|
1 | 1 | 'use strict';
|
2 | 2 |
|
| 3 | +const path = require('path'); |
| 4 | +const extend = require('util')._extend; |
| 5 | +const _ = require('lodash'); |
| 6 | + |
| 7 | +const getPartial = require('./get'); |
| 8 | +const logger = require('./log'); |
| 9 | +const parseLink = require('./parseLink'); |
| 10 | +const render = require('./render'); |
| 11 | +const jsonCopy = require('./json_copy'); |
| 12 | +const pa = require('./pattern_assembler'); |
| 13 | +const smh = require('./style_modifier_hunter'); |
| 14 | + |
| 15 | +const style_modifier_hunter = new smh(); |
| 16 | +const pattern_assembler = new pa(); |
| 17 | + |
3 | 18 | const parameter_hunter = function () {
|
4 |
| - const extend = require('util')._extend; |
5 |
| - const _ = require('lodash'); |
6 |
| - const jsonCopy = require('./json_copy'); |
7 |
| - const pa = require('./pattern_assembler'); |
8 |
| - const smh = require('./style_modifier_hunter'); |
9 |
| - const style_modifier_hunter = new smh(); |
10 |
| - const pattern_assembler = new pa(); |
11 |
| - const logger = require('./log'); |
12 |
| - const parseLink = require('./parseLink'); |
13 |
| - const render = require('./render'); |
14 | 19 |
|
15 | 20 | /**
|
16 | 21 | * This function is really to accommodate the lax JSON-like syntax allowed by
|
@@ -242,70 +247,88 @@ const parameter_hunter = function () {
|
242 | 247 | return paramStringWellFormed;
|
243 | 248 | }
|
244 | 249 |
|
| 250 | + //compile this partial immeadiately, essentially consuming it. |
245 | 251 | function findparameters(pattern, patternlab) {
|
246 |
| - |
247 | 252 | if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) {
|
248 | 253 |
|
249 |
| - //compile this partial immeadiately, essentially consuming it. |
250 |
| - pattern.parameteredPartials.forEach(function (pMatch) { |
251 |
| - //find the partial's name and retrieve it |
252 |
| - const partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; |
253 |
| - const partialPattern = pattern_assembler.getPartial(partialName, patternlab); |
254 |
| - |
255 |
| - //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190 |
256 |
| - partialPattern.extendedTemplate = partialPattern.template; |
257 |
| - |
258 |
| - logger.debug(`found patternParameters for ${partialName}`); |
259 |
| - |
260 |
| - //strip out the additional data, convert string to JSON. |
261 |
| - const leftParen = pMatch.indexOf('('); |
262 |
| - const rightParen = pMatch.lastIndexOf(')'); |
263 |
| - const paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; |
264 |
| - const paramStringWellFormed = paramToJson(paramString); |
265 |
| - |
266 |
| - let paramData = {}; |
267 |
| - let globalData = {}; |
268 |
| - let localData = {}; |
269 |
| - |
270 |
| - try { |
271 |
| - paramData = JSON.parse(paramStringWellFormed); |
272 |
| - globalData = jsonCopy(patternlab.data, 'config.paths.source.data global data'); |
273 |
| - localData = jsonCopy(pattern.jsonFileData || {}, `pattern ${pattern.patternPartial} data`); |
274 |
| - } catch (err) { |
275 |
| - logger.warning(`There was an error parsing JSON for ${pattern.relPath}`); |
276 |
| - logger.warning(err); |
277 |
| - } |
| 254 | + logger.debug(`processing patternParameters for ${pattern.partialName}`); |
278 | 255 |
|
279 |
| - // resolve any pattern links that might be present |
280 |
| - paramData = parseLink(patternlab, paramData, pattern.patternPartial); |
| 256 | + return pattern.parameteredPartials.reduce((previousPromise, pMatch) => { |
| 257 | + return previousPromise.then(() => { |
281 | 258 |
|
282 |
| - //combine all data: GLOBAL DATA => PATTERN.JSON DATA => PARAMETER DATA |
283 |
| - let allData = _.merge(globalData, localData); |
284 |
| - allData = _.merge(allData, paramData); |
| 259 | + logger.debug(`processing patternParameter ${pMatch}`); |
285 | 260 |
|
286 |
| - //if the partial has pattern parameters itself, we need to handle those |
287 |
| - findparameters(partialPattern, patternlab); |
| 261 | + //find the partial's name and retrieve it |
| 262 | + const partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; |
| 263 | + const partialPattern = getPartial(path.normalize(partialName), patternlab); |
288 | 264 |
|
289 |
| - //if partial has style modifier data, replace the styleModifier value |
290 |
| - if (pattern.stylePartials && pattern.stylePartials.length > 0) { |
291 |
| - style_modifier_hunter.consume_style_modifier(partialPattern, pMatch, patternlab); |
292 |
| - } |
| 265 | + //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190 |
| 266 | + partialPattern.extendedTemplate = partialPattern.template; |
| 267 | + |
| 268 | + logger.debug(`retrieved pattern ${partialName}`); |
| 269 | + |
| 270 | + //strip out the additional data, convert string to JSON. |
| 271 | + const leftParen = pMatch.indexOf('('); |
| 272 | + const rightParen = pMatch.lastIndexOf(')'); |
| 273 | + const paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; |
| 274 | + const paramStringWellFormed = paramToJson(paramString); |
| 275 | + |
| 276 | + let paramData = {}; |
| 277 | + let globalData = {}; |
| 278 | + let localData = {}; |
| 279 | + |
| 280 | + try { |
| 281 | + paramData = JSON.parse(paramStringWellFormed); |
| 282 | + globalData = jsonCopy(patternlab.data, 'config.paths.source.data global data'); |
| 283 | + localData = jsonCopy(pattern.jsonFileData || {}, `pattern ${pattern.patternPartial} data`); |
| 284 | + } catch (err) { |
| 285 | + logger.warning(`There was an error parsing JSON for ${pattern.relPath}`); |
| 286 | + logger.warning(err); |
| 287 | + } |
| 288 | + |
| 289 | + // resolve any pattern links that might be present |
| 290 | + paramData = parseLink(patternlab, paramData, pattern.patternPartial); |
| 291 | + |
| 292 | + //combine all data: GLOBAL DATA => PATTERN.JSON DATA => PARAMETER DATA |
| 293 | + let allData = _.merge(globalData, localData); |
| 294 | + allData = _.merge(allData, paramData); |
| 295 | + |
| 296 | + //if the partial has pattern parameters itself, we need to handle those |
| 297 | + return findparameters(partialPattern, patternlab).then(() => { |
| 298 | + |
| 299 | + logger.debug(`recursively checking the partial itself ${partialPattern.patternPartial}`); |
| 300 | + |
| 301 | + //if partial has style modifier data, replace the styleModifier value |
| 302 | + if (pattern.stylePartials && pattern.stylePartials.length > 0) { |
| 303 | + style_modifier_hunter.consume_style_modifier(partialPattern, pMatch, patternlab); |
| 304 | + } |
| 305 | + |
| 306 | + //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally |
| 307 | + allData.link = extend({}, patternlab.data.link); |
293 | 308 |
|
294 |
| - //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally |
295 |
| - allData.link = extend({}, patternlab.data.link); |
| 309 | + return render(partialPattern, allData).then((results) => { |
296 | 310 |
|
297 |
| - const renderPromise = render(pattern, allData); |
| 311 | + logger.debug(`rendering the partialpattern ${partialPattern.patternPartial}`); |
298 | 312 |
|
299 |
| - return renderPromise.then((results) => { |
| 313 | + //defensively do this in case not set yet |
| 314 | + if (!pattern.extendedTemplate) { |
| 315 | + pattern.extendedTemplate = pattern.template; |
| 316 | + } |
300 | 317 |
|
301 |
| - //remove the parameter from the partial and replace it with the rendered partial + paramData |
302 |
| - pattern.extendedTemplate = pattern.extendedTemplate.replace(pMatch, results); |
| 318 | + //remove the parameter from the partial and replace it with the rendered partial + paramData |
| 319 | + pattern.extendedTemplate = pattern.extendedTemplate.replace(pMatch, results); |
303 | 320 |
|
304 |
| - //update the extendedTemplate in the partials object in case this pattern is consumed later |
305 |
| - patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate; |
| 321 | + //update the extendedTemplate in the partials object in case this pattern is consumed later |
| 322 | + patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate; |
| 323 | + }); |
| 324 | + }); |
| 325 | + }).catch((reason) => { |
| 326 | + logger.error(reason); |
306 | 327 | });
|
307 |
| - }); |
| 328 | + }, Promise.resolve()); |
308 | 329 | }
|
| 330 | + logger.debug(`pattern has no partials ${pattern.patternPartial}`); |
| 331 | + return Promise.resolve(); |
309 | 332 | }
|
310 | 333 |
|
311 | 334 | return {
|
|
0 commit comments