- commit
- cb0b88e0a8a24b60d220ef053f140f9a9abfcdc3
- parent
- b9ede1986fab336dc43c2a93fdeec5a896f7ea68
- Author
- Tobias Bengfort <tobias.bengfort@gmx.net>
- Date
- 2015-08-28 17:48
do not get next everywhere
Diffstat
| M | src/muu-template.js | 130 | +++++++++++++++++++++---------------------------------------- |
1 files changed, 45 insertions, 85 deletions
diff --git a/src/muu-template.js b/src/muu-template.js
@@ -80,17 +80,12 @@ define('muu-template', ['muu-js-helpers', 'muu-dom-helpers'], function(_, $) {
80 80
81 81 /**
82 82 * @param {string} tag
83 -1 * @param {string} afterTag
84 -1 * @param {string} loopName
85 -1 * @return {{render: function(*): string, afterBlock: string}}
-1 83 * @return {function(*): string}
86 84 * @nosideeffects
87 85 */
88 -1 var parseVariable = function(tag, afterTag, loopName) {
89 -1 var next = parseTemplate(afterTag, loopName);
90 -1 var render;
91 -1
-1 86 var parseVariable = function(tag) {
92 87 if (tag.indexOf(':') === -1) {
93 -1 render = function(data) {
-1 88 return function(data) {
94 89 return $.escapeHtml(getValue(tag, data) || '');
95 90 };
96 91 } else {
@@ -101,41 +96,27 @@ define('muu-template', ['muu-js-helpers', 'muu-dom-helpers'], function(_, $) {
101 96 return [key, value];
102 97 });
103 98
104 -1 render = function(data) {
105 -1 var results = [];
106 -1
107 -1 for (var i = 0; i < pairs.length; i++) {
108 -1 var key = pairs[i][0];
109 -1 var value = pairs[i][1];
110 -1
111 -1 if (getValue(value, data)) {
112 -1 results.push(key);
113 -1 }
114 -1 }
-1 99 return function(data) {
-1 100 var results = _.map(_.filter(pairs, function(pair) {
-1 101 return getValue(pair[1], data);
-1 102 }), function(pair) {
-1 103 return pair[0];
-1 104 });
115 105
116 106 return $.escapeHtml(results.join(' '));
117 107 };
118 108 }
119 -1
120 -1 return {
121 -1 render: function(data) {
122 -1 return render(data) + next.render(data, loopName);
123 -1 },
124 -1 afterBlock: next.afterBlock
125 -1 };
126 109 };
127 110
128 111 /**
129 112 * @param {string} tag
130 113 * @param {string} afterTag
131 -1 * @param {string} loopName
132 114 * @param {boolean} [inverted]
133 115 * @return {{render: function(*): string, afterBlock: string}}
134 116 * @nosideeffects
135 117 */
136 -1 var parseLoop = function(tag, afterTag, loopName, inverted) {
-1 118 var parseLoop = function(tag, afterTag, inverted) {
137 119 var inner = parseTemplate(afterTag, tag);
138 -1 var next = parseTemplate(inner.afterBlock, loopName);
139 120
140 121 return {
141 122 render: function(data) {
@@ -156,46 +137,15 @@ define('muu-template', ['muu-js-helpers', 'muu-dom-helpers'], function(_, $) {
156 137 }
157 138 }
158 139
159 -1 return result + next.render(data);
-1 140 return result;
160 141 },
161 -1 afterBlock: next.afterBlock
-1 142 afterBlock: inner.afterBlock
162 143 };
163 144 };
164 145
165 146 /**
166 -1 * @param {string} tag
167 -1 * @param {string} afterTag
168 -1 * @param {string} loopName
169 -1 * @return {{render: function(*): string, afterBlock: string}}
170 -1 * @nosideeffects
171 -1 */
172 -1 var parseClose = function(tag, afterTag, loopName) {
173 -1 if (tag === loopName) {
174 -1 return {
175 -1 render: function(data) {
176 -1 return '';
177 -1 },
178 -1 afterBlock: afterTag
179 -1 };
180 -1 } else {
181 -1 throw new Error('unexpected closing loop: ' + tag);
182 -1 }
183 -1 };
184 -1
185 -1 /**
186 -1 * @param {string} tag
187 -1 * @param {string} afterTag
188 -1 * @param {string} loopName
189 -1 * @return {{render: function(*): string, afterBlock: string}}
190 -1 * @nosideeffects
191 -1 */
192 -1 var parseComment = function(tag, afterTag, loopName) {
193 -1 return parseTemplate(afterTag, loopName);
194 -1 };
195 -1
196 -1 /**
197 147 * @param {string} template
198 -1 * @param {string} loopName
-1 148 * @param {string} [loopName]
199 149 * @return {{render: function(*): string, afterBlock: string}}
200 150 * @nosideeffects
201 151 */
@@ -204,9 +154,7 @@ define('muu-template', ['muu-js-helpers', 'muu-dom-helpers'], function(_, $) {
204 154 if (openIndex === -1) {
205 155 if (loopName === undefined) {
206 156 return {
207 -1 render: function(data) {
208 -1 return template;
209 -1 },
-1 157 render: function() { return template; },
210 158 afterBlock: ''
211 159 };
212 160 } else {
@@ -223,33 +171,45 @@ define('muu-template', ['muu-js-helpers', 'muu-dom-helpers'], function(_, $) {
223 171 var tag = tmp.slice(openTag.length, closeIndex);
224 172 var afterTag = tmp.slice(closeIndex + closeTag.length);
225 173
226 -1 var next;
-1 174 var loadNext = true;
-1 175 var current = {
-1 176 render: function() { return ''; },
-1 177 afterBlock: afterTag
-1 178 };
-1 179
227 180 if (tag.lastIndexOf('#', 0) === 0) {
228 -1 next = parseLoop(tag.substr(1), afterTag, loopName);
-1 181 current = parseLoop(tag.substr(1), afterTag);
229 182 } else if (tag.lastIndexOf('^', 0) === 0) {
230 -1 next = parseLoop(tag.substr(1), afterTag, loopName, true);
231 -1 } else if (tag.lastIndexOf('!', 0) === 0) {
232 -1 next = parseComment(tag.substr(1), afterTag, loopName);
-1 183 current = parseLoop(tag.substr(1), afterTag, true);
233 184 } else if (tag.lastIndexOf('/', 0) === 0) {
234 -1 next = parseClose(tag.substr(1), afterTag, loopName);
235 -1 } else {
236 -1 next = parseVariable(tag, afterTag, loopName);
-1 185 loadNext = false;
-1 186 if (tag.substr(1) !== loopName) {
-1 187 throw new Error('unexpected closing loop: ' + tag);
-1 188 }
-1 189 } else if (tag.lastIndexOf('!', 0) !== 0) {
-1 190 current.render = parseVariable(tag);
237 191 }
238 192
239 -1 return {
240 -1 render: function(data) {
241 -1 return beforeTag + next.render(data);
242 -1 },
243 -1 afterBlock: next.afterBlock
244 -1 };
-1 193 if (loadNext) {
-1 194 var next = parseTemplate(current.afterBlock, loopName);
-1 195 return {
-1 196 render: function(data) {
-1 197 return beforeTag + current.render(data) + next.render(data);
-1 198 },
-1 199 afterBlock: next.afterBlock
-1 200 };
-1 201 } else {
-1 202 return {
-1 203 render: function(data) {
-1 204 return beforeTag + current.render(data);
-1 205 },
-1 206 afterBlock: current.afterBlock
-1 207 };
-1 208 }
245 209 }
246 210 };
247 211
248 212 return function(template, data) {
249 -1 var parsed = parseTemplate(template);
250 -1 if (parsed.afterBlock) {
251 -1 throw new Error('non-empty afterBlock');
252 -1 }
253 -1 return parsed.render(data);
-1 213 return parseTemplate(template).render(data);
254 214 };
255 215 });