mirror of
https://github.com/cupcakearmy/cometa.git
synced 2025-03-12 14:27:28 +00:00
130 lines
5.3 KiB
JavaScript
130 lines
5.3 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
const compiler_1 = require("./compiler");
|
||
|
const options_1 = require("./options");
|
||
|
const util_1 = require("./util");
|
||
|
const path_1 = require("path");
|
||
|
const parser_1 = require("./parser");
|
||
|
exports.comment = html => {
|
||
|
const tag = options_1.re.comment + options_1.re.ending;
|
||
|
const end = html.indexOf(tag);
|
||
|
if (end === -1)
|
||
|
throw new Error(options_1.error.parse.comment_not_closed);
|
||
|
return {
|
||
|
parts: [],
|
||
|
length: end + tag.length
|
||
|
};
|
||
|
};
|
||
|
exports.logic = html => {
|
||
|
const rexp = {
|
||
|
start: new RegExp(`${options_1.re.begin}\\${options_1.re.if} *\\${options_1.re.if_else}?${options_1.re.valid_variable} *${options_1.re.ending}`, 'g'),
|
||
|
else: new RegExp(`${options_1.re.begin} *\\${options_1.re.if_else} *${options_1.re.ending}`, 'g'),
|
||
|
end: RegExp(`${options_1.re.begin} *\\${options_1.re.closing_tag} *\\${options_1.re.if} *${options_1.re.ending}`, 'g'),
|
||
|
};
|
||
|
const current = {
|
||
|
found: rexp.start.exec(html),
|
||
|
variable: '',
|
||
|
inverted: false,
|
||
|
};
|
||
|
if (current.found === null || current.found.index !== 0)
|
||
|
throw new Error(options_1.error.parse.default);
|
||
|
current.variable = current.found[0].slice(options_1.re.begin.length + options_1.re.if.length, -options_1.re.ending.length).trim();
|
||
|
current.inverted = current.variable[0] === options_1.re.if_invert;
|
||
|
if (current.inverted)
|
||
|
current.variable = current.variable.slice(options_1.re.if_invert.length);
|
||
|
let next;
|
||
|
do {
|
||
|
next = {
|
||
|
start: rexp.start.exec(html),
|
||
|
else: rexp.else.exec(html),
|
||
|
end: rexp.end.exec(html),
|
||
|
};
|
||
|
if (next.end === null)
|
||
|
throw new Error(options_1.error.parse.default);
|
||
|
} while (next.start !== null && next.start.index < next.end.index);
|
||
|
const body = {
|
||
|
if: html.substring(current.found[0].length, next.end.index),
|
||
|
else: ''
|
||
|
};
|
||
|
return {
|
||
|
parts: [(data) => {
|
||
|
const ret = util_1.getFromObject(data, current.variable);
|
||
|
let isTrue = ret !== undefined && ret !== false && ret !== null && ret !== '';
|
||
|
if (current.inverted)
|
||
|
isTrue = !isTrue;
|
||
|
if (isTrue)
|
||
|
return compiler_1.compileBlock(body.if).parts;
|
||
|
else
|
||
|
return compiler_1.compileBlock(body.else).parts;
|
||
|
}],
|
||
|
length: next.end.index + next.end[0].length
|
||
|
};
|
||
|
};
|
||
|
exports.importer = html => {
|
||
|
const end = html.indexOf(options_1.re.ending);
|
||
|
if (end === -1)
|
||
|
throw new Error(options_1.error.parse.include_not_closed);
|
||
|
const template_name = html.substring(options_1.re.begin.length + options_1.re.incude.length, end).trim();
|
||
|
const file_name = path_1.join(options_1.options.template_dir, `${template_name}.${options_1.options.template_ext}`);
|
||
|
const file = util_1.readFileSync(file_name);
|
||
|
return {
|
||
|
parts: compiler_1.compileBlock(file).parts,
|
||
|
length: end + options_1.re.ending.length
|
||
|
};
|
||
|
};
|
||
|
exports.variables = html => {
|
||
|
const end = html.indexOf(options_1.re.ending);
|
||
|
if (end === -1)
|
||
|
throw new Error(options_1.error.parse.variable_not_closed);
|
||
|
const variable_name = html.substring(options_1.re.begin.length, end).trim();
|
||
|
return {
|
||
|
parts: [(data) => {
|
||
|
const output = util_1.getFromObject(data, variable_name);
|
||
|
switch (typeof output) {
|
||
|
case 'object':
|
||
|
return JSON.stringify(output);
|
||
|
default:
|
||
|
return output;
|
||
|
}
|
||
|
}],
|
||
|
length: end + options_1.re.ending.length
|
||
|
};
|
||
|
};
|
||
|
exports.loop = html => {
|
||
|
const rexp = {
|
||
|
start: new RegExp(`${options_1.re.begin}\\${options_1.re.for} *${options_1.re.valid_variable} *${options_1.re.for_in} *${options_1.re.valid_variable} *${options_1.re.ending}`, 'g'),
|
||
|
end: RegExp(`${options_1.re.begin} *\\${options_1.re.closing_tag} *\\${options_1.re.for} *${options_1.re.ending}`, 'g'),
|
||
|
};
|
||
|
const current = {
|
||
|
found: rexp.start.exec(html),
|
||
|
variable: '',
|
||
|
arr: '',
|
||
|
};
|
||
|
if (current.found === null || current.found.index !== 0)
|
||
|
throw new Error(options_1.error.parse.default);
|
||
|
const statement = current.found[0].slice(options_1.re.begin.length + options_1.re.if.length, -options_1.re.ending.length).trim().split(options_1.re.for_in);
|
||
|
current.variable = statement[0].trim();
|
||
|
current.arr = statement[1].trim();
|
||
|
let next;
|
||
|
do {
|
||
|
next = {
|
||
|
start: rexp.start.exec(html),
|
||
|
end: rexp.end.exec(html),
|
||
|
};
|
||
|
if (next.end === null)
|
||
|
throw new Error(options_1.error.parse.default);
|
||
|
} while (next.start !== null && next.start.index < next.end.index);
|
||
|
html = html.substring(current.found[0].length, next.end.index);
|
||
|
return {
|
||
|
parts: [(data) => {
|
||
|
let ret = '';
|
||
|
for (const variable of util_1.getFromObject(data, current.arr)) {
|
||
|
const newData = Object.assign({ [current.variable]: variable }, data);
|
||
|
ret += parser_1.computeParts(compiler_1.compileBlock(html).parts, newData);
|
||
|
}
|
||
|
return ret;
|
||
|
}],
|
||
|
length: next.end.index + next.end[0].length
|
||
|
};
|
||
|
};
|