7 class DocBuilder : Object
10 // extractable via JSON?
11 public string VERSION = "1.0.0" { get set };
14 private Packer packer;
16 public DocBuilder (Packer p)
20 GLib.debug("Roo JsDoc Toolkit started at %s ", (new GLib.DateTime()).format("Y/m/d H:i:s"));
24 if (PackerRun.opt_tmp_dir != null && !FileUtils.test(PackerRun.opt_tmp_dir, GLib.FileTest.IS_DIR)) {
25 Posix.mkdir(PackerRun.opt_tmp_dir, 0700);
31 this.symbolSet = DocParser.symbols;
33 // this currently uses the concept of publish.js...
41 * Parse the source files.
45 private void parseSrcFiles()
50 var useCache = PackerRun.opt_cache_dir == null ;
52 for (var i = 0, l = this.packer.files.size; i < l; i++) {
54 var srcFile = this.packer.files.get(i);
58 var cacheFile = PackerRun.opt_cache_dir + srcFile.replace(/\//g, '_') + ".cache";
61 // disabled at present!@!!
63 if (GLib.FileUtils.test(cacheFile, GLib.FileTest.EXISTS)) {
65 var cache_mt = File.new_for_path (cacheFile).queryInfo(FileAttribute.TIME_MODIFIED,
66 GLib.FileQueryInfoFlags.NONE, null).
67 get_modification_time();
68 var original_mt = File.new_for_path (sourceInfo).queryInfo(FileAttribute.TIME_MODIFIED,
69 GLib.FileQueryInfoFlags.NONE, null).
70 get_modification_time();
71 // this check does not appear to work according to the doc's - need to check it out.
73 if (cache_mt > original_mt) { // cached time > original time!
74 // use the cached mtimes..
75 GLib.debug("Read %s" , cacheFile);
76 var parser = new Json.Parser();
77 parser.load_from_file(cacheFile);
78 var ar = parser.get_root ().get_array();
80 for(var i = 0;i < ar.get_length();i++) {
81 var o = ar.get_object_element(i);
82 var sym = Json.gobject_from_data(typeof(Symbol), o) as Symbol;
83 DocParser.symbols.add(sym);
92 GLib.debug("reading : %s" , srcFile);
93 src = GLib.FileUtils.get_contents(srcFile);
95 catch(GLib.FileError e) {
96 GLib.debug("Can't read source file '%s': %s", srcFile, e.to_string());
100 var txs = new TextStream(src);
102 var tr = new TokenReader({ keepComments : true, keepWhite : true , sepIdents: false });
104 var ts = new TokenStream(tr.tokenize(txs));
106 Parser.parse(ts, srcFile);
109 File.write(cacheFile,
111 Parser.symbolsToObject(srcFile),
117 //var outstr = JSON.stringify(
118 // Parser.filesSymbols[srcFile]._index
120 //File.write(cacheFile, outstr);
133 publish : function() {
134 Options.LOG.inform("Publishing");
139 Options.LOG.inform("Making directories");
140 if (!File.isDirectory(Options.target))
141 File.mkdir(Options.target);
142 if (!File.isDirectory(Options.target+"/symbols"))
143 File.mkdir(Options.target+"/symbols");
144 if (!File.isDirectory(Options.target+"/symbols/src"))
145 File.mkdir(Options.target+"/symbols/src");
147 if (!File.isDirectory(Options.target +"/json")) {
148 File.mkdir(Options.target +"/json");
151 Options.LOG.inform("Copying files from static: " +Options.templateDir);
152 // copy everything in 'static' into
153 File.list(Options.templateDir + '/static').forEach(function (f) {
154 Options.LOG.inform("Copy " + Options.templateDir + '/static/' + f + ' to ' + Options.target + '/' + f);
155 File.copyFile(Options.templateDir + '/static/' + f, Options.target + '/' + f, Gio.FileCopyFlags.OVERWRITE);
159 Options.LOG.inform("Setting up templates");
160 // used to check the details of things being linked to
161 Link.symbolSet = this.symbolSet;
164 Link.srcFileFlatName = this.srcFileFlatName;
165 Link.srcFileRelName = this.srcFileRelName;
167 var classTemplate = new Template({
168 templateFile : Options.templateDir + "/class.html",
171 var classesTemplate = new Template({
172 templateFile : Options.templateDir +"/allclasses.html",
175 var classesindexTemplate = new Template({
176 templateFile : Options.templateDir +"/index.html",
179 var fileindexTemplate = new Template({
180 templateFile : Options.templateDir +"/allfiles.html",
185 classTemplate.symbolSet = this.symbolSet;
188 function hasNoParent($) {
189 return ($.memberOf == "")
191 function isaFile($) {
192 return ($.is("FILE"))
194 function isaClass($) {
195 return ($.is("CONSTRUCTOR") || $.isNamespace || $.isClass);
207 var symbols = this.symbolSet.toArray();
209 var files = Options.srcFiles;
211 for (var i = 0, l = files.length; i < l; i++) {
213 var targetDir = Options.target + "/symbols/src/";
214 this.makeSrcFile(file, targetDir);
216 //print(JSON.stringify(symbols,null,4));
218 var classes = symbols.filter(isaClass).sort(makeSortby("alias"));
220 //Options.LOG.inform("classTemplate Process : all classes");
222 // var classesIndex = classesTemplate.process(classes); // kept in memory
224 Options.LOG.inform("iterate classes");
228 for (var i = 0, l = classes.length; i < l; i++) {
229 var symbol = classes[i];
232 Options.LOG.inform("classTemplate Process : " + symbol.alias);
237 File.write(Options.target+"/symbols/" +symbol.alias+'.' + Options.publishExt ,
238 classTemplate.process(symbol));
240 jsonAll[symbol.alias] = this.publishJSON(symbol);
246 File.write(Options.target+"/json/roodata.json",
254 // regenrate the index with different relative links
256 //var classesIndex = classesTemplate.process(classes);
258 Options.LOG.inform("build index");
260 File.write(Options.target + "/index."+ Options.publishExt,
261 classesindexTemplate.process(classes)
264 // blank everything???? classesindexTemplate = classesIndex = classes = null;
268 var documentedFiles = symbols.filter(function ($) {
269 return ($.is("FILE"))
274 for (var i = 0; i < files.length; i++) {
275 allFiles.push(new Symbol(files[i], [], "FILE", new DocComment("/** */")));
278 for (var i = 0; i < documentedFiles.length; i++) {
279 var offset = files.indexOf(documentedFiles[i].alias);
280 allFiles[offset] = documentedFiles[i];
283 allFiles = allFiles.sort(makeSortby("name"));
284 Options.LOG.inform("write files index");
286 File.write(Options.target + "/files."+Options.publishExt,
287 fileindexTemplate.process(allFiles)
295 * JSON files are lookup files for the documentation
296 * - can be used by IDE's or AJAX based doc tools
300 publishJSON : function(data)
302 // what we need to output to be usefull...
304 var cfgProperties = [];
305 if (!data.comment.getTag('singleton').length) {
306 cfgProperties = data.configToArray();
307 cfgProperties = cfgProperties.sort(makeSortby("alias"));
311 //println(cfgProperties.toSource());
313 for(var i =0; i < cfgProperties.length;i++) {
314 p = cfgProperties[i];
320 memberOf : p.memberOf == data.alias ? '' : p.memberOf
323 add.optvals = p.optvalues;
329 var ownEvents = data.methods.filter( function(e){
330 return e.isEvent && !e.comment.getTag('hide').length;
331 }).sort(makeSortby("name"));
336 for(var i =0; i < ownEvents.length;i++) {
339 name : m.name.substring(1),
340 sig : this.makeFuncSkel(m.params),
346 var ownMethods = data.methods.filter( function(e){
347 return !e.isEvent && !e.comment.getTag('hide').length;
348 }).sort(makeSortby("name"));
353 for(var i =0; i < ownMethods.length;i++) {
357 sig : this.makeMethodSkel(m.params),
363 //println(props.toSource());
364 // we need to output:
385 srcFileRelName : function(sourceFile)
387 return sourceFile.substring(Options.baseDir.length+1);
389 srcFileFlatName: function(sourceFile)
391 var name = this.srcFileRelName(sourceFile);
392 name = name.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_");
393 return name.replace(/\:/g, "_") + '.html'; //??;
397 makeSrcFile: function(sourceFile)
399 // this stuff works...
402 var name = this.srcFileFlatName(sourceFile);
404 Options.LOG.inform("Write Source file : " + Options.target+"/symbols/src/" + name);
405 var pretty = imports.PrettyPrint.toPretty(File.read( sourceFile));
406 File.write(Options.target+"/symbols/src/" + name,
408 '<title>' + sourceFile + '</title>' +
409 '<link rel="stylesheet" type="text/css" href="../../../css/highlight-js.css"/>' +
410 '</head><body class="highlightpage">' +
415 * used by JSON output to generate a function skeleton
417 makeFuncSkel :function(params) {
418 if (!params) return "function ()\n{\n\n}";
419 return "function (" +
422 return $.name.indexOf(".") == -1; // don't show config params in signature
424 ).map( function($) { return $.name == 'this' ? '_self' : $.name; } ).join(", ") +
427 makeMethodSkel :function(params) {
428 if (!params) return "()";
432 return $.name.indexOf(".") == -1; // don't show config params in signature
434 ).map( function($) { return $.type + " " +( $.name == 'this' ? '_self' : $.name ); } ).join(", ") +