import html
import pipeline
import astutil
+import serialization
-# Fully process a content as a nit source file.
-fun hightlightcode(hl: HighlightVisitor, content: String): HLCode
+# Fully process `content` as a Nit source file.
+#
+# Set `print_errors = true` to print errors in the code to the console.
+fun hightlightcode(hl: HighlightVisitor, content: String, print_errors: nullable Bool): HLCode
do
# Prepare a stand-alone tool context
var tc = new ToolContext
tc.nit_dir = tc.locate_nit_dir # still use the common lib to have core
tc.keep_going = true # no exit, obviously
- tc.opt_warn.value = -1 # no output, obviously
+ if print_errors != true then tc.opt_warn.value = -1 # no output
# Prepare an stand-alone model and model builder.
# Unfortunately, models are enclosing and append-only.
# A standalone highlighted piece of code
class HLCode
+ super Serializable
+
# The highlighter used
var hl: HighlightVisitor
res.add """});}"""
return res
end
+
+ redef fun core_serialize_to(v)
+ do
+ v.serialize_attribute("code", hl.html.write_to_string)
+ var msgs = new Array[Map[String, Serializable]]
+ for m in source.messages do
+ var o = new Map[String, Serializable]
+ msgs.add o
+ o["line"] = m.location.line_start-1
+ o["message"] = m.text
+ end
+ v.serialize_attribute("messages", msgs)
+ end
end
# Visitor used to produce a HTML tree based on a AST on a `Source`
# The root of the HTML hierarchy
var html = new HTMLTag("span")
- # Is the HTML include a nested `<span class"{type_of_node}">` element for each `ANode` of the AST?
+ # Should the HTML include a nested `<span class"{type_of_node}">` element for each `ANode` of the AST?
+ #
# Used to have a really huge and verbose HTML (mainly for debug)
var with_ast = false is writable
#
# By default, `null` is returned.
# Clients are therefore encouraged to redefine the method in a subclass to control where entities should link to.
- fun hrefto(entitiy: MEntity): nullable String do return null
+ fun hrefto(entity: MEntity): nullable String do return null
init
do
if l.next_looses.not_empty then l = l.next_looses.last
end
+ var line = first_line
+ if line != null then
+ while f.location.line_start < line do
+ f = f.next_token
+ if f == null then return
+ end
+ end
+
+ line = last_line
+ if line != null then
+ while l.location.line_end > line do
+ l = l.prev_token
+ if l == null then return
+ end
+ end
+
if include_whole_lines then
f = f.first_real_token_in_line
l = l.last_real_token_in_line
end
# Add the token
- if c isa TEol then
+ if c isa TEol then
html.append "\n"
else
var tag = full_tag(c, hv)
c = n
end
- #assert stack.is_empty
- #assert stack2.is_empty
+ if not stack2.is_empty then html = stack2.first
end
# Return a default CSS content related to CSS classes used in the `html` tree.
end
# Append a new dropdown in the popuped content
- fun new_dropdown(title, text: String): HTMLTag
+ fun new_dropdown(title, text: String, text_is_html: nullable Bool): HTMLTag
do
content.add_raw_html """<div class="dropdown"> <a data-toggle="dropdown" href="#"><b>"""
content.append(title)
content.add_raw_html "</b> "
- content.append(text)
+ if text_is_html == true then
+ content.add_raw_html(text)
+ else content.append(text)
content.add_raw_html """<span class="caret"></span></a>"""
var res = content.open("ul").add_class("dropdown-menu").attr("role", "menu").attr("aria-labelledby", "dLabel")
content.add_raw_html "</div>"
var res = new HInfoBox(v, to_s)
res.href = v.hrefto(mproperty)
var p = mproperty
+ res.new_field("virtual type").add p.intro.linkto(v)
add_doc_to_infobox(res)
- if mdoc != null then mdoc.fill_infobox(res)
return res
end
redef fun linkto(v)