From: Alexandre Terrasa Date: Wed, 9 Dec 2015 06:54:32 +0000 (-0500) Subject: nitweb: introduce web actions X-Git-Tag: v0.8~38^2~3 X-Git-Url: http://nitlanguage.org?ds=sidebyside nitweb: introduce web actions Basic services for now. Signed-off-by: Alexandre Terrasa --- diff --git a/src/web/web_actions.nit b/src/web/web_actions.nit new file mode 100644 index 0000000..574e32e --- /dev/null +++ b/src/web/web_actions.nit @@ -0,0 +1,163 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Nitcorn actions used by the nitweb server. +module web_actions + +import web_views +import model::model_collect + +# Display the tree of all loaded mentities. +class TreeAction + super NitAction + + # Model to explore and render. + var model: Model + + # View to render. + var view = new HtmlHomePage(model) is lazy + + redef fun answer(request, url) do return render_view(view) +end + +# Display the list of mentities matching `namespace`. +class SearchAction + super NitAction + + # Model to explore and render. + var model: Model + + # TODO handle more than full namespaces. + redef fun answer(request, url) do + var namespace = request.param("namespace") + if namespace == null or namespace.is_empty then + return render_error(400, "Missing :namespace.") + end + var mentities = model.collect_by_namespace(namespace) + if request.is_json_asked then + var json = new JsonArray + for mentity in mentities do + json.add mentity.to_json + end + return render_json(json) + end + var view = new HtmlResultPage(namespace, mentities) + return render_view(view) + end +end + +# Display a MEntity source code. +class CodeAction + super NitAction + + # Model to explore and render. + var model: Model + + # Modelbuilder used to access sources. + var modelbuilder: ModelBuilder + + # TODO handle more than full namespaces. + redef fun answer(request, url) do + var namespace = request.param("namespace") + if namespace == null or namespace.is_empty then + return render_error(400, "Missing :namespace.") + end + var mentities = model.collect_by_namespace(namespace) + if mentities.is_empty then + return render_error(404, "No mentity matching this namespace.") + end + var view = new HtmlSourcePage(modelbuilder, mentities.first) + return render_view(view) + end +end + +# Display the doc of a MEntity. +class DocAction + super NitAction + + # Model to explore and render. + var model: Model + + # Modelbuilder used to access sources. + var modelbuilder: ModelBuilder + + # TODO handle more than full namespaces. + redef fun answer(request, url) do + var namespace = request.param("namespace") + if namespace == null or namespace.is_empty then + return render_error(400, "Missing :namespace.") + end + var mentities = model.collect_by_namespace(namespace) + if mentities.is_empty then + return render_error(404, "No mentity matching this namespace.") + end + var view = new HtmlDocPage(modelbuilder, mentities.first) + return render_view(view) + end +end + +# Return a random list of MEntities. +class RandomAction + super NitAction + + # Model to explore and render. + var model: Model + + # TODO handle more than full namespaces. + redef fun answer(request, url) do + var n = request.int_arg("n") or else 10 + var k = request.string_arg("k") or else "modules" + var mentities: Array[MEntity] + if k == "modules" then + mentities = model.mmodules.to_a + else if k == "classdefs" then + mentities = new Array[MClassDef] + for mclass in model.mclasses do + mentities.add_all(mclass.mclassdefs) + end + else + mentities = new Array[MPropDef] + for mprop in model.mproperties do + mentities.add_all(mprop.mpropdefs) + end + end + mentities.shuffle + mentities = mentities.sub(0, n) + if request.is_json_asked then + var json = new JsonArray + for mentity in mentities do + json.add mentity.to_json + end + return render_json(json) + end + var view = new HtmlResultPage("random", mentities) + return render_view(view) + end +end + +redef class MEntity + + # Return `self` as a JsonObject. + fun to_json: JsonObject do + var obj = new JsonObject + obj["name"] = html_name + obj["namespace"] = html_raw_namespace + var mdoc = self.mdoc + if mdoc != null then + obj["synopsis"] = mdoc.content.first.html_escape + obj["mdoc"] = mdoc.content.join("\n").html_escape + end + return obj + end +end