X-Git-Url: http://git.roojs.org/?p=gnome.introspection-doc-generator;a=blobdiff_plain;f=JSDOC%2FPacker.js;h=dde208516007d2ae72fb541999c82f3a23f76135;hp=adf173b0be9214d0be4e683975e30443d652fd5e;hb=db7f0739d8000a3a6acadd881d562ced33a16a3b;hpb=93a7f344554d3f225310d46f330f40893d48eb30 diff --git a/JSDOC/Packer.js b/JSDOC/Packer.js index adf173b..dde2085 100644 --- a/JSDOC/Packer.js +++ b/JSDOC/Packer.js @@ -2,10 +2,12 @@ XObject = imports.XObject.XObject; File = imports.File.File; -TokenReader = imports['JSDOC/TokenReader.js'].TokenReader; -ScopeParser = imports['JSDOC/ScopeParser.js'].ScopeParser; -TokenStream = imports['JSDOC/TokenStream.js'].TokenStream; -CompressWhite = imports['JSDOC/CompressWhite.js'].CompressWhite; +TextStream = imports.TextStream.TextStream; +TokenReader = imports.TokenReader.TokenReader; +ScopeParser = imports.ScopeParser.ScopeParser; +TokenStream = imports.TokenStream.TokenStream; +CompressWhite = imports.CompressWhite.CompressWhite; +Collapse = imports.Collapse.Collapse; GLib = imports.gi.GLib; /** @@ -25,7 +27,7 @@ var x = new Packer({ files : [ "/location/of/file1.js", "/location/of/file2.js", ... ], target : "/tmp/output.js", debugTarget : "/tmp/output.debug.js", // merged file without compression. - translateJson : "/tmp/translate.json", + translateJSON: "/tmp/translate.json", ); @@ -69,17 +71,27 @@ Packer = function(cfg) { XObject.extend(this, cfg); + + if (this.srcfile) { + this.loadSourceFile(); + } + if (!this.files) { throw "No Files"; } - if (!this.target) { - throw "No Target"; - } - + + this.timer = new Date() * 1; + this.packAll(); + } Packer.prototype = { + /** + * @prop srcfiles {String} file containing a list of files/or classes to use. + */ + srcfiles : false, + /** * @prop files {Array} list of files to compress (must be full path) */ @@ -92,27 +104,63 @@ Packer.prototype = { * @prop debugTarget {String} target to write files debug version to (uncompacted)- must be full path. */ debugTarget : '', // merged file without compression. + /** + * @prop tmpDir {String} (optional) where to put the temporary files. + * if you set this, then files will not be cleaned up + */ + tmpDir : '/tmp', - workingDir : '/tmp', - - translateJson : '', // json based list of strings in all files. + translateJSON : '', // json based list of strings in all files. - // set to false to stop translation happening.. + /** + * @prop cleanup {Boolean} (optional) clean up temp files after done - + * Defaults to false if you set tmpDir, otherwise true. + */ + cleanup : true, /** - * Pack the files. - * - * @param {String} batch_path location of batched temporary min files. - * @param {String} compressed_file eg. roo-all.js - * @param {String} debug_file eg. roo-debug.js - * + * @prop prefix {String} (optional) prefix of directory to be stripped of when + * Calculating md5 of filename */ + prefix : '', + out : '', // if no target is specified - then this will contain the result + - packFiles : function() { + loadSourceFile : function() + { + var lines = File.read(this.srcfile).split("\n"); + var _this = this; + lines.forEach(function(f) { + + if (/^\s*\//.test(f) || !/[a-z]+/i.test(f)) { // skip comments.. + return; + } + if (/\.js$/.test(f)) { + _this.files.push( f); + // js file.. + return; + } + + //println("ADD"+ f.replace(/\./g, '/')); + var add = f.replace(/\./g, '/').replace(/\s+/g,'')+'.js'; + if (_this.files.indexOf(f) > -1) { + return; + } + _this.files.push( add ); + + }) + }, + + + packAll : function() // do the packing (run from constructor) + { //this.transOrigFile= bpath + '/../lang.en.js'; // needs better naming... //File.write(this.transfile, ""); - File.write(this.target, ""); + if (this.target) { + File.write(this.target, ""); + } + if (this.debugTarget) { File.write(this.debugTarget, ""); } @@ -121,13 +169,13 @@ Packer.prototype = { var file = this.files[i]; print("reading " +file ); - if (!File.exists(file)) { - print("SKIP (does not exist) " + file); + if (!File.isFile(file)) { + print("SKIP (is not a file) " + file); continue; } if (this.debugTarget) { - File.append(this.debugTarget, File.read(files[i])); + File.append(this.debugTarget, File.read(file)); } // it's a good idea to check with 0 compression to see if the code can parse!! @@ -136,12 +184,14 @@ Packer.prototype = { - var minfile = bpath + '/' +files[i].substr(spath.length+1).replace(/\//g, '.'); - var transfile = bpath + '/' +files[i].substr(spath.length+1).replace(/\//g, '.') +'.lang'; + var minfile = this.tmpDir + '/' +file.replace(/\//g, '.'); + + // let's see if we have a min file already? + // this might happen if tmpDir is set .. if (true && File.exists(minfile)) { var mt = File.mtime(minfile); - var ot = File.mtime(files[i]); + var ot = File.mtime(file); print("compare : " + mt + "=>" + ot); if (mt >= ot) { continue; @@ -161,74 +211,91 @@ Packer.prototype = { print("COMPRESSING "); //var codeComp = pack(str, 10, 0, 0); - var str = File.read(files[i]); - var str = this.pack(str, files[i], minfile); + if (File.exists(minfile)) { + File.remove(minfile); + } + var str = File.read(file); + var str = this.pack(str, file, minfile); if (str.length) { - File.write(minfile, str); + File.write(minfile, str); } - - //var str = File.read(minfile); - //print("using MIN FILE "+ minfile); - //File.append(outpath, str + "\n"); - //this.timerPrint("Wrote Files"); - /* - if (codeComp.length) { - //print(codeComp); - - File.append(outpath, codeComp+"\n"); - File.write(minfile, codeComp); - } - */ - //print(codeComp); - // if (i > 10) return; + } - if (this.translate) { + if (this.translateJSON) { print("MERGING LANGUAGE"); - File.write(outpath, "if (typeof(_T) == 'undefined') { _T={};}\n"); + var out = "if (typeof(_T) == 'undefined') { _T={};}\n" + if (this.target) { + File.write(this.target, out); + } else { + this.out += out; + } + - var transfileAll = bpath + '/_translation_.js'; - File.write(transfileAll, ""); - for(var i=0; i < files.length; i++) { - var transfile= bpath + '/' +files[i].substr(spath.length+1).replace(/\//g, '.') +'.lang.trans'; - var transmd5 = bpath + '/' +files[i].substr(spath.length+1).replace(/\//g, '.') +'.lang'; + + File.write(this.translateJSON, ""); + for(var i=0; i < this.files.length; i++) { + var file = this.files[i]; + var transfile= this.tmpDir + '/' +file.replace(/\//g, '.') +'.lang.trans'; + var transmd5 = this.tmpDir + '/' +file.replace(/\//g, '.') +'.lang'; if (File.exists(transmd5)) { var str = File.read(transmd5); if (str.length) { - File.append(outpath, str + "\n"); + if (this.target) { + File.append(this.target, str + "\n"); + } else { + this.out += str + "\n"; + } + + } + if (this.cleanup) { + File.remove(transmd5); } } if (File.exists(transfile)) { var str = File.read(transfile); if (str.length) { - File.append(transfileAll, str); + File.append(this.translateJSON, str); + } + if (this.cleanup) { + File.remove(transfile); } } } } + print("MERGING SOURCE"); - for(var i=0; i < files.length; i++) { - - var minfile = bpath + '/' +files[i].substr(spath.length+1).replace(/\//g, '.'); + for(var i=0; i < this.files.length; i++) { + var file = this.files[i]; + var minfile = this.tmpDir + '/' + file.replace(/\//g, '.'); + + if (!File.exists(minfile)) { continue; } var str = File.read(minfile); print("using MIN FILE "+ minfile); if (str.length) { - File.append(outpath, str + "\n"); + if (this.target) { + File.append(this.target, str + "\n"); + } else { + this.out += str + "\n"; + } + + } + if (this.cleanup) { + File.remove(minfile); } + } - - //File.append(dout, "\n");// end the function - + }, @@ -244,28 +311,36 @@ Packer.prototype = { pack : function (str,fn,minfile) { - var tr = new TokenReader(); + var tr = new TokenReader( { + keepDocs :true, + keepWhite : true, + keepComments : true, + sepIdents : true, + collapseWhite : false + }); this.timerPrint("START" + fn); // we can load translation map here... - var toks = tr.tokenize(str,false); // dont merge xxx + . + yyyy etc. + var toks = tr.tokenize(new TextStream(str)); // dont merge xxx + . + yyyy etc. // at this point we can write a language file... - if (this.translate) { - this.writeTranslateFile(fn, minfile, tr.translateMap); + if (this.translateJSON) { + + this.writeTranslateFile(fn, minfile, toks); } this.activeFile = fn; // and replace if we are generating a different language.. - - - this.timerPrint("Tokenized"); + //var ts = new TokenStream(toks); + //print(JSON.stringify(toks, null,4 )); Seed.quit(); + var ts = new Collapse(toks); + // print(JSON.stringify(ts.tokens, null,4 )); Seed.quit(); //return;// - var sp = new ScopeParser(new TokenStream(toks, str.length)); + var sp = new ScopeParser(ts); this.timerPrint("Converted to Parser"); sp.packer = this; sp.buildSymbolTree(); @@ -273,10 +348,15 @@ Packer.prototype = { sp.mungeSymboltree(); this.timerPrint("Munged Sym tree"); print(sp.warnings.join("\n")); - var out = JSDOC.CompressWhite(sp.ts, this); + + + //var out = CompressWhite(new TokenStream(toks), this, true); // do not kill whitespace.. + var out = CompressWhite(new TokenStream(toks), this, false); this.timerPrint("Compressed"); return out; + + }, timerPrint: function (str) { @@ -296,10 +376,22 @@ Packer.prototype = { * */ - writeTranslateFile : function(fn, minfile, map) + writeTranslateFile : function(fn, minfile, toks) { + + var map = {}; + var _this = this; + toks.forEach(function (t) { + if (t.type == 'STRN' && t.name == 'DOUBLE_QUOTE') { + var sval = t.data.substring(1,t.data.length-1); + var ffn = fn.substring(_this.prefix.length); + map[sval] = _this.md5(ffn + '-' + sval); + } + }) + var transfile = minfile + '.lang.trans'; var transmd5 = minfile + '.lang'; + print("writeTranslateFile " + transfile); var i = 0; var v = ''; if (File.exists(transfile)) { @@ -312,11 +404,10 @@ Packer.prototype = { if (!i ) { return; // no strings in file... } - var ff = fn.split('/'); - var ffn = ff[ff.length-1]; + var ffn = fn.substring(this.prefix.length); - File.write(transfile, "\n" + ffn.toSource() + " : {"); + File.write(transfile, "\n'" + ffn + "' : {"); var l = ''; var _tout = {} @@ -341,25 +432,29 @@ Packer.prototype = { { //print("STRING HANDLER"); // callback when outputing compressed file, - if (!this.translate) { + var data = tok.data; + if (!this.translateJSON) { // print("TURNED OFF"); - return tok.outData; + return data; } - if (tok.qc != '"') { - return tok.outData; + if (tok.name == 'SINGLE_QUOTE') { + return data; } - var sval = tok.data.substring(1,tok.data.length-1); + + var sval = data.substring(1,data.length-1); + // we do not clean up... quoting here!??!!?!?!?!? + + // blank with tabs or spaces.. //if (!sval.replace(new RegExp("(\\\\n|\\\\t| )+",'g'), '').length) { // return tok.outData; // } + var sval = tok.data.substring(1,data.length-1); + var fn = this.activeFile.substring(this.prefix.length); - - var ff = this.activeFile.split('/'); - var ffn = ff[ff.length-1]; - return '_T["' + this.md5(ffn + '-' + sval) + '"]'; + return '_T["' + this.md5(fn + '-' + sval) + '"]'; }