def parse_link
result = @src.scan(LINK_START)
reset_pos = @src.pos
link_type = (result =~ /^!/ ? :img : :a)
if link_type == :a && (@tree.type == :img || @tree.type == :a || @stack.any? {|t,s| t && (t.type == :img || t.type == :a)})
add_text(result)
return
end
el = Element.new(link_type)
count = 1
found = parse_spans(el, LINK_BRACKET_STOP_RE) do
count = count + (@src[1] ? -1 : 1)
count - el.children.select {|c| c.type == :img}.size == 0
end
if !found || (link_type == :a && el.children.empty?)
@src.pos = reset_pos
add_text(result)
return
end
alt_text = extract_string(reset_pos...@src.pos, @src)
@src.scan(LINK_BRACKET_STOP_RE)
if @src.scan(LINK_INLINE_ID_RE) || !@src.check(/\(/)
link_id = normalize_link_id(@src[1] || alt_text)
if @link_defs.has_key?(link_id)
add_link(el, @link_defs[link_id].first, @link_defs[link_id].last, alt_text)
else
warning("No link definition for link ID '#{link_id}' found")
@src.pos = reset_pos
add_text(result)
end
return
end
if @src.scan(/\(<(.*?)>/)
link_url = @src[1]
if @src.scan(/\)/)
add_link(el, link_url, nil, alt_text)
return
end
else
link_url = ''
nr_of_brackets = 0
while temp = @src.scan_until(LINK_PAREN_STOP_RE)
link_url << temp
if @src[2]
nr_of_brackets -= 1
break if nr_of_brackets == 0
elsif @src[1]
nr_of_brackets += 1
else
break
end
end
link_url = link_url[1..-2]
link_url.strip!
if nr_of_brackets == 0
add_link(el, link_url, nil, alt_text)
return
end
end
if @src.scan(LINK_INLINE_TITLE_RE)
add_link(el, link_url, @src[2], alt_text)
else
@src.pos = reset_pos
add_text(result)
end
end