# Low-level highlighting between 2 tokens
protected fun do_highlight(first_token: Token, last_token: nullable Token) is abstract
src/highlight.nit:110,2--111,87
# Low-level highlighting between 2 tokens
redef fun do_highlight(first_token, last_token)
do
var stack2 = new Array[HTMLTag]
var stack = new Array[Prod]
var line = 0
var c: nullable Token = first_token
while c != null do
var starting
# Handle start of line
var cline = c.location.line_start
if cline != line then
# Handle starting block productions,
# Because c could be a detached token, get prods in
# the first AST token
var c0 = c.first_token_in_line
starting = null
if c0 != null then starting = c0.starting_prods
if starting != null then for p in starting do
if not p.is_block then continue
var tag = full_tag(p)
if tag == null then continue
tag.add_class("foldable")
stack2.add(html)
html.add tag
html = tag
stack.add(p)
end
# Add a div for the whole line
var tag = new HTMLTag("span")
var p = line_id_prefix
if p != "" then tag.attrs["id"] = "{p}{cline}"
tag.classes.add "line"
stack2.add(html)
html.add tag
html = tag
line = cline
end
# Add the blank, verbatim
html.add_raw_html c.blank_before
# Handle starting span production
starting = c.starting_prods
if starting != null then for p in starting do
if not p.is_span then continue
var tag = full_tag(p)
if tag == null then continue
stack2.add(html)
html.add tag
html = tag
stack.add(p)
end
# Add the token
if c isa TEol then
html.append "\n"
else
var tag = full_tag(c)
if tag != null then html.add tag
end
# Handle ending span productions
var ending = c.ending_prods
if ending != null then for p in ending do
if not p.is_span then continue
if stack.is_empty or p != stack.last then continue
stack.pop
html = stack2.pop
end
# Handle end of line and end of file
var n = c.next_token
if c == last_token then n = null
if n == null or n.location.line_start != line then
# closes the line div
html = stack2.pop
# close the block production divs
var c0 = c.last_token_in_line
ending = null
if c0 != null then ending = c0.ending_prods
if ending != null then for p in ending do
if not p.is_block then continue
if stack.is_empty or p != stack.last then continue
stack.pop
html = stack2.pop
end
end
c = n
end
if not stack2.is_empty then html = stack2.first
end
src/htmlight.nit:158,2--253,4
redef fun do_highlight(f, l)
do
var c
c = f
while c != null do
if c != f then result.add(c.blank_before)
result.add c.ansi_colored
if c == l then
c = null
else
c = c.next_token
end
end
end
src/highlight.nit:121,2--135,4