tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Format.js (8874B)


      1 /***
      2 
      3 MochiKit.Format 1.4
      4 
      5 See <http://mochikit.com/> for documentation, downloads, license, etc.
      6 
      7 (c) 2005 Bob Ippolito.  All rights Reserved.
      8 
      9 ***/
     10 
     11 if (typeof(dojo) != 'undefined') {
     12    dojo.provide('MochiKit.Format');
     13 }
     14 
     15 if (typeof(MochiKit) == 'undefined') {
     16    MochiKit = {};
     17 }
     18 
     19 if (typeof(MochiKit.Format) == 'undefined') {
     20    MochiKit.Format = {};
     21 }
     22 
     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 };
     31 
     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 };
     77 
     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 };
    133 
    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 };
    150 
    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 };
    161 
    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 };
    185 
    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 };
    198 
    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 };
    211 
    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 };
    217 
    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 };
    227 
    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 };
    235 
    236 /** @id MochiKit.Format.percentFormat */
    237 MochiKit.Format.percentFormat = function (someFloat) {
    238    return MochiKit.Format.twoDigitFloat(100 * someFloat) + '%';
    239 };
    240 
    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 ];
    253 
    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 };
    260 
    261 MochiKit.Format.EXPORT_OK = [];
    262 MochiKit.Format.EXPORT_TAGS = {
    263    ':all': MochiKit.Format.EXPORT,
    264    ':common': MochiKit.Format.EXPORT
    265 };
    266 
    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 };
    289 
    290 MochiKit.Format.__new__();
    291 
    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 }