var mb = new ModelBuilder(model, tc)
# Parse the code
- var source = new SourceFile.from_string("", content)
+ var source = new SourceFile.from_string("", content + "\n")
var lexer = new Lexer(source)
var parser = new Parser(lexer)
var tree = parser.parse
# The pseudo source-file
var source: SourceFile
+
+ # JavaScript code to update an existing codemirror editor.
+ fun code_mirror_update: Template
+ do
+
+ var res = new Template
+ res.add """
+ function nitmessage() {
+ editor.operation(function(){
+ for (var i = 0; i < widgets.length; ++i)
+ editor.removeLineWidget(widgets[i]);
+ widgets.length = 0;
+"""
+
+ for m in source.messages do
+ res.add """
+ var l = document.createElement("div");
+ l.className = "lint-error"
+ l.innerHTML = "<span class='glyphicon glyphicon-warning-sign lint-error-icon'></span> {{{m.text.html_escape}}}";
+ var w = editor.addLineWidget({{{m.location.line_start-1}}}, l);
+ widgets.push(w);
+"""
+ end
+ res.add """});}"""
+ return res
+ end
end
# Nitcorn service to hightlight code
do
var hl = new HighlightVisitor
var page = new Template
+
+ # There is code? Process it
var code = http_request.post_args.get_or_null("code")
+ var hlcode = null
+ if code != null then hlcode = hightlightcode(hl, code)
+
+ if http_request.post_args.get_or_null("ajax") == "true" and hlcode != null then
+ page.add hlcode.code_mirror_update
+ page.add """
+ document.getElementById("lightcode").innerHTML = "{{{hl.html.write_to_string.escape_to_c}}}";
+ nitmessage();
+ """
+
+ var response = new HttpResponse(200)
+ response.header["Content-Type"] = "application/javascript"
+ response.body = page.write_to_string
+ return response
+ end
page.add """
<!doctype html><html><head>{{{hl.head_content}}}
<style>
{{{hl.css_content}}}
textarea {width:100%;}
+ .lint-error {font-family: arial; font-size: 70%; background: #ffa; color: #a00; padding: 2px 5px 3px; }
+ .lint-error-icon {color: red; padding: 0 3px; margin-right: 7px;}
</style></head><body>
"""
# Add the form+textarea
<form action="#light" method=post><textarea id=code name=code rows=10>{{{code or else ""}}}</textarea><br><input type=submit></form>
"""
- if code != null then
- # There is code? Process it
- var hlcode = hightlightcode(hl, code)
-
+ if hlcode != null then
# Inject highlight
page.add "<pre id=light><code id=lightcode>"
page.add hl.html.write_to_string
page.add "<li>{m.location.as(not null)}: {m.text}</li>"
end
page.add "</ul>"
+ else
+ page.add "<pre id=light><code id=lightcode></code></pre>"
end
page.add hl.foot_content
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
lineNumbers: true
});
+ """
+
+ # Callback to update codemirror messages
+ if hlcode != null then
+ page.add hlcode.code_mirror_update
+ else
+ page.add "function nitmessage()\{\}"
+ end
+ page.add """
+ var widgets = [];
+ nitmessage();
+
+ function updatePage() {
+ $.post("", { ajax: true, code: editor.getValue()}, function(data) {
+ eval(data);
+ $(".popupable").popover({html:true, placement:'top'});
+ });
+ }
+
+ var waiting;
+ editor.on("change", function() {
+ clearTimeout(waiting);
+ waiting = setTimeout(updatePage, 500);
+ });
+ waiting = setTimeout(updatePage, 500);
+
</script>
</body></html>
"""