80 lines
1.9 KiB
JavaScript
Executable File
80 lines
1.9 KiB
JavaScript
Executable File
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
define([
|
|
'underscore'
|
|
], function (_) {
|
|
'use strict';
|
|
|
|
/**
|
|
* Checks if provided string is a valid DOM selector.
|
|
*
|
|
* @param {String} selector - Selector to be checked.
|
|
* @returns {Boolean}
|
|
*/
|
|
function isSelector(selector) {
|
|
try {
|
|
document.querySelector(selector);
|
|
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Unescapes characters used in underscore templates.
|
|
*
|
|
* @param {String} str - String to be processed.
|
|
* @returns {String}
|
|
*/
|
|
function unescape(str) {
|
|
return str.replace(/<%|%3C%/g, '<%').replace(/%>|%%3E/g, '%>');
|
|
}
|
|
|
|
/**
|
|
* If 'tmpl' is a valid selector, returns target node's innerHTML if found.
|
|
* Else, returns empty string and emits console warning.
|
|
* If 'tmpl' is not a selector, returns 'tmpl' as is.
|
|
*
|
|
* @param {String} tmpl
|
|
* @returns {String}
|
|
*/
|
|
function getTmplString(tmpl) {
|
|
if (isSelector(tmpl)) {
|
|
tmpl = document.querySelector(tmpl);
|
|
|
|
if (tmpl) {
|
|
tmpl = tmpl.innerHTML.trim();
|
|
} else {
|
|
console.warn('No template was found by selector: ' + tmpl);
|
|
|
|
tmpl = '';
|
|
}
|
|
}
|
|
|
|
return unescape(tmpl);
|
|
}
|
|
|
|
/**
|
|
* Compiles or renders template provided either
|
|
* by selector or by the template string.
|
|
*
|
|
* @param {String} tmpl - Template string or selector.
|
|
* @param {(Object|Array|Function)} [data] - Data object with which to render template.
|
|
* @returns {String|Function}
|
|
*/
|
|
return function (tmpl, data) {
|
|
var render;
|
|
|
|
tmpl = getTmplString(tmpl);
|
|
render = _.template(tmpl);
|
|
|
|
return !_.isUndefined(data) ?
|
|
render(data) :
|
|
render;
|
|
};
|
|
});
|