@ctrl/golang-template
Version:
Basic golang template parsing in js
146 lines • 4.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parse = exports.indexReplace = exports.variableReplace = exports.rangeReplace = exports.ifElseReplace = exports.joinReplace = exports.reReplace = void 0;
const util_1 = require("./util");
function reReplace(str, variables) {
const regex = /{{\s*re_replace\s+(\..+?)\s+"(.*?)"\s+"(.*?)"\s*}}/;
let result = str;
let m;
while ((m = regex.exec(result)) !== null) {
const all = m[0];
const prop = m[1];
const regexp = m[2];
const newvalue = m[3];
const replaceRegex = new RegExp(regexp, 'g');
const input = (0, util_1.get)(variables, prop.substring(1));
const expanded = input.replace(replaceRegex, newvalue);
result = result.replace(all, expanded);
}
return result;
}
exports.reReplace = reReplace;
function joinReplace(str, variables) {
const regex = /{{\s*join\s+\.(.+?)\s+"(.*?)"\s*}}/;
let result = str;
let m;
while ((m = regex.exec(result)) !== null) {
const all = m[0];
const prop = m[1];
const delimiter = m[2];
const input = (0, util_1.get)(variables, prop);
const expanded = input.join(delimiter);
result = result.replace(all, expanded);
}
return result;
}
exports.joinReplace = joinReplace;
function ifElseReplace(str, variables) {
const regex = /{{\s*if\s*(.+?)\s*}}([\S\s]*?){{\s*else\s*}}([\S\s]*?){{\s*end\s*}}/;
let result = str;
let m;
while ((m = regex.exec(result)) !== null) {
let conditionResult;
const all = m[0];
const condition = m[1];
const onTrue = m[2];
const onFalse = m[3];
if (condition.startsWith('.')) {
let conditionResultState = false;
const value = (0, util_1.get)(variables, condition.substring(1));
if (value === null || value === undefined) {
conditionResultState = false;
}
else if (typeof value === 'string') {
conditionResultState = value.length > 0;
}
else if (Array.isArray(value)) {
conditionResultState = value.length > 0;
}
else if (typeof value === 'boolean') {
conditionResultState = value;
}
else {
throw new Error(`Unexpceted type for variable ${condition}: ${typeof value}`);
}
conditionResult = conditionResultState ? onTrue : onFalse;
}
else {
throw new Error('Functionality not implemented');
}
result = result.replace(all, conditionResult);
}
return result;
}
exports.ifElseReplace = ifElseReplace;
function rangeReplace(str, variables) {
const regex = /{{\s*range\s*(.+?)\s*}}(.*?){{\.}}(.*?){{end}}/;
let result = str;
let m;
while ((m = regex.exec(result)) !== null) {
let expanded = '';
const all = m[0];
const prop = m[1];
const prefix = m[2];
const postfix = m[3];
const arr = (0, util_1.get)(variables, prop.substring(1));
if (arr && Array.isArray(arr)) {
for (const value of arr) {
expanded += `${prefix}${value}${postfix}`;
}
}
result = result.replace(all, expanded);
}
return result;
}
exports.rangeReplace = rangeReplace;
function variableReplace(str, variables) {
const regex = /{{\s*(\..+?)\s*}}/;
let result = str;
let m;
while ((m = regex.exec(result)) !== null) {
const all = m[0];
const prop = m[1];
const value = (0, util_1.get)(variables, prop.substring(1));
result = result.replace(all, value);
}
return result;
}
exports.variableReplace = variableReplace;
function indexReplace(str, variables) {
const regex = /{{\s*index\s*(\..+?)\s+(.+?)\s*}}/;
let result = str;
let m;
while ((m = regex.exec(result)) !== null) {
const all = m[0];
const prop = m[1];
const index = m[2];
const top = (0, util_1.get)(variables, prop.substring(1));
let value;
// @ts-expect-error
if (isNaN(index)) {
value = top[index.substring(1, index.length - 1)];
}
else {
value = top[parseInt(index, 10)];
}
result = result.replace(all, value);
}
return result;
}
exports.indexReplace = indexReplace;
/**
* Parse template and insert variables
* @param str golang style template
* @param variables object of variables to insert
*/
function parse(str, variables) {
let result = reReplace(str, variables);
result = joinReplace(result, variables);
result = ifElseReplace(result, variables);
result = rangeReplace(result, variables);
result = variableReplace(result, variables);
result = indexReplace(result, variables);
return result;
}
exports.parse = parse;
//# sourceMappingURL=index.js.map