Return how many characters were parsed as a reference. Returns 0 if none.
# Attempt to parse a link reference
#
# Return how many characters were parsed as a reference.
# Returns 0 if none.
fun parse_reference(input: String): Int do
self.input = input
self.index = 0
self.column = 0
var dest
var title
var match_chars
var start_index = index
# label
match_chars = parse_link_label
if match_chars == 0 then return 0
advance match_chars
var raw_label = input.substring(0, match_chars)
# colon
if peek != ':' then return 0
advance 1
# link url
spnl
dest = parse_link_destination.first
if dest == null or dest.is_empty then return 0
var before_title = index
var before_column = column
spnl
title = parse_link_title
if title == null then
# rewind before spaces
index = before_title
column = before_column
end
var at_line_end = true
if index != input.length and match(re_line_end) == null then
if title == null then
at_line_end = false
else
# the potential title we found is not at the line end,
# but it could still be a legal link reference if we discard the title
title = null
# rewind before spaces
index = before_title
column = before_column
# and instead check if the link URL is at the line end
at_line_end = match(re_line_end) != null
end
end
if not at_line_end then return 0
var normalized_label = raw_label.normalize_reference
if normalized_label.is_empty then return 0
if not reference_map.has_key(normalized_label) then
var link = new MdLink(new MdLocation(0, 0, 0, 0), dest, title)
reference_map[normalized_label] = link
end
return index - start_index
end
lib/markdown2/markdown_inline_parsing.nit:138,2--205,4