# ~~~
var ext_mode = true
+ # Disable attaching MDLocation to Tokens
+ #
+ # Locations are useful for some tools but they may
+ # cause an important time and space overhead.
+ #
+ # Default = `false`
+ var no_location = false is writable
+
init do self.emitter = new MarkdownEmitter(self)
# Process the mardown `input` string and return the processed output.
if not line.is_empty and line.leading < 4 and line.value[line.leading] == '[' then
pos = line.leading + 1
pos = md.read_until(id, pos, ']')
- if not id.is_empty and pos + 2 < line.value.length then
+ if not id.is_empty and pos >= 0 and pos + 2 < line.value.length then
if line.value[pos + 1] == ':' then
pos += 2
pos = md.skip_spaces(pos)
- if line.value[pos] == '<' then
+ if pos >= 0 and line.value[pos] == '<' then
pos += 1
pos = md.read_until(link, pos, '>')
pos += 1
- else
+ else if pos >= 0 then
pos = md.read_until(link, pos, ' ', '\n')
end
if not link.is_empty then
c2 = ' '
end
- var loc = new MDLocation(
- current_loc.line_start,
- current_loc.column_start + pos,
- current_loc.line_start,
- current_loc.column_start + pos)
+ var loc
+ if no_location then
+ loc = null
+ else
+ loc = new MDLocation(
+ current_loc.line_start,
+ current_loc.column_start + pos,
+ current_loc.line_start,
+ current_loc.column_start + pos)
+ end
if c == '*' then
if c1 == '*' then
text.append "\n"
line = line.next
end
+ var block = first_block
+ while block != null do
+ text.append block.text
+ text.append "\n"
+ block = block.next
+ end
return text.write_to_string
end
end
abstract class Token
# Location of `self` in the original input.
- var location: MDLocation
+ var location: nullable MDLocation
# Position of `self` in input independant from lines.
var pos: Int