1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2008 Jean Privat <jean@pryen.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
20 import abstract_compiler
24 private var toolcontext
: ToolContext
25 private var model
: Model
26 private var modelbuilder
: ModelBuilder
27 private var mainmodule
: MModule
28 private var arguments
: Array[String]
29 private var destinationdir
: nullable String
30 private var sharedir
: nullable String
32 private var opt_dir
= new OptionString("Directory where doc is generated", "-d", "--dir")
33 private var opt_source
= new OptionString("What link for source (%f for filename, %l for first line, %L for last line)", "--source")
34 private var opt_sharedir
= new OptionString("Directory containing the nitdoc files", "--sharedir")
35 private var opt_nodot
= new OptionBool("Do not generate graphes with graphiviz", "--no-dot")
37 init(toolcontext
: ToolContext) do
38 # We need a model to collect stufs
39 self.toolcontext
= toolcontext
40 self.arguments
= toolcontext
.option_context
.rest
41 toolcontext
.option_context
.add_option
(opt_dir
)
42 toolcontext
.option_context
.add_option
(opt_source
)
43 toolcontext
.option_context
.add_option
(opt_sharedir
)
44 toolcontext
.option_context
.add_option
(opt_nodot
)
47 if arguments
.length
< 1 then
48 toolcontext
.option_context
.usage
53 modelbuilder
= new ModelBuilder(model
, toolcontext
)
55 # Here we load an process std modules
56 var mmodules
= modelbuilder
.parse_and_build
([arguments
.first
])
57 if mmodules
.is_empty
then return
58 modelbuilder
.full_propdef_semantic_analysis
59 assert mmodules
.length
== 1
60 self.mainmodule
= mmodules
.first
63 private fun process_options
do
64 if not opt_dir
.value
is null then
65 destinationdir
= opt_dir
.value
67 destinationdir
= "nitdoc_directory"
69 if not opt_sharedir
.value
is null then
70 sharedir
= opt_sharedir
.value
72 var dir
= "NIT_DIR".environ
74 dir
= "{sys.program_name.dirname}/../share/nitdoc"
76 dir
= "{dir}/share/nitdoc"
79 if sharedir
is null then
80 print
"Error: Cannot locate nitdoc share files. Uses --sharedir or envvar NIT_DIR"
83 dir
= "{sharedir.to_s}/scripts/js-facilities.js"
84 if sharedir
is null then
85 print
"Error: Invalid nitdoc share files. Check --sharedir or envvar NIT_DIR"
92 if arguments
.length
== 1 then
93 # Create destination dir if it's necessary
94 if not destinationdir
.file_exists
then destinationdir
.mkdir
95 sys
.system
("cp -r {sharedir.to_s}/* {destinationdir.to_s}/")
103 var overviewpage
= new NitdocOverview.with
(modelbuilder
.nmodules
, self.opt_nodot
.value
, destinationdir
.to_s
)
104 overviewpage
.save
("{destinationdir.to_s}/index.html")
108 var fullindex
= new NitdocFullindex.with
(model
.mmodules
)
109 fullindex
.save
("{destinationdir.to_s}/full-index.html")
113 for mod
in modelbuilder
.nmodules
do
114 var modulepage
= new NitdocModules.with
(mod
)
115 modulepage
.save
("{destinationdir.to_s}/{mod.mmodule.name}.html")
124 var amodules
: Array[AModule]
126 # Init with Array[AModule] to get all ifnormations about each MModule containt in a program
127 # opt_nodot to inform about the graph gen
128 # destination: to know where will be saved dot files
129 init with
(modules
: Array[AModule], opt_nodot
: Bool, destination
: String) do
130 self.amodules
= modules
131 self.opt_nodot
= opt_nodot
132 self.destinationdir
= destination
137 add
("title").text
("Overview | Nit Standard Library")
142 open
("nav").add_class
("main")
144 add
("li").add_class
("current").text
("Overview")
146 add_html
("<a href=\"full-index
.html\
">Full Index</a>")
148 open
("li").attr
("id", "liGitHub")
149 open
("a").add_class
("btn").attr
("id", "logGitHub")
150 add
("img").attr
("id", "imgGitHub").attr
("src", "resources/icons/github-icon.png")
152 open
("div").add_class
("popover bottom")
153 add
("div").add_class
("arrow").text
(" ")
154 open
("div").add_class
("githubTitle")
155 add
("h3").text
("Github Sign In")
158 add
("label").attr
("id", "lbloginGit").text
("Username")
159 add
("input").attr
("id", "loginGit").attr
("name", "login").attr
("type", "text")
160 open
("label").attr
("id", "logginMessage").text
("Hello ")
161 open
("a").attr
("id", "githubAccount")
162 add
("strong").attr
("id", "nickName").text
(" ")
167 add
("label").attr
("id", "lbpasswordGit").text
("Password")
168 add
("input").attr
("id", "passwordGit").attr
("name", "password").attr
("type", "password")
169 open
("div").attr
("id", "listBranches")
170 add
("label").attr
("id", "lbBranches").text
("Branch")
171 add
("select").add_class
("dropdown").attr
("id", "dropBranches").attr
("name", "dropBranches").attr
("tabindex", "1").text
(" ")
175 add
("label").attr
("id", "lbrepositoryGit").text
("Repository")
176 add
("input").attr
("id", "repositoryGit").attr
("name", "repository").attr
("type", "text")
179 add
("label").attr
("id", "lbbranchGit").text
("Branch")
180 add
("input").attr
("id", "branchGit").attr
("name", "branch").attr
("type", "text")
183 add
("a").attr
("id", "signIn").text
("Sign In")
194 open
("div").add_class
("page")
195 open
("div").add_class
("content fullpage")
196 add
("h1").text
("Nit Standard Library")
197 open
("article").add_class
("overview")
198 add_html
("<p>Documentation for the standard library of Nit<br />Version jenkins-component=stdlib-19<br />Date: TODAY</p>")
200 open
("article").add_class
("overview")
201 add
("h2").text
("Modules")
209 add
("footer").text
("Nit standard library. Version jenkins-component=stdlib-19.")
213 var ls
= new List[nullable MModule]
214 for amodule
in amodules
do
215 var mmodule
= amodule
.mmodule
.public_owner
216 if mmodule
!= null and not ls
.has
(mmodule
) then
218 add
("a").attr
("href", "{mmodule.name}.html").text
("{mmodule.to_s} ")
219 add_html
(amodule
.comment
)
226 fun process_generate_dot
do
228 op
.append
("digraph dep \{ rankdir=BT; node[shape=none,margin=0,width=0,height=0,fontsize=10]; edge[dir=none,color=gray]; ranksep=0.2; nodesep=0.1;\n")
229 for amodule
in amodules
do
230 op
.append
("\"{amodule.mmodule.name}\
"[URL=\"{amodule.mmodule.name}.html\
"];\n")
231 for mmodule2
in amodule
.mmodule
.in_importation
.direct_greaters
do
232 op
.append
("\"{amodule.mmodule.name}\
"->\"{mmodule2.name}\
";\n")
236 generate_dot
(op
.to_s
, "dep", "Modules hierarchy")
241 class NitdocFullindex
244 var mmodules
: Array[MModule]
246 init with
(mmodules
: Array[MModule]) do
247 self.mmodules
= mmodules
254 add
("title").text
("Full Index | Nit Standard Library")
259 open
("nav").add_class
("main")
262 add_html
("<a href=\"index
.html\
">Overview</a>")
264 add
("li").add_class
("current").text
("Full Index")
265 open
("li").attr
("id", "liGitHub")
266 open
("a").add_class
("btn").attr
("id", "logGitHub")
267 add
("img").attr
("id", "imgGitHub").attr
("src", "resources/icons/github-icon.png")
269 open
("div").add_class
("popover bottom")
270 add
("div").add_class
("arrow").text
(" ")
271 open
("div").add_class
("githubTitle")
272 add
("h3").text
("Github Sign In")
275 add
("label").attr
("id", "lbloginGit").text
("Username")
276 add
("input").attr
("id", "loginGit").attr
("name", "login").attr
("type", "text")
277 open
("label").attr
("id", "logginMessage").text
("Hello ")
278 open
("a").attr
("id", "githubAccount")
279 add
("strong").attr
("id", "nickName").text
(" ")
284 add
("label").attr
("id", "lbpasswordGit").text
("Password")
285 add
("input").attr
("id", "passwordGit").attr
("name", "password").attr
("type", "password")
286 open
("div").attr
("id", "listBranches")
287 add
("label").attr
("id", "lbBranches").text
("Branch")
288 add
("select").add_class
("dropdown").attr
("id", "dropBranches").attr
("name", "dropBranches").attr
("tabindex", "1").text
(" ")
292 add
("label").attr
("id", "lbrepositoryGit").text
("Repository")
293 add
("input").attr
("id", "repositoryGit").attr
("name", "repository").attr
("type", "text")
296 add
("label").attr
("id", "lbbranchGit").text
("Branch")
297 add
("input").attr
("id", "branchGit").attr
("name", "branch").attr
("type", "text")
300 add
("a").attr
("id", "signIn").text
("Sign In")
311 open
("div").add_class
("page")
312 open
("div").add_class
("content fullpage")
313 add
("h1").text
("Full Index")
317 add
("footer").text
("Nit standard library. Version jenkins-component=stdlib-19.")
326 # Add to content modules column
328 var ls
= new List[nullable MModule]
329 open
("article").add_class
("modules filterable")
330 add
("h2").text
("Modules")
332 for mmodule
in mmodules
do
333 if mmodule
.public_owner
!= null and not ls
.has
(mmodule
.public_owner
) then
334 ls
.add
(mmodule
.public_owner
)
336 add
("a").attr
("href", "{mmodule.public_owner.name}.html").text
(mmodule
.public_owner
.name
)
344 # Add to content classes modules
345 fun classes_column
do
346 open
("article").add_class
("classes filterable")
347 add
("h2").text
("Classes")
350 for mclass
in mmodules
.first
.imported_mclasses
do
352 add
("a").attr
("href", "{mclass.name}.html").text
(mclass
.name
)
360 # Insert the properties column of fullindex page
361 fun properties_column
do
362 open
("article").add_class
("properties filterable")
363 add
("h2").text
("Properties")
366 for method
in mmodules
.first
.imported_methods
do
367 if method
.visibility
is none_visibility
or method
.visibility
is intrude_visibility
then continue
368 open
("li").add_class
("intro")
369 add
("span").attr
("title", "introduction").text
("I")
371 add
("a").attr
("href", "{method.local_class.name}.html").attr
("title", "").text
("{method.name} ({method.local_class.name})")
375 for method
in mmodules
.first
.redef_methods
do
376 if method
.visibility
is none_visibility
or method
.visibility
is intrude_visibility
then continue
377 open
("li").add_class
("redef")
378 add
("span").attr
("title", "redefinition").text
("R")
380 add
("a").attr
("href", "{method.local_class.name}.html").attr
("title", "").text
("{method.name} ({method.local_class.name})")
394 var modulename
: String
395 init with
(amodule
: AModule) do
396 self.amodule
= amodule
397 self.modulename
= self.amodule
.mmodule
.name
404 add
("title").text
("{modulename} module | {amodule.short_comment}")
409 open
("nav").add_class
("main")
412 add_html
("<a href=\"index
.html\
">Overview</a>")
414 add
("li").add_class
("current").text
(modulename
)
416 add_html
("<a href=\"full-index
.html\
" >Full Index</a>")
418 open
("li").attr
("id", "liGitHub")
419 open
("a").add_class
("btn").attr
("id", "logGitHub")
420 add
("img").attr
("id", "imgGitHub").attr
("src", "resources/icons/github-icon.png")
422 open
("div").add_class
("popover bottom")
423 add
("div").add_class
("arrow").text
(" ")
424 open
("div").add_class
("githubTitle")
425 add
("h3").text
("Github Sign In")
428 add
("label").attr
("id", "lbloginGit").text
("Username")
429 add
("input").attr
("id", "loginGit").attr
("name", "login").attr
("type", "text")
430 open
("label").attr
("id", "logginMessage").text
("Hello ")
431 open
("a").attr
("id", "githubAccount")
432 add
("strong").attr
("id", "nickName").text
(" ")
437 add
("label").attr
("id", "lbpasswordGit").text
("Password")
438 add
("input").attr
("id", "passwordGit").attr
("name", "password").attr
("type", "password")
439 open
("div").attr
("id", "listBranches")
440 add
("label").attr
("id", "lbBranches").text
("Branch")
441 add
("select").add_class
("dropdown").attr
("id", "dropBranches").attr
("name", "dropBranches").attr
("tabindex", "1").text
(" ")
445 add
("label").attr
("id", "lbrepositoryGit").text
("Repository")
446 add
("input").attr
("id", "repositoryGit").attr
("name", "repository").attr
("type", "text")
449 add
("label").attr
("id", "lbbranchGit").text
("Branch")
450 add
("input").attr
("id", "branchGit").attr
("name", "branch").attr
("type", "text")
453 add
("a").attr
("id", "signIn").text
("Sign In")
464 open
("div").add_class
("page")
467 add
("footer").text
("Nit standard library. Version jenkins-component=stdlib-19.")
470 # Insert all tags in content part
472 open
("div").add_class
("content")
473 add
("h1").text
(modulename
)
474 add
("div").add_class
("subtitle").text
("module {modulename}")
479 # Insert module comment in the content
480 fun module_comment
do
481 var doc
= amodule
.comment
482 open
("div").attr
("id", "description")
483 add
("pre").add_class
("text_label").text
(doc
)
484 add
("textarea").add_class
("edit").attr
("rows", "1").attr
("cols", "76").attr
("id", "fileContent").text
(" ")
485 add
("a").attr
("id", "cancelBtn").text
("Cancel")
486 add
("a").attr
("id", "commitBtn").text
("Commit")
487 add
("pre").add_class
("text_label").attr
("id", "preSave").attr
("type", "2")
492 open
("div").add_class
("module")
493 open
("article").add_class
("classes filterable")
494 add
("h2").text
("Classes")
496 for c
, state
in amodule
.mmodule
.mclasses
do
498 if state
== c_is_intro
or state
== c_is_imported
then
499 open
("li").add_class
("intro")
500 add
("span").attr
("title", "introduced in this module").text
("I ")
502 open
("li").add_class
("redef")
503 add
("span").attr
("title", "refined in this module").text
("R ")
505 add
("a").attr
("href", "{name}.html").text
(name
)
519 var destinationdir
: String
522 add
("meta").attr
("charset", "utf-8")
523 add
("script").attr
("type", "text/javascript").attr
("src", "scripts/jquery-1.7.1.min.js")
524 add
("script").attr
("type", "text/javascript").attr
("src", "quicksearch-list.js")
525 add
("script").attr
("type", "text/javascript").attr
("src", "scripts/js-facilities.js")
526 add
("link").attr
("rel", "stylesheet").attr
("href", "styles/main.css").attr
("type", "text/css").attr
("media", "screen")
529 redef fun body
do header
532 # Generate a clickable graphviz image using a dot content
533 fun generate_dot
(dot
: String, name
: String, alt
: String) do
534 if opt_nodot
then return
535 var file
= new OFStream.open
("{self.destinationdir}/{name}.dot")
538 sys
.system
("\{ test -f {self.destinationdir}/{name}.png && test -f {self.destinationdir}/{name}.s.dot && diff {self.destinationdir}/{name}.dot {self.destinationdir}/{name}.s.dot >/dev/null 2>&1 ; \} || \{ cp {self.destinationdir}/{name}.dot {self.destinationdir}/{name}.s.dot && dot -Tpng -o{self.destinationdir}/{name}.png -Tcmapx -o{self.destinationdir}/{name}.map {self.destinationdir}/{name}.s.dot ; \}")
539 open
("article").add_class
("graph")
540 add
("img").attr
("src", "{name}.png").attr
("usemap", "#{name}").attr
("style", "margin:auto").attr
("alt", "{alt}")
542 var fmap
= new IFStream.open
("{self.destinationdir}/{name}.map")
543 add_html
(fmap
.read_all
)
550 private fun comment
: String do
552 if n_moduledecl
is null or n_moduledecl
.n_doc
is null then ret
553 if n_moduledecl
.n_doc
is null then return ""
554 for t
in n_moduledecl
.n_doc
.n_comment
do
555 ret
+= "{t.text.replace("# ", "")}"
560 private fun short_comment
: String do
562 if n_moduledecl
!= null and n_moduledecl
.n_doc
!= null then
563 var txt
= n_moduledecl
.n_doc
.n_comment
.first
.text
564 txt
= txt
.replace
("# ", "")
565 txt
= txt
.replace
("\n", "")
574 var amodule
: nullable AModule
576 # Get the list of all methods in a module
577 fun imported_methods
: Set[MMethod] do
578 var methods
= new HashSet[MMethod]
579 for mclass
in imported_mclasses
do
580 for method
in mclass
.intro_methods
do
587 # Get the list aof all refined methods in a module
588 fun redef_methods
: Set[MMethod] do
589 var methods
= new HashSet[MMethod]
590 for mclass
in redef_mclasses
do
591 for method
in mclass
.intro_methods
do
599 redef class MProperty
602 var apropdef
: nullable APropdef
604 redef init(intro_mclassdef
: MClassDef, name
: String, visibility
: MVisibility)
610 fun local_class
: MClass do
611 var classdef
= self.intro_mclassdef
612 return classdef
.mclass
617 # Create a tool context to handle options and paths
618 var toolcontext
= new ToolContext
619 toolcontext
.process_options
621 # Here we launch the nit index
622 var nitdoc
= new Nitdoc(toolcontext
)