aboutsummaryrefslogtreecommitdiffstats
path: root/i18n/src/closureSlurper.js
diff options
context:
space:
mode:
Diffstat (limited to 'i18n/src/closureSlurper.js')
-rwxr-xr-xi18n/src/closureSlurper.js155
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); });