X-Git-Url: http://nitlanguage.org
diff --git a/src/nitdoc.nit b/src/nitdoc.nit
index d76c2c2..104bfef 100644
--- a/src/nitdoc.nit
+++ b/src/nitdoc.nit
@@ -24,9 +24,9 @@ import abstracttool
# Store knowledge and facilities to generate files
class DocContext
-special AbstractCompiler
+ super AbstractCompiler
# Destination directory
- readable writable var _dir: String = "."
+ readable writable var _dir: String = "doc"
# Content of a generated file
var _stage_context: StageContext = new StageContext(null)
@@ -65,190 +65,220 @@ special AbstractCompiler
f.close
end
- # Currently computed module
- readable var _module: nullable MMSrcModule
-
- # Is the current directory module computed as a simple modude ?
- readable writable var _inside_mode: Bool = false
-
- # Is the current module computed as a intruded one ?
- readable writable var _intrude_mode: Bool = false
+ # Start a new file
+ fun clear
+ do
+ _stage_context = new StageContext(null)
+ end
- # Compued introducing entities (for the index)
- var _entities: Array[MMEntity] = new Array[MMEntity]
+ # Sorter of entities in alphabetical order
+ var _sorter: AlphaSorter[MMEntity] = new AlphaSorter[MMEntity]
- # Register an entity (for the index)
- fun register(e: MMEntity)
+ # Sort entities in the alphabetical order
+ fun sort(array: Array[MMEntity])
do
- _entities.add(e)
- if e isa MMSrcModule then
- _module = e
- end
+ _sorter.sort(array)
end
- # Start a new file
- fun clear
+ readable var _opt_dir: OptionString = new OptionString("Directory where doc is generated", "-d", "--dir")
+ readable var _opt_source: OptionString = new OptionString("What link for source (%f for filename, %l for first line, %L for last line)", "--source")
+ readable var _opt_public: OptionBool = new OptionBool("Generate only the public API", "--public")
+
+ fun public_only: Bool
do
- _stage_context = new StageContext(null)
+ if self._opt_public.value == true then return true
+ return false
end
- # Generate common files (frames, index, overview)
- fun extract_other_doc
+ # The current processed filename
+ var filename: String
+
+ # The main virtual module
+ var mainmod: nullable MMVirtualModule
+
+ redef fun perform_work(mods)
do
- info("Generating other files",1)
- _module = null
- inside_mode = false
- intrude_mode = false
- clear
- add("
\n")
- add("Overview
\n")
- add("Index
\n")
- var modules = modules.to_a
- sort(modules)
-
- var rootdirs = new Array[MMDirectory]
- for m in modules do
- var md = m.directory
- if md.parent == null and not rootdirs.has(md) then
- rootdirs.add(md)
+ mainmod = new MMVirtualModule(self, mods)
+
+ dir.mkdir
+
+ # Compute the set of direct owned nested modules
+ var owns = new HashMap[MMModule, Array[MMModule]]
+ for mod in modules do
+ owns[mod] = new Array[MMModule]# [mod]
+ end
+ for mod in modules do
+ if mod == mainmod then continue
+ var d = mod.directory
+ loop
+ var o = d.owner
+ if o != null and o != mod then
+ owns[o].add(mod)
+ end
+ var dp = d.parent
+ if dp == null or dp == d then break
+ d = dp
end
end
- var done = new Array[MMModule]
- for root in rootdirs do
- var dirstack = [root]
- var curdir = root
- add("{root.name}
\n")
- var indent = " "
- while not dirstack.is_empty do
- var redo = false
- for m in modules do
- if done.has(m) then continue
- var md = m.directory
- if md.owner == m and md.parent == curdir then
- # It's a directory module
- add("{indent}{m}
\n")
- curdir = md
- dirstack.push(curdir)
- indent = "  " * dirstack.length
- redo = true
- break # restart to preserve alphabetic order
- else if md == curdir then
- if md.owner == m then
- add("{indent}{m}
\n")
- else
- add("{indent}{m}
\n")
- end
- done.add(m)
- redo = true
- end
- end
- if not redo then
- dirstack.pop
- if not dirstack.is_empty then
- curdir = dirstack[dirstack.length-1]
- indent = "  " * dirstack.length
- end
+ # Builds the various module hierarchies
+ var mnh = new PartialOrder[MMModule] # nested module hierarchy
+ var tmh = new PartialOrder[MMModule] # top module import hierrchy
+ var ms = mainmod.mhe.linear_extension.reversed
+ for m in ms do
+ if ms == mainmod then continue
+ m.mnhe_ = mnh.add(m, owns[m])
+ var pub = new Array[MMModule]
+ for m2 in m.mhe.greaters do
+ if m2.toplevel_owner != m2 and m2.toplevel_owner != m.toplevel_owner then continue
+ if m.mnhe <= m2 then continue
+ if m.visibility_for(m2) <= 0 then
+ # nothing
+ else if m.visibility_for(m2) == 1 then
+ else
+ pub.add(m2)
end
end
+ m.tmhe_ = tmh.add(m, pub)
end
- add("\n")
- write_to("{dir}/menu-frame.html")
- clear
- add_header("Index")
- add("\n")
- sort(_entities)
- for e in _entities do
- add("- {e.html_link(self)} - {e.prototype_head(self)} {e}{e.prototype_body(self)} {e.locate(self)}
- {e.short_doc}\n")
- end
- add("