_polyfill-quote.js 2.28 KB
/**
 * @private
 */
/*jslint node: true, nomen: true, regexp: true */
"use strict";

if (!String.prototype.quote) {
    // oop version - no dependencies
    String.prototype.quote = (function () {
        // prepare fallback
        // ----------------
        // backslash escape double quotes and backslashes
        var escp_regex = /[\\"]/g,
            escp_callback = '\\$&',
        // escape control characters
            ctrl_map = {
                '\b': '\\b', // backspace
                '\t': '\\t', // tab
                '\n': '\\n', // new line
                '\f': '\\f', // form feed
                '\r': '\\r'  // carriage return
            },
        // don't rely on `Object.keys(ctrl_map).join('')`
            ctrl_regex = new RegExp('[\b\t\n\f\r]', 'g'),
            ctrl_callback = function (match) {
                return ctrl_map[match];
            },
        // hex-escape, spare out control characters and ASCII printables
        // [0-7,11,14-31,127-255]
            xhex_regex = /[\x00-\x07\x0B\x0E-\x1F\x7F-\xFF]/g,
            xhex_callback = function (match, char_code) {
                char_code = match.charCodeAt(0);
                return '\\x' + (char_code < 16 ? '0' : '') + char_code;
            },
        // hex-escape all others
            uhex_regex = /[\u0100-\uFFFF]/g,
            uhex_callback = function (match, char_code) {
                char_code = match.charCodeAt(0);
                return '\\u' + (char_code < 4096 ? '0' : '') + char_code;
            },
        // delegate to native `JSON.stringify` if available
            stringify = typeof JSON !== 'undefined' && JSON.stringify;

        // return actual polyfill
        // ----------------------
        return function () {
            var self = this; // promote compression
            if (self === null) { throw new TypeError('can\'t convert ' + self + ' to object'); }
            if (stringify) { return stringify(self); }
            return '"' + self
                    .replace(escp_regex, escp_callback)
                    .replace(ctrl_regex, ctrl_callback)
                    .replace(xhex_regex, xhex_callback)
                    .replace(uhex_regex, uhex_callback) + '"';
        };
    }());

    // generic version - requires Function#bind
    String.quote = Function.call.bind(''.quote);
}