diff --git a/src/extensions.js b/src/extensions.js index cb37139..cab961c 100644 --- a/src/extensions.js +++ b/src/extensions.js @@ -65,32 +65,76 @@ if (!String.prototype.resolve) return value; } }; + + var _templateCache = {}; + var getTemplate = function(template){ + if (!_templateCache.hasOwnProperty(template)){ + var str = template.split(/{([^{}]+)}/g); + + for (var i = 0; i < str.length; i++){ + var s = str[i]; + var hasStart = (s.charAt(0) === "}"); + var hasEnd = (s.charAt(s.length - 1) === "{"); + if (hasStart) + { + s = s.substr(1); + } + if (hasEnd) + { + s = s.substr(0, s.length - 1); + } + + if (hasStart || hasEnd) + { + str[i] = s; //plain old html + } else { + str[i] = { + token: str[i], + key: s.split(".") + }; + } + } + _templateCache[template] = str; + } + return _templateCache[template]; + }; String.prototype.resolve = function (substitutes, prefixes) { - var result = this; - $.each(substitutes, function (key, value) - { - if (value != null && typeof value !== "function") - { - if (typeof value === "object") + var str = getTemplate(this); + var result = ""; + for (var i = 0; i < str.length; i++){ + if (typeof str[i] === "object"){ + var key = str[i].key; + var v = ""; + // now we have a variable to be substitued + if (substitutes.hasOwnProperty(key[0])) { - var keys = (prefixes) ? $.extend([], prefixes) : []; - keys.push(key); - result = result.resolve(value, keys) + ""; + v = substitutes[key[0]]; } else { - if (formatter && formatter[key] && typeof formatter[key] === "function") - { - value = formatter[key](value); + continue; + } + + for (var k = 1; k < key.length; k++){ + if (v.hasOwnProperty(key[k])){ + v = v[key[k]]; + } else { + v = null; + break; } - key = (prefixes) ? prefixes.join(".") + "." + key : key; - var pattern = new RegExp("\\{\\{" + key + "\\}\\}", "gm"); - result = result.replace(pattern, (value.replace) ? value.replace(/\$/gi, "$") : value); } + var formatter_key = key[key.length-1]; + if (formatter && formatter[formatter_key] && typeof formatter[formatter_key] === "function"){ + result += formatter[formatter_key](v); + } else { + result += v; + } + } else { + result += str[i]; // plain old html } - }); + } return result; }; } @@ -167,4 +211,4 @@ if (!Array.prototype.propValues) } return result; }; -} \ No newline at end of file +} diff --git a/src/internal.js b/src/internal.js index 9b9bba4..5ed0af8 100644 --- a/src/internal.js +++ b/src/internal.js @@ -393,6 +393,7 @@ function renderColumnSelection(actions) that.element.find("tbody").empty(); // Fixes an column visualization bug renderTableHeader.call(that); loadData.call(that); + that.element.trigger("columnToggle" + namespace, column); } }); dropDown.find(getCssSelector(css.dropDownMenuItems)).append(item); @@ -873,7 +874,7 @@ function replacePlaceHolder(placeholder, element) placeholder.each(function (index, item) { // todo: check how append is implemented. Perhaps cloning here is superfluous. - $(item).before(element.clone(true)).remove(); + $(item).before(element).remove(); }); } @@ -945,4 +946,4 @@ function sortRows() this.rows.sort(sort); } } -} \ No newline at end of file +}