diff src/implab/text/template-compile.js @ 0:fc2517695ee1

Initial commit, draft import of existing work
author cin
date Thu, 01 Jun 2017 13:20:03 +0300
parents
children f0035923ff3e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/implab/text/template-compile.js	Thu Jun 01 13:20:03 2017 +0300
@@ -0,0 +1,54 @@
+define(
+    [ "dojo/request", "./format" ],
+    function(request, format) {
+        var compile = function(str) {
+            var code = "var p=[],print=function(){p.push(foramt.apply(null,arguments));};" +
+                // Introduce the data as local variables using with(){}
+                "with(obj){p.push('" +
+                // Convert the template into pure JavaScript
+                str.replace(/[\r\t\n]/g, " ").split("<%").join("\t").replace(
+                    /(^|%>)[^\t]*/g,
+                    function(x) {
+                        return x.replace(/('|\\)/g, "\\$1");
+                    }).replace(/\t=(.*?)%>/g, "',$1,'").split("\t").join("');")
+                    .split("%>").join("p.push('") + "');}return p.join('');";
+            /* jshint -W054 */
+            try {
+                var compiled = new Function("obj, format, nls", code);
+
+                /**
+                 * Функция форматирования по шаблону
+                 * 
+                 * @type{Function}
+                 * @param{Object} obj объект с параметрами для подстановки
+                 */
+                return function(obj) {
+                    return compiled(obj || {}, format);
+                };
+            } catch (e) {
+                if (console && console.error) {
+                    console.error(code);
+                }
+            }
+        };
+
+        var cache = {};
+
+        compile.load = function(id, require, callback) {
+            var url = require.toUrl(id);
+            if (url in cache) {
+                callback(cache[url]);
+            } else {
+                request(url).then(compile).then(function(tc) {
+                    callback(cache[url] = tc);
+                }, function(err) {
+                    require.signal("error", [ {
+                        error : err,
+                        src : 'implab/template-compile'
+                    } ]);
+                });
+            }
+        };
+
+        return compile;
+    });
\ No newline at end of file