UNPKG

@kospa/engine

Version:

Template Engine component for kospa framework

175 lines (174 loc) 7.29 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define(["require", "exports", "knockout", "@kospa/base/system"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.init = exports.setTemplateEngine = exports.ModuleEngine = exports.ModuleSource = void 0; var ko = require("knockout"); var system = require("@kospa/base/system"); var SOURCE_REGEXP = /^text!(.+)/, sources = {}; var ModuleSource = /** @class */ (function () { function ModuleSource(source, options) { var _this = this; if (options === void 0) { options = {}; } this.source = source; this.options = options; this.isLoading = false; this.isLoaded = false; if (typeof source !== "string") { throw new Error("Module Template Source need string template source"); } var nameMatch = source.match(SOURCE_REGEXP); if (!nameMatch) { throw new Error("Module Template Source is not valid!"); } this.name = nameMatch[1]; var tmpl = ko.observable(this.options.loadingTemplate || ModuleEngine.defaults.loading); tmpl.data = {}; this.template = tmpl; if (options.afterRender) { var origAfterRender_1 = options.afterRender; this.options.afterRender = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } if (_this.isLoaded) { origAfterRender_1.apply(_this.options, args); } }; } } ModuleSource.isModuleTemplateSource = function (value) { return SOURCE_REGEXP.test(value); }; ModuleSource.prototype.text = function (value) { if (!this.isLoaded) this.loadTemplate(); if (arguments.length === 0) { return this.template(); } else { this.template(value); } }; ModuleSource.prototype.data = function (key, value) { if (arguments.length === 1) { if (key === "precompiled") this.template(); // register observable for auto template refresh return this.template.data[key]; } this.template.data[key] = value; }; ModuleSource.prototype.nodes = function (element) { if (arguments.length === 0) { var markup = this.text(); // to register dependency if (!this.template.data.__NODES__) { this.template.data.__NODES__ = parseMarkup(markup); } return this.template.data.__NODES__; } else { this.template.data.__NODES__ = element; } }; ModuleSource.prototype.loadTemplate = function () { var _this = this; if (this.isLoading) { return; } this.isLoading = true; system.module(this.source) .then(function (template) { _this.data("precompiled", null); _this.isLoaded = true; _this.isLoading = false; _this.template.data.__NODES__ = null; _this.template(template); }); }; ModuleSource.create = function (source, options) { if (sources[source]) { return sources[source]; } var src = new ModuleSource(source, options); sources[source] = src; return src; }; return ModuleSource; }()); exports.ModuleSource = ModuleSource; ko.templateSources["module"] = ModuleSource; var ModuleEngine = /** @class */ (function (_super) { __extends(ModuleEngine, _super); function ModuleEngine(innerEngine) { var _this = _super.call(this) || this; _this.allowTemplateRewriting = false; _this._innerEngine = innerEngine || new ModuleEngine.defaults.engine(); return _this; } ModuleEngine.prototype.makeTemplateSource = function (template, templateDocument, options) { // Module template if (typeof template === "string" && ModuleSource.isModuleTemplateSource(template)) { return ko.templateSources["module"].create(template, options); } // Call base method return this._innerEngine.makeTemplateSource.call(this._innerEngine, template, templateDocument); }; ModuleEngine.prototype.renderTemplateSource = function (templateSource, bindingContext, options, templateDocument) { return this._innerEngine.renderTemplateSource(templateSource, bindingContext, options, templateDocument); }; ModuleEngine.prototype.renderTemplate = function (template, bindingContext, options, templateDocument) { var templateSource = this.makeTemplateSource(template, templateDocument, options); return this.renderTemplateSource(templateSource, bindingContext, options); }; ModuleEngine.defaults = { loading: "<div class=\"template-loading\"></div>", engine: ko.nativeTemplateEngine }; return ModuleEngine; }(ko.templateEngine)); exports.ModuleEngine = ModuleEngine; ko["moduleTemplateEngine"] = ModuleEngine; //#endregion //#region Public Base Members var defaultInstance = new ModuleEngine(); function setTemplateEngine(innerEngine) { ko.setTemplateEngine(innerEngine ? new ModuleEngine(innerEngine) : defaultInstance); } exports.setTemplateEngine = setTemplateEngine; /** * Init Method for boostrap module. * It installs ModuleEngine as default Knockout Template Engine. */ function init() { setTemplateEngine(); } exports.init = init; exports.default = defaultInstance; //#endregion function parseMarkup(markup) { var parser = new DOMParser(); var doc = parser.parseFromString("<div>" + markup + "</div>", "text/html"); return doc.body.children[0]; } });