chg: merged parser code modified in antville app back into hopkit
This commit is contained in:
		
							parent
							
								
									0bf39c8f4b
								
							
						
					
					
						commit
						657f66c0ce
					
				
					 2 changed files with 441 additions and 399 deletions
				
			
		|  | @ -1,29 +1,21 @@ | |||
| //
 | ||||
| // Jala Project [http://opensvn.csie.org/traccgi/jala]
 | ||||
| //
 | ||||
| // Copyright 2004 ORF Online und Teletext GmbH
 | ||||
| // Copyright 2004 ORF Online und Teletext GmbH.
 | ||||
| //
 | ||||
| // Licensed under the Apache License, Version 2.0 (the ``License'');
 | ||||
| // you may not use this file except in compliance with the License.
 | ||||
| // You may obtain a copy of the License at
 | ||||
| //
 | ||||
| //    http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //   http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //
 | ||||
| // Unless required by applicable law or agreed to in writing, software
 | ||||
| // distributed under the License is distributed on an ``AS IS'' BASIS,
 | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| //
 | ||||
| // $Revision$
 | ||||
| // $LastChangedBy$
 | ||||
| // $LastChangedDate$
 | ||||
| // $HeadURL$
 | ||||
| //
 | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * @fileoverview  | ||||
|  * @fileoverview | ||||
|  * MessageParser script that extracts all gettext message macros | ||||
|  * out of skin files and all calls of gettext functions | ||||
|  * (that is "gettext", "ngettext" and "_") out of function | ||||
|  | @ -39,10 +31,10 @@ | |||
|  * @constructor | ||||
|  */ | ||||
| var Message = function(id, pluralId) { | ||||
|    this.id = id && String(id); | ||||
|    this.pluralId = pluralId && String(pluralId); | ||||
|    this.locations = []; | ||||
|    return this; | ||||
|   this.id = id && String(id); | ||||
|   this.pluralId = pluralId && String(pluralId); | ||||
|   this.locations = []; | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -54,11 +46,11 @@ var Message = function(id, pluralId) { | |||
|  * @type String | ||||
|  */ | ||||
| Message.getKey = function(id, pluralId) { | ||||
|    if (id && pluralId) { | ||||
|       return id + pluralId; | ||||
|    } else { | ||||
|       return id; | ||||
|    } | ||||
|   if (id && pluralId) { | ||||
|     return id + pluralId; | ||||
|   } else { | ||||
|     return id; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -71,28 +63,28 @@ Message.getKey = function(id, pluralId) { | |||
|  * @type String | ||||
|  */ | ||||
| Message.formatId = function(str, wrap) { | ||||
|    var escapeQuotes = function(s) { | ||||
|       return s.replace(/(^|[^\\])"/g, '$1\\"'); | ||||
|    }; | ||||
|   var escapeQuotes = function(s) { | ||||
|     return s.replace(/(^|[^\\])"/g, '$1\\"'); | ||||
|   }; | ||||
| 
 | ||||
|    var len = 80; | ||||
|    var buf = new java.lang.StringBuffer(); | ||||
|    if (wrap == true && str.length > len) { | ||||
|       buf.append('""\n'); | ||||
|       var offset = 0; | ||||
|       while (offset < str.length) { | ||||
|          buf.append('"'); | ||||
|          buf.append(escapeQuotes(str.substring(offset, offset += len))); | ||||
|          buf.append('"'); | ||||
|          buf.append("\n"); | ||||
|       } | ||||
|       return buf.toString(); | ||||
|    } else { | ||||
|   var len = 80; | ||||
|   var buf = new java.lang.StringBuffer(); | ||||
|   if (wrap == true && str.length > len) { | ||||
|     buf.append('""\n'); | ||||
|     var offset = 0; | ||||
|     while (offset < str.length) { | ||||
|       buf.append('"'); | ||||
|       buf.append(escapeQuotes(str)); | ||||
|       buf.append('"\n'); | ||||
|    } | ||||
|    return buf.toString(); | ||||
|       buf.append(escapeQuotes(str.substring(offset, offset += len))); | ||||
|       buf.append('"'); | ||||
|       buf.append("\n"); | ||||
|     } | ||||
|     return buf.toString(); | ||||
|   } else { | ||||
|     buf.append('"'); | ||||
|     buf.append(escapeQuotes(str)); | ||||
|     buf.append('"\n'); | ||||
|   } | ||||
|   return buf.toString(); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -103,7 +95,10 @@ Message.formatId = function(str, wrap) { | |||
|  * was found at | ||||
|  */ | ||||
| Message.prototype.addLocation = function(filePath, lineNum) { | ||||
|    this.locations.push(filePath + ":" + lineNum); | ||||
|   const basePath = java.nio.file.Paths.get(java.io.File(app.dir).getCanonicalPath()); | ||||
|   const locationPath = java.nio.file.Paths.get(filePath); | ||||
|   const relativePath = basePath.relativize(locationPath); | ||||
|   this.locations.push(relativePath + ":" + lineNum); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -113,34 +108,34 @@ Message.prototype.addLocation = function(filePath, lineNum) { | |||
|  * to write into | ||||
|  */ | ||||
| Message.prototype.write = function(buf) { | ||||
|    for (var i=0;i<this.locations.length;i++) { | ||||
|       buf.append("#: "); | ||||
|       buf.append(this.locations[i]); | ||||
|       buf.append("\n"); | ||||
|    } | ||||
|    if (this.id.indexOf("{") > -1 | ||||
|        || (this.pluralId != null && this.pluralId.indexOf("{") > -1)) { | ||||
|       buf.append("#, java-format\n"); | ||||
|    } | ||||
|    buf.append('msgid '); | ||||
|    buf.append(Message.formatId(this.id)); | ||||
|    if (this.pluralId != null) { | ||||
|       buf.append('msgid_plural '); | ||||
|       buf.append(Message.formatId(this.pluralId)); | ||||
|       buf.append('msgstr[0] ""\nmsgstr[1] ""\n') | ||||
|    } else { | ||||
|       buf.append('msgstr ""\n') | ||||
|    } | ||||
|    buf.append("\n"); | ||||
|    return; | ||||
|   for (var i=0;i<this.locations.length;i++) { | ||||
|     buf.append("#: "); | ||||
|     buf.append(this.locations[i]); | ||||
|     buf.append("\n"); | ||||
|   } | ||||
|   if (this.id.indexOf("{") > -1 | ||||
|      || (this.pluralId != null && this.pluralId.indexOf("{") > -1)) { | ||||
|     buf.append("#, java-format\n"); | ||||
|   } | ||||
|   buf.append('msgid '); | ||||
|   buf.append(Message.formatId(this.id)); | ||||
|   if (this.pluralId != null) { | ||||
|     buf.append('msgid_plural '); | ||||
|     buf.append(Message.formatId(this.pluralId)); | ||||
|     buf.append('msgstr[0] ""\nmsgstr[1] ""\n') | ||||
|   } else { | ||||
|     buf.append('msgstr ""\n') | ||||
|   } | ||||
|   buf.append("\n"); | ||||
|   return; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * @constructor | ||||
|  */ | ||||
| var MessageParser = function() { | ||||
|    this.messages = {}; | ||||
|    return this; | ||||
|   this.messages = {}; | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -150,10 +145,11 @@ var MessageParser = function() { | |||
|  * @type Object | ||||
|  */ | ||||
| MessageParser.FUNCTION_NAMES = { | ||||
|    "_": true, | ||||
|    "gettext": true, | ||||
|    "ngettext": true, | ||||
|    "markgettext": true | ||||
|   "_": true, | ||||
|   "gettext": true, | ||||
|   "ngettext": true, | ||||
|   "markgettext": true, | ||||
|   "cgettext": true | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -197,7 +193,7 @@ MessageParser.REGEX_PARAM = /([\w]*)\s*=\s*["'](.*?)["']\s*(?=\w+=|$)/gm; | |||
|  * @type Number | ||||
|  */ | ||||
| MessageParser.getLineNum = function(str, idx) { | ||||
|    return str.substring(0, idx).split(/.*(?:\r\n|\n\r|\r|\n)/).length; | ||||
|   return str.substring(0, idx).split(/.*(?:\r\n|\n\r|\r|\n)/).length; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -208,36 +204,36 @@ MessageParser.getLineNum = function(str, idx) { | |||
|  * @param {String} encoding The encoding to use | ||||
|  */ | ||||
| MessageParser.prototype.parse = function(file, encoding) { | ||||
|    if (file.isDirectory()) { | ||||
|       var list = file.list(); | ||||
|       for (var i=0;i<list.length;i++) { | ||||
|          this.parse(new java.io.File(file, list[i]), encoding); | ||||
|   if (file.isDirectory()) { | ||||
|     var list = file.list(); | ||||
|     for (var i=0;i<list.length;i++) { | ||||
|       this.parse(new java.io.File(file, list[i]), encoding); | ||||
|     } | ||||
|   } else { | ||||
|     var fName, dotIdx; | ||||
|     fName = file.getName(); | ||||
|     if ((dotIdx = fName.lastIndexOf(".")) > -1) { | ||||
|       switch (String(fName.substring(dotIdx+1))) { | ||||
|         case "skin": | ||||
|           print("Parsing skin file " + file.getCanonicalPath() + "..."); | ||||
|           this.parseSkinFile(file, encoding); | ||||
|           break; | ||||
|         case "hac": | ||||
|         case "js": | ||||
|           print("Parsing function file " + file.getCanonicalPath() + "..."); | ||||
|           this.parseFunctionFile(file, encoding); | ||||
|           break; | ||||
|         default: | ||||
|           break; | ||||
|       } | ||||
|    } else { | ||||
|       var fName, dotIdx; | ||||
|       fName = file.getName(); | ||||
|       if ((dotIdx = fName.lastIndexOf(".")) > -1) { | ||||
|          switch (String(fName.substring(dotIdx+1))) { | ||||
|             case "skin": | ||||
|                print("Parsing skin file " + file.getAbsolutePath() + "..."); | ||||
|                this.parseSkinFile(file, encoding); | ||||
|                break; | ||||
|             case "hac": | ||||
|             case "js": | ||||
|                print("Parsing function file " + file.getAbsolutePath() + "..."); | ||||
|                this.parseFunctionFile(file, encoding); | ||||
|                break; | ||||
|             default: | ||||
|                break; | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|    return; | ||||
|     } | ||||
|   } | ||||
|   return; | ||||
| }; | ||||
| 
 | ||||
| /** @ignore */ | ||||
| MessageParser.prototype.toString = function() { | ||||
|    return "[Jala Message Parser]"; | ||||
|   return "[Jala Message Parser]"; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -247,61 +243,65 @@ MessageParser.prototype.toString = function() { | |||
|  * @param {String} encoding The encoding to use | ||||
|  */ | ||||
| MessageParser.prototype.parseFunctionFile = function(file, encoding) { | ||||
|    var fis = new java.io.FileInputStream(file); | ||||
|    var isr = new java.io.InputStreamReader(fis, encoding || "UTF-8"); | ||||
|    var reader = new java.io.BufferedReader(isr); | ||||
|    var tokenizer = new java.io.StreamTokenizer(reader); | ||||
|    var messages = [], stack = []; | ||||
|    var c; | ||||
|    while ((c = tokenizer.nextToken()) != java.io.StreamTokenizer.TT_EOF) { | ||||
|       switch (c) { | ||||
|          case java.io.StreamTokenizer.TT_WORD: | ||||
|             if (MessageParser.FUNCTION_NAMES[tokenizer.sval] == true) { | ||||
|                stack.push({name: tokenizer.sval, lineNr: tokenizer.lineno()}); | ||||
|             } else if (stack.length > 0) { | ||||
|                // it's something else than a string argument inside a gettext method call
 | ||||
|                // so finalize the argument parsing here as we aren't interested in that
 | ||||
|                messages.push(stack.pop()); | ||||
|             } | ||||
|             break; | ||||
|          case java.io.StreamTokenizer.TT_NUMBER: | ||||
|             break; | ||||
|          default: | ||||
|             if (stack.length > 0) { | ||||
|                if ("\u0028".charCodeAt(0) == c) { | ||||
|                   // start of arguments (an opening bracket)
 | ||||
|                   stack[stack.length-1].args = []; | ||||
|                } else if ("\u0029".charCodeAt(0) == c) { | ||||
|                   // end of arguments (a closing bracket)
 | ||||
|                   messages.push(stack.pop()); | ||||
|                } else if ("\u0022".charCodeAt(0) == c || "\u0027".charCodeAt(0) == c) { | ||||
|                   // a quoted string argument
 | ||||
|                   stack[stack.length-1].args.push(tokenizer.sval); | ||||
|                } | ||||
|             } | ||||
|             break; | ||||
|   var fis = new java.io.FileInputStream(file); | ||||
|   var isr = new java.io.InputStreamReader(fis, encoding || "UTF-8"); | ||||
|   var reader = new java.io.BufferedReader(isr); | ||||
|   var tokenizer = new java.io.StreamTokenizer(reader); | ||||
|   var messages = [], stack = []; | ||||
|   var c; | ||||
|   while ((c = tokenizer.nextToken()) != java.io.StreamTokenizer.TT_EOF) { | ||||
|     switch (c) { | ||||
|       case java.io.StreamTokenizer.TT_WORD: | ||||
|         if (MessageParser.FUNCTION_NAMES[tokenizer.sval] == true) { | ||||
|           stack.push({name: tokenizer.sval, lineNr: tokenizer.lineno()}); | ||||
|         } else if (stack.length > 0) { | ||||
|           // it's something else than a string argument inside a gettext method call
 | ||||
|           // so finalize the argument parsing here as we aren't interested in that
 | ||||
|           messages.push(stack.pop()); | ||||
|         } | ||||
|         break; | ||||
|       case java.io.StreamTokenizer.TT_NUMBER: | ||||
|         break; | ||||
|       default: | ||||
|         if (stack.length > 0) { | ||||
|           if ("\u0028".charCodeAt(0) == c) { | ||||
|             // start of arguments (an opening bracket)
 | ||||
|             stack[stack.length-1].args = []; | ||||
|           } else if ("\u0029".charCodeAt(0) == c) { | ||||
|             // end of arguments (a closing bracket)
 | ||||
|             messages.push(stack.pop()); | ||||
|           } else if ("\u0022".charCodeAt(0) == c || "\u0027".charCodeAt(0) == c) { | ||||
|             // a quoted string argument
 | ||||
|             stack[stack.length-1].args.push(tokenizer.sval); | ||||
|           } | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|   if (messages.length > 0) { | ||||
|     var msgParam, key, msg; | ||||
|     for (var i=0;i<messages.length;i++) { | ||||
|       msgParam = messages[i]; | ||||
|       if (msgParam.args && msgParam.args.length > 0) { | ||||
|         if (msgParam.name === "cgettext" || msgParam.name === "markgettext") { | ||||
|           msgParam.args[0] = cgettext.getKey(msgParam.args[0], msgParam.args[1]); | ||||
|           delete msgParam.args[1]; | ||||
|         } | ||||
|         key = Message.getKey(msgParam.args[0]); | ||||
|         if (!(msg = this.messages[key])) { | ||||
|           this.messages[key] = msg = new Message(msgParam.args[0], msgParam.args[1]); | ||||
|         } | ||||
|         if (!msg.pluralId && msgParam.args.length > 1) { | ||||
|           msg.pluralId = msgParam.args[1]; | ||||
|         } | ||||
|         msg.addLocation(file.getCanonicalPath(), msgParam.lineNr); | ||||
|       } | ||||
|    } | ||||
|    if (messages.length > 0) { | ||||
|       var msgParam, key, msg; | ||||
|       for (var i=0;i<messages.length;i++) { | ||||
|          msgParam = messages[i]; | ||||
|          if (msgParam.args && msgParam.args.length > 0) { | ||||
|             key = Message.getKey(msgParam.args[0]); | ||||
|             if (!(msg = this.messages[key])) { | ||||
|                this.messages[key] = msg = new Message(msgParam.args[0], msgParam.args[1]); | ||||
|             } | ||||
|             if (!msg.pluralId && msgParam.args.length > 1) { | ||||
|                msg.pluralId = msgParam.args[1]; | ||||
|             } | ||||
|             msg.addLocation(file.getAbsolutePath(), msgParam.lineNr); | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|    fis.close(); | ||||
|    isr.close(); | ||||
|    reader.close(); | ||||
|    return; | ||||
|     } | ||||
|   } | ||||
|   fis.close(); | ||||
|   isr.close(); | ||||
|   reader.close(); | ||||
|   return; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -313,78 +313,128 @@ MessageParser.prototype.parseFunctionFile = function(file, encoding) { | |||
|  * @param {String} encoding The encoding to use | ||||
|  */ | ||||
| MessageParser.prototype.parseSkinFile = function(file, encoding) { | ||||
|    var content = readFile(file.getAbsolutePath(), encoding || "UTF-8"); | ||||
|    var macro, id, pluralId, params, key; | ||||
|    while (macro = MessageParser.REGEX_MACRO.exec(content)) { | ||||
|       while (params = MessageParser.REGEX_PARAM.exec(macro[3])) { | ||||
|          if (macro[2] == MessageParser.MACRO_NAME) { | ||||
|             if (params[1] == "text") { | ||||
|                id = params[2]; | ||||
|                pluralId = null; | ||||
|             } else if (params[1] == "plural") { | ||||
|                pluralId = params[2]; | ||||
|             } | ||||
|          } else { | ||||
|             if (params[1] == MessageParser.ATTRIBUTE_NAME) { | ||||
|                id = params[2]; | ||||
|                pluralId = null; | ||||
|             } else if (params[1] == "plural") { | ||||
|                pluralId = params[2]; | ||||
|             } | ||||
|          } | ||||
|   var self = this; | ||||
|   var source = readFile(file.getAbsolutePath(), encoding || "UTF-8"); | ||||
| 
 | ||||
|   var checkNestedMacros = function(iterator) { | ||||
|     var macros = []; | ||||
|     while (iterator.hasNext()) { | ||||
|       macro = iterator.next(); | ||||
|       if (macro && macro.constructor !== String) { | ||||
|         macros.push(macro); | ||||
|       } | ||||
|     } | ||||
|     processMacros(macros); | ||||
|   } | ||||
| 
 | ||||
|   var processMacros = function(macros) { | ||||
|     var re = gettext_macro.REGEX; | ||||
|     var id, pluralId, name, args, param, key, msg; | ||||
|     for each (var macro in macros) { | ||||
|       id = pluralId = null; | ||||
|       name = macro.getName(); | ||||
|       param = macro.getNamedParams(); | ||||
|       if (param) { | ||||
|         checkNestedMacros(param.values().iterator()); | ||||
|         if (name === MessageParser.MACRO_NAME) { | ||||
|           id = param.get("text"); | ||||
|           pluralId = param.get("plural"); | ||||
|         } else if (param.containsKey("message") === MessageParser.ATTRIBUTE_NAME) { | ||||
|           id = param.get("message"); | ||||
|           pluralId = param.get("plural"); | ||||
|         } | ||||
|       } | ||||
|       args = macro.getPositionalParams(); | ||||
|       if (args) { | ||||
|         checkNestedMacros(args.iterator()); | ||||
|         if (name === "gettext" || name === "markgettext") { | ||||
|           id = cgettext.getKey(args.get(0), param && param.get("context")); | ||||
|         } else if (name === "ngettext") { | ||||
|           id = args.get(0); | ||||
|           pluralId = args.get(1); | ||||
|         } | ||||
|       } | ||||
|       if (id != null) { | ||||
|          // create new Message instance or update the existing one
 | ||||
|          key = Message.getKey(id); | ||||
|          if (!(msg = this.messages[key])) { | ||||
|             this.messages[key] = msg = new Message(id, pluralId, file.getAbsolutePath()); | ||||
|          } | ||||
|          msg.addLocation(file.getAbsolutePath(), | ||||
|                          MessageParser.getLineNum(content, macro.index)); | ||||
|         if (id.constructor !== String) { | ||||
|           continue; | ||||
|         } | ||||
|         // create new Message instance or update the existing one
 | ||||
|         id = id.replace(re, String.SPACE); | ||||
|         pluralId && (pluralId = pluralId.replace(re, String.SPACE)); | ||||
|         key = Message.getKey(id); | ||||
|         if (!(msg = self.messages[key])) { | ||||
|           self.messages[key] = msg = new Message(id, pluralId, file.getCanonicalPath()); | ||||
|         } | ||||
|         msg.addLocation(file.getCanonicalPath(), MessageParser.getLineNum(source, macro.start)); | ||||
|       } | ||||
|    } | ||||
|    return; | ||||
| }; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   var skin = createSkin(source); | ||||
|   if (skin.hasMainskin()) { | ||||
|     processMacros(skin.getMacros()); | ||||
|   } | ||||
|   for each (var name in skin.getSubskinNames()) { | ||||
|     var subskin = skin.getSubskin(name); | ||||
|     processMacros(subskin.getMacros()); | ||||
|   } | ||||
|   return; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Prints a standard Header of a .po file | ||||
|  * FIXME: Allow custom header (template?) | ||||
|  * FIXME: why the hell is Plural-Forms ignored in poEdit? | ||||
|  * @see http://drupal.org/node/17564
 | ||||
|  */ | ||||
| MessageParser.prototype.getPotString = function() { | ||||
|    var buf = new java.lang.StringBuffer(); | ||||
|    buf.append('# SOME DESCRIPTIVE TITLE.\n'); | ||||
|    buf.append('# Copyright (C) YEAR THE PACKAGE\'S COPYRIGHT HOLDER\n'); | ||||
|    buf.append('# This file is distributed under the same license as the PACKAGE package.\n'); | ||||
|    buf.append('# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.\n'); | ||||
|    buf.append('#\n'); | ||||
|    buf.append('#, fuzzy\n'); | ||||
|    buf.append('msgid ""\n'); | ||||
|    buf.append('msgstr ""\n'); | ||||
|    buf.append('"Project-Id-Version: PACKAGE VERSION\\n"\n'); | ||||
|    buf.append('"Report-Msgid-Bugs-To: \\n"\n'); | ||||
|    var sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mmZ"); | ||||
|    buf.append('"POT-Creation-Date: ' + sdf.format(new java.util.Date()) + '\\n"\n'); | ||||
|    buf.append('"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"\n'); | ||||
|    buf.append('"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"\n'); | ||||
|    buf.append('"Language-Team: LANGUAGE <LL@li.org>\\n"\n'); | ||||
|    buf.append('"MIME-Version: 1.0\\n"\n'); | ||||
|    buf.append('"Content-Type: text/plain; charset=utf-8\\n"\n'); | ||||
|    buf.append('"Content-Transfer-Encoding: 8bit\\n"\n'); | ||||
|    buf.append('"Plural-Forms: nplurals=2; plural=(n != 1);\\n"\n'); | ||||
|    buf.append('\n'); | ||||
|   var date = new Date; | ||||
|   var buf = new java.lang.StringBuffer(); | ||||
|   buf.append('#\n'); | ||||
|   buf.append('# The Antville Project\n'); | ||||
|   buf.append('# http://code.google.com/p/antville\n'); | ||||
|   buf.append('#\n'); | ||||
|   buf.append('# Copyright 2001-' + date.getFullYear() + ' by the Workers of Antville.\n'); | ||||
|   buf.append('#\n'); | ||||
|   buf.append("# Licensed under the Apache License, Version 2.0 (the ``License''\n"); | ||||
|   buf.append('# you may not use this file except in compliance with the License.\n'); | ||||
|   buf.append('# You may obtain a copy of the License at\n'); | ||||
|   buf.append('#\n'); | ||||
|   buf.append('#   http://www.apache.org/licenses/LICENSE-2.0\n'); | ||||
|   buf.append('#\n'); | ||||
|   buf.append('# Unless required by applicable law or agreed to in writing, software\n'); | ||||
|   buf.append("# distributed under the License is distributed on an ``AS IS'' BASIS,\n"); | ||||
|   buf.append('# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n'); | ||||
|   buf.append('# See the License for the specific language governing permissions and\n'); | ||||
|   buf.append('# limitations under the License.\n'); | ||||
|   buf.append('#\n\n'); | ||||
|   buf.append('#, fuzzy\n'); | ||||
|   buf.append('msgid ""\n'); | ||||
|   buf.append('msgstr ""\n'); | ||||
|   buf.append('"Project-Id-Version: Antville-' + Root.VERSION + '\\n"\n'); | ||||
|   buf.append('"Report-Msgid-Bugs-To: mail@antville.org\\n"\n'); | ||||
|   var sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mmZ"); | ||||
|   buf.append('"POT-Creation-Date: ' + sdf.format(new java.util.Date()) + '\\n"\n'); | ||||
|   buf.append('"PO-Revision-Date: ' + sdf.format(new java.util.Date()) + '\\n"\n'); | ||||
|   //buf.append('"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n"\n');
 | ||||
|   buf.append('"Language-Team: The Antville People <mail@antville.org>\\n"\n'); | ||||
|   buf.append('"MIME-Version: 1.0\\n"\n'); | ||||
|   buf.append('"Content-Type: text/plain; charset=utf-8\\n"\n'); | ||||
|   buf.append('"Content-Transfer-Encoding: 8bit\\n"\n'); | ||||
|   buf.append('"Plural-Forms: nplurals=2; plural=(n != 1);\\n"\n'); | ||||
|   buf.append('\n'); | ||||
| 
 | ||||
|    // sort all messages by their singular key
 | ||||
|    var keys = []; | ||||
|    for (var i in this.messages) { | ||||
|       keys[keys.length] = this.messages[i].id; | ||||
|    } | ||||
|    keys.sort(); | ||||
|    // add all the messages
 | ||||
|    for (var i=0;i<keys.length;i++) { | ||||
|       this.messages[keys[i]].write(buf); | ||||
|    } | ||||
|    return buf.toString(); | ||||
|   // sort all messages by their singular key
 | ||||
|   var keys = []; | ||||
|   for (var i in this.messages) { | ||||
|     keys[keys.length] = this.messages[i].id; | ||||
|   } | ||||
|   keys.sort(); | ||||
|   // add all the messages
 | ||||
|   for (var i=0;i<keys.length;i++) { | ||||
|     this.messages[keys[i]].write(buf); | ||||
|   } | ||||
|   return new java.lang.String(buf); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -392,10 +442,10 @@ MessageParser.prototype.getPotString = function() { | |||
|  * @param {java.io.File} file The file to write to | ||||
|  */ | ||||
| MessageParser.prototype.writeToFile = function(file) { | ||||
|    var writer = new java.io.FileWriter(file); | ||||
|    writer.write(new java.lang.String(this.getPotString().getBytes("UTF-8"))); | ||||
|    writer.close(); | ||||
|    return; | ||||
|   var writer = new java.io.FileWriter(file); | ||||
|   writer.write(new java.lang.String(this.getPotString().getBytes("UTF-8"))); | ||||
|   writer.close(); | ||||
|   return; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -405,24 +455,24 @@ var toParse = []; | |||
| var arg, outFile, file, fileEncoding; | ||||
| 
 | ||||
| for (var i=0;i<arguments.length;i++) { | ||||
|    arg = arguments[i]; | ||||
|    if (arg.indexOf("-o") === 0 && i < arguments.length -1) { | ||||
|       outFile = new java.io.File(arguments[i += 1]); | ||||
|    } else if (arg.indexOf("-e") === 0 && i < arguments.length -1) { | ||||
|       fileEncoding = arguments[i += 1]; | ||||
|    } else { | ||||
|       // add argument to list of files and directories to parse
 | ||||
|       toParse.push(new java.io.File(arg)); | ||||
|    } | ||||
|   arg = arguments[i]; | ||||
|   if (arg.indexOf("-o") === 0 && i < arguments.length -1) { | ||||
|     outFile = new java.io.File(arguments[i += 1]); | ||||
|   } else if (arg.indexOf("-e") === 0 && i < arguments.length -1) { | ||||
|     fileEncoding = arguments[i += 1]; | ||||
|   } else { | ||||
|     // add argument to list of files and directories to parse
 | ||||
|     toParse.push(new java.io.File(arg)); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // start parsing
 | ||||
| var parser = new MessageParser(); | ||||
| for (var i=0;i<toParse.length;i++) { | ||||
|    parser.parse(toParse[i], fileEncoding); | ||||
|   parser.parse(toParse[i], fileEncoding); | ||||
| } | ||||
| if (outFile != null) { | ||||
|    parser.writeToFile(outFile); | ||||
|   parser.writeToFile(outFile); | ||||
| } else { | ||||
|    print(parser.getPotString()); | ||||
|   print(parser.getPotString()); | ||||
| } | ||||
|  |  | |||
|  | @ -1,34 +1,26 @@ | |||
| //
 | ||||
| // Jala Project [http://opensvn.csie.org/traccgi/jala]
 | ||||
| //
 | ||||
| // Copyright 2004 ORF Online und Teletext GmbH
 | ||||
| // Copyright 2004 ORF Online und Teletext GmbH.
 | ||||
| //
 | ||||
| // Licensed under the Apache License, Version 2.0 (the ``License'');
 | ||||
| // you may not use this file except in compliance with the License.
 | ||||
| // You may obtain a copy of the License at
 | ||||
| //
 | ||||
| //    http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //   http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //
 | ||||
| // Unless required by applicable law or agreed to in writing, software
 | ||||
| // distributed under the License is distributed on an ``AS IS'' BASIS,
 | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| //
 | ||||
| // $Revision$
 | ||||
| // $LastChangedBy$
 | ||||
| // $LastChangedDate$
 | ||||
| // $HeadURL$
 | ||||
| //
 | ||||
| 
 | ||||
| 
 | ||||
| /** | ||||
|  * @fileoverview  | ||||
|  * @fileoverview | ||||
|  * A parser script that converts GNU Gettext .po files into plain JavaScript objects | ||||
|  * for use with jala.I18n. To run it either start the build script of HopKit | ||||
|  * or call it directly using the JavaScript shell of Rhino: | ||||
|  * <code>java -cp rhino.jar org.mozilla.javascript.tools.shell.Main PoParser.js <input> <output> [namespace]</code> | ||||
|  *  | ||||
|  * | ||||
|  * The accepted arguments are: | ||||
|  * <ul> | ||||
|  * <li><code>input</code>: Either a single .po file or a directory containing multiple files</li> | ||||
|  | @ -49,24 +41,24 @@ | |||
|  * @constructor | ||||
|  */ | ||||
| var PoParser = function(namespace) { | ||||
|    /** | ||||
|     * An array containing the parsed messages | ||||
|     * @type Array | ||||
|     */ | ||||
|    this.messages = []; | ||||
|   /** | ||||
|    * An array containing the parsed messages | ||||
|    * @type Array | ||||
|    */ | ||||
|   this.messages = []; | ||||
| 
 | ||||
|    /** | ||||
|     * The locale key string (eg. "de_AT") of the .po file | ||||
|     * @type String | ||||
|     */ | ||||
|    this.localeKey = null; | ||||
|   /** | ||||
|    * The locale key string (eg. "de_AT") of the .po file | ||||
|    * @type String | ||||
|    */ | ||||
|   this.localeKey = null; | ||||
| 
 | ||||
|    /** | ||||
|     * The namespace (optional) where to store the generated messages | ||||
|     * @type String | ||||
|     */ | ||||
|    this.namespace = namespace; | ||||
|    return this; | ||||
|   /** | ||||
|    * The namespace (optional) where to store the generated messages | ||||
|    * @type String | ||||
|    */ | ||||
|   this.namespace = namespace; | ||||
|   return this; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -108,7 +100,7 @@ PoParser.REGEX_MSGSTR = /^\s*msgstr(?:\[(\d)\])?\s+\"(.*)\"\s*$/; | |||
| PoParser.REGEX_DATA = /^\s*msg/; | ||||
| 
 | ||||
| PoParser.isData = function(str) { | ||||
|    return PoParser.REGEX_DATA.test(str); | ||||
|   return PoParser.REGEX_DATA.test(str); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -118,21 +110,21 @@ PoParser.isData = function(str) { | |||
|  * @type java.lang.String | ||||
|  */ | ||||
| PoParser.readFile = function(file) { | ||||
|    var inStream = new java.io.InputStreamReader(new java.io.FileInputStream(file), "UTF-8"); | ||||
|    var buffer = new java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, 2048); | ||||
|    var read = 0; | ||||
|    var r = 0; | ||||
|    while ((r = inStream.read(buffer, read, buffer.length - read)) > -1) { | ||||
|       read += r; | ||||
|       if (read == buffer.length) { | ||||
|          // grow input buffer
 | ||||
|          var newBuffer = new java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, buffer.length * 2); | ||||
|          java.lang.System.arraycopy(buffer, 0, newBuffer, 0, buffer.length); | ||||
|          buffer = newBuffer; | ||||
|       } | ||||
|    } | ||||
|    inStream.close(); | ||||
|    return new java.lang.String(buffer, 0, read); | ||||
|   var inStream = new java.io.InputStreamReader(new java.io.FileInputStream(file), "UTF-8"); | ||||
|   var buffer = new java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, 2048); | ||||
|   var read = 0; | ||||
|   var r = 0; | ||||
|   while ((r = inStream.read(buffer, read, buffer.length - read)) > -1) { | ||||
|     read += r; | ||||
|     if (read == buffer.length) { | ||||
|       // grow input buffer
 | ||||
|       var newBuffer = new java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, buffer.length * 2); | ||||
|       java.lang.System.arraycopy(buffer, 0, newBuffer, 0, buffer.length); | ||||
|       buffer = newBuffer; | ||||
|     } | ||||
|   } | ||||
|   inStream.close(); | ||||
|   return new java.lang.String(buffer, 0, read); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  | @ -141,63 +133,63 @@ PoParser.readFile = function(file) { | |||
|  * @param {java.io.File} file The .po file to parse | ||||
|  */ | ||||
| PoParser.prototype.parse = function(file) { | ||||
|    // parse the locale key out of the file name
 | ||||
|    var fileName = file.getName(); | ||||
|    if (!(this.localeKey = fileName.substring(0, fileName.indexOf(".")))) { | ||||
|       throw "Invalid PO file name: " + fileName; | ||||
|    } | ||||
|   // parse the locale key out of the file name
 | ||||
|   var fileName = file.getName(); | ||||
|   if (!(this.localeKey = fileName.substring(0, fileName.indexOf(".")))) { | ||||
|     throw "Invalid PO file name: " + fileName; | ||||
|   } | ||||
| 
 | ||||
|    // read the PO file content and parse it into messages
 | ||||
|    var content = PoParser.readFile(file); | ||||
|    var start = new Date(); | ||||
|    var lines = content.split(PoParser.REGEX_LINES); | ||||
|    var idx = -1; | ||||
|    var line = null; | ||||
|    var m, value, nr; | ||||
|    var msg; | ||||
|   // read the PO file content and parse it into messages
 | ||||
|   var content = PoParser.readFile(file); | ||||
|   var start = new Date(); | ||||
|   var lines = content.split(PoParser.REGEX_LINES); | ||||
|   var idx = -1; | ||||
|   var line = null; | ||||
|   var m, value, nr; | ||||
|   var msg; | ||||
| 
 | ||||
|    var hasMoreLines = function() { | ||||
|       return idx < lines.length - 1; | ||||
|    }; | ||||
|   var hasMoreLines = function() { | ||||
|     return idx < lines.length - 1; | ||||
|   }; | ||||
| 
 | ||||
|    var nextLine = function() { | ||||
|       return (line = lines[idx += 1]) != null; | ||||
|    }; | ||||
|   var nextLine = function() { | ||||
|     return (line = lines[idx += 1]) != null; | ||||
|   }; | ||||
| 
 | ||||
|    var getContinuation = function(str) { | ||||
|       var nLine; | ||||
|       while ((nLine = lines[idx + 1]) != null) { | ||||
|          if ((m = nLine.match(PoParser.REGEX_MSG_CONT)) != null) { | ||||
|             str += m[1]; | ||||
|             nextLine(); | ||||
|          } else { | ||||
|             break; | ||||
|          } | ||||
|   var getContinuation = function(str) { | ||||
|     var nLine; | ||||
|     while ((nLine = lines[idx + 1]) != null) { | ||||
|       if ((m = nLine.match(PoParser.REGEX_MSG_CONT)) != null) { | ||||
|         str += m[1]; | ||||
|         nextLine(); | ||||
|       } else { | ||||
|         break; | ||||
|       } | ||||
|       return str; | ||||
|    } | ||||
|     } | ||||
|     return str; | ||||
|   } | ||||
| 
 | ||||
|    while (nextLine()) { | ||||
|       if ((m = line.match(PoParser.REGEX_MSGID)) != null) { | ||||
|          value = getContinuation(m[1]); | ||||
|          if (value) { | ||||
|             msg = this.messages[this.messages.length] = new Message(value); | ||||
|          } | ||||
|       } else if ((m = line.match(PoParser.REGEX_MSGID_PLURAL)) != null) { | ||||
|          value = getContinuation(m[1]); | ||||
|          if (value && msg != null) { | ||||
|             msg.pluralKey = value; | ||||
|          } | ||||
|       } else if ((m = line.match(PoParser.REGEX_MSGSTR)) != null) { | ||||
|          nr = m[1]; | ||||
|          value = getContinuation(m[2]); | ||||
|          if (value && msg != null) { | ||||
|             nr = parseInt(nr, 10); | ||||
|             msg.translations[nr || 0] = value; | ||||
|          } | ||||
|   while (nextLine()) { | ||||
|     if ((m = line.match(PoParser.REGEX_MSGID)) != null) { | ||||
|       value = getContinuation(m[1]); | ||||
|       if (value) { | ||||
|         msg = this.messages[this.messages.length] = new Message(value); | ||||
|       } | ||||
|    } | ||||
|    return; | ||||
|     } else if ((m = line.match(PoParser.REGEX_MSGID_PLURAL)) != null) { | ||||
|       value = getContinuation(m[1]); | ||||
|       if (value && msg != null) { | ||||
|         msg.pluralKey = value; | ||||
|       } | ||||
|     } else if ((m = line.match(PoParser.REGEX_MSGSTR)) != null) { | ||||
|       nr = m[1]; | ||||
|       value = getContinuation(m[2]); | ||||
|       if (value && msg != null) { | ||||
|         nr = parseInt(nr, 10); | ||||
|         msg.translations[nr || 0] = value; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   return; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -207,44 +199,44 @@ PoParser.prototype.parse = function(file) { | |||
|  * file should be saved | ||||
|  */ | ||||
| PoParser.prototype.writeToFile = function(output) { | ||||
|    var buf = new java.lang.StringBuffer(); | ||||
|    // write header
 | ||||
|    buf.append('/**\n'); | ||||
|    buf.append(' * Instantiate the messages namespace if it\'s not already existing\n'); | ||||
|    buf.append(' */\n'); | ||||
|   var buf = new java.lang.StringBuffer(); | ||||
|   // write header
 | ||||
|   buf.append('/**\n'); | ||||
|   buf.append(' * Instantiate the messages namespace if it\'s not already existing\n'); | ||||
|   buf.append(' */\n'); | ||||
| 	var objPath = ""; | ||||
|    if (this.namespace) { | ||||
|       objPath += this.namespace; | ||||
|       buf.append('if (!global.' + objPath + ') {\n'); | ||||
|       buf.append('   global.' + objPath + ' = {};\n'); | ||||
|       buf.append('}\n'); | ||||
|       objPath += "."; | ||||
|    } | ||||
|    objPath += "messages"; | ||||
|    buf.append('if (!global.' + objPath + ') {\n'); | ||||
|    buf.append('   global.' + objPath + ' = {};\n'); | ||||
|    buf.append('}\n\n'); | ||||
|   if (this.namespace) { | ||||
|     objPath += this.namespace; | ||||
|     buf.append('if (!global.' + objPath + ') {\n'); | ||||
|     buf.append('  global.' + objPath + ' = {};\n'); | ||||
|     buf.append('}\n'); | ||||
|     objPath += "."; | ||||
|   } | ||||
|   objPath += "messages"; | ||||
|   buf.append('if (!global.' + objPath + ') {\n'); | ||||
|   buf.append('  global.' + objPath + ' = {};\n'); | ||||
|   buf.append('}\n\n'); | ||||
| 
 | ||||
|    buf.append('/**\n'); | ||||
|    buf.append(' * Messages for locale "' + this.localeKey + '"\n'); | ||||
|    buf.append(' */\n'); | ||||
|    objPath += "." + this.localeKey; | ||||
|    buf.append('global.' + objPath + ' = {\n'); | ||||
|    // write messages
 | ||||
|    for (var i=0;i<this.messages.length; i++) { | ||||
|       this.messages[i].write(buf); | ||||
|    } | ||||
|    // write footer
 | ||||
|    buf.append('};\n'); | ||||
|   buf.append('/**\n'); | ||||
|   buf.append(' * Messages for locale "' + this.localeKey + '"\n'); | ||||
|   buf.append(' */\n'); | ||||
|   var fname = objPath + "." + this.localeKey + ".js"; | ||||
|   objPath += "['" + this.localeKey + "']"; | ||||
|   buf.append('global.' + objPath + ' = {\n'); | ||||
|   // write messages
 | ||||
|   for (var i=0;i<this.messages.length; i++) { | ||||
|     this.messages[i].write(buf); | ||||
|   } | ||||
|   // write footer
 | ||||
|   buf.append('};\n'); | ||||
| 
 | ||||
|    // write the message catalog into the outFile
 | ||||
|    var file = new java.io.File(output, objPath + ".js"); | ||||
|    var writer = new java.io.FileWriter(file); | ||||
|    writer.write(buf.toString()); | ||||
|    // writer.write(buf.toString().getBytes("UTF-8"));
 | ||||
|    writer.close(); | ||||
|    print("generated messages file " + file.getAbsolutePath()); | ||||
|    return; | ||||
|   // write the message catalog into the outFile
 | ||||
|   var file = new java.io.File(output, fname); | ||||
|   var writer = new java.io.FileWriter(file); | ||||
|   writer.write(new java.lang.String(buf.toString().getBytes("UTF-8"))); | ||||
|   writer.close(); | ||||
|   print("generated messages file " + file.getAbsolutePath()); | ||||
|   return; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  | @ -255,10 +247,10 @@ PoParser.prototype.writeToFile = function(output) { | |||
|  * @constructor | ||||
|  */ | ||||
| var Message = function(singularKey) { | ||||
|    this.singularKey = singularKey; | ||||
|    this.pluralKey = null; | ||||
|    this.translations = []; | ||||
|    return this; | ||||
|   this.singularKey = singularKey; | ||||
|   this.pluralKey = null; | ||||
|   this.translations = []; | ||||
|   return this; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  | @ -267,37 +259,37 @@ var Message = function(singularKey) { | |||
|  * string to | ||||
|  */ | ||||
| Message.prototype.write = function(buf) { | ||||
|    var writeLine = function(key, value) { | ||||
|       buf.append('   "'); | ||||
|       buf.append(key); | ||||
|       buf.append('": "'); | ||||
|       if (value !== null && value !== undefined) { | ||||
|          buf.append(value); | ||||
|       } | ||||
|       buf.append('",\n'); | ||||
|    }; | ||||
|   var writeLine = function(key, value) { | ||||
|     buf.append('  "'); | ||||
|     buf.append(key); | ||||
|     buf.append('": "'); | ||||
|     if (value !== null && value !== undefined) { | ||||
|       buf.append(value); | ||||
|     } | ||||
|     buf.append('",\n'); | ||||
|   }; | ||||
| 
 | ||||
|    if (this.singularKey != null) { | ||||
|       writeLine(this.singularKey, this.translations[0]); | ||||
|       if (this.pluralKey != null) { | ||||
|          writeLine(this.pluralKey, this.translations[1]); | ||||
|       } | ||||
|    } | ||||
|    return; | ||||
|   if (this.singularKey != null) { | ||||
|     writeLine(this.singularKey, this.translations[0]); | ||||
|     if (this.pluralKey != null) { | ||||
|       writeLine(this.pluralKey, this.translations[1]); | ||||
|     } | ||||
|   } | ||||
|   return; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Main script body | ||||
|  */ | ||||
| if (arguments.length < 2) { | ||||
|    print("Usage:"); | ||||
|    print("PoParser.js <input> <output> [namespace]"); | ||||
|    print("<input>: Either a single .po file or a directory containing .po files"); | ||||
|    print("<output>: The directory where the generated messages files should be stored"); | ||||
|    print("[namespace]: An optional global namespace where the messages should be"); | ||||
|    print("             stored (eg. a namespace like 'jala' will lead to messages"); | ||||
|    print("             stored in global.jala.messages by their locale."); | ||||
|    quit(); | ||||
|   print("Usage:"); | ||||
|   print("PoParser.js <input> <output> [namespace]"); | ||||
|   print("<input>: Either a single .po file or a directory containing .po files"); | ||||
|   print("<output>: The directory where the generated messages files should be stored"); | ||||
|   print("[namespace]: An optional global namespace where the messages should be"); | ||||
|   print("         stored (eg. a namespace like 'jala' will lead to messages"); | ||||
|   print("         stored in global.jala.messages by their locale."); | ||||
|   quit(); | ||||
| } | ||||
| 
 | ||||
| var input = new java.io.File(arguments[0]); | ||||
|  | @ -306,31 +298,31 @@ var namespace = arguments[2]; | |||
| 
 | ||||
| // check if the output destination is a directory
 | ||||
| if (output.isFile()) { | ||||
|    print("Invalid arguments: the output destination must be a directory."); | ||||
|    quit(); | ||||
|   print("Invalid arguments: the output destination must be a directory."); | ||||
|   quit(); | ||||
| } | ||||
| 
 | ||||
| if (namespace && namespace.indexOf(".") != -1) { | ||||
|    print("Invalid arguments: Please don't specify complex object paths, as this"); | ||||
|    print("would corrupt the messages file."); | ||||
|    quit(); | ||||
|   print("Invalid arguments: Please don't specify complex object paths, as this"); | ||||
|   print("would corrupt the messages file."); | ||||
|   quit(); | ||||
| } | ||||
| 
 | ||||
| // parse the PO file(s) and create the message catalog files
 | ||||
| var parser; | ||||
| if (input.isDirectory()) { | ||||
|    var files = input.listFiles(); | ||||
|    var file; | ||||
|    for (var i=0;i<files.length;i++) { | ||||
|       file = files[i]; | ||||
|       if (file.getName().endsWith(".po")) { | ||||
|          parser = new PoParser(namespace); | ||||
|          parser.parse(file); | ||||
|          parser.writeToFile(output); | ||||
|       } | ||||
|    } | ||||
|   var files = input.listFiles(); | ||||
|   var file; | ||||
|   for (var i=0;i<files.length;i++) { | ||||
|     file = files[i]; | ||||
|     if (file.getName().endsWith(".po")) { | ||||
|       parser = new PoParser(namespace); | ||||
|       parser.parse(file); | ||||
|       parser.writeToFile(output); | ||||
|     } | ||||
|   } | ||||
| } else { | ||||
|    parser = new PoParser(namespace); | ||||
|    parser.parse(input); | ||||
|    parser.writeToFile(output); | ||||
|   parser = new PoParser(namespace); | ||||
|   parser.parse(input); | ||||
|   parser.writeToFile(output); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue