Comparing version 1.0.2 to 1.0.3
{ | ||
"name": "vancat", | ||
"version": "1.0.2", | ||
"version": "1.0.3", | ||
"description": "A fast and small templating engine for client side rendering HTML", | ||
@@ -5,0 +5,0 @@ "author": "Serhat Abdulbakioğlu", |
653
vancat.js
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : | ||
typeof define === 'function' && define.amd ? define(factory) : | ||
(global = global || self, global.Vancat = factory()); | ||
}(this, (function () { 'use strict'; | ||
typeof exports === 'object' && typeof module !== 'undefined' | ||
? (module.exports = factory()) | ||
: typeof define === 'function' && define.amd | ||
? define(factory) | ||
: ((global = global || self), (global.Vancat = factory())); | ||
})(this, function () { | ||
'use strict'; | ||
/*! | ||
* vancat.js - Fast and small templating engine | ||
* v1.0.2 | ||
* https://github.com/serhat359/vancat-js | ||
*/ | ||
/*! | ||
* vancat.js - Fast and small templating engine | ||
* v1.0.3 | ||
* https://github.com/serhat359/vancat-js | ||
*/ | ||
var Vancat = (function () { | ||
const registeredHelpers = { | ||
not: (x) => !x, | ||
}; | ||
const registeredPartials = {}; | ||
const registerHelper = (name, f) => (registeredHelpers[name] = f); | ||
const registerPartial = (name, template) => | ||
(registeredPartials[name] = compileToStatements(template)); | ||
const compile = (template) => { | ||
const statements = compileToStatements(template); | ||
return (data, helpers = {}) => { | ||
const parts = []; | ||
const writer = (x) => parts.push(x); | ||
const context = { | ||
contextData: { $: data }, | ||
get(key) { | ||
return ( | ||
this.contextData[key] ?? | ||
helpers[key] ?? | ||
registeredHelpers[key] ?? | ||
this.contextData.$[key] | ||
); | ||
}, | ||
set(name, val) { | ||
this.contextData[name] = val; | ||
}, | ||
replaceContextData(data) { | ||
const old = this.contextData; | ||
this.contextData = { $: data }; | ||
return old; | ||
}, | ||
setContextData(data) { | ||
this.contextData = data; | ||
}, | ||
var Vancat = (function () { | ||
const registeredHelpers = { | ||
not: (x) => !x, | ||
}; | ||
const registeredPartials = {}; | ||
const registerHelper = (name, f) => (registeredHelpers[name] = f); | ||
const registerPartial = (name, template) => | ||
(registeredPartials[name] = compileToStatements(template)); | ||
const compile = (template) => { | ||
const statements = compileToStatements(template); | ||
return (data, helpers = {}) => { | ||
const parts = []; | ||
const writer = (x) => parts.push(x); | ||
const context = { | ||
contextData: { $: data }, | ||
get(key) { | ||
return ( | ||
this.contextData[key] ?? | ||
helpers[key] ?? | ||
registeredHelpers[key] ?? | ||
this.contextData.$[key] | ||
); | ||
}, | ||
set(name, val) { | ||
this.contextData[name] = val; | ||
}, | ||
getDirect(name) { | ||
return this.contextData[name]; | ||
}, | ||
replaceContextData(data) { | ||
const old = this.contextData; | ||
this.contextData = { $: data }; | ||
return old; | ||
}, | ||
setContextData(data) { | ||
this.contextData = data; | ||
}, | ||
}; | ||
runStatements(writer, context, statements); | ||
return parts.join(''); | ||
}; | ||
runStatements(writer, context, statements); | ||
return parts.join(''); | ||
}; | ||
}; | ||
const compileToStatements = (template) => { | ||
const statements = []; | ||
let end = 0; | ||
let statement; | ||
while (end < template.length) { | ||
[statement, end] = getStatement(template, end); | ||
if (!statement) err('Unexpected end token'); | ||
statements.push(statement); | ||
} | ||
return statements; | ||
}; | ||
const getStatement = (template, start) => { | ||
if (start == template.length) err('Expected {{end}} but not found'); | ||
const i = template.indexOf('{{', start); | ||
if (i == start) { | ||
if (template[i + 2] === '>') { | ||
// handle partial here | ||
const [tokens, end] = getTokens(template, i + 3); | ||
const templateName = tokens[0]; | ||
if (!templateName) err('Template name not specified'); | ||
const expr = getExpression(tokens, 1); | ||
const statement = (writer, context) => { | ||
const partialStatements = registeredPartials[templateName]; | ||
if (!partialStatements) err(`Partial not registered: ${templateName}`); | ||
const newData = expr(context); | ||
const oldData = context.replaceContextData(newData); | ||
runStatements(writer, context, partialStatements); | ||
context.setContextData(oldData); | ||
}; | ||
return [statement, end]; | ||
const compileToStatements = (template) => { | ||
const statements = []; | ||
let end = 0; | ||
let statement; | ||
while (end < template.length) { | ||
[statement, end] = getStatement(template, end); | ||
if (!statement) err('Unexpected end token'); | ||
statements.push(statement); | ||
} | ||
let [tokens, end] = getTokens(template, i + 2); | ||
const first = tokens[0]; | ||
if (first === 'for') { | ||
let loopType = tokens[2]; | ||
if (loopType !== 'in') { | ||
const inIndex = tokens.indexOf('in'); | ||
if (inIndex > 2) { | ||
tokens = mergeTokens(tokens, inIndex); | ||
loopType = tokens[2]; | ||
} else err('Missing "in" in for-loop'); | ||
return statements; | ||
}; | ||
const getStatement = (template, start) => { | ||
if (start == template.length) err('Expected {{end}} but not found'); | ||
const i = template.indexOf('{{', start); | ||
if (i == start) { | ||
if (template[i + 2] === '>') { | ||
// handle partial here | ||
const [tokens, end] = getTokens(template, i + 3); | ||
const templateName = tokens[0]; | ||
if (!templateName) err('Template name not specified'); | ||
const expr = getExpression(tokens, 1); | ||
const statement = (writer, context) => { | ||
const partialStatements = registeredPartials[templateName]; | ||
if (!partialStatements) err(`Partial not registered: ${templateName}`); | ||
const newData = expr(context); | ||
const oldData = context.replaceContextData(newData); | ||
runStatements(writer, context, partialStatements); | ||
context.setContextData(oldData); | ||
}; | ||
return [statement, end]; | ||
} | ||
const [t1, t2] = tokens[1].split(','); | ||
const loopValuesExpr = getExpression(tokens, 3); | ||
let statements; | ||
[statements, end] = getInnerStatements(template, end); | ||
const forStatement = (writer, context) => { | ||
const loopValues = loopValuesExpr(context); | ||
if (loopValues == null) | ||
err(`Value of '${tokens.slice(3).join(' ')}' was not iterable`); | ||
if (isIterable(loopValues)) { | ||
let i = 0; | ||
for (const val of loopValues) { | ||
context.set(t1, val); | ||
if (t2) context.set(t2, i); | ||
runStatements(writer, context, statements); | ||
i++; | ||
} | ||
} else { | ||
for (const key in loopValues) { | ||
context.set(t2, key); | ||
context.set(t1, loopValues[key]); | ||
runStatements(writer, context, statements); | ||
} | ||
let [tokens, end] = getTokens(template, i + 2); | ||
const first = tokens[0]; | ||
if (first === 'for') { | ||
let loopType = tokens[2]; | ||
if (loopType !== 'in') { | ||
const inIndex = tokens.indexOf('in'); | ||
if (inIndex > 2) { | ||
tokens = mergeTokens(tokens, inIndex); | ||
loopType = tokens[2]; | ||
} else err('Missing "in" in for-loop'); | ||
} | ||
}; | ||
return [forStatement, end]; | ||
} else if (first === 'if') { | ||
const ifExpr = getExpression(tokens, 1); | ||
let ifStatements = []; | ||
let elseStatements = []; | ||
let elseIfGroups = []; | ||
let nextType; | ||
let statement; | ||
while (true) { | ||
nextType = getNextStatementType(template, end); | ||
if (nextType === 'else') { | ||
break; | ||
} | ||
end = skipWhiteSpace(template, end); | ||
if (nextType === 'end') { | ||
[statement, end] = getStatement(template, end); // Read {{end}} | ||
const ifStatement = (writer, context) => { | ||
if (ifExpr(context)) runStatements(writer, context, ifStatements); | ||
}; | ||
return [ifStatement, end]; | ||
} else { | ||
[statement, end] = getStatement(template, end); | ||
ifStatements.push(statement); | ||
} | ||
} | ||
const createIfStatement = () => (writer, context) => { | ||
if (ifExpr(context)) { | ||
runStatements(writer, context, ifStatements); | ||
return; | ||
} | ||
for (const [expr, statements] of elseIfGroups) { | ||
if (expr(context)) { | ||
runStatements(writer, context, statements); | ||
return; | ||
const [t1, t2] = tokens[1].split(','); | ||
const loopValuesExpr = getExpression(tokens, 3); | ||
let statements; | ||
[statements, end] = getInnerStatements(template, end); | ||
const forStatement = (writer, context) => { | ||
const loopValues = loopValuesExpr(context); | ||
if (loopValues == null) | ||
err(`Value of '${tokens.slice(3).join(' ')}' was not iterable`); | ||
const t1Old = context.getDirect(t1); | ||
const t2Old = context.getDirect(t2); | ||
if (isIterable(loopValues)) { | ||
let i = 0; | ||
for (const val of loopValues) { | ||
context.set(t1, val); | ||
if (t2) context.set(t2, i); | ||
runStatements(writer, context, statements); | ||
i++; | ||
} | ||
} else { | ||
for (const key in loopValues) { | ||
context.set(t2, key); | ||
context.set(t1, loopValues[key]); | ||
runStatements(writer, context, statements); | ||
} | ||
} | ||
} | ||
runStatements(writer, context, elseStatements); | ||
}; | ||
// Has else here as the next type | ||
while (true) { | ||
[tokens, end] = getTokens(template, end + 2); | ||
if (tokens.length == 1) { | ||
while (true) { | ||
[statement, end] = getStatement(template, end); | ||
if (!statement) break; | ||
elseStatements.push(statement); | ||
} | ||
const ifStatement = createIfStatement(); | ||
return [ifStatement, end]; | ||
} | ||
// Else-if here | ||
if (tokens[1] !== 'if') err('if missing from else-if statement'); | ||
let elseIfExpr = getExpression(tokens, 2); | ||
let elseIfStatements = []; | ||
context.set(t1, t1Old); | ||
context.set(t2, t2Old); | ||
}; | ||
return [forStatement, end]; | ||
} else if (first === 'if') { | ||
const ifExpr = getExpression(tokens, 1); | ||
let ifStatements = []; | ||
let elseStatements = []; | ||
let elseIfGroups = []; | ||
let nextType; | ||
let statement; | ||
while (true) { | ||
nextType = getNextStatementType(template, end); | ||
if (nextType === 'else') { | ||
elseIfGroups.push([elseIfExpr, elseIfStatements]); | ||
break; | ||
} | ||
end = skipWhiteSpace(template, end); | ||
if (nextType == null) { | ||
if (nextType === 'end') { | ||
[statement, end] = getStatement(template, end); // Read {{end}} | ||
const ifStatement = (writer, context) => { | ||
if (ifExpr(context)) runStatements(writer, context, ifStatements); | ||
}; | ||
return [ifStatement, end]; | ||
} else { | ||
[statement, end] = getStatement(template, end); | ||
elseIfStatements.push(statement); | ||
continue; | ||
} else if (nextType === 'end') { | ||
elseIfGroups.push([elseIfExpr, elseIfStatements]); | ||
[statement, end] = getStatement(template, end); // Read {{end}} | ||
ifStatements.push(statement); | ||
} | ||
} | ||
const createIfStatement = () => (writer, context) => { | ||
if (ifExpr(context)) { | ||
runStatements(writer, context, ifStatements); | ||
return; | ||
} | ||
for (const [expr, statements] of elseIfGroups) { | ||
if (expr(context)) { | ||
runStatements(writer, context, statements); | ||
return; | ||
} | ||
} | ||
runStatements(writer, context, elseStatements); | ||
}; | ||
// Has else here as the next type | ||
while (true) { | ||
[tokens, end] = getTokens(template, end + 2); | ||
if (tokens.length == 1) { | ||
while (true) { | ||
[statement, end] = getStatement(template, end); | ||
if (!statement) break; | ||
elseStatements.push(statement); | ||
} | ||
const ifStatement = createIfStatement(); | ||
return [ifStatement, end]; | ||
} | ||
err('Tag not closed with }}'); | ||
// Else-if here | ||
if (tokens[1] !== 'if') err('if missing from else-if statement'); | ||
let elseIfExpr = getExpression(tokens, 2); | ||
let elseIfStatements = []; | ||
while (true) { | ||
nextType = getNextStatementType(template, end); | ||
if (nextType === 'else') { | ||
elseIfGroups.push([elseIfExpr, elseIfStatements]); | ||
break; | ||
} | ||
end = skipWhiteSpace(template, end); | ||
if (nextType == null) { | ||
[statement, end] = getStatement(template, end); | ||
elseIfStatements.push(statement); | ||
continue; | ||
} else if (nextType === 'end') { | ||
elseIfGroups.push([elseIfExpr, elseIfStatements]); | ||
[statement, end] = getStatement(template, end); // Read {{end}} | ||
const ifStatement = createIfStatement(); | ||
return [ifStatement, end]; | ||
} | ||
err('Tag not closed with }}'); | ||
} | ||
} | ||
} else if (first === 'end') { | ||
return [null, end]; | ||
} else if (first === 'else') { | ||
err('Unexpected else token'); | ||
} else if (first === 'set') { | ||
const varName = tokens[1]; | ||
const expr = getExpression(tokens, 2); | ||
const statement = (writer, context) => context.set(varName, expr(context)); | ||
return [statement, end]; | ||
} | ||
} else if (first === 'end') { | ||
return [null, end]; | ||
} else if (first === 'else') { | ||
err('Unexpected else token'); | ||
} else if (first === 'set') { | ||
const varName = tokens[1]; | ||
const expr = getExpression(tokens, 2); | ||
const statement = (writer, context) => context.set(varName, expr(context)); | ||
return [statement, end]; | ||
// Get expression as statement | ||
const expr = getExpression(tokens, 0); | ||
const stmt = (writer, context) => writer(htmlEncode(expr(context))); | ||
return [stmt, end]; | ||
} else if (i < 0) { | ||
return [template.substring(start), template.length]; | ||
} else { | ||
return [template.substring(start, i), i]; | ||
} | ||
// Get expression as statement | ||
const expr = getExpression(tokens, 0); | ||
const stmt = (writer, context) => writer(htmlEncode(expr(context))); | ||
return [stmt, end]; | ||
} else if (i < 0) { | ||
return [template.substring(start), template.length]; | ||
} else { | ||
return [template.substring(start, i), i]; | ||
} | ||
}; | ||
const getInnerStatements = (template, end) => { | ||
const statements = []; | ||
let statement; | ||
while (true) { | ||
[statement, end] = getStatement(template, end); | ||
if (!statement) break; | ||
statements.push(statement); | ||
} | ||
return [statements, end]; | ||
}; | ||
const getNextStatementType = (template, start) => { | ||
start = skipWhiteSpace(template, start); | ||
if (start + 1 < template.length && template[start] === '{' && template[start + 1] === '{') { | ||
start += 2; | ||
while (template[start] === ' ') start++; | ||
const tempStart = start++; | ||
while (start < template.length && template[start] !== '}' && template[start] !== ' ') | ||
start++; | ||
return template.substring(tempStart, start); | ||
} | ||
return null; | ||
}; | ||
const skipWhiteSpace = (template, start) => { | ||
while (start < template.length && /\s/.test(template[start])) start++; | ||
return start; | ||
}; | ||
const getTokens = (template, i) => { | ||
const tokens = []; | ||
while (true) { | ||
while (template[i] === ' ') i++; | ||
if (template[i] === '}' && template[i + 1] === '}') return [tokens, i + 2]; | ||
const start = i++; | ||
while (i < template.length && template[i] !== '}' && template[i] !== ' ') i++; | ||
const token = template.substring(start, i); | ||
if (!token) err('Tag not closed with }}'); | ||
tokens.push(token); | ||
} | ||
}; | ||
const getExpression = (tokens, start) => { | ||
if (tokens.length - start == 0 || tokens[start] === '.') { | ||
if (tokens.length == 0) err('Expression cannot be empty'); | ||
else err(`Expression expected after: ${tokens.slice(0, start).join(' ')}`); | ||
} | ||
if (tokens.length - start == 1) return getTokenAsExpression(tokens[start]); | ||
const f = tokens[start]; | ||
if (f.includes('.')) err(`Function name cannot contain a dot character: ${f}`); | ||
const argGroups = getArgGroups(tokens, start + 1); | ||
if (argGroups.length == 1) { | ||
const expr = argGroups[0]; | ||
}; | ||
const getInnerStatements = (template, end) => { | ||
const statements = []; | ||
let statement; | ||
while (true) { | ||
[statement, end] = getStatement(template, end); | ||
if (!statement) break; | ||
statements.push(statement); | ||
} | ||
return [statements, end]; | ||
}; | ||
const getNextStatementType = (template, start) => { | ||
start = skipWhiteSpace(template, start); | ||
if (start + 1 < template.length && template[start] === '{' && template[start + 1] === '{') { | ||
start += 2; | ||
while (template[start] === ' ') start++; | ||
const tempStart = start++; | ||
while (start < template.length && template[start] !== '}' && template[start] !== ' ') | ||
start++; | ||
return template.substring(tempStart, start); | ||
} | ||
return null; | ||
}; | ||
const skipWhiteSpace = (template, start) => { | ||
while (start < template.length && /\s/.test(template[start])) start++; | ||
return start; | ||
}; | ||
const getTokens = (template, i) => { | ||
const tokens = []; | ||
while (true) { | ||
while (template[i] === ' ') i++; | ||
if (template[i] === '}' && template[i + 1] === '}') return [tokens, i + 2]; | ||
const start = i++; | ||
while (i < template.length && template[i] !== '}' && template[i] !== ' ') i++; | ||
const token = template.substring(start, i); | ||
if (!token) err('Tag not closed with }}'); | ||
tokens.push(token); | ||
} | ||
}; | ||
const getExpression = (tokens, start) => { | ||
if (tokens.length - start == 0 || tokens[start] === '.') { | ||
if (tokens.length == 0) err('Expression cannot be empty'); | ||
else err(`Expression expected after: ${tokens.slice(0, start).join(' ')}`); | ||
} | ||
if (tokens.length - start == 1) return getTokenAsExpression(tokens[start]); | ||
const f = tokens[start]; | ||
if (f.includes('.')) err(`Function name cannot contain a dot character: ${f}`); | ||
const argGroups = getArgGroups(tokens, start + 1); | ||
if (argGroups.length == 1) { | ||
const expr = argGroups[0]; | ||
return (context) => { | ||
const func = getFunc(f, context); | ||
return func(expr(context)); | ||
}; | ||
} | ||
return (context) => { | ||
const func = getFunc(f, context); | ||
return func(expr(context)); | ||
const args = argGroups.map((expr) => expr(context)); | ||
return func.apply(null, args); | ||
}; | ||
} | ||
return (context) => { | ||
const func = getFunc(f, context); | ||
const args = argGroups.map((expr) => expr(context)); | ||
return func.apply(null, args); | ||
}; | ||
}; | ||
const getTokenAsExpression = (token) => { | ||
const expr = getTokenAsExpressionInner(token); | ||
return (context) => { | ||
try { | ||
return expr(context); | ||
} catch (e) { | ||
err(`Error while resolving: ${token}`); | ||
const getTokenAsExpression = (token) => { | ||
const expr = getTokenAsExpressionInner(token); | ||
return (context) => { | ||
try { | ||
return expr(context); | ||
} catch (e) { | ||
err(`Error while resolving: ${token}`); | ||
} | ||
}; | ||
}; | ||
const getTokenAsExpressionInner = (token) => { | ||
const parsedNumber = Number(token); | ||
if (!isNaN(parsedNumber)) return (context) => parsedNumber; | ||
const subTokens = token.split('.'); | ||
for (const x of subTokens) { | ||
if (!x) err(`Invalid member access expression: ${token}`); | ||
} | ||
const t = subTokens[0]; | ||
if (subTokens.length == 1) { | ||
return (context) => context.get(t); | ||
} | ||
if (subTokens.length == 2) { | ||
const k = subTokens[1]; | ||
return (context) => context.get(t)[k]; | ||
} | ||
if (subTokens.length == 3) { | ||
const k1 = subTokens[1]; | ||
const k2 = subTokens[2]; | ||
return (context) => context.get(t)[k1][k2]; | ||
} | ||
return (context) => { | ||
let o = context.get(t); | ||
for (let i = 1; i < subTokens.length; i++) o = o[subTokens[i]]; | ||
return o; | ||
}; | ||
}; | ||
}; | ||
const getTokenAsExpressionInner = (token) => { | ||
const parsedNumber = Number(token); | ||
if (!isNaN(parsedNumber)) return (context) => parsedNumber; | ||
const subTokens = token.split('.'); | ||
for (const x of subTokens) { | ||
if (!x) err(`Invalid member access expression: ${token}`); | ||
} | ||
const t = subTokens[0]; | ||
if (subTokens.length == 1) { | ||
return (context) => context.get(t); | ||
} | ||
if (subTokens.length == 2) { | ||
const k = subTokens[1]; | ||
return (context) => context.get(t)[k]; | ||
} | ||
if (subTokens.length == 3) { | ||
const k1 = subTokens[1]; | ||
const k2 = subTokens[2]; | ||
return (context) => context.get(t)[k1][k2]; | ||
} | ||
return (context) => { | ||
let o = context.get(t); | ||
for (let i = 1; i < subTokens.length; i++) o = o[subTokens[i]]; | ||
return o; | ||
const getArgGroups = (tokens, index) => { | ||
const expressions = []; | ||
while (index < tokens.length) expressions.push(getTokenAsExpression(tokens[index++])); | ||
return expressions; | ||
}; | ||
}; | ||
const getArgGroups = (tokens, index) => { | ||
const expressions = []; | ||
while (index < tokens.length) expressions.push(getTokenAsExpression(tokens[index++])); | ||
return expressions; | ||
}; | ||
const getFunc = (f, context) => { | ||
const func = context.get(f); | ||
if (typeof func !== 'function') err(`value of ${f} was not a function`); | ||
return func; | ||
}; | ||
const mergeTokens = (tokens, inIndex) => [ | ||
tokens[0], | ||
tokens.slice(1, inIndex).join(''), | ||
...tokens.slice(inIndex), | ||
]; | ||
const runStatements = (writer, context, statements) => { | ||
for (const stmt of statements) | ||
if (typeof stmt === 'string') writer(stmt); | ||
else stmt(writer, context); | ||
}; | ||
const htmlEncode = (s) => { | ||
s = String(s ?? ''); | ||
return /[&<>\'\"]/.test(s) | ||
? s | ||
.replace(/&/g, '&') | ||
.replace(/</g, '<') | ||
.replace(/>/g, '>') | ||
.replace(/'/g, ''') | ||
.replace(/"/g, '"') | ||
: s; | ||
}; | ||
const isIterable = (obj) => { | ||
if (obj == null) return false; | ||
return typeof obj[Symbol.iterator] === 'function'; | ||
}; | ||
const err = (msg) => { | ||
throw new Error(msg); | ||
}; | ||
return { compile, registerHelper, registerPartial }; | ||
})(); | ||
return Vancat; | ||
}))); | ||
const getFunc = (f, context) => { | ||
const func = context.get(f); | ||
if (typeof func !== 'function') err(`value of ${f} was not a function`); | ||
return func; | ||
}; | ||
const mergeTokens = (tokens, inIndex) => [ | ||
tokens[0], | ||
tokens.slice(1, inIndex).join(''), | ||
...tokens.slice(inIndex), | ||
]; | ||
const runStatements = (writer, context, statements) => { | ||
for (const stmt of statements) | ||
if (typeof stmt === 'string') writer(stmt); | ||
else stmt(writer, context); | ||
}; | ||
const htmlEncode = (s) => { | ||
s = String(s ?? ''); | ||
return /[&<>\'\"]/.test(s) | ||
? s | ||
.replace(/&/g, '&') | ||
.replace(/</g, '<') | ||
.replace(/>/g, '>') | ||
.replace(/'/g, ''') | ||
.replace(/"/g, '"') | ||
: s; | ||
}; | ||
const isIterable = (obj) => { | ||
if (obj == null) return false; | ||
return typeof obj[Symbol.iterator] === 'function'; | ||
}; | ||
const err = (msg) => { | ||
throw new Error(msg); | ||
}; | ||
return { compile, registerHelper, registerPartial }; | ||
})(); | ||
return Vancat; | ||
}); |
@@ -1,2 +0,2 @@ | ||
/* Vancat v1.0.2 */ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vancat=t()}(this,function(){return function(){let e={not:e=>!e},t={},n=(t,n)=>e[t]=n,r=(e,n)=>t[e]=i(n),l=t=>{let n=i(t);return(t,r={})=>{let l=[],i=e=>l.push(e);return _(i,{contextData:{$:t},get(t){return this.contextData[t]??r[t]??e[t]??this.contextData.$[t]},set(e,t){this.contextData[e]=t},replaceContextData(e){let t=this.contextData;return this.contextData={$:e},t},setContextData(e){this.contextData=e}},n),l.join("")}},i=e=>{let t=[],n=0,r;for(;n<e.length;)[r,n]=o(e,n),r||D("Unexpected end token"),t.push(r);return t},o=(e,n)=>{n==e.length&&D("Expected {{end}} but not found");let r=e.indexOf("{{",n);if(r==n){if(">"===e[r+2]){let[l,i]=a(e,r+3),p=l[0];p||D("Template name not specified");let g=c(l,1),h=(e,n)=>{let r=t[p];r||D(`Partial not registered: ${p}`);let l=g(n),i=n.replaceContextData(l);_(e,n,r),n.setContextData(i)};return[h,i]}let[d,b]=a(e,r+2),y=d[0];if("for"===y){let w=d[2];if("in"!==w){let j=d.indexOf("in");j>2?w=(d=x(d,j))[2]:D('Missing "in" in for-loop')}let[C,E]=d[1].split(","),k=c(d,3),v;[v,b]=f(e,b);let T=(e,t)=>{let n=k(t);if(null==n&&D(`Value of '${d.slice(3).join(" ")}' was not iterable`),$(n)){let r=0;for(let l of n)t.set(C,l),E&&t.set(E,r),_(e,t,v),r++}else for(let i in n)t.set(E,i),t.set(C,n[i]),_(e,t,v)};return[T,b]}if("if"===y){let O=c(d,1),U=[],V=[],F=[],I,M;for(;"else"!==(I=s(e,b));){if(b=u(e,b),"end"===I){[M,b]=o(e,b);let P=(e,t)=>{O(t)&&_(e,t,U)};return[P,b]}[M,b]=o(e,b),U.push(M)}let q=()=>(e,t)=>{if(O(t)){_(e,t,U);return}for(let[n,r]of F)if(n(t)){_(e,t,r);return}_(e,t,V)};for(;;){if([d,b]=a(e,b+2),1==d.length){for(;[M,b]=o(e,b),M;)V.push(M);let z=q();return[z,b]}"if"!==d[1]&&D("if missing from else-if statement");let A=c(d,2),B=[];for(;;){if("else"===(I=s(e,b))){F.push([A,B]);break}if(b=u(e,b),null==I){[M,b]=o(e,b),B.push(M);continue}if("end"===I){F.push([A,B]),[M,b]=o(e,b);let G=q();return[G,b]}D("Tag not closed with }}")}}}else if("end"===y)return[null,b];else if("else"===y)D("Unexpected else token");else if("set"===y){let H=d[1],J=c(d,2),K=(e,t)=>t.set(H,J(t));return[K,b]}let L=c(d,0),N=(e,t)=>e(m(L(t)));return[N,b]}return r<0?[e.substring(n),e.length]:[e.substring(n,r),r]},f=(e,t)=>{let n=[],r;for(;[r,t]=o(e,t),r;)n.push(r);return[n,t]},s=(e,t)=>{if((t=u(e,t))+1<e.length&&"{"===e[t]&&"{"===e[t+1]){for(t+=2;" "===e[t];)t++;let n=t++;for(;t<e.length&&"}"!==e[t]&&" "!==e[t];)t++;return e.substring(n,t)}return null},u=(e,t)=>{for(;t<e.length&&/\s/.test(e[t]);)t++;return t},a=(e,t)=>{let n=[];for(;;){for(;" "===e[t];)t++;if("}"===e[t]&&"}"===e[t+1])return[n,t+2];let r=t++;for(;t<e.length&&"}"!==e[t]&&" "!==e[t];)t++;let l=e.substring(r,t);l||D("Tag not closed with }}"),n.push(l)}},c=(e,t)=>{if((e.length-t==0||"."===e[t])&&(0==e.length?D("Expression cannot be empty"):D(`Expression expected after: ${e.slice(0,t).join(" ")}`)),e.length-t==1)return p(e[t]);let n=e[t];n.includes(".")&&D(`Function name cannot contain a dot character: ${n}`);let r=h(e,t+1);if(1==r.length){let l=r[0];return e=>{let t=d(n,e);return t(l(e))}}return e=>{let t=d(n,e),l=r.map(t=>t(e));return t.apply(null,l)}},p=e=>{let t=g(e);return n=>{try{return t(n)}catch(r){D(`Error while resolving: ${e}`)}}},g=e=>{let t=Number(e);if(!isNaN(t))return e=>t;let n=e.split(".");for(let r of n)r||D(`Invalid member access expression: ${e}`);let l=n[0];if(1==n.length)return e=>e.get(l);if(2==n.length){let i=n[1];return e=>e.get(l)[i]}if(3==n.length){let o=n[1],f=n[2];return e=>e.get(l)[o][f]}return e=>{let t=e.get(l);for(let r=1;r<n.length;r++)t=t[n[r]];return t}},h=(e,t)=>{let n=[];for(;t<e.length;)n.push(p(e[t++]));return n},d=(e,t)=>{let n=t.get(e);return"function"!=typeof n&&D(`value of ${e} was not a function`),n},x=(e,t)=>[e[0],e.slice(1,t).join(""),...e.slice(t),],_=(e,t,n)=>{for(let r of n)"string"==typeof r?e(r):r(e,t)},m=e=>(e=String(e??""),/[&<>\'\"]/.test(e)?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,"""):e),$=e=>null!=e&&"function"==typeof e[Symbol.iterator],D=e=>{throw Error(e)};return{compile:l,registerHelper:n,registerPartial:r}}()}); | ||
/* Vancat v1.0.3 */ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vancat=t()}(this,function(){return function(){let e={not:e=>!e},t={},n=(t,n)=>e[t]=n,r=(e,n)=>t[e]=i(n),l=t=>{let n=i(t);return(t,r={})=>{let l=[],i=e=>l.push(e);return _(i,{contextData:{$:t},get(t){return this.contextData[t]??r[t]??e[t]??this.contextData.$[t]},set(e,t){this.contextData[e]=t},getDirect(e){return this.contextData[e]},replaceContextData(e){let t=this.contextData;return this.contextData={$:e},t},setContextData(e){this.contextData=e}},n),l.join("")}},i=e=>{let t=[],n=0,r;for(;n<e.length;)[r,n]=o(e,n),r||$("Unexpected end token"),t.push(r);return t},o=(e,n)=>{n==e.length&&$("Expected {{end}} but not found");let r=e.indexOf("{{",n);if(r==n){if(">"===e[r+2]){let[l,i]=a(e,r+3),g=l[0];g||$("Template name not specified");let h=c(l,1),p=(e,n)=>{let r=t[g];r||$(`Partial not registered: ${g}`);let l=h(n),i=n.replaceContextData(l);_(e,n,r),n.setContextData(i)};return[p,i]}let[d,b]=a(e,r+2),y=d[0];if("for"===y){let w=d[2];if("in"!==w){let j=d.indexOf("in");j>2?w=(d=x(d,j))[2]:$('Missing "in" in for-loop')}let[C,E]=d[1].split(","),k=c(d,3),v;[v,b]=s(e,b);let T=(e,t)=>{let n=k(t);null==n&&$(`Value of '${d.slice(3).join(" ")}' was not iterable`);let r=t.getDirect(C),l=t.getDirect(E);if(m(n)){let i=0;for(let o of n)t.set(C,o),E&&t.set(E,i),_(e,t,v),i++}else for(let s in n)t.set(E,s),t.set(C,n[s]),_(e,t,v);t.set(C,r),t.set(E,l)};return[T,b]}if("if"===y){let O=c(d,1),U=[],V=[],F=[],I,M;for(;"else"!==(I=f(e,b));){if(b=u(e,b),"end"===I){[M,b]=o(e,b);let P=(e,t)=>{O(t)&&_(e,t,U)};return[P,b]}[M,b]=o(e,b),U.push(M)}let q=()=>(e,t)=>{if(O(t)){_(e,t,U);return}for(let[n,r]of F)if(n(t)){_(e,t,r);return}_(e,t,V)};for(;;){if([d,b]=a(e,b+2),1==d.length){for(;[M,b]=o(e,b),M;)V.push(M);let z=q();return[z,b]}"if"!==d[1]&&$("if missing from else-if statement");let A=c(d,2),B=[];for(;;){if("else"===(I=f(e,b))){F.push([A,B]);break}if(b=u(e,b),null==I){[M,b]=o(e,b),B.push(M);continue}if("end"===I){F.push([A,B]),[M,b]=o(e,b);let G=q();return[G,b]}$("Tag not closed with }}")}}}else if("end"===y)return[null,b];else if("else"===y)$("Unexpected else token");else if("set"===y){let H=d[1],J=c(d,2),K=(e,t)=>t.set(H,J(t));return[K,b]}let L=c(d,0),N=(e,t)=>e(D(L(t)));return[N,b]}return r<0?[e.substring(n),e.length]:[e.substring(n,r),r]},s=(e,t)=>{let n=[],r;for(;[r,t]=o(e,t),r;)n.push(r);return[n,t]},f=(e,t)=>{if((t=u(e,t))+1<e.length&&"{"===e[t]&&"{"===e[t+1]){for(t+=2;" "===e[t];)t++;let n=t++;for(;t<e.length&&"}"!==e[t]&&" "!==e[t];)t++;return e.substring(n,t)}return null},u=(e,t)=>{for(;t<e.length&&/\s/.test(e[t]);)t++;return t},a=(e,t)=>{let n=[];for(;;){for(;" "===e[t];)t++;if("}"===e[t]&&"}"===e[t+1])return[n,t+2];let r=t++;for(;t<e.length&&"}"!==e[t]&&" "!==e[t];)t++;let l=e.substring(r,t);l||$("Tag not closed with }}"),n.push(l)}},c=(e,t)=>{if((e.length-t==0||"."===e[t])&&(0==e.length?$("Expression cannot be empty"):$(`Expression expected after: ${e.slice(0,t).join(" ")}`)),e.length-t==1)return g(e[t]);let n=e[t];n.includes(".")&&$(`Function name cannot contain a dot character: ${n}`);let r=p(e,t+1);if(1==r.length){let l=r[0];return e=>{let t=d(n,e);return t(l(e))}}return e=>{let t=d(n,e),l=r.map(t=>t(e));return t.apply(null,l)}},g=e=>{let t=h(e);return n=>{try{return t(n)}catch(r){$(`Error while resolving: ${e}`)}}},h=e=>{let t=Number(e);if(!isNaN(t))return e=>t;let n=e.split(".");for(let r of n)r||$(`Invalid member access expression: ${e}`);let l=n[0];if(1==n.length)return e=>e.get(l);if(2==n.length){let i=n[1];return e=>e.get(l)[i]}if(3==n.length){let o=n[1],s=n[2];return e=>e.get(l)[o][s]}return e=>{let t=e.get(l);for(let r=1;r<n.length;r++)t=t[n[r]];return t}},p=(e,t)=>{let n=[];for(;t<e.length;)n.push(g(e[t++]));return n},d=(e,t)=>{let n=t.get(e);return"function"!=typeof n&&$(`value of ${e} was not a function`),n},x=(e,t)=>[e[0],e.slice(1,t).join(""),...e.slice(t),],_=(e,t,n)=>{for(let r of n)"string"==typeof r?e(r):r(e,t)},D=e=>(e=String(e??""),/[&<>\'\"]/.test(e)?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,"""):e),m=e=>null!=e&&"function"==typeof e[Symbol.iterator],$=e=>{throw Error(e)};return{compile:l,registerHelper:n,registerPartial:r}}()}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
21171
358