1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/tianqiq-tpl.js

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
tpl.js 7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
tianqiq Отправлено 24.06.2020 05:29 26a8bdb
(function(global, factory) {
if (typeof exports === 'object') {
module.exports = factory();
} else if (typeof define === 'function') {
define(factory);
} else {
global.tpl = factory();
}
})(this, function() {
return {
html: function(tpl, data) {
return this.func(tpl)(data);
},
func: function(tpl) {
var js = this._compile(tpl);
return new Function('D', "var _h='';function _w(s){ _h+=s;}" + js + "return _h;");
},
serv: function(tplurl, data, callBack) {
var _this = this;
this.ajax(tplurl, function(tplHtml) {
var html = _this.html(tplHtml, data);
callBack(html, tplHtml, data);
});
},
render: function(nodes, finish) {
if (Object.prototype.toString.call(nodes) == '[object Function]') {
finish = nodes;
nodes = null;
}
var scripts = nodes || document.getElementsByTagName("script");
this._finish = finish;
var tpls = [],
len = scripts.length;
for (var i = 0; i < len; i++) {
var norender = scripts[i].getAttribute("norender");
if (nodes || (scripts[i].getAttribute("type") == "tpl" && ( norender === null || norender !== "true") )) {
tpls.push(scripts[i]);
this._total++;
}
}
len = tpls.length;
this._curr = 0;
for (var i = 0; i < len; i++) {
var temp = tpls[i];
this._renderOne(temp);
}
},
escapeHTML: function(str) {
return str.toString().replace(/[<>&"]/g, function(c) { return { '<': '&lt;', '>': '&gt;', '&': '&amp;', '"': '&quot;' }[c]; });
},
ajax: function(url, callback) {
var req = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
req.onreadystatechange = function() {
if (req.readyState == 4 && req.status == 200) {
callback(req.responseText);
}
}
try {
req.open("GET", url,true);
req.send();
} catch (e) {}
},
_xssfunc: 'tpl.escapeHTML',
_compile: function(tpl) {
var result = '',
lines = tpl.split('\n'),
len = lines.length,
i = -1,
first;
while (++i < len) {
var line = lines[i];
line = line.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
first = line.charAt(0);
if (first == '<' || first == '@') {
result += this._parseLine(line);
} else if (first == '!' && line.charAt(1) == '!') {
result += "_w('" + line.substr(2) + "');";
} else if (first == '!') {
result += this._parseLine(line.substr(1));
} else {
result += line;
}
}
return result;
},
_parseLine: function(line) {
var _this = this;
return "_w('" + line.replace(/'/g, "\\'").replace(/@(\{.+?\}|[\w\.\[\]\(\)\!]+)/g, function(match, exp, index, source) {
exp = exp.replace(/\\'/g, "'");
if (source.charAt(index - 1) == '\\') {
return "@" + exp;
}
if (exp.charAt(0) == '{') {
exp = exp.substr(1, exp.length - 2);
}
if (exp.charAt(exp.length - 1) == '!') {
exp = exp.substr(0, exp.length - 1);
return "'+(" + exp + ") + '";
} else {
return "'+ " + _this._xssfunc + "(" + exp + ") + '";
}
}) + "');";
},
_setToDom: function(node, tplHtml, data) {
var wrap = document.createElement(/MSIE \d\.0/.test(navigator.userAgent) ? "div" : "table");
var parent = node.parentNode,
childs = wrap.childNodes;
wrap.innerHTML = this.func(tplHtml)(data);
var scripts = wrap.getElementsByTagName('include');
var childTpls = [];
for(var i = 0;i<scripts.length;i++){
var norender = scripts[i].getAttribute("norender");
if(scripts[i].getAttribute('type') == "tpl" && ( norender === null || norender !== "true") ){
childTpls.push(scripts[i]);
this._total++;
}
}
while (childs.length != 0) {
parent.insertBefore(childs[0], node);
}
parent.removeChild(node);
for(var i = 0;i<childTpls.length;i++){
var attr = childTpls[i].getAttribute("data-data-attr")
tpl._renderOne(childTpls[i], attr ? data[attr] : data);
}
},
_total: 0,
_curr: 0,
_finishCall: function() {
this._curr++;
if (this._total == 0) {
if (this._finish) {
this._finish(this._curr);
}
}
},
_finish: function() {},
_renderOne: function(node, data) {
var _this = this;
var ref = node.getAttribute('data-tpl-ref');
if(ref){
var refNode = document.getElementById(ref).cloneNode(true);
node.parentNode.replaceChild(refNode,node);
node = refNode;
}
var dataurl = node.getAttribute("data-data-url");
var tplUrl = node.getAttribute("data-tpl-url");
if (tplUrl) {
if (dataurl) {
this.ajax(dataurl, function(jsonStr) {
var json = JSON.parse(jsonStr);
_this.ajax(tplUrl, function(tplHtml) {
_this._setToDom(node, tplHtml, json);
_this._total--;
_this._finishCall();
});
});
} else {
_this.ajax(tplUrl, function(tplHtml) {
_this._setToDom(node, tplHtml, data || {});
_this._total--;
_this._finishCall();
});
}
} else {
if (dataurl) {
_this.ajax(dataurl, function(jsonStr) {
var json = JSON.parse(jsonStr);
_this._setToDom(node, node.innerHTML, json);
_this._total--;
_this._finishCall();
});
} else {
_this._setToDom(node, node.innerHTML, data || {});
_this._total--;
_this._finishCall();
}
}
}
}
});

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/tianqiq-tpl.js.git
git@api.gitlife.ru:oschina-mirror/tianqiq-tpl.js.git
oschina-mirror
tianqiq-tpl.js
tianqiq-tpl.js
master