# A processor for emphasis tokens
class MdEmphasisDelimiterProcessor
super MdDelimiterProcessor
# Delimiter character
var delimiter_char: Char
redef var min_length = 1
redef fun opening_delimiter do return delimiter_char
redef fun closing_delimiter do return delimiter_char
redef fun delimiter_use(opener, closer) do
# "multiple of 3" rule for internal delimiter runs
if (opener.can_close or closer.can_open) and
((opener.original_length + closer.original_length) % 3 == 0) then
return 0
end
# calculate actual number of delimiters used from this closer
if opener.length >= 2 and closer.length >= 2 then
return 2
end
return 1
end
redef fun process(opener, closer, delimiter_use) do
var single_delimiter = opening_delimiter.to_s
var emphasis: MdNode
if delimiter_use == 1 then
emphasis = new MdEmphasis(
new MdLocation(
opener.location.line_start,
opener.location.column_start,
closer.location.line_end,
closer.location.column_end),
single_delimiter)
else
emphasis = new MdStrongEmphasis(
new MdLocation(
opener.location.line_start,
opener.location.column_start + opener.literal.length,
closer.location.line_end,
closer.location.column_end - closer.literal.length),
"{single_delimiter}{single_delimiter}")
end
var tmp = opener.next
while tmp != null and tmp != closer do
var next = tmp.next
emphasis.append_child(tmp)
tmp = next
end
opener.insert_after(emphasis)
end
end
lib/markdown2/markdown_inline_parsing.nit:1296,1--1348,3