nitlight: add --first-line --last-line
[nit.git] / src / nitlight.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 # Tool that produces highlighting for Nit programs
16 module nitlight
17
18 import highlight
19
20 var toolcontext = new ToolContext
21
22 var opt_fragment = new OptionBool("Omit document header and footer", "-f", "--fragment")
23 var opt_first_line = new OptionInt("Start the source file at this line (default: 1)", 0, "--first-line")
24 var opt_last_line = new OptionInt("End the source file at this line (default: to the end)", 0, "--last-line")
25 var opt_dir = new OptionString("Output html files in a specific directory (required if more than one module)", "-d", "--dir")
26 var opt_full = new OptionBool("Process also imported modules", "--full")
27 var opt_ast = new OptionBool("Generate specific HTML elements for each Node of the AST", "--ast")
28 toolcontext.option_context.add_option(opt_fragment, opt_first_line, opt_last_line, opt_dir, opt_full)
29
30 var model = new Model
31 var modelbuilder = new ModelBuilder(model, toolcontext)
32
33 toolcontext.process_options
34 var args = toolcontext.option_context.rest
35
36 if args.is_empty then
37 print "usage: nitlight [options] files..."
38 toolcontext.option_context.usage
39 return
40 end
41
42 var mmodules = modelbuilder.parse(args)
43 modelbuilder.run_phases
44
45 if opt_full.value then mmodules = model.mmodules
46
47 var dir = opt_dir.value
48 if dir != null then
49 dir.mkdir
50 else if mmodules.length > 1 then
51 print "More than one module to render, use option -d"
52 return
53 end
54
55 for mm in mmodules do
56 if dir != null then toolcontext.info("write {dir}/{mm.name}.html", 1)
57
58 var v = new HighlightVisitor
59
60 if opt_first_line.value != 0 then v.first_line = opt_first_line.value
61 if opt_last_line.value != 0 then v.last_line = opt_last_line.value
62 if opt_ast.value then v.with_ast = true
63 var page = null
64 if not opt_fragment.value then
65 page = new HTMLTag("html")
66 page.add_raw_html """<head>
67 <meta charset="utf-8">"""
68 if dir == null then
69 page.add_raw_html """
70 <style type="text/css">
71 {{{v.css_content}}}
72 </style>
73 """
74 else
75 page.add_raw_html """<link rel="stylesheet" type="text/css" href="style.css" />"""
76 end
77 page.add_raw_html "</head><body><pre>"
78 end
79 var m = modelbuilder.mmodule2nmodule[mm]
80 v.enter_visit(m)
81 if not opt_fragment.value then
82 page.add(v.html)
83 page.add_raw_html "</pre></body>"
84 else
85 page = v.html
86 end
87
88 if dir != null then
89 page.save("{dir}/{mm.name}.html")
90 else
91 print page.html
92 end
93 end
94
95 if dir != null then
96 toolcontext.info("write {dir}/index.html", 1)
97
98 var page = new HTMLTag("html")
99 page.add_raw_html """<head>
100 <meta charset="utf-8">
101 </head><body><ul>
102 """
103 for mm in mmodules do
104 var n = new HTMLTag("li")
105 var n2 = new HTMLTag("a")
106 page.add n
107 n.add n2
108 n2.attr("href", "{mm.name}.html")
109 n2.text(mm.name)
110 end
111 page.add_raw_html "</li></body>"
112 page.save("{dir}/index.html")
113
114 var v = new HighlightVisitor
115 toolcontext.info("write {dir}/style.css", 1)
116 var f = new OFStream.open("{dir}/style.css")
117 f.write v.css_content
118 f.close
119 end