@kospa/engine
Version:
Template Engine component for kospa framework
175 lines (174 loc) • 7.29 kB
JavaScript
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];
}
});