UNPKG

3.9 kBJavaScriptView Raw
1var ignore = 'ignore',
2 missing = 'missing',
3 only = 'only',
4 attrs = ["id", "mode", "group", "for", "model"];
5
6/**
7 * Includes a template partial in place. The template is rendered within the current locals variable context.
8 *
9 * @alias widget
10 *
11 * @example
12 * // food = 'burritos';
13 * // drink = 'lemonade';
14 * {% widget "./partial.html" %}
15 * // => I like burritos and lemonade.
16 *
17 * @example
18 * // my_obj = { food: 'tacos', drink: 'horchata' };
19 * {% widget "./partial.html" id="pagelet_id" mode="async" with my_obj%}
20 * // => I like tacos and horchata.
21 *
22 * @example
23 * {% widget "/this/file/does/not/exist" ignore missing %}
24 * // => (Nothing! empty string)
25 *
26 * @param {string|var} file The path, relative to the template root, to render into the current context.
27 * @param {literal} [with] Literally, "with".
28 * @param {object} [context] Local variable key-value object context to provide to the included file.
29 * @param {literal} [only] Restricts to <strong>only</strong> passing the <code>with context</code> as local variables–the included template will not be aware of any other local variables in the parent template. For best performance, usage of this option is recommended if possible.
30 * @param {literal} [ignore missing] Will output empty string if not found instead of throwing an error.
31 */
32exports.compile = function(compiler, args) {
33 var file = args.shift(),
34 onlyIdx = args.indexOf(only),
35 onlyCtx = onlyIdx !== -1 ? args.splice(onlyIdx, 1) : false,
36 parentFile = (args.pop() || '').replace(/\\/g, '\\\\'),
37 ignore = args[args.length - 1] === missing ? (args.pop()) : false,
38 w = args.filter(function(o) {
39 return !o.k;
40 }).join(' '),
41 w_args = {};
42
43 args.map(function(w) {
44 if (w.k) w_args[w.k] = w.v;
45 });
46
47 return (ignore ? ' try {\n' : '') +
48 '_output += _swig._w(_ctx._yog, '+ file+',' + JSON.stringify(w_args) + ', {' +
49 'resolveFrom: "' + parentFile + '"' +
50 '})(' +
51 ((onlyCtx && w) ? w : (!w ? '_ctx' : '_utils.extend({}, _ctx, ' + w + ')')) +
52 ');\n' +
53 (ignore ? '} catch (e) {}\n' : '');
54};
55
56exports.parse = function(str, line, parser, types, stack, opts) {
57 var file, w, k;
58
59 parser.on(types.STRING, function(token) {
60
61 if (!file) {
62 file = token.match;
63 this.out.push(file);
64 return;
65 }
66
67 var out = {
68 v: '',
69 k: ''
70 };
71
72 if (~attrs.indexOf(k)) {
73 out.v = token.match.replace(/^("|')?(.*)\1$/g, '$2');
74 out.k = k;
75 this.out.push(out);
76 v = ''; //reset
77 }
78
79 });
80
81 parser.on(types.VAR, function(token) {
82 if (!file) {
83 k = '';
84 file = token.match;
85 return true;
86 }
87
88 if (~attrs.indexOf(token.match)) {
89 k = token.match;
90 return false;
91 }
92
93 if (!w && token.match === 'with') {
94 w = true;
95 return;
96 }
97
98 if (w && token.match === only && this.prevToken.match !== 'with') {
99 this.out.push(token.match);
100 return;
101 }
102
103 if (token.match === ignore) {
104 return false;
105 }
106
107 if (token.match === missing) {
108 if (this.prevToken.match !== ignore) {
109 throw new Error('Unexpected token "' + missing + '" on line ' + line + '.');
110 }
111 this.out.push(token.match);
112 return false;
113 }
114
115 if (this.prevToken.match === ignore) {
116 throw new Error('Expected "' + missing + '" on line ' + line + ' but found "' + token.match + '".');
117 }
118
119 return true;
120 });
121
122 parser.on('end', function() {
123 this.out.push(opts.filename || null);
124 });
125
126 return true;
127};
128
129exports.ends = false;
\No newline at end of file