JSDOC/TokenReader.js
[gnome.introspection-doc-generator] / JSDOC / Packer.vala
index a1166f6..b6d7e28 100644 (file)
@@ -18,11 +18,9 @@ x.srcfiles = array of files (that list other files...) << not supported?
 x.target = "output.pathname.js"
 x.debugTarget = "output.pathname.debug.js"
 
-
-x.debugTranslateTarget : "/tmp/output.translate.js" << this used to be the single vs double quotes.. we may not use it in future..
-x.translateJSON: "/tmp/translate.json",
     
-x.packAll();  // writes files  etc..
+x.pack();  // writes files  etc..
     
  *</code> 
  *
@@ -56,7 +54,9 @@ x.packAll();  // writes files  etc..
  */
 namespace JSDOC 
 {
-
+       public errordomain PackerError {
+            ArgumentError
+    }
 
        public class Packer : Object 
        {
@@ -64,14 +64,21 @@ namespace JSDOC
                * @cfg {String} target to write files to - must be full path.
                */
                string target;
+               GLib.FileOutputStream targetStream = null;
                /**
                 * @cfg {String} debugTarget target to write files debug version to (uncompacted)- must be full path.
                 */
                string targetDebug;
-       
+               
+
+               GLib.FileOutputStream targetDebugStream  = null;
                /**
                 * @cfg {String} tmpDir  (optional) where to put the temporary files. 
                 *      if you set this, then files will not be cleaned up
+                *  
+                *  at present we need tmpfiles - as we compile multiple files into one.
+                *  we could do this in memory now, as I suspect vala will not be as bad as javascript for leakage...
+                *
                 */
                public string tmpDir = "/tmp";  // FIXME??? in ctor?
        
@@ -89,19 +96,29 @@ namespace JSDOC
                 *    usefull for debugging compressed files.
                 */
                
-               public bool keepWhite =  true;
+               public bool keepWhite =  false;
                
                
                // list of files to compile...
                Gee.ArrayList<string> files;
                
-               public  string out = ""; // if no target is specified - then this will contain the result
+               /**
+               * @cfg debug -- pretty obvious.
+               */
+                
+               public string activeFile = "";
+               
+               
+               public  string outstr = ""; // if no target is specified - then this will contain the result
     
                public Packer(string target, string targetDebug = "")
                {
                        this.target = target;
                        this.targetDebug  = targetDebug;
-               
+                       this.files = new Gee.ArrayList<string>();
+                       
+                       new Lang_Class(); ///initilizaze lang..
+                        
                }
                
                public void loadSourceIndexes(Gee.ArrayList<string> indexes)
@@ -111,19 +128,24 @@ namespace JSDOC
                        }
                }
                
-               public void loadFiles(Gee.ArrayList<string> fs)
+               public void loadFiles(string[] fs)
                {
                        foreach(var f in fs) {
+                           GLib.debug("add File: %s", f);
                                this.files.add(f); //?? easier way?
                        }
                }
-               FileOutputStream targetStream = null;
-               FileOutputStream targetDebugStream  = null;
+               public void loadFile(string f)
+               {
+                   GLib.debug("add File: %s", f);
+                       this.files.add(f); 
+                       GLib.debug("FILE LEN: %d", this.files.size);
+               }
                
                public void pack()
                {
-                   if (!this.files) {
-                               throw new Packer.ArgumentError("No Files loaded before pack() called");
+                   if (this.files.size < 1) {
+                               throw new PackerError.ArgumentError("No Files loaded before pack() called");
                        }
                        if (this.target.length > 0 ) {
                                this.targetStream = File.new_for_path(this.target).replace(null, false,FileCreateFlags.NONE);
@@ -157,13 +179,13 @@ namespace JSDOC
  
                            var f = lines[i].strip();
                        if (f.length < 1 ||
-                               Regex.match_simple ("^\/", f) ||
+                               Regex.match_simple ("^/", f) ||
                                !Regex.match_simple ("[a-zA-Z]+", f) 
                        ){
                                continue; // blank comment or not starting with a-z
                        }
                        
-                       if (Regex.match_simple ("\.js$", f)) {
+                       if (Regex.match_simple ("\\.js$", f)) {
                            this.files.add( f);
                            // js file..
                            continue;
@@ -173,10 +195,10 @@ namespace JSDOC
                                // should we prefix? =- or should this be done elsewhere?
                                
                        var add = f.replace(".", "/") + ".js";
-                       if (_this.files.contains(add)) {
+                       if (this.files.contains(add)) {
                            continue;
                        }
-                       _this.files.add( add );
+                       this.files.add( add );
                        
                    }
                }
@@ -188,27 +210,32 @@ namespace JSDOC
                    //this.transOrigFile= bpath + '/../lang.en.js'; // needs better naming...
                    //File.write(this.transfile, "");
                    if (this.target.length > 0) {
-                       this.targetStream.write("");
+                       this.targetStream.write("".data);
                    }
                    
-                   if (this.debugTarget > 0) {
-                           this.targetDebugStream.write("");
+                   if (this.targetDebugStream != null) {
+                           this.targetDebugStream.write("".data);
                    }
+                   
+                   
                    foreach(var file in this.files) {
                        
                        print("reading %s\n",file );
                        
-                       if (FileUtils.test (file, FileTest.EXISTS) && ! FileUtils.test (file, FileTest.IS_DIR)) {
+                       if (!FileUtils.test (file, FileTest.EXISTS) || FileUtils.test (file, FileTest.IS_DIR)) {
                            print("SKIP (is not a file) %s\n ", file);
                            continue;
                        }
                       
+                               var loaded_string = false;
+                               string file_contents = "";
                        // debug Target
                        
-                       if (this.debugTargetStream !=null) {
-                               string str;
-                               FileUtils.get_contents(file,out str);
-                           this.debugTarget.write(str);
+                       if (this.targetDebugStream !=null) {
+                               
+                               FileUtils.get_contents(file,out file_contents);
+                           this.targetDebugStream.write(file_contents.data);
+                           loaded_string = false;
                        }
                        // it's a good idea to check with 0 compression to see if the code can parse!!
                        
@@ -217,14 +244,14 @@ namespace JSDOC
                        
                   
                        
-                       var minfile = this.tmpDir + '/' + file.replace("/", '.');
+                       var minfile = this.tmpDir + "/" + file.replace("/", ".");
                        
                        
                        // let's see if we have a min file already?
                        // this might happen if tmpDir is set .. 
-                       var use_minfile = false;
+
                        
-                       if (true && FileUtils.test (minfile, FileTest.EXISTS)) {
+                       if (false && FileUtils.test (minfile, FileTest.EXISTS)) {
                                
                                var otv = File.new_for_path(file).query_info (FileAttribute.TIME_MODIFIED, 0).get_modification_time();
                                var mtv = File.new_for_path(minfile).query_info (FileAttribute.TIME_MODIFIED, 0).get_modification_time();
@@ -241,333 +268,140 @@ namespace JSDOC
                            
                        }
                         
-                       print("COMPRESSING ");
+                       print("COMPRESSING to %s\n", minfile);
                        //var codeComp = pack(str, 10, 0, 0);
-                       if (File.exists(minfile)) {
-                           File.remove(minfile);
+                       if (FileUtils.test (minfile, FileTest.EXISTS)) {
+                           FileUtils.remove(minfile);
                        }
-                       var str = File.read(file);
-                       var str = this.packFile(str, file, minfile);
+                       if (!loaded_string) {
+                               FileUtils.get_contents(file,out file_contents);
+                       }
+
+                        this.packFile(file_contents, file, minfile);
                         
                      
                    }
                    
+                 
+                   print("MERGING SOURCE\n");
                    
-                   
-                   // if we are translating, write the translations strings at the top
-                   // of the file..
-                   
-                   if (this.translateJSON) {
-                       
-                          
-                       print("MERGING LANGUAGE");
-                       var out = "if (typeof(_T) == 'undefined') { _T={};}\n"
-                       if (this.target) {
-                           File.write(this.target, out);
-                       } else {
-                           this.out += out;
-                       }
-                        
-                       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) {
-                                   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(this.translateJSON, str);
-                               }
-                               if (this.cleanup) {
-                                   File.remove(transfile);
-                               }
-                           }
-                           
-                          
-                       }
-                   }
-                   
-                   print("MERGING SOURCE");
-                   
-                   for(var i=0; i < this.files.length; i++)  {
+                   for(var i=0; i < this.files.size; i++)  {
                        var file = this.files[i];
-                       var minfile = this.tmpDir + '/' + file.replace(/\//g, '.');
+                       var minfile = this.tmpDir + "/" + file.replace("/", ".");
                        
                        
-                       if (!File.exists(minfile)) {
+                       if ( !FileUtils.test(minfile, FileTest.EXISTS)) {
+                               print("skipping source %s - does not exist\n", minfile);
                            continue;
                        }
-                       var str = File.read(minfile);
-                       print("using MIN FILE  "+ minfile);
-                       if (str.length) {
-                           if (this.target) {
-                               File.append(this.target, '//' + file + "\n");   
-                               File.append(this.target, str + "\n");   
+                       string str;
+                       FileUtils.get_contents(minfile, out str);
+                       print("using MIN FILE  %s\n", minfile);
+                       if (str.length > 0) {
+                           if (this.targetStream != null) {
+                                       this.targetStream.write(("// " + file + "\n").data); 
+                                       this.targetStream.write((str + "\n").data); 
+
                            } else {
-                               this.out += '//' + file + "\n";
-                               this.out += str + "\n";
+                               this.outstr += "//" + file + "\n";
+                               this.outstr += str + "\n";
                            }
                            
                        }
                        if (this.cleanup) {
-                           File.remove(minfile);
+                           FileUtils.remove(minfile);
                        }
                        
                    }
-                   print("Output file: " + this.target);
-                   if (this.debugTarget) print("Output debug file: " + this.debugTarget);
-                   
+                   if (this.target.length > 0 ) {
+                           print("Output file: " + this.target);
+                   }
+                   if (this.targetDebug.length > 0) {
+                                print("Output debug file: %s\n" , this.targetDebug);
+                       }  
+                       
+                       if (this.outstr.length > 0 ) {
+                               print(this.outstr);
+                       }
                     
                
                
-               },
-    /**
-     * Core packing routine  for a file
-     * 
-     * @param str - str source text..
-     * @param fn - filename (for reference?)
-     * @param minfile - min file location...
-     * 
-     */
-    
-    packFile : function (str,fn,minfile)
-    {
-    
-        var tr = new  TokenReader(  { 
-            keepDocs :true, 
-            keepWhite : true,  
-            keepComments : true, 
-            sepIdents : true,
-            collapseWhite : false,
-            filename : fn
-        });
-        this.timerPrint("START" + fn);
-        
-        // we can load translation map here...
-        
-        var toks = tr.tokenize(new TextStream(str)); // dont merge xxx + . + yyyy etc.
-        
-        // at this point we can write a language file...
-        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(ts);
-        this.timerPrint("Converted to Parser");
-        sp.packer = this;
-        sp.buildSymbolTree();
-        this.timerPrint("Built Sym tree");
-        sp.mungeSymboltree();
-        this.timerPrint("Munged Sym tree");
-        print(sp.warnings.join("\n"));
-        this.timerPrint("Compressed");
-        
-        var out = CompressWhite(new TokenStream(toks), this, this.keepWhite); // do not kill whitespace..
-        
-        
-        this.timerPrint("Compressed");
-        
-         if (out.length) {
-            File.write(minfile, out);
-            this.timerPrint("Write (" + out.length + "bytes) " + minfile);
-        }
-        
-        return out;
-        
-        
-         
-    },
-    
-    timerPrint: function (str) {
-        var ntime = new Date() * 1;
-        var tdif =  ntime -this.timer;
-        this.timer = ntime;
-        print('['+tdif+']'+str);
-    },
-    
-    /**
-     * 
-     * Translation concept...
-     * -> replace text strings with _T....
-     * -> this file will need inserting at the start of the application....
-     * -> we need to generate 2 files, 
-     * -> a reference used to do the translation, and the _T file..
-     *
-     *
-     * We store the trsum on the token...
-     * 
-     */
+               }
+               /**
+                * Core packing routine  for a file
+                * 
+                * @param str - str source text..
+                * @param fn - filename (for reference?)
+                * @param minfile - min file location...
+                * 
+                */
+
+               private string packFile  (string str,string fn, string minfile)
+               {
+
+                       var tr = new  TokenReader();
+                       tr.keepDocs =true;
+                       tr.keepWhite = true;
+                       tr.keepComments = true;
+                       tr.sepIdents = true;
+                       tr.collapseWhite = false;
+                       tr.filename = fn;
+                       // we can load translation map here...
+               
+                       TokenArray toks = tr.tokenize(new TextStream(str)); // dont merge xxx + . + yyyy etc.
+               
+               
+               
+                       this.activeFile = fn;
+               
+                       // and replace if we are generating a different language..
+               
+
+                       //var ts = new TokenStream(toks);
+                       //print(JSON.stringify(toks, null,4 )); Seed.quit();
+                       var ts = new Collapse(toks.tokens);
+                       
+                       //ts.dumpAll("");                       print("Done collaps"); Process.exit(1);
+                       
+                  // print(JSON.stringify(ts.tokens, null,4 )); Seed.quit();
+                       //return;//
+                       var sp = new ScopeParser(ts);
+                       //sp.packer = this;
+                       sp.buildSymbolTree();
+
+                       sp.mungeSymboltree();
+                       sp.printWarnings();
+                       //print(sp.warnings.join("\n"));
+                       //(new TokenStream(toks.tokens)).dumpAll(""); GLib.Process.exit(1);
+                       // compress works on the original array - in theory the replacements have already been done by now 
+                       var outf = CompressWhite(new TokenStream(toks.tokens), this, this.keepWhite); // do not kill whitespace..
+               
+                       
+                       print("RESULT: \n %s\n", outf);
+               
+                        if (outf.length > 0) {
+                               FileUtils.set_contents(minfile, outf);
+                                
+                       }  
+
+               
+                       return outf;
+               
+               
+                        
+               }
+                
+
+               public string md5(string str)
+               {
+               
+                       return GLib.Checksum.compute_for_string(GLib.ChecksumType.MD5, str);
+               
+               }
     
-    writeTranslateFile : function(fn, minfile, toks) 
-    {
-        
-        var map = {};  // 'string=> md5sum'
-        var _this = this;
-        var t, last, next;
-        
-        
-        var tokfind =  function (j,dir) {
-            while (1) {
-                if ((dir < 0) && (j < 0)) {
-                    return false;
-                }
-                if ((dir > 0) && (j >= toks.length)) {
-                    return false;
-                }
-                j += dir;
-                if (toks[j].type != 'WHIT') {
-                    return toks[j];
-                }
-            }
-            return false;
-            
-        }
-        
-        
-        for (var i=0;i<toks.length;i++) {
-            
-            t = toks[i];
-            if (t.type != 'STRN') {
-                continue;
-            }
-            if (t.name != 'DOUBLE_QUOTE') {
-                continue;
-            }
-            
-            last = tokfind(i,-1);
-            next = tokfind(i,+1);
-            
-            // we have to ignore key values on objects
-            
-            // defined by
-            // last == '{' or ',' and
-            // next == ':'
-            
-            if (next &&
-                next.type == 'PUNC' &&
-                next.data == ':' && 
-                last && 
-                last.type == 'PUNC' &&
-                (last.data == ',' || last.data == '{')
-            ){
-                continue; // found object key... - we can not translate these
-            }
-                
-            var sval = t.data.substring(1,t.data.length-1);
-            var ffn = fn.substring(_this.prefix.length);
-            
-            t.trsum = _this.md5(ffn + '-' + sval);
-            map[sval] = t.trsum;
-            
-            
-            
-        }
-        
-        
-        var transfile = minfile + '.lang.trans';
-        var transmd5 = minfile + '.lang';
-        print("writeTranslateFile "  + transfile);
-        var i = 0;
-        var v = '';
-        if (File.exists(transfile)) {
-            File.remove(transfile);
-        }
-        if (File.exists(transmd5)) {
-            File.remove(transmd5);
-        }
-        for(v in map) { i++; break };
-        if (!i ) {
-            return; // no strings in file...
-        }
-        var ffn = fn.substring(this.prefix.length);
-         
-         
-        File.write(transfile, "\n'" + ffn  + "' : {");
-        var l = '';
-        var _tout = {}
-         
-        File.write(transmd5, '');
-        for(v in map) {
-            if (!v.length) {
-                continue;
-            }
-            File.append(transfile, l + "\n\t\"" + v  + "\" : \"" + v +"\"");
-            l = ',';
-            // strings are raw... - as the where encoded to start with!!!
-            // so we should not need to encode them again.. - just wrap with "
-            File.append(transmd5, '_T["' + this.md5(ffn + '-' + v) + '"]="'+v+"\";\n");
-        }
-        File.append(transfile, "\n},"); // always one trailing..
-        
-         
-    },
-    md5 : function (string)
-    {
-        
-        return GLib.compute_checksum_for_string(GLib.ChecksumType.MD5, string, string.length);
-        
-    },
-    stringHandler : function(tok)
-    {
-        //print("STRING HANDLER");
-       // callback when outputing compressed file, 
-       var data = tok.data;
-        if (!this.translateJSON) {
-         //   print("TURNED OFF");
-            return data;
-        }
-        if (tok.name == 'SINGLE_QUOTE') {
-            return data;
-        }
-        
-        if (typeof(tok.trsum) == 'undefined') {
-            return data;
-        }
-        
-        return '_T["' + tok.trsum + '"]';
-        
-        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);
-        
-        
-        return '_T["' + this.md5(fn + '-' + sval) + '"]';
-        
-        
+        //stringHandler : function(tok) -- not used...
     }
     
-    
-};
+}