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 08d6980..da179be 100644 --- a/src/examples/nitlight_as_a_service.nit +++ b/src/examples/nitlight_as_a_service.nit @@ -15,55 +15,16 @@ # This is an example of a client of the frontend without command-line processing. # # It offers a simple nitcorn web server that offers a textarea and nitpick and nitlignt it. -module nitlight_as_a_service +module nitlight_as_a_service is example import frontend -import highlight +import htmlight import nitcorn import nitcorn::log +import template +import json::serialization_write -# Fully process a content as a nit source file. -fun hightlightcode(hl: HighlightVisitor, content: String): SourceFile -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 - - # Check syntax error - var eof = tree.n_eof - if eof isa AError then - mb.error(eof, eof.message) - hl.hightlight_source(source) - return source - 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 source -end - -# Nitcorn service to hightlight code +# Nitcorn service to highlight code # # It's a single stand-alone page that has to form to itself. class HighlightAction @@ -71,37 +32,107 @@ class HighlightAction redef fun answer(http_request, turi) do + var hl = new HtmlightVisitor + 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 = hl.highlightcode(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 - var hl = new HighlightVisitor - var page = "{hl.head_content}" + page.add """ + {{{hl.head_content}}} + + + """ # Add the form+textarea - page += """ -

+ page.add """ +

""" - if code != null then - # There is code? Process it - var source = hightlightcode(hl, code) - + if hlcode != null then # Inject highlight - page += "
"
-			page += hl.html.write_to_string
-			page += "

" - page += "" + else + page.add "
" end - page += hl.foot_content + page.add hl.foot_content + + # Call codemirror + page.add """ + + + + """ var response = new HttpResponse(200) response.header["Content-Type"] = "text/html" - response.body = page + response.body = page.write_to_string return response end end