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()
49 for (var i = 0, l = this.packer.files.length; i < l; i++) {
51 var srcFile = this.srcFiles[i];
54 var cacheFile = !Options.cacheDirectory.length ? false :
55 Options.cacheDirectory + srcFile.replace(/\//g, '_') + ".cache";
58 // disabled at present!@!!
60 if (cacheFile && File.exists(cacheFile)) {
63 var c_mt = File.mtime(cacheFile);
64 var o_mt = File.mtime(srcFile);
65 //println(c_mt.toSource());
66 // println(o_mt.toSource());
68 // this check does not appear to work according to the doc's - need to check it out.
70 if (c_mt > o_mt) { // cached time > original time!
71 // use the cached mtimes..
72 print("Read " + cacheFile);
73 var syms = JSON.parse(File.read(cacheFile), function(k, v) {
75 if (typeof(v) != 'object') {
78 if (typeof(v['*object']) == 'undefined') {
81 var cls = imports[v['*object']][v['*object']];
82 //print(v['*object']);
85 XObject.extend(ret, v);
90 //print("Add sybmols " + cacheFile);
91 for (var sy in syms._index) {
92 // print("ADD:" + sy );
93 Parser.symbols.addSymbol(syms._index[sy]);
101 Options.LOG.inform("reading : " + srcFile);
102 src = File.read(srcFile);
105 Options.LOG.warn("Can't read source file '"+srcFile+"': "+e.message);
109 var txs = new TextStream(src);
111 var tr = new TokenReader({ keepComments : true, keepWhite : true , sepIdents: false });
113 var ts = new TokenStream(tr.tokenize(txs));
115 Parser.parse(ts, srcFile);
118 File.write(cacheFile,
120 Parser.symbolsToObject(srcFile),
126 //var outstr = JSON.stringify(
127 // Parser.filesSymbols[srcFile]._index
129 //File.write(cacheFile, outstr);
142 publish : function() {
143 Options.LOG.inform("Publishing");
148 Options.LOG.inform("Making directories");
149 if (!File.isDirectory(Options.target))
150 File.mkdir(Options.target);
151 if (!File.isDirectory(Options.target+"/symbols"))
152 File.mkdir(Options.target+"/symbols");
153 if (!File.isDirectory(Options.target+"/symbols/src"))
154 File.mkdir(Options.target+"/symbols/src");
156 if (!File.isDirectory(Options.target +"/json")) {
157 File.mkdir(Options.target +"/json");
160 Options.LOG.inform("Copying files from static: " +Options.templateDir);
161 // copy everything in 'static' into
162 File.list(Options.templateDir + '/static').forEach(function (f) {
163 Options.LOG.inform("Copy " + Options.templateDir + '/static/' + f + ' to ' + Options.target + '/' + f);
164 File.copyFile(Options.templateDir + '/static/' + f, Options.target + '/' + f, Gio.FileCopyFlags.OVERWRITE);
168 Options.LOG.inform("Setting up templates");
169 // used to check the details of things being linked to
170 Link.symbolSet = this.symbolSet;
173 Link.srcFileFlatName = this.srcFileFlatName;
174 Link.srcFileRelName = this.srcFileRelName;
176 var classTemplate = new Template({
177 templateFile : Options.templateDir + "/class.html",
180 var classesTemplate = new Template({
181 templateFile : Options.templateDir +"/allclasses.html",
184 var classesindexTemplate = new Template({
185 templateFile : Options.templateDir +"/index.html",
188 var fileindexTemplate = new Template({
189 templateFile : Options.templateDir +"/allfiles.html",
194 classTemplate.symbolSet = this.symbolSet;
197 function hasNoParent($) {
198 return ($.memberOf == "")
200 function isaFile($) {
201 return ($.is("FILE"))
203 function isaClass($) {
204 return ($.is("CONSTRUCTOR") || $.isNamespace || $.isClass);
216 var symbols = this.symbolSet.toArray();
218 var files = Options.srcFiles;
220 for (var i = 0, l = files.length; i < l; i++) {
222 var targetDir = Options.target + "/symbols/src/";
223 this.makeSrcFile(file, targetDir);
225 //print(JSON.stringify(symbols,null,4));
227 var classes = symbols.filter(isaClass).sort(makeSortby("alias"));
229 //Options.LOG.inform("classTemplate Process : all classes");
231 // var classesIndex = classesTemplate.process(classes); // kept in memory
233 Options.LOG.inform("iterate classes");
237 for (var i = 0, l = classes.length; i < l; i++) {
238 var symbol = classes[i];
241 Options.LOG.inform("classTemplate Process : " + symbol.alias);
246 File.write(Options.target+"/symbols/" +symbol.alias+'.' + Options.publishExt ,
247 classTemplate.process(symbol));
249 jsonAll[symbol.alias] = this.publishJSON(symbol);
255 File.write(Options.target+"/json/roodata.json",
263 // regenrate the index with different relative links
265 //var classesIndex = classesTemplate.process(classes);
267 Options.LOG.inform("build index");
269 File.write(Options.target + "/index."+ Options.publishExt,
270 classesindexTemplate.process(classes)
273 // blank everything???? classesindexTemplate = classesIndex = classes = null;
277 var documentedFiles = symbols.filter(function ($) {
278 return ($.is("FILE"))
283 for (var i = 0; i < files.length; i++) {
284 allFiles.push(new Symbol(files[i], [], "FILE", new DocComment("/** */")));
287 for (var i = 0; i < documentedFiles.length; i++) {
288 var offset = files.indexOf(documentedFiles[i].alias);
289 allFiles[offset] = documentedFiles[i];
292 allFiles = allFiles.sort(makeSortby("name"));
293 Options.LOG.inform("write files index");
295 File.write(Options.target + "/files."+Options.publishExt,
296 fileindexTemplate.process(allFiles)
304 * JSON files are lookup files for the documentation
305 * - can be used by IDE's or AJAX based doc tools
309 publishJSON : function(data)
311 // what we need to output to be usefull...
313 var cfgProperties = [];
314 if (!data.comment.getTag('singleton').length) {
315 cfgProperties = data.configToArray();
316 cfgProperties = cfgProperties.sort(makeSortby("alias"));
320 //println(cfgProperties.toSource());
322 for(var i =0; i < cfgProperties.length;i++) {
323 p = cfgProperties[i];
329 memberOf : p.memberOf == data.alias ? '' : p.memberOf
332 add.optvals = p.optvalues;
338 var ownEvents = data.methods.filter( function(e){
339 return e.isEvent && !e.comment.getTag('hide').length;
340 }).sort(makeSortby("name"));
345 for(var i =0; i < ownEvents.length;i++) {
348 name : m.name.substring(1),
349 sig : this.makeFuncSkel(m.params),
355 var ownMethods = data.methods.filter( function(e){
356 return !e.isEvent && !e.comment.getTag('hide').length;
357 }).sort(makeSortby("name"));
362 for(var i =0; i < ownMethods.length;i++) {
366 sig : this.makeMethodSkel(m.params),
372 //println(props.toSource());
373 // we need to output:
394 srcFileRelName : function(sourceFile)
396 return sourceFile.substring(Options.baseDir.length+1);
398 srcFileFlatName: function(sourceFile)
400 var name = this.srcFileRelName(sourceFile);
401 name = name.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_");
402 return name.replace(/\:/g, "_") + '.html'; //??;
406 makeSrcFile: function(sourceFile)
408 // this stuff works...
411 var name = this.srcFileFlatName(sourceFile);
413 Options.LOG.inform("Write Source file : " + Options.target+"/symbols/src/" + name);
414 var pretty = imports.PrettyPrint.toPretty(File.read( sourceFile));
415 File.write(Options.target+"/symbols/src/" + name,
417 '<title>' + sourceFile + '</title>' +
418 '<link rel="stylesheet" type="text/css" href="../../../css/highlight-js.css"/>' +
419 '</head><body class="highlightpage">' +
424 * used by JSON output to generate a function skeleton
426 makeFuncSkel :function(params) {
427 if (!params) return "function ()\n{\n\n}";
428 return "function (" +
431 return $.name.indexOf(".") == -1; // don't show config params in signature
433 ).map( function($) { return $.name == 'this' ? '_self' : $.name; } ).join(", ") +
436 makeMethodSkel :function(params) {
437 if (!params) return "()";
441 return $.name.indexOf(".") == -1; // don't show config params in signature
443 ).map( function($) { return $.type + " " +( $.name == 'this' ? '_self' : $.name ); } ).join(", ") +