src/doc: introduce option --no-render in HTML phase.
[nit.git] / src / nitdoc.nit
index 947d1bd..1e6059b 100644 (file)
 # limitations under the License.
 
 # Documentation generator for the nit language.
+#
 # Generate API documentation in HTML format from nit source code.
 module nitdoc
 
 import modelbuilder
 import doc
+import counter
 
-# process options
+redef class ToolContext
+       # Nitdoc generation phase.
+       var docphase: Phase = new Nitdoc(self, null)
+
+       # File pattern used to link documentation to source code.
+       var opt_test = new OptionBool("print test data", "--test")
+
+       redef init do
+               super
+               option_context.add_option(opt_test)
+       end
+end
+
+# Nitdoc phase explores the model and generate pages for each mentities found
+private class Nitdoc
+       super Phase
+       redef fun process_mainmodule(mainmodule, mmodules)
+       do
+               var doc = new DocModel(mainmodule.model, mainmodule)
+
+               var phases = [
+                       new ExtractionPhase(toolcontext, doc),
+                       new IndexingPhase(toolcontext, doc),
+                       new MakePagePhase(toolcontext, doc),
+                       new POSetPhase(toolcontext, doc),
+                       new ConcernsPhase(toolcontext, doc),
+                       new StructurePhase(toolcontext, doc),
+                       new InheritanceListsPhase(toolcontext, doc),
+                       new IntroRedefListPhase(toolcontext, doc),
+                       new LinListPhase(toolcontext, doc),
+                       new GraphPhase(toolcontext, doc),
+                       new ReadmePhase(toolcontext, doc),
+                       new RenderHTMLPhase(toolcontext, doc): DocPhase]
+
+               for phase in phases do
+                       toolcontext.info("# {phase.class_name}", 1)
+                       phase.apply
+               end
+
+               if toolcontext.opt_test.value then
+                       # Pages metrics
+                       var page_counter = new Counter[String]
+                       var pages = doc.pages.keys.to_a
+                       default_comparator.sort(pages)
+                       for title in pages do
+                               var page = doc.pages[title]
+                               page_counter.inc page.class_name
+                               print page.pretty_print.write_to_string
+                       end
+                       print "Generated {doc.pages.length} pages"
+                       page_counter.print_elements(100)
+                       # Model metrics
+                       var model_counter = new Counter[String]
+                       for mentity in doc.mentities do
+                               model_counter.inc mentity.class_name
+                       end
+                       print "Found {doc.mentities.length} mentities"
+                       model_counter.print_elements(100)
+               end
+       end
+end
+
+# build toolcontext
 var toolcontext = new ToolContext
+var tpl = new Template
+tpl.add "Usage: nitdoc [OPTION]... <file.nit>...\n"
+tpl.add "Generates HTML pages of API documentation from Nit source files."
+toolcontext.tooldescription = tpl.write_to_string
+
+# process options
 toolcontext.process_options(args)
 var arguments = toolcontext.option_context.rest
 
 # build model
 var model = new Model
 var mbuilder = new ModelBuilder(model, toolcontext)
-var mmodules = mbuilder.parse(arguments)
+var mmodules = mbuilder.parse_full(arguments)
 
+# process
 if mmodules.is_empty then return
 mbuilder.run_phases
-var mainmodule: MModule
-if mmodules.length == 1 then
-       mainmodule = mmodules.first
-else
-       mainmodule = new MModule(model, null, "<main>", new Location(null, 0, 0, 0, 0))
-       mainmodule.is_fictive = true
-       mainmodule.set_imported_mmodules(mmodules)
-end
-
-# generate doc
-var nitdoc = new Nitdoc(toolcontext, model, mainmodule)
-nitdoc.generate
-
+toolcontext.run_global_phases(mmodules)