# File lib/maruku/input/parse_span.rb, line 562
  def read_link(src, con)
    # we read the string and see what happens
    src.ignore_char # opening bracket
    children = read_span(src, EscapedCharInText, ']')
    src.ignore_char # closing bracket

    # ignore space
    if src.cur_char == ' ' && ['[', '('].include?(src.next_char)
      src.shift_char
    end

    case src.cur_char
    when '('
      src.ignore_char # opening (
      src.consume_whitespace
      url = read_url(src, [' ', "\t", ")"]) || ''

      src.consume_whitespace
      title = nil
      if src.cur_char != ')' # we have a title
        quote_char = src.cur_char
        title = read_quoted(src, con)

        if not title
          maruku_error 'Must quote title', src, con
        else
          # Tries to read a title with quotes: ![a](url "ti"tle")
          # this is the most ugly thing in Markdown
          unless src.next_matches(/\s*\)/)
            # if there is not a closing par ), then read
            # the rest and guess it's title with quotes
            rest = read_simple(src, nil, ')', nil)
            # chop the closing char
            rest.chop!
            title << quote_char << rest
          end
        end
      end
      src.consume_whitespace
      closing = src.shift_char # closing )
      if closing != ')'
        maruku_error 'Unclosed link', src, con, "No closing ): I will not create" +
          " the link for #{children.inspect}"
        con.push_elements children
        return
      end
      con.push_element md_im_link(children, url, title)
    when '[' # link ref
      ref_id = read_ref_id(src, con)
      if ref_id
        con.push_element md_link(children, ref_id)
      else
        maruku_error "Could not read ref_id", src, con, "I will not create the link for " +
          "#{children.inspect}"
        con.push_elements children
        return
      end
    else # empty [link]
      con.push_element md_link(children, nil)
    end
  end