Changeset 7429

Show
Ignore:
Timestamp:
02/23/07 19:51:43 (23 months ago)
Author:
peller
Message:

create method dojo.date.regexp for validation widget. References #2475

Location:
trunk/src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/date/format.js

    r7382 r7429  
    5656                                case 'G': 
    5757                                        if(l>3){dojo.unimplemented("Era format not implemented");} 
    58                                         s = info.eras[dateObject.getFullYear() < 0 ? 1 : 0]; 
     58                                        s = bundle.eras[dateObject.getFullYear() < 0 ? 1 : 0]; 
    5959                                        break; 
    6060                                case 'y': 
     
    9797                                                var type = (c == "L") ? "standalone" : "format"; 
    9898                                                var prop = ["months",type,width].join("-"); 
    99                                                 s = info[prop][m]; 
     99                                                s = bundle[prop][m]; 
    100100                                        } 
    101101                                        break; 
     
    133133                                                var type = (c == "c") ? "standalone" : "format"; 
    134134                                                var prop = ["days",type,width].join("-"); 
    135                                                 s = info[prop][d]; 
     135                                                s = bundle[prop][d]; 
    136136                                        } 
    137137                                        break; 
    138138                                case 'a': 
    139139                                        var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm'; 
    140                                         s = info[timePeriod]; 
     140                                        s = bundle[timePeriod]; 
    141141                                        break; 
    142142                                case 'h': 
     
    212212        var locale = dojo.hostenv.normalizeLocale(options.locale); 
    213213        var formatLength = options.formatLength || 'full'; 
    214         var info = dojo.date._getGregorianBundle(locale); 
     214        var bundle = dojo.date._getGregorianBundle(locale); 
    215215        var str = []; 
    216216        var sauce = dojo.lang.curry(this, formatPattern, dateObject); 
     
    224224        } 
    225225        if(options.selector != "timeOnly"){ 
    226                 var datePattern = options.datePattern || info["dateFormat-"+formatLength]; 
     226                var datePattern = options.datePattern || bundle["dateFormat-"+formatLength]; 
    227227                if(datePattern){str.push(_processPattern(datePattern, sauce));} 
    228228        } 
    229229        if(options.selector != "dateOnly"){ 
    230                 var timePattern = options.timePattern || info["timeFormat-"+formatLength]; 
     230                var timePattern = options.timePattern || bundle["timeFormat-"+formatLength]; 
    231231                if(timePattern){str.push(_processPattern(timePattern, sauce));} 
    232232        } 
     
    234234        return result; /*String*/ 
    235235}; 
     236 
     237dojo.date.regexp = function(/*Object?*/options){ 
     238// 
     239// summary: 
     240//              Builds the regular needed to parse a localized date 
     241// 
     242// options: object {selector: string, formatLength: string, datePattern: string, timePattern: string, locale: string, strict: boolean} 
     243//              selector- choice of timeOnly, dateOnly, dateTime (default: dateOnly) 
     244//              formatLength- choice of long, short, medium or full (plus any custom additions).  Defaults to 'full' 
     245//              datePattern,timePattern- override pattern with this string 
     246//              locale- override the locale used to determine formatting rules 
     247 
     248        return dojo.date._parseInfo(options).regexp; // String 
     249}; 
     250 
     251dojo.date._parseInfo = function(/*Object?*/options){ 
     252        options = options || {}; 
     253        var locale = dojo.hostenv.normalizeLocale(options.locale); 
     254        var bundle = dojo.date._getGregorianBundle(locale); 
     255        var formatLength = options.formatLength || 'full'; 
     256        if(!options.selector){ options.selector = 'dateOnly'; } 
     257        var datePattern = options.datePattern || bundle["dateFormat-" + formatLength]; 
     258        var timePattern = options.timePattern || bundle["timeFormat-" + formatLength]; 
     259        var pattern = datePattern; 
     260        if(options.selector == 'timeOnly'){ 
     261                pattern = timePattern; 
     262        }else if(options.selector == 'dateTime'){ 
     263                pattern = datePattern + ' ' + timePattern; //TODO: use locale-specific pattern to assemble date + time 
     264        } 
     265 
     266        var groups = []; 
     267        var re = _processPattern(pattern, dojo.lang.curry(this, _buildDateTimeRE, groups, bundle, options)); 
     268        return {regexp: re, groups: groups, bundle: bundle}; 
     269} 
    236270 
    237271dojo.date.parse = function(/*String*/value, /*Object?*/options){ 
     
    263297// 
    264298 
    265         options = options || {}; 
    266         var locale = dojo.hostenv.normalizeLocale(options.locale); 
    267         var info = dojo.date._getGregorianBundle(locale); 
    268         var formatLength = options.formatLength || 'full'; 
    269         if(!options.selector){ options.selector = 'dateOnly'; } 
    270         var datePattern = options.datePattern || info["dateFormat-" + formatLength]; 
    271         var timePattern = options.timePattern || info["timeFormat-" + formatLength]; 
    272         var pattern; 
    273         if(options.selector == 'dateOnly'){ 
    274                 pattern = datePattern; 
    275         } 
    276         else if(options.selector == 'timeOnly'){ 
    277                 pattern = timePattern; 
    278         }else if(options.selector == 'dateTime'){ 
    279                 pattern = datePattern + ' ' + timePattern; //TODO: use locale-specific pattern to assemble date + time 
    280         }else{ 
    281                 var msg = "dojo.date.parse: Unknown selector param passed: '" + options.selector + "'."; 
    282                 msg += " Defaulting to date pattern."; 
    283                 dojo.debug(msg); 
    284                 pattern = datePattern; 
    285         } 
    286  
    287         var groups = []; 
    288         var dateREString = _processPattern(pattern, dojo.lang.curry(this, _buildDateTimeRE, groups, info, options)); 
    289         var dateRE = new RegExp("^" + dateREString + "$"); 
    290  
    291         var match = dateRE.exec(value); 
    292         if(!match){ 
    293                 return null; 
    294         } 
     299        var info = dojo.date._parseInfo(options); 
     300        var groups = info.groups, bundle = info.bundle; 
     301        var re = new RegExp("^" + info.regexp + "$");; 
     302        var match = re.exec(value); 
     303        if(!match){ return null;} 
    295304 
    296305        var widthList = ['abbr', 'wide', 'narrow']; 
     
    341350                                                v = v.toLowerCase(); 
    342351                                        } 
    343                                         var months = info['months-format-' + widthList[l-3]].concat(); 
     352                                        var months = bundle['months-format-' + widthList[l-3]].concat(); 
    344353                                        for (var j=0; j<months.length; j++){ 
    345354                                                if(!options.strict){ 
     
    368377                                        v = v.toLowerCase(); 
    369378                                } 
    370                                 var days = info['days-format-' + widthList[l-3]].concat(); 
     379                                var days = bundle['days-format-' + widthList[l-3]].concat(); 
    371380                                for (var j=0; j<days.length; j++){ 
    372381                                        if(!options.strict){ 
     
    398407                                break; 
    399408                        case 'a': //am/pm 
    400                                 var am = options.am || info.am; 
    401                                 var pm = options.pm || info.pm; 
     409                                var am = options.am || bundle.am; 
     410                                var pm = options.pm || bundle.pm; 
    402411                                if(!options.strict){ 
    403412                                        v = v.replace(/\./g,'').toLowerCase(); 
     
    462471        //TODO: implement a getWeekday() method in order to test  
    463472        //validity of input strings containing 'EEE' or 'EEEE'... 
    464  
    465473        return result; /*Date*/ 
    466474}; 
     
    490498} 
    491499 
    492 function _buildDateTimeRE(groups, info, options, pattern){ 
     500function _buildDateTimeRE(groups, bundle, options, pattern){ 
    493501        return pattern.replace(/([a-z])\1*/ig, function(match){ 
    494502                // Build a simple regexp without parenthesis, which would ruin the match list 
     
    498506                switch(c){ 
    499507                        case 'y': 
    500                                 s = '\\d' + ((l==2) ? '{2,4}' : '+'); 
     508                                s = '\\d' + ((l==2) ? '{2,4}' : '{4}'); 
    501509                                break; 
    502510                        case 'M': 
    503                                 s = (l>2) ? '\\S+' : '\\d{1,2}'; 
     511                                s = (l>2) ? '\\S+' : '(?:(?:0*[1-9])|(?:1[0-2]))'; 
    504512                                break; 
    505513                        case 'D': 
     
    507515                                break; 
    508516                        case 'd': 
     517                                s = '(?:(?:0*[1-9])|(?:[12]\\d)|(?:3[01]))'; 
     518                                break; 
    509519                        case 'w': 
    510520                                s = '\\d{1,2}'; 
     
    513523                                s = '\\S+'; 
    514524                                break; 
    515                         case 'h':  
    516                         case 'H':  
    517                         case 'K':  
    518                         case 'k': 
    519                                 s = '\\d{1,2}'; 
     525 
     526                        case 'h': //hour (1-12) 
     527                                s = '(?:(?:0*[1-9])|(?:1[0-2]))'; 
     528                                break; 
     529                        case 'k': //hour (0-11) 
     530                                s = '(?:(?:0*\\d)|(?:1[01]))'; 
     531                                break; 
     532                        case 'H': //hour (0-23) 
     533                                s = '(?:(?:0*\\d)|(?:1\\d)|(?:2[0-3]))'; 
     534                                break; 
     535                        case 'K': //hour (1-24) 
     536                                s = '(?:(?:0*[1-9])|(?:1\\d)|(?:2[0-4]))'; 
    520537                                break; 
    521538                        case 'm': 
     
    527544                                break; 
    528545                        case 'a': 
    529                                 var am = options.am || info.am || 'AM'; 
    530                                 var pm = options.pm || info.pm || 'PM'; 
     546                                var am = options.am || bundle.am || 'AM'; 
     547                                var pm = options.pm || bundle.pm || 'PM'; 
    531548                                if(options.strict){ 
    532549                                        s = am + '|' + pm; 
     
    567584        } 
    568585 
    569         var info = dojo.date._getGregorianBundle(locale); 
     586        var bundle = dojo.date._getGregorianBundle(locale); 
    570587 
    571588        function $(property){ 
     
    653670                        case "p": // either `am' or `pm' according to the given time value, 
    654671                                      // or the corresponding strings for the current locale 
    655                                 return info[dateObject.getHours() < 12 ? "am" : "pm"]; 
     672                                return bundle[dateObject.getHours() < 12 ? "am" : "pm"]; 
    656673                                 
    657674                        case "r": // time in a.m. and p.m. notation 
  • trunk/src/number.js

    r7398 r7429  
    11dojo.provide("dojo.number"); 
    22 
    3 dojo.require("dojo.experimental"); 
    4 dojo.experimental("dojo.number"); 
    53dojo.require("dojo.i18n.common"); 
    64dojo.requireLocalization("dojo.i18n.cldr", "number");