X-Git-Url: http://nitlanguage.org diff --git a/src/examples/nitlight_as_a_service.nit b/src/examples/nitlight_as_a_service.nit index 808837a..103a3c8 100644 --- a/src/examples/nitlight_as_a_service.nit +++ b/src/examples/nitlight_as_a_service.nit @@ -22,87 +22,7 @@ import highlight import nitcorn import nitcorn::log import template - -# Fully process a content as a nit source file. -fun hightlightcode(hl: HighlightVisitor, content: String): 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 - - # Prepare an stand-alone model and model builder. - # Unfortunately, models are enclosing and append-only. - # There is no way (yet?) to have a shared module `core` with - # isolated and throwable user modules. - var model = new Model - var mb = new ModelBuilder(model, tc) - - # Parse the code - var source = new SourceFile.from_string("", content) - var lexer = new Lexer(source) - var parser = new Parser(lexer) - var tree = parser.parse - - var hlcode = new HLCode(hl, content, source) - - # Check syntax error - var eof = tree.n_eof - if eof isa AError then - mb.error(eof, eof.message) - hl.hightlight_source(source) - return hlcode - end - var amodule = tree.n_base.as(not null) - - # Load the AST as a module in the model - # Then process it - mb.load_rt_module(null, amodule, "") - mb.run_phases - - # Highlight the processed module - hl.enter_visit(amodule) - return hlcode -end - -# A standalone highlighted piece of code -class HLCode - # The highlighter used - var hl: HighlightVisitor - - # The raw code source - var content: String - - # 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 = " {{{m.text.html_escape}}}"; - var w = editor.addLineWidget({{{m.location.line_start-1}}}, l); - widgets.push(w); -""" - end - res.add """});}""" - return res - end -end +import json::serialization_write # Nitcorn service to hightlight code # @@ -120,6 +40,26 @@ class HighlightAction var hlcode = null if code != null then hlcode = hightlightcode(hl, code) + if http_request.post_args.get_or_null("json") == "true" and hlcode != null then + var response = new HttpResponse(200) + response.header["Content-Type"] = "text/json" + response.body = hlcode.to_json + return response + end + + 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 """ {{{hl.head_content}}} @@ -147,6 +87,8 @@ class HighlightAction page.add "
  • {m.location.as(not null)}: {m.text}
  • " end page.add "" + else + page.add "
    " end page.add hl.foot_content @@ -170,6 +112,20 @@ class HighlightAction 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); + """