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}")
480 # Insert module comment in the content
481 fun module_comment
do
482 var doc
= amodule
.comment
483 open
("div").attr
("id", "description")
484 add
("pre").add_class
("text_label").text
(doc
)
485 add
("textarea").add_class
("edit").attr
("rows", "1").attr
("cols", "76").attr
("id", "fileContent").text
(" ")
486 add
("a").attr
("id", "cancelBtn").text
("Cancel")
487 add
("a").attr
("id", "commitBtn").text
("Commit")
488 add
("pre").add_class
("text_label").attr
("id", "preSave").attr
("type", "2")
493 open
("div").add_class
("module")
494 open
("article").add_class
("classes filterable")
495 add
("h2").text
("Classes")
497 for c
, state
in amodule
.mmodule
.mclasses
do
499 if state
== c_is_intro
or state
== c_is_imported
then
500 open
("li").add_class
("intro")
501 add
("span").attr
("title", "introduced in this module").text
("I ")
503 open
("li").add_class
("redef")
504 add
("span").attr
("title", "refined in this module").text
("R ")
506 add
("a").attr
("href", "{name}.html").text
(name
)
520 var destinationdir
: String
523 add
("meta").attr
("charset", "utf-8")
524 add
("script").attr
("type", "text/javascript").attr
("src", "scripts/jquery-1.7.1.min.js")
525 add
("script").attr
("type", "text/javascript").attr
("src", "quicksearch-list.js")
526 add
("script").attr
("type", "text/javascript").attr
("src", "scripts/js-facilities.js")
527 add
("link").attr
("rel", "stylesheet").attr
("href", "styles/main.css").attr
("type", "text/css").attr
("media", "screen")
530 redef fun body
do header
533 # Generate a clickable graphviz image using a dot content
534 fun generate_dot
(dot
: String, name
: String, alt
: String) do
535 if opt_nodot
then return
536 var file
= new OFStream.open
("{self.destinationdir}/{name}.dot")
539 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 ; \}")
540 open
("article").add_class
("graph")
541 add
("img").attr
("src", "{name}.png").attr
("usemap", "#{name}").attr
("style", "margin:auto").attr
("alt", "{alt}")
543 var fmap
= new IFStream.open
("{self.destinationdir}/{name}.map")
544 add_html
(fmap
.read_all
)
551 private fun comment
: String do
553 if n_moduledecl
is null or n_moduledecl
.n_doc
is null then ret
554 if n_moduledecl
.n_doc
is null then return ""
555 for t
in n_moduledecl
.n_doc
.n_comment
do
556 ret
+= "{t.text.replace("# ", "")}"
561 private fun short_comment
: String do
563 if n_moduledecl
!= null and n_moduledecl
.n_doc
!= null then
564 var txt
= n_moduledecl
.n_doc
.n_comment
.first
.text
565 txt
= txt
.replace
("# ", "")
566 txt
= txt
.replace
("\n", "")
575 var amodule
: nullable AModule
577 # Get the list of all methods in a module
578 fun imported_methods
: Set[MMethod] do
579 var methods
= new HashSet[MMethod]
580 for mclass
in imported_mclasses
do
581 for method
in mclass
.intro_methods
do
588 # Get the list aof all refined methods in a module
589 fun redef_methods
: Set[MMethod] do
590 var methods
= new HashSet[MMethod]
591 for mclass
in redef_mclasses
do
592 for method
in mclass
.intro_methods
do
600 redef class MProperty
603 var apropdef
: nullable APropdef
605 redef init(intro_mclassdef
: MClassDef, name
: String, visibility
: MVisibility)
611 fun local_class
: MClass do
612 var classdef
= self.intro_mclassdef
613 return classdef
.mclass
618 # Create a tool context to handle options and paths
619 var toolcontext
= new ToolContext
620 toolcontext
.process_options
622 # Here we launch the nit index
623 var nitdoc
= new Nitdoc(toolcontext
)