Alien-Web-HalBrowser

 view release on metacpan or  search on metacpan

share/vendor/js/uritemplates.js  view on Meta::CPAN

            // NOTE: by storing tupples we make sure a null return is validly consistent too in expansions
        }
    }
    return result;
};

CachingContext.prototype.lookupRaw = function(key) {
    return CachingContext.lookup(this, this.raw, key);
};

CachingContext.lookup = function(me, context, key) {
    var result = context[key];
    if (result !== undefined) {
        return result;
    } else {
        var keyparts = key.split('.');
        var i = 0, keysplits = keyparts.length - 1;
        for (i = 0; i<keysplits; i++) {
            var leadKey = keyparts.slice(0, keysplits - i).join('.');
            var trailKey = keyparts.slice(-i-1).join('.');
            var leadContext = context[leadKey];
            if (leadContext !== undefined) {
                return CachingContext.lookup(me, leadContext, trailKey);
            }
        }
        return undefined;
    }
};


function UriTemplate(set) {
    this.set = set;
}

UriTemplate.prototype.expand = function(context) {
    var cache = new CachingContext(context);
    var res = "";
    var i = 0, cnt = this.set.length;
    for (i = 0; i<cnt; i++ ) {
        res += this.set[i].expand(cache);
    }
    return res;
};

//TODO: change since draft-0.6 about characters in literals
/* extract:
The characters outside of expressions in a URI Template string are intended to be copied literally to the URI-reference if the character is allowed in a URI (reserved / unreserved / pct-encoded) or, if not allowed, copied to the URI-reference in its ...
*/
function Literal(txt ) {
    this.txt = txt;
}

Literal.prototype.expand = function() {
    return this.txt;
};



var RESERVEDCHARS_RE = new RegExp("[:/?#\\[\\]@!$&()*+,;=']","g");
function encodeNormal(val) {
    return encodeURIComponent(val).replace(RESERVEDCHARS_RE, function(s) {return escape(s);} );
}

//var SELECTEDCHARS_RE = new RegExp("[]","g");
function encodeReserved(val) {
    //return encodeURI(val).replace(SELECTEDCHARS_RE, function(s) {return escape(s)} );
    return encodeURI(val); // no need for additional replace if selected-chars is empty
}


function addUnNamed(name, key, val) {
    return key + (key.length > 0 ? "=" : "") + val;
}

function addNamed(name, key, val, noName) {
    noName = noName || false;
    if (noName) { name = ""; }
    
    if (!key || key.length === 0)  {
        key = name;
    }
    return key + (key.length > 0 ? "=" : "") + val;
}

function addLabeled(name, key, val, noName) {
    noName = noName || false;
    if (noName) { name = ""; }
    
    if (!key || key.length === 0)  {
        key = name;
    }
    return key + (key.length > 0 && val ? "=" : "") + val;
}


var simpleConf = { 
    prefix : "",     joiner : ",",     encode : encodeNormal,    builder : addUnNamed
};
var reservedConf = { 
    prefix : "",     joiner : ",",     encode : encodeReserved,  builder : addUnNamed
};
var fragmentConf = { 
    prefix : "#",    joiner : ",",     encode : encodeReserved,  builder : addUnNamed
};
var pathParamConf = { 
    prefix : ";",    joiner : ";",     encode : encodeNormal,    builder : addLabeled
};
var formParamConf = { 
    prefix : "?",    joiner : "&",     encode : encodeNormal,    builder : addNamed
};
var formContinueConf = { 
    prefix : "&",    joiner : "&",     encode : encodeNormal,    builder : addNamed
};
var pathHierarchyConf = { 
    prefix : "/",    joiner : "/",     encode : encodeNormal,    builder : addUnNamed
};
var labelConf = { 
    prefix : ".",    joiner : ".",     encode : encodeNormal,    builder : addUnNamed
};


function Expression(conf, vars ) {
    extend(this, conf);
    this.vars = vars;
}

share/vendor/js/uritemplates.js  view on Meta::CPAN

        if (obj.hasOwnProperty(k) ) {
            if (obj[k] !== null && obj[k] !== undefined) {
                buffer.append(joiner + k + ',').append(obj[k], encoder);
                joiner = ",";
            }
        }
    }
    return buffer.str;
}


function simpleValueHandler(me, val, valprops, encoder, adder) {
    var result;
    
    if (valprops.isArr) {
        result = arrayToString(val, encoder, me.maxLength);
    } else if (valprops.isObj) {
        result = objectToString(val, encoder, me.maxLength);
    } else {
        var buffer = new Buffer(me.maxLength);
        result = buffer.append(val, encoder).str;
    }       
    
    adder("", result);
}

function explodeValueHandler(me, val, valprops, encoder, adder) {
    if (valprops.isArr) {
        var i = 0, cnt = val.length;
        for (i = 0; i<cnt; i++) {
            adder("", encoder(val[i]) );
        }
    } else if (valprops.isObj) {
        var k;
        for (k in val) {
            if (val.hasOwnProperty(k)) {
                adder(k, encoder(val[k]) );
            }
        }
    } else { // explode-requested, but single value
        adder("", encoder(val));
    }
}

function valueProperties(val) {
    var isArr = false;
    var isObj = false;
    var isUndef = true;  //note: "" is empty but not undef
    
    if (val !== null && val !== undefined) {
        isArr = (val.constructor === Array);
        isObj = (val.constructor === Object);
        isUndef = (isArr && val.length === 0) || (isObj && isEmptyObject(val));
    } 
    
    return {isArr: isArr, isObj: isObj, isUndef: isUndef};
}


function VarSpec (name, vhfn, nums) {
    this.name = unescape(name); 
    this.valueHandler = vhfn;
    this.maxLength = nums;
}


VarSpec.build = function(name, expl, part, nums) {
    var valueHandler, valueModifier;
    
    if (!!expl) { //interprete as boolean
        valueHandler = explodeValueHandler;
    } else {
        valueHandler = simpleValueHandler;
    }
    
    if (!part) {
        nums = UNBOUND;
    }
    
    return new VarSpec(name, valueHandler, nums);
};


VarSpec.prototype.addValues = function(context, encoder, adder) {
    var val = context.get(this.name);
    var valprops = valueProperties(val);
    if (valprops.isUndef) { return; } // ignore empty values 
    this.valueHandler(this, val, valprops, encoder, adder);
};
    
    

//----------------------------------------------parsing logic
// How each varspec should look like
var VARSPEC_RE=/([^*:]*)((\*)|(:)([0-9]+))?/;

var match2varspec = function(m) {
    var name = m[1];
    var expl = m[3];
    var part = m[4];
    var nums = parseInt(m[5], 10);
    
    return VarSpec.build(name, expl, part, nums);
};


// Splitting varspecs in list with:
var LISTSEP=",";

// How each template should look like
var TEMPL_RE=/(\{([+#.;?&\/])?(([^.*:,{}|@!=$()][^*:,{}$()]*)(\*|:([0-9]+))?(,([^.*:,{}][^*:,{}]*)(\*|:([0-9]+))?)*)\})/g;
// Note: reserved operators: |!@ are left out of the regexp in order to make those templates degrade into literals 
// (as expected by the spec - see tests.html "reserved operators")


var match2expression = function(m) {
    var expr = m[0];
    var ops = m[2] || '';
    var vars = m[3].split(LISTSEP);
    var i = 0, len = vars.length;
    for (i = 0; i<len; i++) {



( run in 1.071 second using v1.01-cache-2.11-cpan-e1769b4cff6 )