testing/mochitest/MochiKit/Format.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /***
     3 MochiKit.Format 1.4
     5 See <http://mochikit.com/> for documentation, downloads, license, etc.
     7 (c) 2005 Bob Ippolito.  All rights Reserved.
     9 ***/
    11 if (typeof(dojo) != 'undefined') {
    12     dojo.provide('MochiKit.Format');
    13 }
    15 if (typeof(MochiKit) == 'undefined') {
    16     MochiKit = {};
    17 }
    19 if (typeof(MochiKit.Format) == 'undefined') {
    20     MochiKit.Format = {};
    21 }
    23 MochiKit.Format.NAME = "MochiKit.Format";
    24 MochiKit.Format.VERSION = "1.4";
    25 MochiKit.Format.__repr__ = function () {
    26     return "[" + this.NAME + " " + this.VERSION + "]";
    27 };
    28 MochiKit.Format.toString = function () {
    29     return this.__repr__();
    30 };
    32 MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) {
    33     return function (num) {
    34         num = parseFloat(num);
    35         if (typeof(num) == "undefined" || num === null || isNaN(num)) {
    36             return placeholder;
    37         }
    38         var curheader = header;
    39         var curfooter = footer;
    40         if (num < 0) {
    41             num = -num;
    42         } else {
    43             curheader = curheader.replace(/-/, "");
    44         }
    45         var me = arguments.callee;
    46         var fmt = MochiKit.Format.formatLocale(locale);
    47         if (isPercent) {
    48             num = num * 100.0;
    49             curfooter = fmt.percent + curfooter;
    50         }
    51         num = MochiKit.Format.roundToFixed(num, precision);
    52         var parts = num.split(/\./);
    53         var whole = parts[0];
    54         var frac = (parts.length == 1) ? "" : parts[1];
    55         var res = "";
    56         while (whole.length < leadingZeros) {
    57             whole = "0" + whole;
    58         }
    59         if (separatorAt) {
    60             while (whole.length > separatorAt) {
    61                 var i = whole.length - separatorAt;
    62                 //res = res + fmt.separator + whole.substring(i, whole.length);
    63                 res = fmt.separator + whole.substring(i, whole.length) + res;
    64                 whole = whole.substring(0, i);
    65             }
    66         }
    67         res = whole + res;
    68         if (precision > 0) {
    69             while (frac.length < trailingZeros) {
    70                 frac = frac + "0";
    71             }
    72             res = res + fmt.decimal + frac;
    73         }
    74         return curheader + res + curfooter;
    75     };
    76 };
    78 /** @id MochiKit.Format.numberFormatter */
    79 MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) {
    80     // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
    81     // | 0 | leading or trailing zeros
    82     // | # | just the number
    83     // | , | separator
    84     // | . | decimal separator
    85     // | % | Multiply by 100 and format as percent
    86     if (typeof(placeholder) == "undefined") {
    87         placeholder = "";
    88     }
    89     var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
    90     if (!match) {
    91         throw TypeError("Invalid pattern");
    92     }
    93     var header = pattern.substr(0, match.index);
    94     var footer = pattern.substr(match.index + match[0].length);
    95     if (header.search(/-/) == -1) {
    96         header = header + "-";
    97     }
    98     var whole = match[1];
    99     var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : "";
   100     var isPercent = (typeof(match[3]) == "string" && match[3] != "");
   101     var tmp = whole.split(/,/);
   102     var separatorAt;
   103     if (typeof(locale) == "undefined") {
   104         locale = "default";
   105     }
   106     if (tmp.length == 1) {
   107         separatorAt = null;
   108     } else {
   109         separatorAt = tmp[1].length;
   110     }
   111     var leadingZeros = whole.length - whole.replace(/0/g, "").length;
   112     var trailingZeros = frac.length - frac.replace(/0/g, "").length;
   113     var precision = frac.length;
   114     var rval = MochiKit.Format._numberFormatter(
   115         placeholder, header, footer, locale, isPercent, precision,
   116         leadingZeros, separatorAt, trailingZeros
   117     );
   118     var m = MochiKit.Base;
   119     if (m) {
   120         var fn = arguments.callee;
   121         var args = m.concat(arguments);
   122         rval.repr = function () {
   123             return [
   124                 self.NAME,
   125                 "(",
   126                 map(m.repr, args).join(", "),
   127                 ")"
   128             ].join("");
   129         };
   130     }
   131     return rval;
   132 };
   134 /** @id MochiKit.Format.formatLocale */
   135 MochiKit.Format.formatLocale = function (locale) {
   136     if (typeof(locale) == "undefined" || locale === null) {
   137         locale = "default";
   138     }
   139     if (typeof(locale) == "string") {
   140         var rval = MochiKit.Format.LOCALE[locale];
   141         if (typeof(rval) == "string") {
   142             rval = arguments.callee(rval);
   143             MochiKit.Format.LOCALE[locale] = rval;
   144         }
   145         return rval;
   146     } else {
   147         return locale;
   148     }
   149 };
   151 /** @id MochiKit.Format.twoDigitAverage */
   152 MochiKit.Format.twoDigitAverage = function (numerator, denominator) {
   153     if (denominator) {
   154         var res = numerator / denominator;
   155         if (!isNaN(res)) {
   156             return MochiKit.Format.twoDigitFloat(numerator / denominator);
   157         }
   158     }
   159     return "0";
   160 };
   162 /** @id MochiKit.Format.twoDigitFloat */
   163 MochiKit.Format.twoDigitFloat = function (someFloat) {
   164     var sign = (someFloat < 0 ? '-' : '');
   165     var s = Math.floor(Math.abs(someFloat) * 100).toString();
   166     if (s == '0') {
   167         return s;
   168     }
   169     if (s.length < 3) {
   170         while (s.charAt(s.length - 1) == '0') {
   171             s = s.substring(0, s.length - 1);
   172         }
   173         return sign + '0.' + s;
   174     }
   175     var head = sign + s.substring(0, s.length - 2);
   176     var tail = s.substring(s.length - 2, s.length);
   177     if (tail == '00') {
   178         return head;
   179     } else if (tail.charAt(1) == '0') {
   180         return head + '.' + tail.charAt(0);
   181     } else {
   182         return head + '.' + tail;
   183     }
   184 };
   186 /** @id MochiKit.Format.lstrip */
   187 MochiKit.Format.lstrip = function (str, /* optional */chars) {
   188     str = str + "";
   189     if (typeof(str) != "string") {
   190         return null;
   191     }
   192     if (!chars) {
   193         return str.replace(/^\s+/, "");
   194     } else {
   195         return str.replace(new RegExp("^[" + chars + "]+"), "");
   196     }
   197 };
   199 /** @id MochiKit.Format.rstrip */
   200 MochiKit.Format.rstrip = function (str, /* optional */chars) {
   201     str = str + "";
   202     if (typeof(str) != "string") {
   203         return null;
   204     }
   205     if (!chars) {
   206         return str.replace(/\s+$/, "");
   207     } else {
   208         return str.replace(new RegExp("[" + chars + "]+$"), "");
   209     }
   210 };
   212 /** @id MochiKit.Format.strip */
   213 MochiKit.Format.strip = function (str, /* optional */chars) {
   214     var self = MochiKit.Format;
   215     return self.rstrip(self.lstrip(str, chars), chars);
   216 };
   218 /** @id MochiKit.Format.truncToFixed */
   219 MochiKit.Format.truncToFixed = function (aNumber, precision) {
   220     aNumber = Math.floor(aNumber * Math.pow(10, precision));
   221     var res = (aNumber * Math.pow(10, -precision)).toFixed(precision);
   222     if (res.charAt(0) == ".") {
   223         res = "0" + res;
   224     }
   225     return res;
   226 };
   228 /** @id MochiKit.Format.roundToFixed */
   229 MochiKit.Format.roundToFixed = function (aNumber, precision) {
   230     return MochiKit.Format.truncToFixed(
   231         aNumber + 0.5 * Math.pow(10, -precision),
   232         precision
   233     );
   234 };
   236 /** @id MochiKit.Format.percentFormat */
   237 MochiKit.Format.percentFormat = function (someFloat) {
   238     return MochiKit.Format.twoDigitFloat(100 * someFloat) + '%';
   239 };
   241 MochiKit.Format.EXPORT = [
   242     "truncToFixed",
   243     "roundToFixed",
   244     "numberFormatter",
   245     "formatLocale",
   246     "twoDigitAverage",
   247     "twoDigitFloat",
   248     "percentFormat",
   249     "lstrip",
   250     "rstrip",
   251     "strip"
   252 ];
   254 MochiKit.Format.LOCALE = {
   255     en_US: {separator: ",", decimal: ".", percent: "%"},
   256     de_DE: {separator: ".", decimal: ",", percent: "%"},
   257     fr_FR: {separator: " ", decimal: ",", percent: "%"},
   258     "default": "en_US"
   259 };
   261 MochiKit.Format.EXPORT_OK = [];
   262 MochiKit.Format.EXPORT_TAGS = {
   263     ':all': MochiKit.Format.EXPORT,
   264     ':common': MochiKit.Format.EXPORT
   265 };
   267 MochiKit.Format.__new__ = function () {
   268     // MochiKit.Base.nameFunctions(this);
   269     var base = this.NAME + ".";
   270     var k, v, o;
   271     for (k in this.LOCALE) {
   272         o = this.LOCALE[k];
   273         if (typeof(o) == "object") {
   274             o.repr = function () { return this.NAME; };
   275             o.NAME = base + "LOCALE." + k;
   276         }
   277     }
   278     for (k in this) {
   279         o = this[k];
   280         if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') {
   281             try {
   282                 o.NAME = base + k;
   283             } catch (e) {
   284                 // pass
   285             }
   286         }
   287     }
   288 };
   290 MochiKit.Format.__new__();
   292 if (typeof(MochiKit.Base) != "undefined") {
   293     MochiKit.Base._exportSymbols(this, MochiKit.Format);
   294 } else {
   295     (function (globals, module) {
   296         if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined')
   297             || (MochiKit.__export__ === false)) {
   298             var all = module.EXPORT_TAGS[":all"];
   299             for (var i = 0; i < all.length; i++) {
   300                 globals[all[i]] = module[all[i]]; 
   301             }
   302         }   
   303     })(this, MochiKit.Format);  
   304 }

mercurial