summaryrefslogtreecommitdiff
path: root/core/template.js
diff options
context:
space:
mode:
Diffstat (limited to 'core/template.js')
-rw-r--r--core/template.js62
1 files changed, 62 insertions, 0 deletions
diff --git a/core/template.js b/core/template.js
new file mode 100644
index 0000000..a213e36
--- /dev/null
+++ b/core/template.js
@@ -0,0 +1,62 @@
+/**
+ * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.html or http://ckeditor.com/license
+ */
+
+/**
+ * @fileOverview Defines the {@link CKEDITOR.template} class, which represents
+ * an UI template for an editor instance.
+ */
+
+(function() {
+ var cache = {};
+
+ /**
+ * Lightweight template used to build the output string from variables.
+ *
+ * // HTML template for presenting a label UI.
+ * var tpl = new CKEDITOR.template( '<div class="{cls}">{label}</div>' );
+ * alert( tpl.output( { cls: 'cke-label', label: 'foo'} ) ); // '<div class="cke-label">foo</div>'
+ *
+ * @class
+ * @constructor Creates a template class instance.
+ * @param {String} source The template source.
+ */
+ CKEDITOR.template = function( source ) {
+ // Builds an optimized function body for the output() method, focused on performance.
+ // For example, if we have this "source":
+ // '<div style="{style}">{editorName}</div>'
+ // ... the resulting function body will be (apart from the "buffer" handling):
+ // return [ '<div style="', data['style'] == undefined ? '{style}' : data['style'], '">', data['editorName'] == undefined ? '{editorName}' : data['editorName'], '</div>' ].join('');
+
+ // Try to read from the cache.
+ if ( cache[ source ] )
+ this.output = cache[ source ];
+ else {
+ var fn = source
+ // Escape all quotation marks (").
+ .replace( /'/g, "\\'" )
+ // Inject the template keys replacement.
+ .replace( /{([^}]+)}/g, function( m, key ) {
+ return "',data['" + key + "']==undefined?'{" + key + "}':data['" + key + "'],'";
+ });
+
+ fn = "return buffer?buffer.push('" + fn + "'):['" + fn + "'].join('');";
+ this.output = cache[ source ] = Function( 'data', 'buffer', fn );
+ }
+ };
+})();
+
+/**
+ * Processes the template, filling its variables with the provided data.
+ *
+ * @method output
+ * @param {Object} data An object containing properties which values will be
+ * used to fill the template variables. The property names must match the
+ * template variables names. Variables without matching properties will be
+ * kept untouched.
+ * @param {Array} [buffer] An array into which the output data will be pushed into.
+ * The number of entries appended to the array is unknown.
+ * @returns {String/Number} If `buffer` has not been provided, the processed
+ * template output data, otherwise the new length of `buffer`.
+ */