X-Git-Url: http://nitlanguage.org diff --git a/src/web/web_actions.nit b/src/web/web_actions.nit index 574e32e..e9198ae 100644 --- a/src/web/web_actions.nit +++ b/src/web/web_actions.nit @@ -16,148 +16,146 @@ module web_actions import web_views -import model::model_collect +import uml # Display the tree of all loaded mentities. class TreeAction - super NitAction + super ModelAction - # 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) + redef fun get(req, res) do + var model = init_model_view(req) + var view = new HtmlHomePage(model.to_tree) + res.send_view(view) + end end # Display the list of mentities matching `namespace`. class SearchAction - super NitAction - - # Model to explore and render. - var model: Model + super ModelAction # 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.") + redef fun get(req, res) do + var namespace = req.param("namespace") + var model = init_model_view(req) + var mentity = find_mentity(model, namespace) + if mentity == null then + res.error(404) + return 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) + if req.is_json_asked then + res.json(mentity.to_json) + return end - var view = new HtmlResultPage(namespace, mentities) - return render_view(view) + var view = new HtmlResultPage(namespace or else "null", [mentity]) + res.send_view(view) end end # Display a MEntity source code. class CodeAction - super NitAction - - # Model to explore and render. - var model: Model + super ModelAction # 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.") + redef fun get(req, res) do + var namespace = req.param("namespace") + var model = init_model_view(req) + var mentity = find_mentity(model, namespace) + if mentity == null then + res.error(404) + return 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) + var view = new HtmlSourcePage(modelbuilder, mentity) + res.send_view(view) end end # Display the doc of a MEntity. class DocAction - super NitAction - - # Model to explore and render. - var model: Model + super ModelAction # 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.") + redef fun get(req, res) do + var namespace = req.param("namespace") + var model = init_model_view(req) + var mentity = find_mentity(model, namespace) + if mentity == null then + res.error(404) + return end - var mentities = model.collect_by_namespace(namespace) - if mentities.is_empty then - return render_error(404, "No mentity matching this namespace.") + if req.is_json_asked then + res.json(mentity.to_json) + return end - var view = new HtmlDocPage(modelbuilder, mentities.first) - return render_view(view) + + var view = new HtmlDocPage(modelbuilder, mentity) + res.send_view(view) + end +end + +# Return an UML diagram for `namespace`. +class UMLDiagramAction + super ModelAction + + # Mainmodule used for hierarchy flattening. + var mainmodule: MModule + + redef fun get(req, res) do + var namespace = req.param("namespace") + var model = init_model_view(req) + var mentity = find_mentity(model, namespace) + if mentity == null then + res.error(404) + return + end + + var dot + if mentity isa MClassDef then mentity = mentity.mclass + if mentity isa MClass then + var uml = new UMLModel(model, mainmodule) + dot = uml.generate_class_uml.write_to_string + else if mentity isa MModule then + var uml = new UMLModel(model, mentity) + dot = uml.generate_package_uml.write_to_string + else + res.error(404) + return + end + var view = new HtmlDotPage(dot, mentity.as(not null).html_name) + res.send_view(view) end end # Return a random list of MEntities. class RandomAction - super NitAction - - # Model to explore and render. - var model: Model + super ModelAction - # 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" + redef fun get(req, res) do + var n = req.int_arg("n") or else 10 + var k = req.string_arg("k") or else "modules" + var model = init_model_view(req) 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 + mentities = model.mclassdefs.to_a else - mentities = new Array[MPropDef] - for mprop in model.mproperties do - mentities.add_all(mprop.mpropdefs) - end + mentities = model.mpropdefs.to_a end mentities.shuffle mentities = mentities.sub(0, n) - if request.is_json_asked then + if req.is_json_asked then var json = new JsonArray for mentity in mentities do json.add mentity.to_json end - return render_json(json) + res.json(json) + return 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 + res.send_view(view) end end