oidc-lib
Version:
A library for creating OIDC Service Providers
83 lines (70 loc) • 3.07 kB
JavaScript
module.exports = {
compile: compile
}
function compile(source){
var offset = 0;
var segments = [];
while (offset < source.length){
var startTokenOffset = source.substring(offset).indexOf('{{#');
if (startTokenOffset >=0 ){
startTokenOffset += offset;
segments.push({source: [], content: source.substring(offset, startTokenOffset)});
endOfStartTokenOffset = startTokenOffset + 3;
var tokenLength = source.substring(endOfStartTokenOffset).indexOf('}}');
var tokenName = source.substring(endOfStartTokenOffset, endOfStartTokenOffset + tokenLength);
var endOfStartToken = startTokenOffset + tokenName.length + 6;
var closingToken = '{{/' + tokenName + '}}';
var closingTokenOffset = source.substring(endOfStartToken).indexOf(closingToken);
var tokenContent = source.substring(endOfStartToken, endOfStartToken + closingTokenOffset);
var endTokenOffset = endOfStartToken + tokenContent.length + closingToken.length;
segments.push({source: [tokenName], content: tokenContent});
}
else{
segments.push({source: [], content: source.substring(offset, source.length)});
var endTokenOffset = source.length;
}
offset = endTokenOffset;
}
addTemplateFunction(segments);
return templateProcessor;
}
function substitute(tokenContent, json){
for (var claim in json){
tokenContent = tokenContent.replace(new RegExp('{{{' + claim + '}}}', 'g'), json[claim]).replace(new RegExp('{{' + claim + '}}', 'g'), json[claim]);
}
return tokenContent;
}
function addTemplateFunction(segments){
var oScript = document.createElement('script');
oScript.language = 'javascript';
oScript.type = 'text/javascript';
oScript.text = templateProcessorSource.toString()
.replace('templateProcessorSource', 'templateProcessor')
.replace('// placeHolderForSegments', 'var segments = ' + JSON.stringify(segments) + ';')
+ '\r\n\r\n' + templateProcessorSubstitute.toString();
document.getElementsByTagName('BODY').item(0).appendChild(oScript);
}
function templateProcessorSource(context){
// placeHolderForSegments
var output = "";
for (var c1=0; c1 < segments.length; c1++){
var step =segments[c1];
if (step.source.length === 0){
output += step.content;
}
else if (step.source.length === 1){
var repeater = context[step.source[0]];
for (var c2=0; c2 < repeater.length; c2++){
output += templateProcessorSubstitute(step.content, repeater[c2]);
}
}
}
output = templateProcessorSubstitute(output, context);
return output;
}
function templateProcessorSubstitute(tokenContent, json){
for (var claim in json){
var tokenContent = tokenContent.replace(new RegExp('{{{' + claim + '}}}', 'g'), json[claim]).replace(new RegExp('{{' + claim + '}}', 'g'), json[claim]);
}
return tokenContent;
}