zhaojs
2023-07-04 e4a86aabeb044ddd42dbbbb585e2425871df47e9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// doT.js
// 2011, Laura Doktorova
// https://github.com/olado/doT
//
// doT.js is an open source component of http://bebedo.com
//
// doT is a custom blend of templating functions from jQote2.js
// (jQuery plugin) by aefxx (http://aefxx.com/jquery-plugins/jqote2/)
// and underscore.js (http://documentcloud.github.com/underscore/)
// plus extensions.
//
// Licensed under the MIT license.
//
(function() {
    var doT = { version : '0.1.7' };
 
    if (typeof module !== 'undefined' && module.exports) {
        module.exports = doT;
    } else {
        this.doT = doT;
    }
 
    doT.templateSettings = {
        evaluate:    /\{\{([\s\S]+?)\}\}/g,
        interpolate: /\{\{=([\s\S]+?)\}\}/g,
        encode:      /\{\{!([\s\S]+?)\}\}/g,
        use:         /\{\{#([\s\S]+?)\}\}/g, //compile time evaluation
        define:      /\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g, //compile time defs
        conditionalStart: /\{\{\?([\s\S]+?)\}\}/g,
        conditionalEnd: /\{\{\?\}\}/g,
        varname: 'it',
        strip : true,
        append: true
    };
 
    function resolveDefs(c, block, def) {
        return ((typeof block === 'string') ? block : block.toString())
        .replace(c.define, function (match, code, assign, value) {
            if (code.indexOf('def.') === 0) {
                code = code.substring(4);
            }
            if (!(code in def)) {
                if (assign === ':') {
                    def[code]= value;
                } else {
                    eval("def[code]=" + value);
                }
            }
            return '';
        })
        .replace(c.use, function(match, code) {
            var v = eval(code);
            return v ? resolveDefs(c, v, def) : v;
        });
    }
 
    doT.template = function(tmpl, c, def) {
        c = c || doT.templateSettings;
        var cstart = c.append ? "'+(" : "';out+=(", // optimal choice depends on platform/size of templates
            cend   = c.append ? ")+'" : ");out+='";
        var str = (c.use || c.define) ? resolveDefs(c, tmpl, def || {}) : tmpl;
 
        str = ("var out='" +
            ((c.strip) ? str.replace(/\s*<!\[CDATA\[\s*|\s*\]\]>\s*|[\r\n\t]|(\/\*[\s\S]*?\*\/)/g, ''): str)
            .replace(/\\/g, '\\\\')
            .replace(/'/g, "\\'")
            .replace(c.interpolate, function(match, code) {
                return cstart + code.replace(/\\'/g, "'").replace(/\\\\/g,"\\").replace(/[\r\t\n]/g, ' ') + cend;
            })
            .replace(c.encode, function(match, code) {
                return cstart + code.replace(/\\'/g, "'").replace(/\\\\/g, "\\").replace(/[\r\t\n]/g, ' ') + ").toString().replace(/&(?!\\w+;)/g, '&#38;').split('<').join('&#60;').split('>').join('&#62;').split('" + '"' + "').join('&#34;').split(" + '"' + "'" + '"' + ").join('&#39;').split('/').join('&#47;'" + cend;
            })
            .replace(c.conditionalEnd, function(match, expression) {
                return "';}out+='";
            })
            .replace(c.conditionalStart, function(match, expression) {
                var code = "if(" + expression + "){";
                return "';" + code.replace(/\\'/g, "'").replace(/\\\\/g,"\\").replace(/[\r\t\n]/g, ' ')  + "out+='";
            })
            .replace(c.evaluate, function(match, code) {
                return "';" + code.replace(/\\'/g, "'").replace(/\\\\/g,"\\").replace(/[\r\t\n]/g, ' ') + "out+='";
            })
            + "';return out;")
            .replace(/\n/g, '\\n')
            .replace(/\t/g, '\\t')
            .replace(/\r/g, '\\r')
            .split("out+='';").join('')
            .split("var out='';out+=").join('var out=');
 
        try {
            return new Function(c.varname, str);
        } catch (e) {
            if (typeof console !== 'undefined') console.log("Could not create a template function: " + str);
            throw e;
        }
    };
 
    doT.compile = function(tmpl, def) {
        return doT.template(tmpl, null, def);
    };
}());