# See the License for the specific language governing permissions and
# limitations under the License.
-# Highliting of Nit AST
+# Highlighting of Nit AST
module highlight
-import modelize_property
import frontend
import html
import pipeline
# Is 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 writable = false
+ var with_ast = false is writable
+
+ # Prefixes used in generated IDs for line `<span>` elements.
+ # Useful if more than one highlighted code is present in the same HTML document.
+ #
+ # If set to the empty string, id for lines are disabled.
+ #
+ # Is `"L"` by default.
+ var line_id_prefix = "L" is writable
# The first line to generate, null if start at the first line
- var first_line: nullable Int writable = null
+ var first_line: nullable Int = null is writable
# The last line to generate, null if finish at the last line
- var last_line: nullable Int writable = null
+ var last_line: nullable Int = null is writable
init
do
html.add_class("nitcode")
end
+ # The entry-point of the highlighting.
+ # Will fill `html` with the generated HTML content.
fun enter_visit(n: ANode)
do
n.parentize_tokens
do
var stack2 = new Array[HTMLTag]
var stack = new Array[Prod]
- var closes = new Array[Prod]
var line = 0
var c: nullable Token = first_token
var hv = new HighlightVisitor
# Add a div for the whole line
var tag = new HTMLTag("span")
- tag.attrs["id"] = "L{cline}"
+ var p = line_id_prefix
+ if p != "" then tag.attrs["id"] = "{p}{cline}"
tag.classes.add "line"
stack2.add(html)
html.add tag
return """
.nitcode a { color: inherit; cursor:pointer; }
.nitcode .popupable:hover { text-decoration: underline; cursor:help; } /* underline titles */
-pre.nitcode .foldable { display: block } /* for block productions*/
-pre.nitcode .line{ display: block } /* for lines */
-pre.nitcode .line:hover{ background-color: #FFFFE0; } /* current line */
+.nitcode .foldable { display: block } /* for block productions*/
+.nitcode .line{ display: block } /* for lines */
+.nitcode .line:hover{ background-color: #FFFFE0; } /* current line */
.nitcode :target { background-color: #FFF3C2 } /* target highlight*/
/* lexical raw tokens. independent of usage or semantic: */
.nitcode .nc_c { color: gray; font-style: italic; } /* comment */
return res
end
+ # The module HTML page
fun href: String
do
return name + ".html"
if mdoc == null then mdoc = mclass.intro.mdoc
if mdoc != null then mdoc.fill_infobox(res)
+ if in_hierarchy == null then return res
+
if in_hierarchy.greaters.length > 1 then
var c = res.new_dropdown("hier", "super-classes")
for x in in_hierarchy.greaters do
return res
end
+ # The class HTML page (an anchor in the module page)
fun href: String
do
return mmodule.href + "#" + to_s
var res = new HInfoBox(v, to_s)
res.href = href
if self isa MMethodDef then
- res.new_field("fun").append(mproperty.name).add msignature.linkto
+ if msignature != null then res.new_field("fun").append(mproperty.name).add msignature.linkto
else if self isa MAttributeDef then
- res.new_field("fun").append(mproperty.name).add static_mtype.linkto
+ if static_mtype != null then res.new_field("fun").append(mproperty.name).add static_mtype.linkto
else if self isa MVirtualTypeDef then
- res.new_field("add").append(mproperty.name).add bound.linkto
+ if bound != null then res.new_field("add").append(mproperty.name).add bound.linkto
else
res.new_field("wat?").append(mproperty.name)
end
return res
end
+ # The property HTML page (an anchor in the module page)
fun href: String
do
return self.mclassdef.mmodule.href + "#" + self.to_s
redef fun infobox(v)
do
var res = new HInfoBox(v, to_s)
- var name = mclass.intro.parameter_names[rank]
res.new_field("parameter type").append("{name} from class ").add mclass.intro.linkto
return res
end
redef fun linkto
do
- var name = mclass.intro.parameter_names[rank]
return (new HTMLTag("span")).text(name)
end
end
return t.infobox(v)
end
end
-