diff options
Diffstat (limited to 'i18n/src/closureSlurper.js')
| -rwxr-xr-x | i18n/src/closureSlurper.js | 155 | 
1 files changed, 55 insertions, 100 deletions
| diff --git a/i18n/src/closureSlurper.js b/i18n/src/closureSlurper.js index 2e78ef64..9f236cf2 100755 --- a/i18n/src/closureSlurper.js +++ b/i18n/src/closureSlurper.js @@ -1,130 +1,85 @@  #!/usr/bin/env node  'use strict'; -var Q  = require('qq'), +var Q  = require('q'),      qfs  = require('q-fs'),      converter = require('./converter.js'),      util = require('./util.js'), +    closureI18nExtractor = require('./closureI18nExtractor.js'),      localeInfo = {}, -    localeIds = [],      currencySymbols,      goog = { provide: function() {},               require: function() {},               i18n: {currency: {}, pluralRules: {}} }; -createFolder('../../src/ngLocale/').then(function() { -  var promiseA = Q.defer(), -      promiseB = Q.defer(); -  qfs.read(__dirname + '/../closure/currencySymbols.js', 'b').then(function(content) { -    eval(content.toString()); -    currencySymbols = goog.i18n.currency.CurrencyInfo; -    currencySymbols.__proto__ = goog.i18n.currency.CurrencyInfoTier2; +var NG_LOCALE_DIR = '../src/ngLocale/'; -    qfs.read(__dirname + '/../closure/numberSymbols.js', 'b').then(function(content) { -      //eval script in the current context so that we get access to all the symbols -      eval(content.toString()); -      for (var propName in goog.i18n) { -        var localeID = util.findLocaleId(propName, 'num'); -        if (localeID) { -          if (!localeInfo[localeID]) { -            localeInfo[localeID] = {}; -            localeIds.push(localeID); -          } -          var convertedData = converter.convertNumberData(goog.i18n[propName], currencySymbols); -          localeInfo[localeID].NUMBER_FORMATS = convertedData; -        } -      } -      promiseA.resolve(); -    }); -  }); - - -  qfs.read(__dirname + '/../closure/datetimeSymbols.js', 'b').then(function(content) { -    eval(content.toString()); -    for (var propName in goog.i18n) { -      var localeID = util.findLocaleId(propName, 'datetime'); -      if (localeID) { -        if (!localeInfo[localeID]) { -          localeInfo[localeID] = {}; -          localeIds.push(localeID); -        } -        var convertedData = converter.convertDatetimeData(goog.i18n[propName]); -        localeInfo[localeID].DATETIME_FORMATS = convertedData; -      } -    } - -    promiseB.resolve(); -  }); +function readSymbols() { +  console.log("Processing currency and number symbols ..."); +  var numericStagePromise = qfs.read(__dirname + '/../closure/currencySymbols.js', 'b') +    .then(function(content) { +      var currencySymbols = closureI18nExtractor.extractCurrencySymbols(content); +      return qfs.read(__dirname + '/../closure/numberSymbols.js', 'b').then(function(content) { +          closureI18nExtractor.extractNumberSymbols(content, localeInfo, currencySymbols); +        }); +      }); -  return Q.join(promiseA.promise, promiseB.promise, noop); -}).then(function() { -  var promise = Q.defer(); +  console.log("Processing datetime symbols ..."); +  var datetimeStagePromise = qfs.read(__dirname + '/../closure/datetimeSymbols.js', 'b') +      .then(function(content) { +        closureI18nExtractor.extractDateTimeSymbols(content, localeInfo); +        return qfs.read(__dirname + '/../closure/datetimeSymbolsExt.js', 'b').then(function(content) { +            closureI18nExtractor.extractDateTimeSymbols(content, localeInfo); +        }); +    }); -  qfs.read(__dirname + '/../closure/pluralRules.js').then(function(content) { -    for(var i = 0; i < localeIds.length; i++) { -      //We don't need to care about country ID because the plural rules in more specific id are -      //always the same as those in its language ID. -      // e.g. plural rules for en_SG is the same as those for en. -      goog.LOCALE = localeIds[i].match(/[^_]+/)[0]; -      eval(content); -      var temp = goog.i18n.pluralRules.select.toString(). -                     replace(/goog.i18n.pluralRules.Keyword/g, 'PLURAL_CATEGORY').replace(/\n/g, ''); +    return Q.all([numericStagePromise, datetimeStagePromise]); +} -      ///@@ is a crazy place holder to be replaced before writing to file -      localeInfo[localeIds[i]].pluralCat = "@@" + temp + "@@"; -    } -    promise.resolve(); +function extractPlurals() { +  console.log('Extracting Plurals ...'); +  return qfs.read(__dirname + '/../closure/pluralRules.js').then(function(content) { +    closureI18nExtractor.pluralExtractor(content, localeInfo);    }); +} -  return promise.promise; -}).then(function() { +function writeLocaleFiles() { +  console.log('Final stage: Writing angular locale files to directory: %j', NG_LOCALE_DIR); +  var writePromises = []; +  var localeIds = Object.keys(localeInfo); +  var num_files = 0;    localeIds.forEach(function(localeID) { -    var fallBackID = localeID.match(/[A-Za-z]+/)[0], -        localeObj = localeInfo[localeID], -        fallBackObj = localeInfo[fallBackID]; - -    // fallBack to language formats when country format is missing -    // e.g. if NUMBER_FORMATS of en_xyz is not present, use the NUMBER_FORMATS of en instead -    if (!localeObj.NUMBER_FORMATS) { -      localeObj.NUMBER_FORMATS = fallBackObj.NUMBER_FORMATS; -    } - -    if (!localeObj.DATETIME_FORMATS) { -       localeObj.DATETIME_FORMATS = fallBackObj.DATETIME_FORMATS; -    } - -    // e.g. from zh_CN to zh-CN, from en_US to en-US -    var correctedLocaleId = localeID.replace(/_/g, '-').toLowerCase(); -    localeObj.id = correctedLocaleId; - -    var prefix = -      'angular.module("ngLocale", [], ["$provide", function($provide) {\n' + -         'var PLURAL_CATEGORY = {' + -           'ZERO: "zero", ONE: "one", TWO: "two", FEW: "few", MANY: "many", OTHER: "other"' + -         '};\n' + -         '$provide.value("$locale", '; - -    var suffix = ');\n}]);'; - -    var content = JSON.stringify(localeInfo[localeID]).replace(/\ยค/g,'\\u00A4'). -                      replace(/"@@|@@"/g, ''); - -    var toWrite = prefix + content + suffix; -    qfs.write(__dirname + '/../locale/' + 'angular-locale_' + correctedLocaleId + '.js', toWrite); +    var content = closureI18nExtractor.outputLocale(localeInfo, localeID); +    if (!content) return; +    var correctedLocaleId = closureI18nExtractor.correctedLocaleId(localeID); +    var filename = NG_LOCALE_DIR + 'angular-locale_' + correctedLocaleId + '.js' +    writePromises.push( +      qfs.write(filename, content) +      .then(function () { +        console.log('Wrote ' + filename); +        ++num_files; +        })); +    console.log('Writing ' + filename);    }); -  console.log('Generated ' + localeIds.length + ' locale files!'); -}).end(); - -function noop() {}; +  console.log('Generated %j locale files.', localeIds.length); +  return Q.all(writePromises).then(function() { return num_files }); +}  /**  * Make a folder under current directory.  * @param folder {string} name of the folder to be made  */  function createFolder(folder) { -  return qfs.isDirectory(__dirname + '/' + folder).then(function(isDir) { -    if (!isDir) return qfs.makeDirectory(__dirname + '/' + folder); +  return qfs.isDirectory(folder).then(function(isDir) { +    if (!isDir) return qfs.makeDirectory(folder).then(function() { +        console.log('Created directory %j', folder); });    });  } + +createFolder(NG_LOCALE_DIR) +  .then(readSymbols) +  .then(extractPlurals) +  .then(writeLocaleFiles) +  .done(function(num_files) { console.log("Wrote %j files.\nAll Done!", num_files); }); | 
