See MarkdownProcessor::recurse
.
# Parse the line.
# See `MarkdownProcessor::recurse`.
fun process(v: MarkdownProcessor) is abstract
lib/markdown/markdown.nit:1637,2--1639,46
redef fun process(v) do
var line = v.current_line
# go to block end
var was_empty = line.as(not null).prev_empty
while line != null and not line.is_empty do
var t = v.line_kind(line)
if (v.in_list or v.ext_mode) and t isa LineList then
break
end
if v.ext_mode and (t isa LineCode or t isa LineFence) then
break
end
if t isa LineHeadline or t isa LineHeadline1 or t isa LineHeadline2 or
t isa LineHR or t isa LineBlockquote or t isa LineXML then
break
end
line = line.next
end
# build block
var current_block = v.current_block.as(not null)
if line != null and not line.is_empty then
var block = current_block.split(line.prev.as(not null))
if v.in_list and not was_empty then
block.kind = new BlockNone(block)
else
block.kind = new BlockParagraph(block)
end
current_block.remove_leading_empty_lines
else
var block: MDBlock
if line != null then
block = current_block.split(line)
else
block = current_block.split(current_block.last_line.as(not null))
end
if v.in_list and (line == null or not line.is_empty) and not was_empty then
block.kind = new BlockNone(block)
else
block.kind = new BlockParagraph(block)
end
current_block.remove_leading_empty_lines
end
v.current_line = current_block.first_line
end
lib/markdown/markdown.nit:1656,2--1699,4
redef fun process(v) do
var line = v.current_line
# lookup block end
while line != null and (line.is_empty or v.line_kind(line) isa LineCode) do
line = line.next
end
# split at block end line
var current_block = v.current_block.as(not null)
var block: MDBlock
if line != null then
block = current_block.split(line.prev.as(not null))
else
block = current_block.split(current_block.last_line.as(not null))
end
block.kind = new BlockCode(block)
block.remove_surrounding_empty_lines
v.current_line = current_block.first_line
end
lib/markdown/markdown.nit:1706,2--1723,4
redef fun process(v) do
var line = v.current_line
if line == null then return
var current_block = v.current_block.as(not null)
var prev = line.prev
if prev != null then current_block.split(prev)
var block = current_block.split(line.xml_end_line.as(not null))
block.kind = new BlockXML(block)
current_block.remove_leading_empty_lines
v.current_line = current_block.first_line
end
lib/markdown/markdown.nit:1730,2--1740,4
redef fun process(v) do
var line = v.current_line
var current_block = v.current_block.as(not null)
# go to bquote end
while line != null do
if not line.is_empty and (line.prev_empty and
line.leading == 0 and
not v.line_kind(line) isa LineBlockquote) then break
line = line.next
end
# build sub block
var block: MDBlock
if line != null then
block = current_block.split(line.prev.as(not null))
else
block = current_block.split(current_block.last_line.as(not null))
end
var kind = new BlockQuote(block)
block.kind = kind
block.remove_surrounding_empty_lines
kind.remove_block_quote_prefix(block)
v.current_line = line
v.recurse(block, false)
v.current_line = current_block.first_line
end
lib/markdown/markdown.nit:1747,2--1771,4
redef fun process(v) do
var line = v.current_line
if line == null then return
var current_block = v.current_block.as(not null)
if line.prev != null then current_block.split(line.prev.as(not null))
var block = current_block.split(line)
block.kind = new BlockRuler(block)
current_block.remove_leading_empty_lines
v.current_line = current_block.first_line
end
lib/markdown/markdown.nit:1778,2--1787,4
redef fun process(v) do
# go to fence end
var line = v.current_line.as(not null).next
var current_block = v.current_block.as(not null)
while line != null do
if v.line_kind(line) isa LineFence then break
line = line.next
end
if line != null then
line = line.next
end
# build fence block
var block: MDBlock
if line != null then
block = current_block.split(line.prev.as(not null))
else
block = current_block.split(current_block.last_line.as(not null))
end
block.remove_surrounding_empty_lines
var meta = block.first_line.as(not null).value.meta_from_fence
block.kind = new BlockFence(block, meta)
block.first_line.as(not null).clear
var last = block.last_line
if last != null and v.line_kind(last) isa LineFence then
block.last_line.as(not null).clear
end
block.remove_surrounding_empty_lines
v.current_line = line
end
lib/markdown/markdown.nit:1794,2--1822,4
redef fun process(v) do
var line = v.current_line
if line == null then return
var current_block = v.current_block.as(not null)
var lprev = line.prev
if lprev != null then current_block.split(lprev)
var block = current_block.split(line)
var kind = new BlockHeadline(block)
block.kind = kind
kind.transform_headline(block)
current_block.remove_leading_empty_lines
v.current_line = current_block.first_line
end
lib/markdown/markdown.nit:1829,2--1841,4
redef fun process(v) do
var line = v.current_line
# go to list end
while line != null do
var t = v.line_kind(line)
if not line.is_empty and (line.prev_empty and line.leading == 0 and
not t isa LineList) then break
line = line.next
end
# build list block
var current_block = v.current_block.as(not null)
var list: MDBlock
if line != null then
list = current_block.split(line.prev.as(not null))
else
list = current_block.split(current_block.last_line.as(not null))
end
var kind = block_kind(list)
list.kind = kind
list.first_line.as(not null).prev_empty = false
list.last_line.as(not null).next_empty = false
list.remove_surrounding_empty_lines
list.first_line.as(not null).prev_empty = false
list.last_line.as(not null).next_empty = false
kind.init_block(v)
var block = list.first_block
while block != null do
block.remove_list_indent(v)
v.recurse(block, true)
block = block.next
end
kind.expand_paragraphs(list)
v.current_line = line
end
lib/markdown/markdown.nit:1891,2--1924,4
redef fun process(v) do
var line = v.current_line
if line == null then return
var current_block = v.current_block.as(not null)
var lprev = line.prev
if lprev != null then current_block.split(lprev)
line.next.as(not null).clear
var block = current_block.split(line)
var kind = new BlockHeadline(block)
kind.depth = 1
kind.transform_headline(block)
block.kind = kind
current_block.remove_leading_empty_lines
v.current_line = current_block.first_line
end
lib/markdown/markdown.nit:1848,2--1862,4
redef fun process(v) do
var line = v.current_line
if line == null then return
var current_block = v.current_block.as(not null)
var lprev = line.prev
if lprev != null then current_block.split(lprev)
line.next.as(not null).clear
var block = current_block.split(line)
var kind = new BlockHeadline(block)
kind.depth = 2
kind.transform_headline(block)
block.kind = kind
current_block.remove_leading_empty_lines
v.current_line = current_block.first_line
end
lib/markdown/markdown.nit:1869,2--1883,4