173 lines
6.2 KiB
Text
173 lines
6.2 KiB
Text
|
/* ************************************************************************
|
||
|
|
||
|
qooxdoo - the new era of web development
|
||
|
|
||
|
http://qooxdoo.org
|
||
|
|
||
|
Copyright:
|
||
|
2004-2012 1&1 Internet AG, Germany, http://www.1und1.de
|
||
|
|
||
|
License:
|
||
|
LGPL: http://www.gnu.org/licenses/lgpl.html
|
||
|
EPL: http://www.eclipse.org/org/documents/epl-v10.php
|
||
|
See the LICENSE file in the project's top-level directory for details.
|
||
|
|
||
|
Authors:
|
||
|
* Martin Wittemann (martinwittemann)
|
||
|
|
||
|
======================================================================
|
||
|
|
||
|
This class contains code based on the following work:
|
||
|
|
||
|
* Mustache.js version 0.8.0
|
||
|
|
||
|
Code:
|
||
|
https://github.com/janl/mustache.js
|
||
|
|
||
|
Copyright:
|
||
|
(c) 2009 Chris Wanstrath (Ruby)
|
||
|
(c) 2010 Jan Lehnardt (JavaScript)
|
||
|
|
||
|
License:
|
||
|
MIT: http://www.opensource.org/licenses/mit-license.php
|
||
|
|
||
|
----------------------------------------------------------------------
|
||
|
|
||
|
Copyright (c) 2009 Chris Wanstrath (Ruby)
|
||
|
Copyright (c) 2010 Jan Lehnardt (JavaScript)
|
||
|
|
||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||
|
a copy of this software and associated documentation files (the
|
||
|
"Software"), to deal in the Software without restriction, including
|
||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||
|
permit persons to whom the Software is furnished to do so, subject to
|
||
|
the following conditions:
|
||
|
|
||
|
The above copyright notice and this permission notice shall be
|
||
|
included in all copies or substantial portions of the Software.
|
||
|
|
||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||
|
|
||
|
************************************************************************ */
|
||
|
|
||
|
/**
|
||
|
* The is a template class which can be used for HTML templating. In fact,
|
||
|
* this is a wrapper for mustache.js which is a "framework-agnostic way to
|
||
|
* render logic-free views".
|
||
|
*
|
||
|
* Here is a basic example how to use it:
|
||
|
* Template:
|
||
|
* <pre class="javascript">
|
||
|
* var template = "Hi, my name is {{name}}!";
|
||
|
* var view = {name: "qooxdoo"};
|
||
|
* qx.bom.Template.render(template, view);
|
||
|
* // return "Hi, my name is qooxdoo!"
|
||
|
* </pre>
|
||
|
*
|
||
|
* For further details, please visit the mustache.js documentation here:
|
||
|
* https://github.com/janl/mustache.js/blob/master/README.md
|
||
|
*
|
||
|
* @ignore(module)
|
||
|
*/
|
||
|
qx.Bootstrap.define("qx.bom.Template", {
|
||
|
statics : {
|
||
|
/** Contains the mustache.js version. */
|
||
|
version: null,
|
||
|
|
||
|
/**
|
||
|
* Original and only template method of mustache.js. For further
|
||
|
* documentation, please visit https://github.com/janl/mustache.js
|
||
|
*
|
||
|
* @signature function(template, view, partials)
|
||
|
* @param template {String} The String containing the template.
|
||
|
* @param view {Object} The object holding the data to render.
|
||
|
* @param partials {Object} Object holding parts of a template.
|
||
|
* @return {String} The parsed template.
|
||
|
*/
|
||
|
render: null,
|
||
|
|
||
|
/**
|
||
|
* Combines {@link #render} and {@link #get}. Input is equal to {@link #render}
|
||
|
* and output is equal to {@link #get}. The advantage over {@link #get}
|
||
|
* is that you don't need a HTML template but can use a template
|
||
|
* string and still get a DOM element. Keep in mind that templates
|
||
|
* can only have one root element.
|
||
|
*
|
||
|
* @param template {String} The String containing the template.
|
||
|
* @param view {Object} The object holding the data to render.
|
||
|
* @param partials {Object} Object holding parts of a template.
|
||
|
* @return {Element} A DOM element holding the parsed template data.
|
||
|
*/
|
||
|
renderToNode : function(template, view, partials) {
|
||
|
var renderedTmpl = this.render(template, view, partials);
|
||
|
return this._createNodeFromTemplate(renderedTmpl);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Helper method which provides you with a direct access to templates
|
||
|
* stored as HTML in the DOM. The DOM node with the given ID will be used
|
||
|
* as a template, parsed and a new DOM node will be returned containing the
|
||
|
* parsed data. Keep in mind to have only one root DOM element in the the
|
||
|
* template.
|
||
|
* Additionally, you should not put the template into a regular, hidden
|
||
|
* DOM element because the template may not be valid HTML due to the containing
|
||
|
* mustache tags. We suggest to put it into a script tag with the type
|
||
|
* <code>text/template</code>.
|
||
|
*
|
||
|
* @param id {String} The id of the HTML template in the DOM.
|
||
|
* @param view {Object} The object holding the data to render.
|
||
|
* @param partials {Object} Object holding parts of a template.
|
||
|
* @return {Element} A DOM element holding the parsed template data.
|
||
|
*/
|
||
|
get : function(id, view, partials) {
|
||
|
// get the content stored in the DOM
|
||
|
var template = document.getElementById(id);
|
||
|
return this.renderToNode(template.innerHTML, view, partials);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Accepts a parsed template and returns a (potentially nested) node.
|
||
|
*
|
||
|
* @param template {String} The String containing the template.
|
||
|
* @return {Element} A DOM element holding the parsed template data.
|
||
|
*/
|
||
|
_createNodeFromTemplate : function(template) {
|
||
|
// template is text only (no html elems) so use text node
|
||
|
if (template.search(/<|>/) === -1) {
|
||
|
return document.createTextNode(template);
|
||
|
}
|
||
|
|
||
|
// template has html elems so convert string into DOM nodes
|
||
|
var helper = qx.dom.Element.create("div");
|
||
|
helper.innerHTML = template;
|
||
|
|
||
|
return helper.children[0];
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
(function() {
|
||
|
// prevent using CommonJS exports object,
|
||
|
// by shadowing global exports object
|
||
|
var exports;
|
||
|
|
||
|
// prevent using AMD compatible loader,
|
||
|
// by shadowing global define function
|
||
|
var define;
|
||
|
|
||
|
/**
|
||
|
* Below is the original mustache.js code. Snapshot date is mentioned in
|
||
|
* the head of this file.
|
||
|
* @ignore(exports)
|
||
|
* @ignore(define.*)
|
||
|
* @ignore(module.*)
|
||
|
* @lint ignoreNoLoopBlock()
|
||
|
*/
|