nitweb: introduce web actions
authorAlexandre Terrasa <alexandre@moz-code.org>
Wed, 9 Dec 2015 06:54:32 +0000 (01:54 -0500)
committerAlexandre Terrasa <alexandre@moz-code.org>
Fri, 11 Dec 2015 19:13:25 +0000 (14:13 -0500)
Basic services for now.

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/web/web_actions.nit [new file with mode: 0644]

diff --git a/src/web/web_actions.nit b/src/web/web_actions.nit
new file mode 100644 (file)
index 0000000..574e32e
--- /dev/null
@@ -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