X-Git-Url: http://git.roojs.org/?p=gnome.introspection-doc-generator;a=blobdiff_plain;f=JSDOC%2FBuildDocs.js;h=fac451dccc6c60443b1ee5720135e44a0bbc285b;hp=54592a45d39667c877c2c860fafcb3cf289fcb2c;hb=7e0c58e6c06915dad40a04b582612b60175c4fee;hpb=3910df3eaa11f7e3e53d089951303bb5e680e47d diff --git a/JSDOC/BuildDocs.js b/JSDOC/BuildDocs.js index 54592a4..fac451d 100644 --- a/JSDOC/BuildDocs.js +++ b/JSDOC/BuildDocs.js @@ -4,273 +4,358 @@ @namespace */ -Options = import.Options.Options; -XObject = import.XObject.XObject; +XObject = imports.XObject.XObject; +File = imports.File.File; + +Template = imports.JsTemplate.Template.Template; + + +Parser = imports.Parser.Parser; + +TokenReader = imports.TokenReader.TokenReader; +TokenStream = imports.TokenStream.TokenStream; +Symbol = imports.Symbol.Symbol; /****************** INCLUDES ARE ALL AT THE BOTTOM OF THIS FILE!!!!! *******************/ // should not realy be here -- or anywhere...?? - +Options = false; // refer to this everywhere! BuildDocs = { VERSION : "2.0.0", - /** - * apply properties to an object - * - * @param object to get properties (eg. JSDOC.Token.prototype) - * @param object of properties, - eg. a list of all the methods - * @param default (optional) -- no idea :) - */ + + + srcFiles : [], build : function (opts) { - - XObject.extend(Options, opts); - + Options = opts; Options.init(); - - - Options.LOG.inform("JsDoc Toolkit main() running at "+new Date()+"."); - Options.LOG.inform("With options: "); - - // the -c option: use a configuration file - not supported at present.. + //Options.LOG.inform("With options: "); - - + if (Options.cacheDirectory.length && !File.isDirectory(Options.cacheDirectory)) { + File.mkdir(Options.cacheDirectory) + } + + Options.srcFiles = this._getSrcFiles(); + this._parseSrcFiles(); + this.symbolSet = Parser.symbols; + // this currently uses the concept of publish.js... + + this.publish(); }, - - - - - apply : function(o, c, defaults){ - if(defaults){ - // no "this" reference for friendly out of scope calls - JSDOC.apply(o, defaults); + _getSrcFiles : function() + { + this.srcFiles = []; + + var ext = ["js"]; + if (Options.ext) { + ext = Options.ext.split(",").map(function($) {return $.toLowerCase()}); } - if(o && c && typeof c == 'object'){ - for(var p in c){ - o[p] = c[p]; - } + + for (var i = 0; i < Options.src.length; i++) { + this.srcFiles = this.srcFiles.concat( + + File.list(Options.src[i] ).filter( + function($) { + var thisExt = $.split(".").pop().toLowerCase(); + return (ext.indexOf(thisExt) > -1); // || thisExt in JSDOC.handlers); + // we're only interested in files with certain extensions + } + ) + ); } - return o; - }, - - /** - * Qdump is used to generated cache dumps of objects - * @arg mixed t - object/array to dump - * @arg string prefix output with - * @arg string suffix output with - * @arg mixed defaults for the object - so they are not dumped.. - */ - - toQDump : function(t, pref, suf, defs) + return this.srcFiles; + }, + + _parseSrcFiles : function() { - //println("got ToDump: " + pref +" ??? " + suf); - //var ret = "JSDOC.Symbol.fromDump("; - var qret = ""; - defs = (typeof(defs) == "undefined") ? {} : defs; - - var isAr = t.constructor == Array; - var k = ''; - var v = ''; - for (var i in t) { - // println("dump: " + i + " : " +typeof(t[i])); - - if (!isAr) { - k = typeof(i) == "number" ? i +":" : i.toSource()+":" ; - } else { - if (typeof(i) != "number") { - continue; - } - - } - - v = t[i]; - //} else { - // v = i; - //} - - + Parser.init(); + + for (var i = 0, l = this.srcFiles.length; i < l; i++) { - var def = defs[i]; - //if ((typeof(defs[i]) != 'undefined') && (v.toSource() == defs[i]).toSource()) { - // continue; - //} + var srcFile = this.srcFiles[i]; + var cacheFile = Options.cacheDirectory + srcFile.replace(/\//g, '_') + ".cache"; + //println(cacheFile); + // disabled at present!@!! - switch(typeof(v)) { - case "function": - continue; - - - - case 'string': - if (def == v) { - continue; - } + if (false && !Options.disablecache && File.exists(cacheFile)) { + // check filetime? - if (!v.length) { // ?? skip empty!! - continue; - } - - if (qret.length) { - qret+=","; - } - - qret += k + v.toSource(); - continue; - case 'boolean': - - case 'number': - if (def == v) { - continue; - } - if (qret.length) { - qret+=","; - } - - qret += k + v; + var c_mt = File.getTimes(cacheFile); + var o_mt = File.getTimes(srcFile); + //println(c_mt.toSource()); + // println(o_mt.toSource()); + + // this check does not appear to work according to the doc's - need to check it out. + + if (c_mt[0] > o_mt[0]) { // cached time > original time! + // use the cached mtimes.. + var syms = JSON.parse(File.read(cacheFile)); - continue; - - // undefined? - case "object": + throw "Conversion of cache not done yet!"; - //if (i == 'tags') { - // println(k +"?:" + (v.constructor == Array ? "ARRAY" : "OBJECT")); - //} - - // what about raw objects... - if (v.constructor == Array) { - //println("ARRAYLEN:" + v.length); - var toadd = JSDOC.toQDump(v, '[', ']'); - if (k == 'tags') { - println("Array: " + toadd); - } - - if (toadd == "[]") { - continue; - } - - if (qret.length) { - qret+=","; - } - qret += k + toadd; - //println("AFT AR:" + qret); - continue; - } - if (v.constructor == Object) { - var toadd = JSDOC.toQDump(v, '{', '}'); - if (toadd == "{}") { - continue; - } - - if (qret.length) { - qret+=","; - } - qret += k + toadd; - //println("AFT AR:" + qret); - continue; - } - //println("v:toQdump" + typeof(v['toQDump'])); - if (typeof(v['toQDump']) != "undefined") { - if (qret.length) { - qret+=","; - } - - qret += k + v.toQDump(v); - continue; + for (var sy in syms) { + //println("ADD:" + sy ); + Parser.symbols.addSymbol(syms[sy]); } - println("SKIP " + i + " : " +typeof(t[i]) + ":" + t[i].toSource()); continue; - - default: - println("SKIP " + i + " : " +typeof(t[i]) ); - - continue; - + } } - } - // println(qret); - //throw "done"; - return pref + qret + suf; - }, - /** - * - * Depreciated - use Script.prettyDump() - cant remember real name.. - * - * - */ - - prettyDump : function(src) - { - // println("tidy SRC"); - return Script.prettyDump(src); - /* - var ar = Script.tokenize(src); - println("tidy" + ar.length); - var eret = ''; - var indent = ""; - var lbr = 0; - - // this is reallllllllly sloooooowwwwww!!! = perhaps we should just dump it straight to the file!!! - - for( var i =0 ;i< ar.length; i++) { - //println(ar[i].toSource()); - var tok = ar[i]; - //println("tidy" + i + ":" + tok.val); - if ( (tok.val == '{') || (tok.val == '[') || (tok.val == '(') ) { - indent += " "; - eret += tok.val; - lbr = true; - continue; + var src = '' + try { + src = File.read(srcFile); } - if ( (tok.val == '}') || (tok.val == ']') || (tok.val == ')') ) { - - indent = indent.substring(2); // strip spaces.. - if (i < (ar.length-1) && ar[i+1].val == ',') { - ar[i].val +=","; - i++; - - } - eret += (lbr ? "" : "\n" + indent ) + tok.val ; - lbr = true; - continue; - } - if ( (tok.val == ',')) { - eret += tok.val; - lbr = true; + catch(e) { + LOG.warn("Can't read source file '"+srcFile+"': "+e.message); continue; } - if (lbr) { - eret += "\n" + indent; - } - lbr = false; - eret += tok.val; + + + var tr = new TokenReader(); + var ts = new TokenStream(tr.tokenize(src)); + + Parser.parse(ts, srcFile); + + //var outstr = JSON.stringify( + // Parser.filesSymbols[srcFile]._index + //); + //File.write(cacheFile, outstr); + + + // } + } + + + + Parser.finish(); + }, + + + + publish : function() { + + + // link!!! + + + + if (!File.exists(Options.target)) + File.mkdir(Options.target); + if (!File.exists(Options.target+"/symbols")) + File.mkdir(Options.target+"/symbols"); + if (!File.exists(Options.target+"/symbols/src")) + File.mkdir(Options.target+"/symbols/src"); + + // copy everything in 'static' into + File.list(Options.templatesDir + '/static').forEach(function (f) { + File.copy(Options.templatesDir + '/static/' + f, Options.target + '/' + f); + }); + if (!File.isDirectory(Options.target +"/json")) { + File.makeDir(Options.target +"/json"); + } + + // used to check the details of things being linked to + Link.symbolSet = symbolSet; + Link.base = "../"; + + var classTemplate = new Template({ + templateFile : Options.templatesDir + "/class.tmpl", + Link : Link + }); + var classesTemplate = new Template({ + templateFile : Options.templatesDir +"/allclasses.tmpl", + Link : Link + }); + var classesindexTemplate = new Template({ + templateFile : Options.templatesDir +"/index.tmpl", + Link : Link + }); + var fileindexTemplate = new Template({ + templateFile : Options.templatesDir +"/allfiles.tmpl", + Link: Link + }); + + + classTemplate.symbolSet = symbolSet; + + + function hasNoParent($) { + return ($.memberOf == "") + } + function isaFile($) { + return ($.is("FILE")) + } + function isaClass($) { + return ($.is("CONSTRUCTOR") || $.isNamespace); + } + + var symbols = symbolSet.toArray(); + + var files = Options.srcFiles; + + for (var i = 0, l = files.length; i < l; i++) { + var file = files[i]; + var targetDir = Options.target + "/symbols/src/"; + this.makeSrcFile(file, targetDir); + } + + var classes = symbols.filter(isaClass).sort(makeSortby("alias")); + + var classesIndex = classesTemplate.process(classes); // kept in memory + + + + for (var i = 0, l = classes.length; i < l; i++) { + var symbol = classes[i]; + var output = ""; + File.write(Options.target+"/symbols/" +symbol.alias+'.' + Options.publishExt , + classTemplate.process(symbol)); - } - return eret; - */ - } + print("write " + Options.target+"/symbols/" +symbol.alias+'.' + Options.publishExt); + + // dump out a + + this.publishJSON(Options.target+"/json/", symbol.alias+'.json', symbol) + + + + } + + // regenrate the index with different relative links + Link.base = ""; + var classesIndex = classesTemplate.process(classes); + + + + File.write(Options.target + "/index."+ Options.publishExt, + classesindexTemplate.process(classes) + ); + + // blank everything???? classesindexTemplate = classesIndex = classes = null; + + + + var documentedFiles = symbols.filter(function ($) { + return ($.is("FILE")) + }); + + var allFiles = []; + + for (var i = 0; i < files.length; i++) { + allFiles.push(new Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */"))); + } + + for (var i = 0; i < documentedFiles.length; i++) { + var offset = files.indexOf(documentedFiles[i].alias); + allFiles[offset] = documentedFiles[i]; + } + + allFiles = allFiles.sort(makeSortby("name")); + File.write(Options.target , "/files."+Options.publishExt, + fileindexTemplate.process(allFiles) + ); + + }, + publishJSON : function(file, data) + { + // what we need to output to be usefull... + // a) props.. + var cfgProperties = []; + if (!data.comment.getTag('singleton').length) { + cfgProperties = data.configToArray(); + cfgProperties = cfgProperties.sort(makeSortby("name")); + + } + var props = []; + //println(cfgProperties.toSource()); + var p =''; + for(var i =0; i < cfgProperties.length;i++) { + p = cfgProperties[i]; + props.push( { + name : p.name, + type : p.type, + desc : p.desc, + memberOf : p.memberOf == data.alias ? '' : p.memberOf + }); + } + + + var ownEvents = data.methods.filter( function(e){ + return e.isEvent && !e.comment.getTag('hide').length; + }).sort(makeSortby("name")); + + + var events = []; + var m; + for(var i =0; i < ownEvents.length;i++) { + m = ownEvents[i]; + events.push( { + name : m.name.substring(1), + sig : makeFuncSkel(m.params), + type : 'function', + desc : m.desc + }); + } + //println(props.toSource()); + // we need to output: + //classname => { + // propname => + // type=> + // desc=> + // } + + var ret = { + props : props, + events: events + }; + File.write(file, JSON.stringify(ret, null, 2 )); + + + // b) methods + // c) events + + + }, + makeSrcFile: function(sourceFile) + { + + + name = sourceFile.substring(Options.baseDir.length); + name = name.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_"); + name = name.replace(/\:/g, "_"); //?? + + + var pretty = imports.PrettyPrint.toPretty(File.read(sourceFile)); + File.write(Options.target+"/symbols/src/" + name, + '' + + '' + sourceFile + '' + + '' + + '' + + pretty + + ''); + } + };