76 lines
6.8 KiB
JavaScript
76 lines
6.8 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const error_1 = require("../util/error");
|
|
const liquid_1 = require("../liquid");
|
|
const parse_stream_1 = require("./parse-stream");
|
|
const type_guards_1 = require("../util/type-guards");
|
|
const tag_1 = require("../template/tag/tag");
|
|
const output_1 = require("../template/output");
|
|
const html_1 = require("../template/html");
|
|
const loader_1 = require("../fs/loader");
|
|
const async_1 = require("../util/async");
|
|
class Parser {
|
|
constructor(liquid) {
|
|
this.liquid = liquid;
|
|
this.cache = this.liquid.options.cache;
|
|
this.fs = this.liquid.options.fs;
|
|
this.parseFile = this.cache ? this._parseFileCached : this._parseFile;
|
|
this.loader = new loader_1.Loader(this.liquid.options);
|
|
}
|
|
parse(html, filepath) {
|
|
const tokenizer = new liquid_1.Tokenizer(html, this.liquid.options.operatorsTrie, filepath);
|
|
const tokens = tokenizer.readTopLevelTokens(this.liquid.options);
|
|
return this.parseTokens(tokens);
|
|
}
|
|
parseTokens(tokens) {
|
|
let token;
|
|
const templates = [];
|
|
while ((token = tokens.shift())) {
|
|
templates.push(this.parseToken(token, tokens));
|
|
}
|
|
return templates;
|
|
}
|
|
parseToken(token, remainTokens) {
|
|
try {
|
|
if ((0, type_guards_1.isTagToken)(token)) {
|
|
return new tag_1.Tag(token, remainTokens, this.liquid);
|
|
}
|
|
if ((0, type_guards_1.isOutputToken)(token)) {
|
|
return new output_1.Output(token, this.liquid);
|
|
}
|
|
return new html_1.HTML(token);
|
|
}
|
|
catch (e) {
|
|
throw new error_1.ParseError(e, token);
|
|
}
|
|
}
|
|
parseStream(tokens) {
|
|
return new parse_stream_1.ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens));
|
|
}
|
|
*_parseFileCached(file, sync, type = loader_1.LookupType.Root, currentFile) {
|
|
const cache = this.cache;
|
|
const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file;
|
|
const tpls = yield cache.read(key);
|
|
if (tpls)
|
|
return tpls;
|
|
const task = this._parseFile(file, sync, type, currentFile);
|
|
// sync mode: exec the task and cache the result
|
|
// async mode: cache the task before exec
|
|
const taskOrTpl = sync ? yield task : (0, async_1.toPromise)(task);
|
|
cache.write(key, taskOrTpl);
|
|
// note: concurrent tasks will be reused, cache for failed task is removed until its end
|
|
try {
|
|
return yield taskOrTpl;
|
|
}
|
|
catch (err) {
|
|
cache.remove(key);
|
|
throw err;
|
|
}
|
|
}
|
|
*_parseFile(file, sync, type = loader_1.LookupType.Root, currentFile) {
|
|
const filepath = yield this.loader.lookup(file, type, sync, currentFile);
|
|
return this.liquid.parse(sync ? this.fs.readFileSync(filepath) : yield this.fs.readFile(filepath), filepath);
|
|
}
|
|
}
|
|
exports.default = Parser;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpcXVpZGpzL3BhcnNlci9wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx5Q0FBMEM7QUFDMUMsc0NBQTZDO0FBQzdDLGlEQUE0QztBQUM1QyxxREFBK0Q7QUFFL0QsNkNBQXlDO0FBQ3pDLCtDQUEyQztBQUMzQywyQ0FBdUM7QUFJdkMseUNBQWlEO0FBQ2pELHlDQUF5QztBQUd6QyxNQUFxQixNQUFNO0lBUXpCLFlBQW9CLE1BQWM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUE7UUFDdEMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUE7UUFDckUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFDTSxLQUFLLENBQUUsSUFBWSxFQUFFLFFBQWlCO1FBQzNDLE1BQU0sU0FBUyxHQUFHLElBQUksa0JBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ2xGLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNqQyxD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
|