source: Dev/trunk/src/client/util/buildscripts/cldr/arrayInherit.js

Last change on this file was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 5.4 KB
Line 
1/**
2 *  The CLDR represents some lists, like month names, as separate entries, and our JSON uses arrays to express them.
3 *  For some variants, the best our XSLT can do is translate this to a sparse array with 'undefined' entries.
4 *  These entries need to be picked up from the parent locale(s) and copied into the array as necessary(only when the item
5 *  is not the source of a locale alias mapping, like 'months-format-abbr' should be ignored if it is the source of
6 *  locale alias mapping like 'months-format-abbr@localeAlias' :{'target':"months-format-wide",'bundle':"gregorian"}).
7 *  So, this script is responsible for taking all the generated JSON files, and for values which are of type
8 *  array and not the source of locale alias mapping, mixing in the parent values with the undefined ones, recursing
9 *  all the way to the 'root' locale,and replacing the contents of the file.
10 *
11 *  this script traverses all locales dir in the given root dir
12 *
13 *   E.g.(Just for example, the contents are not applicable)
14 *   parent locale - "en":
15 *    // generated from ldml/main/ *.xml, xpath: ldml/calendars/calendar-ethiopic
16 *    ({
17 *      'months-format-abbr':["1","2","3","4","5","6","7","8","9","10","11","12"],
18 *      'dateFormat-long': "yyyy MMMM d",
19 *      'dateTimeFormat': "{1} {0}"
20 *    })
21 *
22 *   child locale - "en-us":
23 *    // generated from ldml/main/ *.xml, xpath: ldml/calendars/calendar-ethiopic
24 *    ({
25 *      'months-format-abbr':[undefined,undefined,"March",undefined,undefined,"June"],
26 *      'dateFormat-long': "yyyy-MMMM-d"
27 *    })
28 *
29 *   After process, the result will be:
30 *    child locale - "en-us":
31 *    // generated from ldml/main/ *.xml, xpath: ldml/calendars/calendar-ethiopic
32 *    ({
33 *      'months-format-abbr':["1","2","March","4","5","June","7","8","9","10","11","12"],
34 *      'dateFormat-long': "yyyy-MMMM-d"
35 *    })
36 */
37
38djConfig={baseUrl: "../../../dojo/", paths: {"dojo/_base/xhr": "../util/buildscripts/cldr/xhr"}};
39
40load("../../../dojo/dojo.js");
41load("../jslib/logger.js");
42load("../jslib/fileUtil.js");
43load("cldrUtil.js");
44
45dojo.require("dojo.i18n");
46
47var _searchLocalePath = function(/*String*/locale, /*Boolean*/down, /*Function*/searchFunc){
48    // summary:
49    //          A helper method to assist in searching for locale-based resources.
50    //          Will iterate through the variants of a particular locale, either up
51    //          or down, executing a callback function.  For example, "en-us" and
52    //          true will try "en-us" followed by "en" and finally "ROOT".
53
54    locale = dojo.i18n.normalizeLocale(locale);
55
56    var elements = locale.split('-');
57    var searchlist = [];
58    for(var i = elements.length; i > 0; i--){
59        searchlist.push(elements.slice(0, i).join('-'));
60    }
61    searchlist.push(false);
62    if(down){searchlist.reverse();}
63
64    for(var j = searchlist.length - 1; j >= 0; j--){
65        var loc = searchlist[j] || "ROOT";
66        var stop = searchFunc(loc);
67        if(stop){ break; }
68    }
69};
70
71var dir = arguments[0];
72var logDir = arguments[1];
73var logStr = "";
74
75print('arrayInherit.js...');
76
77// limit search to gregorian.js files, which are the only ones to use Array as data type
78var fileList = fileUtil.getFilteredFileList(dir, /\/gregorian\.js$/, true);
79
80for(var i= 0; i < fileList.length; i++){
81        //Use new String so we get a JS string and not a Java string.
82        var jsFileName = new String(fileList[i]);
83        var data = null;
84        var jsPath = jsFileName.split("/");
85        var localeIndex = jsPath.length-2;
86        var locale = jsPath[localeIndex];
87        if(locale=="nls"){continue;} // don't run on ROOT resource
88        var hasChanged = false;
89       
90        try{
91//              dojo.i18n._requireLocalization('dojo.cldr', 'gregorian', locale);
92                var bundle = dojo.i18n.getLocalization('dojo.cldr', 'gregorian', locale); //flattened bundle
93        }catch(e){/* logStr += "arrayInherit: an exception occurred: "+e;/* simply ignore if no bundle found*/}
94       
95        _searchLocalePath(locale, true, function(variant){
96                var isComplete = false;
97                var path = jsPath;
98                if(variant=="ROOT"){
99                        path = path.slice(0, localeIndex);
100                        path.push(jsPath[localeIndex+1]);
101                }else{
102                        path[localeIndex] = variant;
103                }
104                var contents;
105                try{
106                        contents = new String(readFile(path.join("/"), "utf-8"));
107                }catch(e){
108                        print(e); //TODO: should we be catching this?
109                        return false;
110                }
111                var variantData = dojo.fromJson(contents);
112                if(!data){
113                        data = variantData;
114                }else{
115                        isComplete = true;
116                        //logStr += locale + "===============================================\n";
117                        for(prop in data){
118                                if(dojo.isArray(data[prop])){
119                                        //ignore if the property is an alias source, for alias.js and specialLocale.js
120                                        if(isLocaleAliasSrc(prop, bundle)){
121                                                //logStr += prop + " is alias, ignored\n";
122                                                continue;
123                                        }
124
125                                        var variantArray = variantData[prop];
126                                        dojo.forEach(data[prop], function(element, index, list){
127                                                if(element === undefined && dojo.isArray(variantArray)){
128                                                        list[index] = variantArray[index];
129                                                        //logStr += prop + "[" + index + "] undefined, is replaced with " + list[index] + "\n";
130                                                        hasChanged = true;
131                                                        if(!("index" in list)){
132                                                                isComplete = false;
133                                                        }
134                                                }
135                                        });
136                                        if(dojo.isArray(variantArray) && variantArray.length > data[prop].length){
137                                                data[prop] = data[prop].concat(variantArray.slice(data[prop].length));
138                                                hasChanged = true;
139                                        }
140                                }
141                        }
142                        //logStr += "\n";
143                }
144                return isComplete;
145        });
146        if(hasChanged){
147                fileUtil.saveUtf8File(jsFileName, "(" + dojo.toJson(data, true) + ")");
148        }
149}
150
151//fileUtil.saveUtf8File(logDir + '/arrayInherit.log',logStr+'\n');
Note: See TracBrowser for help on using the repository browser.