(() => { // A template source represents a read/write way of accessing a template. This is to eliminate the need for template loading/saving // logic to be duplicated in every template engine (and means they can all work with anonymous templates, etc.) // // Two are provided by default: // 1. ko.templateSources.domElement - reads/writes the text content of an arbitrary DOM element // 2. ko.templateSources.anonymousElement - uses ko.utils.domData to read/write text *associated* with the DOM element, but // without reading/writing the actual element text content, since it will be overwritten // with the rendered template output. // You can implement your own template source if you want to fetch/store templates somewhere other than in DOM elements. // Template sources need to have the following functions: // text() - returns the template text from your storage location // text(value) - writes the supplied template text to your storage location // data(key) - reads values stored using data(key, value) - see below // data(key, value) - associates "value" with this template and the key "key". Is used to store information like "isRewritten". // // Optionally, template sources can also have the following functions: // nodes() - returns a DOM element containing the nodes of this template, where available // nodes(value) - writes the given DOM element to your storage location // If a DOM element is available for a given template source, template engines are encouraged to use it in preference over text() // for improved speed. However, all templateSources must supply text() even if they don't supply nodes(). // // Once you've implemented a templateSource, make your template engine use it by subclassing whatever template engine you were // using and overriding "makeTemplateSource" to return an instance of your custom template source. ko.templateSources = {}; // ---- ko.templateSources.domElement ----- // template types var templateScript = 1, templateTextArea = 2, templateTemplate = 3, templateElement = 4; ko.templateSources.domElement = function(element) { this.domElement = element; if (element) { var tagNameLower = ko.utils.tagNameLower(element); this.templateType = tagNameLower === "script" ? templateScript : tagNameLower === "textarea" ? templateTextArea : // For browsers with proper