This repository has been archived by the owner on Jun 10, 2018. It is now read-only.
/
compiler.coffee
68 lines (61 loc) · 1.96 KB
/
compiler.coffee
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
CoffeeScript = require "coffee-script"
{preprocess} = require "./preprocessor"
{indent} = require "./util"
module.exports = eco = (source) ->
do new Function "return #{compile source}"
eco.preprocess = preprocess
eco.compile = compile = (source) ->
script = CoffeeScript.compile preprocess(source), noWrap: true
"""
function(__obj) {
if (!__obj) __obj = {};
var __out = [], __capture = function(callback) {
var out = __out, result;
__out = [];
callback.call(this);
result = __out.join('');
__out = out;
return __safe(result);
}, __sanitize = function(value) {
if (value && value.ecoSafe) {
return value;
} else if (typeof value !== 'undefined' && value != null) {
return __escape(value);
} else {
return '';
}
}, __safe, __objSafe = __obj.safe, __escape = __obj.escape;
__safe = __obj.safe = function(value) {
if (value && value.ecoSafe) {
return value;
} else {
if (!(typeof value !== 'undefined' && value != null)) value = '';
var result = new String(value);
result.ecoSafe = true;
return result;
}
};
if (!__escape) {
__escape = __obj.escape = function(value) {
return ('' + value)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/\x22/g, '"');
};
}
(function() {
#{indent script, 4}
}).call(__obj);
__obj.safe = __objSafe, __obj.escape = __escape;
return __out.join('');
}
"""
eco.render = (source, data) ->
(eco source) data
if require.extensions
require.extensions[".eco"] = (module, filename) ->
source = require("fs").readFileSync filename, "utf-8"
module._compile "module.exports = #{compile source}", filename
else if require.registerExtension
require.registerExtension ".eco", compile