source: Dev/branches/rest-dojo-ui/client/util/buildscripts/cldr/arrayInherit.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 5.7 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/"};
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.