Parse the line.

See MarkdownProcessor::recurse.

Property definitions

markdown $ Line :: process
	# Parse the line.
	# See `MarkdownProcessor::recurse`.
	fun process(v: MarkdownProcessor) is abstract
lib/markdown/markdown.nit:1637,2--1639,46

markdown $ LineEmpty :: process
	redef fun process(v) do
		v.current_line = v.current_line.as(not null).next
	end
lib/markdown/markdown.nit:1646,2--1648,4

markdown $ LineOther :: process
	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

markdown $ LineCode :: process
	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

markdown $ LineXML :: process
	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

markdown $ LineBlockquote :: process
	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

markdown $ LineHR :: process
	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

markdown $ LineFence :: process
	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

markdown $ LineHeadline :: process
	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

markdown $ LineList :: process
	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

markdown $ LineHeadline1 :: process
	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

markdown $ LineHeadline2 :: process
	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