nit: Added link to `CONTRIBUTING.md` from the README
[nit.git] / src / web / web_views.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 # Nitcorn actions used by the nitweb server.
16 module web_views
17
18 import web_base
19 import model_html
20 import highlight
21 import markdown
22
23 # Html homepage for the `nitweb` server.
24 class HtmlHomePage
25 super NitView
26
27 # Loaded model to display.
28 var tree: MEntityTree
29
30 redef fun render do
31 var tpl = new Template
32 tpl.add new Header(1, "Loaded model")
33 tpl.add tree.html_list
34 return tpl
35 end
36 end
37
38 # Display a search results list.
39 class HtmlResultPage
40 super NitView
41
42 # Initial query.
43 var query: String
44
45 # Result set
46 var results: Array[MEntity]
47
48 redef fun render do
49 var tpl = new Template
50 tpl.add new Header(1, "Results for {query}")
51 if results.is_empty then
52 tpl.add "<p>No result for {query}.<p>"
53 return tpl
54 end
55 var list = new UnorderedList
56 for mentity in results do
57 var link = mentity.html_link
58 link.text = mentity.html_full_name
59 list.add_li new ListItem(link)
60 end
61 tpl.add list
62 return tpl
63 end
64 end
65
66 # Display the source for each mentities
67 class HtmlSourcePage
68 super NitView
69
70 # Modelbuilder used to access sources.
71 var modelbuilder: ModelBuilder
72
73 # MEntity to display
74 var mentity: MEntity
75
76 # HiglightVisitor used to hilight the source code
77 var hl = new HighlightVisitor
78
79 redef fun render do
80 var tpl = new Template
81 tpl.add new Header(1, "Source Code")
82 tpl.add render_source
83 return tpl
84 end
85
86 private fun render_source: Template do
87 var node = modelbuilder.mentity2node(mentity)
88 var tpl = new Template
89 tpl.add new Header(3, "Source code")
90 if node == null then
91 tpl.add "<p>Source for {mentity.html_name} not found.<p>"
92 else
93 hl.enter_visit node
94 tpl.add "<pre><code>"
95 tpl.add hl.html
96 tpl.add "</code></pre>"
97 end
98 return tpl
99 end
100 end
101
102 # Display the mdoc of the mentities.
103 class HtmlDocPage
104 super HtmlSourcePage
105
106 redef fun render do
107 var tpl = new Template
108 tpl.add new Header(1, mentity.html_name)
109 tpl.add "<p>"
110 tpl.add mentity.html_declaration
111 tpl.add "</p>"
112 tpl.add "<br>"
113 var mdoc = mentity.mdoc
114 if mdoc != null then
115 tpl.add mdoc.content.join("\n").md_to_html
116 end
117 tpl.add "<br>"
118 tpl.add render_source
119 return tpl
120 end
121 end
122
123 # Display the source for each mentities
124 class HtmlDotPage
125 super NitView
126
127 # Dot to process.
128 var dot: Text
129
130 # Page title.
131 var title: String
132
133 redef fun render do
134 var tpl = new Template
135 tpl.add new Header(1, title)
136 tpl.add render_dot
137 return tpl
138 end
139
140 private fun render_dot: String do
141 var proc = new ProcessDuplex("dot", "-Tsvg", "-Tcmapx")
142 var svg = proc.write_and_read(dot)
143 proc.close
144 proc.wait
145 return svg
146 end
147 end