app.use("/api", new APIRouter(model, modelbuilder, mainmodule))
app.use("/doc/:namespace", new DocAction(model, mainmodule, modelbuilder))
- app.use("/uml/:namespace", new UMLDiagramAction(model, mainmodule))
app.use("/", new TreeAction(model, mainmodule))
app.listen(host, port.to_i)
import web_base
import highlight
+import uml
# Specific handler for nitweb API.
abstract class APIHandler
use("/search", new APISearch(model, mainmodule))
use("/random", new APIRandom(model, mainmodule))
use("/code/:id", new APIEntityCode(model, mainmodule, modelbuilder))
+ use("/uml/:id", new APIEntityUML(model, mainmodule))
end
end
end
end
+
+# Return a UML representation of MEntity.
+#
+# Example: `GET /entity/core::Array/uml`
+class APIEntityUML
+ super APIHandler
+
+ redef fun get(req, res) do
+ var mentity = mentity_from_uri(req, res)
+ var dot
+ if mentity isa MClassDef then mentity = mentity.mclass
+ if mentity isa MClass then
+ var uml = new UMLModel(view, mainmodule)
+ dot = uml.generate_class_uml.write_to_string
+ else if mentity isa MModule then
+ var uml = new UMLModel(view, mentity)
+ dot = uml.generate_package_uml.write_to_string
+ else
+ res.error 404
+ return
+ end
+ res.send render_svg(dot)
+ end
+
+ # Render a `dot` string as a svg image.
+ fun render_svg(dot: String): String do
+ var proc = new ProcessDuplex("dot", "-Tsvg")
+ var svg = proc.write_and_read(dot)
+ proc.close
+ proc.wait
+ return svg
+ end
+end
+
# Return the source code of MEntity.
#
# Example: `GET /entity/core::Array/code`
res.send_view(view)
end
end
-
-# Return an UML diagram for `namespace`.
-class UMLDiagramAction
- super ModelHandler
-
- # 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 tpl
end
end
-
-# Display the source for each mentities
-class HtmlDotPage
- super NitView
-
- # Dot to process.
- var dot: Text
-
- # Page title.
- var title: String
-
- redef fun render do
- var tpl = new Template
- tpl.add new Header(1, title)
- tpl.add render_dot
- return tpl
- end
-
- private fun render_dot: String do
- var proc = new ProcessDuplex("dot", "-Tsvg", "-Tcmapx")
- var svg = proc.write_and_read(dot)
- proc.close
- proc.wait
- return svg
- end
-end