forked from mozilla/nunjucks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtranspiler.js
94 lines (82 loc) · 2.79 KB
/
transpiler.js
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
const parser = require('./nunjucks/src/parser')
const compiler = require('./nunjucks/src/compiler')
const transformer = require('./nunjucks/src/transformer')
const nodes = require('./nunjucks/src/nodes')
const fs = require('fs')
const inputStr = fs.readFileSync(process.argv[2], 'utf8')
const ast = transformer.transform(parser.parse(inputStr), []);
const filters = {
safe: node => {
const out = []
out.push(printNodes(node.args, '@Html(', ')'))
return out.join('')
}
}
function printNodes(node, variablePrefix, variablePostfix) {
const output = []
const varPrefix = variablePrefix || '@{'
const varPostfix = variablePostfix || '}'
if (node instanceof nodes.NodeList) {
node.children.forEach((n) => {
output.push(printNodes(n, variablePrefix, variablePostfix))
})
} else if (node instanceof nodes.LookupVal || node instanceof nodes.Symbol) {
output.push(varPrefix)
if (node.target) {
output.push('(')
output.push(node.target.value)
output.push(' \\ "')
output.push(node.val.value)
output.push('").as[String]')
} else {
output.push(node.value)
}
output.push(varPostfix)
} else if (node instanceof nodes.Value) {
node.iterFields((val) => {
output.push(val)
})
} else if (node instanceof nodes.If || node instanceof nodes.InlineIf) {
if (node.cond.left) {
output.push('<!-- multiple conditions -->')
} else {
output.push('@if((')
output.push(node.cond.target.value)
output.push(' \\ "')
output.push(node.cond.val.value)
output.push('").toOption.isDefined) {')
output.push(printNodes(node.body, variablePrefix, variablePostfix))
output.push('}')
if (node.else_) {
output.push('else {')
output.push(printNodes(node.else_, variablePrefix, variablePostfix))
output.push('}')
}
}
} else if (node instanceof nodes.For) {
output.push('@for((')
output.push(node.name.children[0].value)
output.push(', ')
output.push(node.name.children[1].value)
output.push(') <- ((')
output.push(node.arr.target.value)
output.push(') \\ "')
output.push(node.arr.val.value)
output.push('").as[Map[String, String]]){')
output.push(printNodes(node.body, variablePrefix, variablePostfix))
output.push('})')
} else if (node instanceof nodes.Filter) {
const filterName = node.name.value
const filterHandler = filters[filterName]
if (filterHandler) {
output.push(filterHandler(node))
} else {
output.push(`<!-- NO HANDLER FOR FILTER [${filterName}] -->`)
}
} else {
output.push(`[unrecognised ${node.typename}]`)
}
return output.join('')
}
const boilerplate = ['@import play.api.libs.json.JsValue', '@(params: JsValue)', ''].join('\n')
console.log(boilerplate + printNodes(ast))