lib: intro `prompt`, basic Apache 2.0 service to display a prompt
[nit.git] / src / nitdoc.nit
index 02f3bb1..159c771 100644 (file)
@@ -13,6 +13,7 @@
 # limitations under the License.
 
 # Documentation generator for the nit language.
+#
 # Generate API documentation in HTML format from nit source code.
 module nitdoc
 
@@ -20,29 +21,75 @@ import modelbuilder
 import doc
 
 redef class ToolContext
-       var docphase: Phase = new NitdocPhase(self, null)
+       # Nitdoc generation phase.
+       var docphase: Phase = new Nitdoc(self, null)
+
+       # Do not generate documentation for attributes.
+       var opt_no_attributes = new OptionBool("Ignore the attributes", "--no-attributes")
+
+       # Do not generate documentation for private properties.
+       var opt_private = new OptionBool("Also generate private API", "--private")
+
+       redef init do
+               super
+               option_context.add_option(opt_no_attributes, opt_private)
+       end
 end
 
-private class NitdocPhase
+# Nitdoc phase explores the model and generate pages for each mentities found
+private class Nitdoc
        super Phase
        redef fun process_mainmodule(mainmodule, mmodules)
        do
-               # generate doc
-               var nitdoc = new Nitdoc(toolcontext, mainmodule.model, mainmodule)
-               nitdoc.generate
+               var min_visibility = private_visibility
+               if not toolcontext.opt_private.value then min_visibility = protected_visibility
+               var accept_attribute = true
+               if toolcontext.opt_no_attributes.value then accept_attribute = false
+
+               var filters = new ModelFilter(
+                       min_visibility,
+                       accept_attribute = accept_attribute,
+                       accept_fictive = false)
+               var doc = new DocModel(mainmodule.model, mainmodule, filters)
+
+               var phases = [
+                       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),
+                       new DocTestPhase(toolcontext, doc): DocPhase]
+
+               for phase in phases do
+                       toolcontext.info("# {phase.class_name}", 1)
+                       phase.apply
+               end
        end
 end
 
-# process options
+# 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
 toolcontext.run_global_phases(mmodules)