src/cm/media/js/lib/yui/yui3.0.0/build/substitute/substitute.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 0 40c8f766c9b8
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
/*
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
Code licensed under the BSD License:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
http://developer.yahoo.net/yui/license.txt
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
version: 3.0.0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
build: 1549
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
*/
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
YUI.add('substitute', function(Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
/**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
 * String variable substitution and string formatting.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
 * If included, the substitute method is added to the YUI instance.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
 *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
 * @module substitute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
 */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
    var L = Y.Lang, DUMP='dump', SPACE=' ', LBRACE='{', RBRACE='}',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
     * The following methods are added to the YUI instance
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
     * @class YUI~substitute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
     // @todo template configurability is not implemented yet
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
     // @param ldelim {string} optional left delimiter for the replacement token (default: left brace)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
     // @param rdelim {string} optional right delimiter for the replacement token (default: right brace)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
    /**
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
     * Does variable substitution on a string. It scans through the string 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
     * looking for expressions enclosed in { } braces. If an expression 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
     * is found, it is used a key on the object.  If there is a space in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
     * the key, the first word is used for the key and the rest is provided
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
     * to an optional function to be used to programatically determine the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
     * value (the extra information might be used for this decision). If 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
     * the value for the key in the object, or what is returned from the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
     * function has a string value, number value, or object value, it is 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
     * substituted for the bracket expression and it repeats.  If this
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
     * value is an object, it uses the Object's toString() if this has
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
     * been overridden, otherwise it does a shallow dump of the key/value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
     * pairs if Y.dump is available (if dump isn't available, toString()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
     * is used).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
     * This method is included in the 'substitute' module.  It is not included
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
     * in the YUI module.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
     *
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
     * @method substitute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
     * @param s {string} The string that will be modified.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
     * @param o An object containing the replacement values
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
     * @param f {function} An optional function that can be used to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
     *                     process each match.  It receives the key,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
     *                     value, and any extra metadata included with
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
     *                     the key inside of the braces.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
     * @return {string} the substituted string
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
     */
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
    substitute = function (s, o, f, ldelim, rdelim) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
        var i, j, k, key, v, meta, saved=[], token, dump;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
        ldelim = ldelim || LBRACE;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
        rdelim = rdelim || RBRACE;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
        for (;;) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
            i = s.lastIndexOf(ldelim);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
            if (i < 0) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
            j = s.indexOf(rdelim, i);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
            if (i + 1 >= j) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
                break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
            //Extract key and meta info 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
            token = s.substring(i + 1, j);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
            key = token;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
            meta = null;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
            k = key.indexOf(SPACE);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
            if (k > -1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
                meta = key.substring(k + 1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
                key = key.substring(0, k);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
            // lookup the value
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
            v = o[key];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
            // if a substitution function was provided, execute it
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
            if (f) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
                v = f(key, v, meta);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
            if (L.isObject(v)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
                if (!Y.dump) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
                    v = v.toString();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
                } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
                    if (L.isArray(v)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
                        v = Y.dump(v, parseInt(meta, 10));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
                    } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
                        meta = meta || "";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
                        // look for the keyword 'dump', if found force obj dump
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
                        dump = meta.indexOf(DUMP);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
                        if (dump > -1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
                            meta = meta.substring(4);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
                        // use the toString if it is not the Object toString 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
                        // and the 'dump' meta info was not found
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
                        if (v.toString===Object.prototype.toString||dump>-1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
                            v = Y.dump(v, parseInt(meta, 10));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
                        } else {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
                            v = v.toString();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
                        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
                    }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
                }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
            } else if (!L.isString(v) && !L.isNumber(v)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
                // This {block} has no replace string. Save it for later.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
                v = "~-" + saved.length + "-~";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
                saved[saved.length] = token;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
                // break;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
            }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
            s = s.substring(0, i) + v + s.substring(j + 1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
        // restore saved {block}s
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
        for (i=saved.length-1; i>=0; i=i-1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
            s = s.replace(new RegExp("~-" + i + "-~"), ldelim  + saved[i] + rdelim, "g");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
        }
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
        return s;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
    };
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
    Y.substitute = substitute;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
    L.substitute = substitute;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
}, '3.0.0' ,{optional:['dump']});