uri-template-router
Version:
Match a URI to a pattern in a collection of URI Templates
42 lines (38 loc) • 930 B
JavaScript
;
// Get all the characters described by a charclass like [a-z0-9]
function *range(str){
for(var i=0; i<str.length; i++){
const chr = str[i];
if(chr === '-'){
yield chr;
}else if(str[i+1]==='-' && str[i+2]){
for(var j=str.charCodeAt(i), end=str.charCodeAt(i+2); j<=end; j++){
yield String.fromCharCode(j);
}
i += 2;
}else{
yield chr;
}
}
}
function toRangeString(chars){
var str = '';
chars = chars.slice().sort();
for(var i=0; i<chars.length; i++){
if(chars[i].length !== 1) throw new Error('Invalid symbol size');
const startCode = chars[i].charCodeAt();
for(var j=0; i+j+1<chars.length && chars[i+j+1].charCodeAt() !== startCode+j+1; j++);
if(j===0){
str += chars[i];
}else if(j===1){
str += chars[i] + chars[i+1];
}else{
str += chars[i] + '-' + chars[i+j];
}
i += j;
}
return str;
}
function normalize(str){
return toRangeString([...range(str)]);
}