X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=JSDOC%2FBuildDocs.js;h=0a54cdaa1ad2029271544926024b5d74726d736e;hb=946745c31f55545d8c128520983b09079e747109;hp=882b759cd93560d217e191b0962a0e95560709ef;hpb=fe14b1c96929b57b42af46aa1388dce96e4a19e9;p=gnome.introspection-doc-generator diff --git a/JSDOC/BuildDocs.js b/JSDOC/BuildDocs.js index 882b759..845b7a2 100644 --- a/JSDOC/BuildDocs.js +++ b/JSDOC/BuildDocs.js @@ -3,20 +3,38 @@ This is the main container for the JSDOC application. @namespace */ +Gio = imports.gi.Gio; +XObject = imports.XObject.XObject; +File = imports.File.File; -XObject = import.XObject.XObject; -File = import.File.File; +Template = imports.JsTemplate.Template.Template; +Link = imports.JsTemplate.Link.Link; // ?? fixme!?? -Options = import.Options.Options; -Parser = import.Parser.Parser; +Parser = imports.Parser.Parser; +TextStream = imports.TextStream.TextStream; +TokenReader = imports.TokenReader.TokenReader; +TokenStream = imports.TokenStream.TokenStream; +Symbol = imports.Symbol.Symbol; +DocComment = imports.DocComment.DocComment; /****************** INCLUDES ARE ALL AT THE BOTTOM OF THIS FILE!!!!! *******************/ // should not realy be here -- or anywhere...?? +function makeSortby(attribute) { + return function(a, b) { + if (a[attribute] != undefined && b[attribute] != undefined) { + a = a[attribute]; //.toLowerCase(); + b = b[attribute];//.toLowerCase(); + if (a < b) return -1; + if (a > b) return 1; + return 0; + } + } +} - +Options = false; // refer to this everywhere! BuildDocs = { @@ -26,29 +44,26 @@ BuildDocs = { 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: "); + //Options.LOG.inform("With options: "); - if (!File.isDirectory(Options.cacheDirectory)) { + 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(); @@ -58,23 +73,28 @@ BuildDocs = { _getSrcFiles : function() { this.srcFiles = []; - + var _this = this; var ext = ["js"]; - if (JSDOC.opt.x) { - ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()}); + if (Options.ext) { + ext = Options.ext.split(",").map(function($) {return $.toLowerCase()}); } - for (var i = 0; i < JSDOC.opt._.length; i++) { - this.srcFiles = this.srcFiles.concat( - IO.ls(JSDOC.opt._[i], JSDOC.opt.r).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 - } - ) - ); + for (var i = 0; i < Options.src.length; i++) { + // add to sourcefiles.. + + File.list(Options.src[i] ).forEach(function($) { + if (Options['exclude-src'].indexOf($) > -1) { + return; + } + var thisExt = $.split(".").pop().toLowerCase(); + if (ext.indexOf(thisExt) < 0) { + return; + } + _this.srcFiles.push(Options.src[i] + '/' + $); + }); + } - + //Seed.print(JSON.stringify(this.srcFiles, null,4));Seed.quit(); return this.srcFiles; }, @@ -88,9 +108,11 @@ BuildDocs = { var cacheFile = Options.cacheDirectory + srcFile.replace(/\//g, '_') + ".cache"; - println(cacheFile); - if (!JSDOC.opt.C && File.exists(cacheFile)) { + //println(cacheFile); + // disabled at present!@!! + + if (false && !Options.disablecache && File.exists(cacheFile)) { // check filetime? var c_mt = File.getTimes(cacheFile); @@ -102,59 +124,310 @@ BuildDocs = { if (c_mt[0] > o_mt[0]) { // cached time > original time! // use the cached mtimes.. - var syms = {}; + var syms = JSON.parse(File.read(cacheFile)); - eval("syms = " + File.read(cacheFile)); + throw "Conversion of cache not done yet!"; for (var sy in syms) { //println("ADD:" + sy ); - JSDOC.Parser.symbols.addSymbol(syms[sy]); + Parser.symbols.addSymbol(syms[sy]); } continue; } } + var src = '' try { - var src = IO.readFile(srcFile); + Options.LOG.inform("reading : " + srcFile); + src = File.read(srcFile); } catch(e) { - LOG.warn("Can't read source file '"+srcFile+"': "+e.message); + Options.LOG.warn("Can't read source file '"+srcFile+"': "+e.message); + continue; } - // Check to see if there is a handler for this file type - // var ext = FilePath.fileExtension(srcFile); - // if (JSDOC.handlers[ext]) { - // LOG.inform(" Using external handler for '" + ext + "'"); - // - // symbols = symbols.concat(JSDOC.handlers[ext].handle(srcFile, src)); - // symbols.handler = JSDOC.handlers[ext]; - // } - // else { - // The default (JSDOC) handler - var tr = new JSDOC.TokenReader(); - var ts = new JSDOC.TokenStream(tr.tokenize(src)); - - JSDOC.Parser.parse(ts, srcFile); - // println("Symbols: " + JSDOC.Parser.symbols.keys().toSource()); - var outstr = JSDOC.prettyDump(JSDOC.toQDump(JSDOC.Parser.filesSymbols[JSDOC.Symbol.srcFile]._index,'{','}')) - - //if (outstr.length > 3) { - // dont cache crap.. - File.write(cacheFile, outstr); - //} + var txs = new TextStream(src); + + var tr = new TokenReader({ keepComments : true, keepWhite : true , sepIdents: false }); + + var ts = new TokenStream(tr.tokenize(txs)); + + Parser.parse(ts, srcFile); + + //var outstr = JSON.stringify( + // Parser.filesSymbols[srcFile]._index + //); + //File.write(cacheFile, outstr); + // } } - JSDOC.Parser.finish(); - } + Parser.finish(); + }, + publish : function() { + Options.LOG.inform("Publishing"); + + // link!!! + + + Options.LOG.inform("Making directories"); + if (!File.isDirectory(Options.target)) + File.mkdir(Options.target); + if (!File.isDirectory(Options.target+"/symbols")) + File.mkdir(Options.target+"/symbols"); + if (!File.isDirectory(Options.target+"/symbols/src")) + File.mkdir(Options.target+"/symbols/src"); + + if (!File.isDirectory(Options.target +"/json")) { + File.mkdir(Options.target +"/json"); + } + + Options.LOG.inform("Copying files from static: " +Options.templateDir); + // copy everything in 'static' into + File.list(Options.templateDir + '/static').forEach(function (f) { + Options.LOG.inform("Copy " + Options.templateDir + '/static/' + f + ' to ' + Options.target + '/' + f); + File.copyFile(Options.templateDir + '/static/' + f, Options.target + '/' + f, Gio.FileCopyFlags.OVERWRITE); + }); + + + Options.LOG.inform("Setting up templates"); + // used to check the details of things being linked to + Link.symbolSet = this.symbolSet; + Link.base = "../"; + + Link.srcFileFlatName = this.srcFileFlatName; + Link.srcFileRelName = this.srcFileRelName; + + var classTemplate = new Template({ + templateFile : Options.templateDir + "/class.html", + Link : Link + }); + var classesTemplate = new Template({ + templateFile : Options.templateDir +"/allclasses.html", + Link : Link + }); + var classesindexTemplate = new Template({ + templateFile : Options.templateDir +"/index.html", + Link : Link + }); + var fileindexTemplate = new Template({ + templateFile : Options.templateDir +"/allfiles.html", + Link: Link + }); + + + classTemplate.symbolSet = this.symbolSet; + + + function hasNoParent($) { + return ($.memberOf == "") + } + function isaFile($) { + return ($.is("FILE")) + } + function isaClass($) { + return ($.is("CONSTRUCTOR") || $.isNamespace); + } + + + + + + + + + + + var symbols = this.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")); + + //Options.LOG.inform("classTemplate Process : all classes"); + + // var classesIndex = classesTemplate.process(classes); // kept in memory + + Options.LOG.inform("iterate classes"); + + for (var i = 0, l = classes.length; i < l; i++) { + var symbol = classes[i]; + var output = ""; + + Options.LOG.inform("classTemplate Process : " + symbol.alias); + + File.write(Options.target+"/symbols/" +symbol.alias+'.' + Options.publishExt , + classTemplate.process(symbol)); + + + + // 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); + + Options.LOG.inform("build index"); + + 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 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")); + Options.LOG.inform("write files index"); + + File.write(Options.target + "/files."+Options.publishExt, + fileindexTemplate.process(allFiles) + ); + + }, + /** + * JSON files are lookup files for the documentation + * - can be used by IDE's or AJAX based doc tools + * + * + */ + 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 : this.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 + + + }, + srcFileRelName : function(sourceFile) + { + return sourceFile.substring(Options.baseDir.length+1); + }, + srcFileFlatName: function(sourceFile) + { + var name = this.srcFileRelName(sourceFile); + name = name.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_"); + return name.replace(/\:/g, "_"); //?? + + }, + + makeSrcFile: function(sourceFile) + { + // this stuff works... - + + var name = this.srcFileFlatName(sourceFile); + + Options.LOG.inform("Write Source file : " + Options.target+"/symbols/src/" + name); + var pretty = imports.PrettyPrint.toPretty(File.read( sourceFile)); + File.write(Options.target+"/symbols/src/" + name, + '' + + '' + sourceFile + '' + + '' + + '' + + pretty + + ''); + }, + /** + * used by JSON output to generate a function skeleton + */ + makeFuncSkel :function(params) { + if (!params) return "function ()\n{\n\n}"; + return "function (" + + params.filter( + function($) { + return $.name.indexOf(".") == -1; // don't show config params in signature + } + ).map( function($) { return $.name == 'this' ? '_self' : $.name; } ).join(", ") + + ")\n{\n\n}"; + } + + };