# An implementation of MdDelimiterProcessor that dispatches all calls to others
#
# The sub processors called bepends on the length of the delimiter run.
# All child processors must have different minimum lengths.
# A given delimiter run is dispatched to the child with the largest acceptable minimum length.
# If not child is applicable, the one with the largest minimum length is chosen.
class MdStaggeredDelimiterProcessor
super MdDelimiterProcessor
# Delimiter character
var delim: Char
# Sub processors to apply
var processors = new Array[MdDelimiterProcessor]
redef var min_length = 0
redef fun opening_delimiter do return delim
redef fun closing_delimiter do return delim
# Add a new sub delimiter processor
fun add(dp: MdDelimiterProcessor) do
var len = dp.min_length
var i = 0
while i < processors.length do
var p = processors[i]
assert len != p.min_length else
print "Cannot add two delimiter processor for `{delim}` " +
"and mininimum length `{len}`"
end
if len > p.min_length then
break
end
i += 1
end
processors.insert(dp, i)
end
# Find the corresponding processor for a length of `len` delimiter characters
fun find_processor(len: Int): MdDelimiterProcessor do
for processor in processors do
if processor.min_length <= len then return processor
end
return processors.first
end
redef fun delimiter_use(opener, closer) do
return find_processor(opener.length).delimiter_use(opener, closer)
end
redef fun process(opener, closer, delimiter_use) do
find_processor(delimiter_use).process(opener, closer, delimiter_use)
end
end
lib/markdown2/markdown_inline_parsing.nit:1242,1--1294,3