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}/")
105 var overviewpage
= new NitdocOverview.with
(modelbuilder
.nmodules
, self.opt_nodot
.value
, destinationdir
.to_s
)
106 overviewpage
.save
("{destinationdir.to_s}/index.html")
110 var fullindex
= new NitdocFullindex.with
(model
.mmodules
)
111 fullindex
.save
("{destinationdir.to_s}/full-index.html")
115 for mod
in modelbuilder
.nmodules
do
116 var modulepage
= new NitdocModules.with
(mod
)
117 modulepage
.save
("{destinationdir.to_s}/{mod.mmodule.name}.html")
122 for amodule
in modelbuilder
.nmodules
do
123 for mclass
, aclassdef
in amodule
.mclass2nclassdef
do
124 mclass
.amodule
(modelbuilder
.mmodule2nmodule
)
125 mclass
.mmethod
(aclassdef
.mprop2npropdef
)
126 var classpage
= new NitdocMClasses.with
(mclass
, aclassdef
)
127 classpage
.save
("{destinationdir.to_s}/{mclass.name}.html")
132 # Generate QuickSearch file
133 fun quicksearch_list
do
134 var file
= new OFStream.open
("{destinationdir.to_s}/quicksearch-list.js")
135 var content
= new Buffer
136 content
.append
("var entries = \{ ")
137 for prop
in model
.mproperties
do
138 if not prop
isa MMethod then continue
139 content
.append
("\"{prop.name}\
": [")
140 for propdef
in prop
.mpropdefs
do
141 content
.append
("\{txt: \"{propdef.mproperty.full_name}\", url
:\
"{propdef.mproperty.link_anchor}\" \
}")
142 if not propdef is prop.mpropdefs.last then content.append(", ")
148 for mclass in model.mclasses do
149 content.append("\
"{mclass.name}\": [")
150 for mclassdef in mclass.mclassdefs do
151 content.append("\
{txt: \"{mclassdef.mclass.full_name}\
", url:\"{mclass.link_anchor}\
" \}")
152 if not mclassdef
is mclass
.mclassdefs
.last
then content
.append
(", ")
155 if not mclass
is model
.mclasses
.last
then content
.append
(", ")
158 content
.append
(" \};")
159 file
.write
(content
.to_s
)
168 var amodules
: Array[AModule]
170 # Init with Array[AModule] to get all ifnormations about each MModule containt in a program
171 # opt_nodot to inform about the graph gen
172 # destination: to know where will be saved dot files
173 init with
(modules
: Array[AModule], opt_nodot
: Bool, destination
: String) do
174 self.amodules
= modules
175 self.opt_nodot
= opt_nodot
176 self.destinationdir
= destination
181 add
("title").text
("Overview | Nit Standard Library")
186 open
("nav").add_class
("main")
188 add
("li").add_class
("current").text
("Overview")
190 add_html
("<a href=\"full-index
.html\
">Full Index</a>")
192 open
("li").attr
("id", "liGitHub")
193 open
("a").add_class
("btn").attr
("id", "logGitHub")
194 add
("img").attr
("id", "imgGitHub").attr
("src", "resources/icons/github-icon.png")
196 open
("div").add_class
("popover bottom")
197 add
("div").add_class
("arrow").text
(" ")
198 open
("div").add_class
("githubTitle")
199 add
("h3").text
("Github Sign In")
202 add
("label").attr
("id", "lbloginGit").text
("Username")
203 add
("input").attr
("id", "loginGit").attr
("name", "login").attr
("type", "text")
204 open
("label").attr
("id", "logginMessage").text
("Hello ")
205 open
("a").attr
("id", "githubAccount")
206 add
("strong").attr
("id", "nickName").text
(" ")
211 add
("label").attr
("id", "lbpasswordGit").text
("Password")
212 add
("input").attr
("id", "passwordGit").attr
("name", "password").attr
("type", "password")
213 open
("div").attr
("id", "listBranches")
214 add
("label").attr
("id", "lbBranches").text
("Branch")
215 add
("select").add_class
("dropdown").attr
("id", "dropBranches").attr
("name", "dropBranches").attr
("tabindex", "1").text
(" ")
219 add
("label").attr
("id", "lbrepositoryGit").text
("Repository")
220 add
("input").attr
("id", "repositoryGit").attr
("name", "repository").attr
("type", "text")
223 add
("label").attr
("id", "lbbranchGit").text
("Branch")
224 add
("input").attr
("id", "branchGit").attr
("name", "branch").attr
("type", "text")
227 add
("a").attr
("id", "signIn").text
("Sign In")
238 open
("div").add_class
("page")
239 open
("div").add_class
("content fullpage")
240 add
("h1").text
("Nit Standard Library")
241 open
("article").add_class
("overview")
242 add_html
("<p>Documentation for the standard library of Nit<br />Version jenkins-component=stdlib-19<br />Date: TODAY</p>")
244 open
("article").add_class
("overview")
245 add
("h2").text
("Modules")
253 add
("footer").text
("Nit standard library. Version jenkins-component=stdlib-19.")
257 var ls
= new List[nullable MModule]
258 for amodule
in amodules
do
259 var mmodule
= amodule
.mmodule
.public_owner
260 if mmodule
!= null and not ls
.has
(mmodule
) then
262 add
("a").attr
("href", "{mmodule.name}.html").text
("{mmodule.to_s} ")
263 add_html
(amodule
.comment
)
270 fun process_generate_dot
do
272 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")
273 for amodule
in amodules
do
274 op
.append
("\"{amodule.mmodule.name}\
"[URL=\"{amodule.mmodule.name}.html\
"];\n")
275 for mmodule2
in amodule
.mmodule
.in_importation
.direct_greaters
do
276 op
.append
("\"{amodule.mmodule.name}\
"->\"{mmodule2.name}\
";\n")
280 generate_dot
(op
.to_s
, "dep", "Modules hierarchy")
285 class NitdocFullindex
288 var mmodules
: Array[MModule]
290 init with
(mmodules
: Array[MModule]) do
291 self.mmodules
= mmodules
298 add
("title").text
("Full Index | Nit Standard Library")
303 open
("nav").add_class
("main")
306 add_html
("<a href=\"index
.html\
">Overview</a>")
308 add
("li").add_class
("current").text
("Full Index")
309 open
("li").attr
("id", "liGitHub")
310 open
("a").add_class
("btn").attr
("id", "logGitHub")
311 add
("img").attr
("id", "imgGitHub").attr
("src", "resources/icons/github-icon.png")
313 open
("div").add_class
("popover bottom")
314 add
("div").add_class
("arrow").text
(" ")
315 open
("div").add_class
("githubTitle")
316 add
("h3").text
("Github Sign In")
319 add
("label").attr
("id", "lbloginGit").text
("Username")
320 add
("input").attr
("id", "loginGit").attr
("name", "login").attr
("type", "text")
321 open
("label").attr
("id", "logginMessage").text
("Hello ")
322 open
("a").attr
("id", "githubAccount")
323 add
("strong").attr
("id", "nickName").text
(" ")
328 add
("label").attr
("id", "lbpasswordGit").text
("Password")
329 add
("input").attr
("id", "passwordGit").attr
("name", "password").attr
("type", "password")
330 open
("div").attr
("id", "listBranches")
331 add
("label").attr
("id", "lbBranches").text
("Branch")
332 add
("select").add_class
("dropdown").attr
("id", "dropBranches").attr
("name", "dropBranches").attr
("tabindex", "1").text
(" ")
336 add
("label").attr
("id", "lbrepositoryGit").text
("Repository")
337 add
("input").attr
("id", "repositoryGit").attr
("name", "repository").attr
("type", "text")
340 add
("label").attr
("id", "lbbranchGit").text
("Branch")
341 add
("input").attr
("id", "branchGit").attr
("name", "branch").attr
("type", "text")
344 add
("a").attr
("id", "signIn").text
("Sign In")
355 open
("div").add_class
("page")
356 open
("div").add_class
("content fullpage")
357 add
("h1").text
("Full Index")
361 add
("footer").text
("Nit standard library. Version jenkins-component=stdlib-19.")
370 # Add to content modules column
372 var ls
= new List[nullable MModule]
373 open
("article").add_class
("modules filterable")
374 add
("h2").text
("Modules")
376 for mmodule
in mmodules
do
377 if mmodule
.public_owner
!= null and not ls
.has
(mmodule
.public_owner
) then
378 ls
.add
(mmodule
.public_owner
)
380 add
("a").attr
("href", "{mmodule.public_owner.name}.html").text
(mmodule
.public_owner
.name
)
388 # Add to content classes modules
389 fun classes_column
do
390 open
("article").add_class
("classes filterable")
391 add
("h2").text
("Classes")
394 for mclass
in mmodules
.first
.imported_mclasses
do
396 add
("a").attr
("href", "{mclass.name}.html").text
(mclass
.name
)
404 # Insert the properties column of fullindex page
405 fun properties_column
do
406 open
("article").add_class
("properties filterable")
407 add
("h2").text
("Properties")
410 for method
in mmodules
.first
.imported_methods
do
411 if method
.visibility
is none_visibility
or method
.visibility
is intrude_visibility
then continue
412 open
("li").add_class
("intro")
413 add
("span").attr
("title", "introduction").text
("I")
415 add
("a").attr
("href", "{method.local_class.name}.html").attr
("title", "").text
("{method.name} ({method.local_class.name})")
419 for method
in mmodules
.first
.redef_methods
do
420 if method
.visibility
is none_visibility
or method
.visibility
is intrude_visibility
then continue
421 open
("li").add_class
("redef")
422 add
("span").attr
("title", "redefinition").text
("R")
424 add
("a").attr
("href", "{method.local_class.name}.html").attr
("title", "").text
("{method.name} ({method.local_class.name})")
438 var modulename
: String
439 init with
(amodule
: AModule) do
440 self.amodule
= amodule
441 self.modulename
= self.amodule
.mmodule
.name
448 add
("title").text
("{modulename} module | {amodule.short_comment}")
453 open
("nav").add_class
("main")
456 add_html
("<a href=\"index
.html\
">Overview</a>")
458 add
("li").add_class
("current").text
(modulename
)
460 add_html
("<a href=\"full-index
.html\
" >Full Index</a>")
462 open
("li").attr
("id", "liGitHub")
463 open
("a").add_class
("btn").attr
("id", "logGitHub")
464 add
("img").attr
("id", "imgGitHub").attr
("src", "resources/icons/github-icon.png")
466 open
("div").add_class
("popover bottom")
467 add
("div").add_class
("arrow").text
(" ")
468 open
("div").add_class
("githubTitle")
469 add
("h3").text
("Github Sign In")
472 add
("label").attr
("id", "lbloginGit").text
("Username")
473 add
("input").attr
("id", "loginGit").attr
("name", "login").attr
("type", "text")
474 open
("label").attr
("id", "logginMessage").text
("Hello ")
475 open
("a").attr
("id", "githubAccount")
476 add
("strong").attr
("id", "nickName").text
(" ")
481 add
("label").attr
("id", "lbpasswordGit").text
("Password")
482 add
("input").attr
("id", "passwordGit").attr
("name", "password").attr
("type", "password")
483 open
("div").attr
("id", "listBranches")
484 add
("label").attr
("id", "lbBranches").text
("Branch")
485 add
("select").add_class
("dropdown").attr
("id", "dropBranches").attr
("name", "dropBranches").attr
("tabindex", "1").text
(" ")
489 add
("label").attr
("id", "lbrepositoryGit").text
("Repository")
490 add
("input").attr
("id", "repositoryGit").attr
("name", "repository").attr
("type", "text")
493 add
("label").attr
("id", "lbbranchGit").text
("Branch")
494 add
("input").attr
("id", "branchGit").attr
("name", "branch").attr
("type", "text")
497 add
("a").attr
("id", "signIn").text
("Sign In")
508 open
("div").add_class
("page")
512 add
("footer").text
("Nit standard library. Version jenkins-component=stdlib-19.")
515 # Insert all tags in content part
517 open
("div").add_class
("content")
518 add
("h1").text
(modulename
)
519 add
("div").add_class
("subtitle").text
("module {modulename}")
526 # Insert module comment in the content
527 fun module_comment
do
528 var doc
= amodule
.comment
529 open
("div").attr
("id", "description")
530 add
("pre").add_class
("text_label").text
(doc
)
531 add
("textarea").add_class
("edit").attr
("rows", "1").attr
("cols", "76").attr
("id", "fileContent").text
(" ")
532 add
("a").attr
("id", "cancelBtn").text
("Cancel")
533 add
("a").attr
("id", "commitBtn").text
("Commit")
534 add
("pre").add_class
("text_label").attr
("id", "preSave").attr
("type", "2")
539 var mmodule
= amodule
.mmodule
540 open
("div").add_class
("menu")
542 add
("h3").text
("Module Hierarchy").attr
("style","cursor: pointer;")
543 if mmodule
.in_importation
.direct_greaters
.length
> 0 then
544 add_html
("<h4>All dependencies</h4><ul>")
545 for m
in mmodule
.in_importation
.direct_greaters
do
546 if m
== mmodule
or mmodule
== m
.public_owner
then continue
548 add
("a").attr
("href", "{m.name}.html").text
(m
.name
)
553 if mmodule
.in_importation
.greaters
.length
> 0 then
554 add_html
("<h4>All clients</h4><ul>")
555 for m
in mmodule
.in_importation
.greaters
do
556 if m
== mmodule
then continue
558 add
("a").attr
("href", "{m.name}.html").text
(m
.name
)
564 if mmodule
.in_nesting
.direct_greaters
.length
> 0 then
566 add
("h3").text
("Nested Modules").attr
("style","cursor: pointer;")
568 for m
in mmodule
.in_nesting
.direct_greaters
do
570 add
("a").attr
("href", "{m.name}.html").text
(m
.name
)
581 open
("div").add_class
("module")
582 open
("article").add_class
("classes filterable")
583 add
("h2").text
("Classes")
585 for c
, state
in amodule
.mmodule
.mclasses
do
587 if state
== c_is_intro
or state
== c_is_imported
then
588 open
("li").add_class
("intro")
589 add
("span").attr
("title", "introduced in this module").text
("I ")
591 open
("li").add_class
("redef")
592 add
("span").attr
("title", "refined in this module").text
("R ")
594 add
("a").attr
("href", "{name}.html").text
(name
)
603 open
("article").add_class
("properties filterable")
604 add_html
("<h2>Properties</h2>")
606 for method
in amodule
.mmodule
.imported_methods
do
607 if method
.visibility
is none_visibility
or method
.visibility
is intrude_visibility
then continue
608 open
("li").add_class
("intro")
609 add
("span").attr
("title", "introduction").text
("I")
611 add
("a").attr
("href", "{method.local_class.name}.html").attr
("title", "").text
("{method.name} ({method.local_class.name})")
615 for method
in amodule
.mmodule
.redef_methods
do
616 if method
.visibility
is none_visibility
or method
.visibility
is intrude_visibility
then continue
617 open
("li").add_class
("redef")
618 add
("span").attr
("title", "redefinition").text
("R")
620 add
("a").attr
("href", "{method.local_class.name}.html").attr
("title", "").text
("{method.name} ({method.local_class.name})")
630 # Nit Standard Library
635 var aclassdef
: AClassdef
636 var stdclassdef
: nullable AStdClassdef
637 var public_owner
: nullable MModule
639 init with
(mclass
: MClass, aclassdef
: AClassdef) do
641 self.aclassdef
= aclassdef
642 if aclassdef
isa AStdClassdef then self.stdclassdef
= aclassdef
643 self.public_owner
= mclass
.intro_mmodule
.public_owner
650 add
("title").text
("{self.mclass.name} class | Nit Standard Library")
655 open
("nav").add_class
("main")
658 add_html
("<a href=\"index
.html\
">Overview</a>")
661 if public_owner
is null then
662 add_html
("<a href=\"{mclass.intro_mmodule.name}.html\
">{mclass.intro_mmodule.name}</a>")
664 add_html
("<a href=\"{public_owner.name}.html\
">{public_owner.name}</a>")
667 add
("li").add_class
("current").text
(mclass
.name
)
669 add_html
("<a href=\"full-index
.html\
" >Full Index</a>")
671 open
("li").attr
("id", "liGitHub")
672 open
("a").add_class
("btn").attr
("id", "logGitHub")
673 add
("img").attr
("id", "imgGitHub").attr
("src", "resources/icons/github-icon.png")
675 open
("div").add_class
("popover bottom")
676 add
("div").add_class
("arrow").text
(" ")
677 open
("div").add_class
("githubTitle")
678 add
("h3").text
("Github Sign In")
681 add
("label").attr
("id", "lbloginGit").text
("Username")
682 add
("input").attr
("id", "loginGit").attr
("name", "login").attr
("type", "text")
683 open
("label").attr
("id", "logginMessage").text
("Hello ")
684 open
("a").attr
("id", "githubAccount")
685 add
("strong").attr
("id", "nickName").text
(" ")
690 add
("label").attr
("id", "lbpasswordGit").text
("Password")
691 add
("input").attr
("id", "passwordGit").attr
("name", "password").attr
("type", "password")
692 open
("div").attr
("id", "listBranches")
693 add
("label").attr
("id", "lbBranches").text
("Branch")
694 add
("select").add_class
("dropdown").attr
("id", "dropBranches").attr
("name", "dropBranches").attr
("tabindex", "1").text
(" ")
698 add
("label").attr
("id", "lbrepositoryGit").text
("Repository")
699 add
("input").attr
("id", "repositoryGit").attr
("name", "repository").attr
("type", "text")
702 add
("label").attr
("id", "lbbranchGit").text
("Branch")
703 add
("input").attr
("id", "branchGit").attr
("name", "branch").attr
("type", "text")
706 add
("a").attr
("id", "signIn").text
("Sign In")
717 open
("div").add_class
("page")
720 add
("footer").text
("Nit standard library. Version jenkins-component=stdlib-19.")
723 # Insert all tags in content part
725 open
("div").add_class
("menu")
729 open
("div").add_class
("content")
734 fun properties_column
do
735 open
("nav").add_class
("properties filterable")
736 add
("h3").text
("Properties")
738 if mclass
.virtual_types
.length
> 0 then
739 add
("h4").text
("Virtual Types")
741 for prop
in mclass
.virtual_types
do
742 add_html
("<li class=\"redef\
"><span title=\"Redefined\
">R</span><a href=\"{prop.link_anchor}\
">{prop.name}</a></li>")
746 if mclass
.constructors
.length
> 0 then
747 add
("h4").text
("Constructors")
749 for prop
in mclass
.constructors
do
750 add_html
("<li class=\"intro\
"><span title=\"Introduced\
">I</span><a href=\"{prop.link_anchor}\
">{prop.name}</a></li>")
754 add
("h4").text
("Methods")
756 if mclass
.intro_methods
.length
> 0 then
757 for prop
in mclass
.intro_methods
do
758 if prop
.visibility
is public_visibility
or prop
.visibility
is protected_visibility
then add_html
("<li class=\"intro\
"><span title=\"Introduced\
">I</span><a href=\"{prop.link_anchor}\
">{prop.name}</a></li>")
761 if mclass
.inherited_methods
.length
> 0 then
762 for prop
in mclass
.inherited_methods
do
763 if prop
.visibility
is public_visibility
or prop
.visibility
is protected_visibility
then add_html
("<li class=\"inherit\
"><span title=\"Inherited\
">H</span><a href=\"{prop.link_anchor}\
">{prop.name}</a></li>")
766 if mclass
.redef_methods
.length
> 0 then
767 for prop
in mclass
.redef_methods
do
768 if prop
.visibility
is public_visibility
or prop
.visibility
is protected_visibility
then add_html
("<li class=\"redef\
"><span title=\"Refined\
">R</span><a href=\"{prop.link_anchor}\
">{prop.name}</a></li>")
775 fun inheritance_column
do
777 add
("h3").text
("Inheritance")
778 if mclass
.parents
.length
> 0 then
779 add
("h4").text
("Superclasses")
781 for sup
in mclass
.parents
do add_html
("<li><a href=\"{sup.name}.html\
">{sup.name}</a></li>")
785 if mclass
.descendants
.length
is 0 then
786 add
("h4").text
("No Known Subclasses")
787 else if mclass
.descendants
.length
<= 100 then
788 add
("h4").text
("Subclasses")
790 for sub
in mclass
.descendants
do add_html
("<li><a href=\"{sub.name}\
">{sub.name}</a></li>")
792 else if mclass
.children
.length
<= 100 then
793 add
("h4").text
("Direct Subclasses Only")
795 for sub
in mclass
.children
do add_html
("<li><a href=\"{sub.name}\
">{sub.name}</a></li>")
798 add
("h4").text
("Too much Subclasses to list")
805 var lmmodule
= new List[MModule]
806 # Insert the subtitle part
807 add
("h1").text
(mclass
.name
)
808 open
("div").add_class
("subtitle")
809 if mclass
.visibility
is none_visibility
then subtitle
+= "private "
810 subtitle
+= "{mclass.kind} <a href=\"{mclass.public_owner.name}.html\
">{mclass.public_owner.name}</a>::{mclass.name}"
813 add_html
("<div style=\"float
: right
;\
"><a id=\"lblDiffCommit\
"></a></div>")
814 # We add the class description
815 open
("section").add_class
("description")
816 if not stdclassdef
is null and not stdclassdef
.comment
.is_empty
then add_html
("<pre class=\"text_label\
" title=\"122\
" name=\"\
" tag=\"{mclass.mclassdefs.first.location.to_s}\
" type=\"2\
">{stdclassdef.comment} </pre><textarea id=\"fileContent\
" class=\"edit\
" cols=\"76\
" rows=\"1\
" style=\"display
: none
;\
"></textarea><a id=\"cancelBtn\
" style=\"display
: none
;\
">Cancel</a><a id=\"commitBtn\
" style=\"display
: none
;\
">Commit</a><pre id=\"preSave\
" class=\"text_label\
" type=\"2\
"></pre>")
818 open
("section").add_class
("concerns")
819 add
("h2").add_class
("section-header").text
("Concerns")
821 for owner
, childs
in mclass
.concerns
do
823 add_html
("<a href=\"#MOD_{owner.name}\">{owner.name}</a>: {owner.amodule.short_comment}")
824 if not childs
is null then
826 for child
in childs
.as(not null) do add_html
("<li><a href=\"#MOD_{child.name}\">{child.name}</a>: {child.amodule.short_comment} </li>")
833 # Insert virtual types if there is almost one
834 if mclass
.virtual_types
.length
> 0 or (stdclassdef
!= null and stdclassdef
.n_formaldefs
.length
> 0) then
835 open
("section").add_class
("types")
836 add
("h2").text
("Formal and Virtual Types")
837 if mclass
.virtual_types
.length
> 0 then for prop
in mclass
.virtual_types
do description
(prop
)
838 if stdclassdef
.n_formaldefs
.length
> 0 then
839 for prop
in stdclassdef
.n_formaldefs
do
840 open
("article").attr
("id", "FT_Object_{prop.collect_text}")
841 open
("h3").add_class
("signature").text
("{prop.collect_text}: nullable ")
842 add_html
("<a title=\"The root of the
class hierarchy
.\
" href=\"Object.html\
">Object</a>")
844 add_html
("<div class=\"info\
">formal generic type</div>")
850 # Insert constructors if there is almost one
851 if mclass
.constructors
.length
> 0 then
852 open
("section").add_class
("constructors")
853 add
("h2").add_class
("section-header").text
("Constructors")
854 for prop
in mclass
.constructors
do description
(prop
)
857 open
("section").add_class
("methods")
858 add
("h2").add_class
("section-header").text
("Methods")
859 for mmodule
, mmethods
in mclass
.all_methods
do
860 add_html
("<a id=\"MOD_{mmodule.name}\
"></a>")
861 if mmodule
!= mclass
.intro_mmodule
and mmodule
!= mclass
.public_owner
then
862 if mclass
.has_mmodule
(mmodule
) then
863 add_html
("<p class=\"concern-doc\
">{mmodule.name}: {mmodule.amodule.short_comment}</p>")
865 add_html
("<h3 class=\"concern-toplevel\
">Methods refined in <a href=\"{mmodule.name}.html\
">{mmodule.name}</a></h3><p class=\"concern-doc\
">{mmodule.name}: {mmodule.amodule.short_comment}</p>")
868 for prop
in mmethods
do description
(prop
)
870 # Insert inherited methods
871 if mclass
.inherited_methods
.length
> 0 then
872 add
("h3").text
("Inherited Methods")
873 for i_mclass
, methods
in mclass
.inherited
do
875 add_html
("Defined in <a href=\"{i_mclass.name}.html\
">{i_mclass.name}</a>: ")
876 for method
in methods
do
877 add_html
("<a href=\"{method.link_anchor}\
">{method.name}</a>")
878 if method
!= methods
.last
then add_html
(", ")
886 # Insert description tags for 'prop'
887 fun description
(prop
: MProperty) do
888 open
("article").add_class
("fun public {if prop.is_redef then "redef" else ""}").attr
("id", "{prop.anchor}")
890 if prop
.apropdef
!= null then sign
+= prop
.apropdef
.signature
891 add_html
("<h3 class=\"signature\
">{sign}</h3>")
892 add_html
("<div class=\"info\
">{if prop.is_redef then "redef" else ""} fun {prop.intro_mclassdef.namespace(mclass)}::{prop.name}</div><div style=\"float
: right
;\
"><a id=\"lblDiffCommit\
"></a></div>")
894 open
("div").add_class
("description")
895 if prop
.apropdef
is null or prop
.apropdef
.comment
== "" then
896 add_html
("<a class=\"newComment\
" title=\"32\
" tag=\"\
">New Comment</a>")
898 add_html
("<pre class=\"text_label\
" title=\"\
" name=\"\
" tag=\"\
" type=\"1\
">{prop.apropdef.comment}</pre>")
900 add_html
("<textarea id=\"fileContent\
" class=\"edit\
" cols=\"76\
" rows=\"1\
" style=\"display
: none
;\
"></textarea><a id=\"cancelBtn\
" style=\"display
: none
;\
">Cancel</a><a id=\"commitBtn\
" style=\"display
: none
;\
">Commit</a><pre id=\"preSave\
" class=\"text_label\
" type=\"2\
"></pre>")
902 if prop
.local_class
!= mclass
then add_html
("inherited from {prop.local_class.intro_mmodule.name} ")
903 #TODO display show code if doc github
904 add_html
("defined by the module <a href=\"{prop.intro_mclassdef.mmodule.name}.html\
">{prop.intro_mclassdef.mmodule.name}</a> (<a href=\"\
">show code</a>).")
906 for parent
in mclass
.parents
do
907 if prop
isa MMethod then if parent
.constructors
.has
(prop
) then add_html
(" Previously defined by: <a href=\"{parent.intro_mmodule.name}.html\
">{parent.intro_mmodule.name}</a> for <a href=\"{parent.name}.html\
">{parent.name}</a>.")
921 var destinationdir
: String
924 add
("meta").attr
("charset", "utf-8")
925 add
("script").attr
("type", "text/javascript").attr
("src", "scripts/jquery-1.7.1.min.js")
926 add
("script").attr
("type", "text/javascript").attr
("src", "quicksearch-list.js")
927 add
("script").attr
("type", "text/javascript").attr
("src", "scripts/js-facilities.js")
928 add
("link").attr
("rel", "stylesheet").attr
("href", "styles/main.css").attr
("type", "text/css").attr
("media", "screen")
931 redef fun body
do header
934 # Generate a clickable graphviz image using a dot content
935 fun generate_dot
(dot
: String, name
: String, alt
: String) do
936 if opt_nodot
then return
937 var file
= new OFStream.open
("{self.destinationdir}/{name}.dot")
940 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 ; \}")
941 open
("article").add_class
("graph")
942 add
("img").attr
("src", "{name}.png").attr
("usemap", "#{name}").attr
("style", "margin:auto").attr
("alt", "{alt}")
944 var fmap
= new IFStream.open
("{self.destinationdir}/{name}.map")
945 add_html
(fmap
.read_all
)
952 private fun comment
: String do
954 if n_moduledecl
is null or n_moduledecl
.n_doc
is null then ret
955 if n_moduledecl
.n_doc
is null then return ""
956 for t
in n_moduledecl
.n_doc
.n_comment
do
957 ret
+= "{t.text.replace("# ", "")}"
962 private fun short_comment
: String do
964 if n_moduledecl
!= null and n_moduledecl
.n_doc
!= null then
965 var txt
= n_moduledecl
.n_doc
.n_comment
.first
.text
966 txt
= txt
.replace
("# ", "")
967 txt
= txt
.replace
("\n", "")
976 var amodule
: nullable AModule
978 # Get the list of all methods in a module
979 fun imported_methods
: Set[MMethod] do
980 var methods
= new HashSet[MMethod]
981 for mclass
in imported_mclasses
do
982 for method
in mclass
.intro_methods
do
989 # Get the list aof all refined methods in a module
990 fun redef_methods
: Set[MMethod] do
991 var methods
= new HashSet[MMethod]
992 for mclass
in redef_mclasses
do
993 for method
in mclass
.intro_methods
do
1001 redef class MProperty
1004 var apropdef
: nullable APropdef
1006 redef init(intro_mclassdef
: MClassDef, name
: String, visibility
: MVisibility)
1012 fun local_class
: MClass do
1013 var classdef
= self.intro_mclassdef
1014 return classdef
.mclass
1017 fun class_text
: String do
1018 return local_class
.name
1021 fun link_anchor
: String do
1022 return "{class_text}.html#{anchor}"
1025 fun anchor
: String do
1026 return "PROP_{c_name}"
1033 # Associate all MMethods to each MModule concerns
1034 fun all_methods
: HashMap[MModule, Set[MMethod]] do
1035 var hm
= new HashMap[MModule, Set[MMethod]]
1036 for mmodule
, childs
in concerns
do
1037 if not hm
.has_key
(mmodule
) then hm
[mmodule
] = new HashSet[MMethod]
1038 for prop
in intro_methods
do
1039 if mmodule
== prop
.intro_mclassdef
.mmodule
then
1040 prop
.is_redef
= false
1041 hm
[mmodule
].add
(prop
)
1044 for prop
in redef_methods
do
1045 if mmodule
== prop
.intro_mclassdef
.mmodule
then
1046 prop
.is_redef
= true
1047 hm
[mmodule
].add
(prop
)
1051 if childs
!= null then
1052 for child
in childs
do
1053 if not hm
.has_key
(child
) then hm
[child
] = new HashSet[MMethod]
1054 for prop
in intro_methods
do
1055 if child
== prop
.intro_mclassdef
.mmodule
then
1056 prop
.is_redef
= false
1060 for prop
in redef_methods
do
1061 if child
== prop
.intro_mclassdef
.mmodule
then
1062 prop
.is_redef
= true
1072 fun public_owner
: MModule do
1073 var owner
= intro_mmodule
1074 if owner
.public_owner
is null then
1077 return owner
.public_owner
.as(not null)
1081 # Associate Amodule to all MModule concern by 'self'
1082 fun amodule
(amodules
: HashMap[MModule, AModule]) do
1083 for owner
, childs
in concerns
do
1084 if childs
!= null then for child
in childs
do child
.amodule
= amodules
[child
]
1085 owner
.amodule
= amodules
[owner
]
1089 # Associate MClass to all MMethod include in 'inherited_methods'
1090 fun inherited
: HashMap[MClass, Set[MMethod]] do
1091 var hm
= new HashMap[MClass, Set[MMethod]]
1092 for method
in inherited_methods
do
1093 var mclass
= method
.intro_mclassdef
.mclass
1094 if not hm
.has_key
(mclass
) then hm
[mclass
] = new HashSet[MMethod]
1095 hm
[mclass
].add
(method
)
1100 # Return true if MModule concern contain subMModule
1101 fun has_mmodule
(sub
: MModule): Bool do
1102 for mmodule
, childs
in concerns
do
1103 if childs
is null then continue
1104 if childs
.has
(sub
) then return true
1109 fun mmethod
(mprop2npropdef
: Map[MProperty, APropdef]) do
1110 for const
in constructors
do
1111 if mprop2npropdef
.has_key
(const
)then
1112 const
.apropdef
= mprop2npropdef
[const
].as(AMethPropdef)
1116 for intro
in intro_methods
do
1117 if mprop2npropdef
.has_key
(intro
)then
1118 if mprop2npropdef
[intro
] isa AMethPropdef then intro
.apropdef
= mprop2npropdef
[intro
].as(AMethPropdef)
1122 for rd
in redef_methods
do
1123 if mprop2npropdef
.has_key
(rd
)then
1124 if mprop2npropdef
[rd
] isa AMethPropdef then rd
.apropdef
= mprop2npropdef
[rd
].as(AMethPropdef)
1129 fun link_anchor
: String do
1130 return "{name}.html"
1135 redef class AStdClassdef
1136 private fun comment
: String do
1138 if n_doc
!= null then
1139 for t
in n_doc
.n_comment
do
1140 var txt
= t
.text
.replace
("# ", "")
1141 txt
= txt
.replace
("#", "")
1148 private fun short_comment
: String do
1150 if n_doc
!= null then
1151 var txt
= n_doc
.n_comment
.first
.text
1152 txt
= txt
.replace
("# ", "")
1153 txt
= txt
.replace
("\n", "")
1160 redef class ASignature
1164 if not n_params
.is_empty
then
1165 ret
= "{ret}({n_params.join(", ")})"
1167 if n_type
!= null and n_type
.to_s
!= "" then ret
+= " {n_type.to_s}"
1174 var ret
= "{n_id.text}"
1175 if n_type
!= null then
1176 ret
= "{ret}: {n_type.to_s}"
1177 if n_dotdotdot
!= null then ret
= "{ret}..."
1185 var ret
= "<a href=\"{n_id.text}.html\
">{n_id.text}</a>"
1186 if n_kwnullable
!= null then ret
= "nullable {ret}"
1187 if not n_types
.is_empty
then ret
= "{ret}[{n_types.join(", ")}]"
1192 redef class APropdef
1193 private fun short_comment
: String is abstract
1194 private fun signature
: String is abstract
1195 private fun comment
: String is abstract
1198 redef class AAttrPropdef
1199 redef fun short_comment
do
1201 if n_doc
!= null then
1202 var txt
= n_doc
.n_comment
.first
.text
1203 txt
= txt
.replace
("# ", "")
1204 txt
= txt
.replace
("\n", "")
1211 redef class AMethPropdef
1212 redef fun short_comment
do
1214 if n_doc
!= null then
1215 var txt
= n_doc
.n_comment
.first
.text
1216 txt
= txt
.replace
("# ", "")
1217 txt
= txt
.replace
("\n", "")
1223 redef fun signature
: String do
1225 if n_signature
!= null then sign
= " {n_signature.to_s}"
1229 redef private fun comment
: String do
1231 if n_doc
!= null then
1232 for t
in n_doc
.n_comment
do
1233 var txt
= t
.text
.replace
("# ", "")
1234 txt
= txt
.replace
("#", "")
1242 redef class MClassDef
1243 private fun namespace
(mclass
: MClass): String do
1245 if mmodule
.public_owner
is null then
1246 return "{mmodule.full_name}::{mclass.name}"
1247 else if mclass
is self.mclass
then
1248 return "{mmodule.public_owner.name}::{mclass.name}"
1250 return "{mmodule.public_owner.name}::<a href=\"{mclass.name}.html\
">{mclass.name}</a>"
1257 return to_a
[length-1
]
1261 # Create a tool context to handle options and paths
1262 var toolcontext
= new ToolContext
1263 toolcontext
.process_options
1265 # Here we launch the nit index
1266 var nitdoc
= new Nitdoc(toolcontext
)