Skip to content

Commit 63117e2

Browse files
Merge pull request #771 from pattern-lab/pattern-param-rework
Pattern param rework
2 parents 578a9af + 2f84d9c commit 63117e2

23 files changed

+471
-476
lines changed

core/index.js

+79-76
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ const patternlab_module = function (config) {
146146
}
147147
}
148148

149-
function buildPatterns(deletePatternDir) {
149+
function buildPatterns(deletePatternDir, additionalData) {
150150
patternlab.events.emit('patternlab-build-pattern-start', patternlab);
151151

152152
//
@@ -170,9 +170,8 @@ const patternlab_module = function (config) {
170170
//
171171
cleanBuildDirectory(patternlab.incrementalBuildsEnabled);
172172

173-
patternlab.buildGlobalData();
173+
patternlab.buildGlobalData(additionalData);
174174

175-
// diveSync once to perform iterative populating of patternlab object
176175
return patternlab.processAllPatternsIterative(paths.source.patterns).then(() => {
177176

178177
patternlab.events.emit('patternlab-pattern-iteration-end', patternlab);
@@ -181,90 +180,94 @@ const patternlab_module = function (config) {
181180
//we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference
182181
parseAllLinks(patternlab);
183182

184-
//diveSync again to recursively include partials, filling out the
183+
//dive again to recursively include partials, filling out the
185184
//extendedTemplate property of the patternlab.patterns elements
186-
// TODO we can reduce the time needed by only processing changed patterns and their partials
187-
patternlab.processAllPatternsRecursive(paths.source.patterns, patternlab);
188-
189-
//take the user defined head and foot and process any data and patterns that apply
190-
const headPatternPromise = processMetaPattern(`_00-head.${patternlab.config.patternExtension}`, 'userHead', patternlab);
191-
const footPatternPromise = processMetaPattern(`_01-foot.${patternlab.config.patternExtension}`, 'userFoot', patternlab);
192-
193-
return Promise.all([headPatternPromise, footPatternPromise]).then(() => {
194-
195-
//cascade any patternStates
196-
lineage_hunter.cascade_pattern_states(patternlab);
197-
198-
//set pattern-specific header if necessary
199-
let head;
200-
if (patternlab.userHead) {
201-
head = patternlab.userHead;
202-
} else {
203-
head = patternlab.header;
204-
}
205-
206-
//set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
207-
return render(Pattern.createEmpty({extendedTemplate: patternlab.header}), {
208-
cacheBuster: patternlab.cacheBuster
209-
}).then((results) => {
210-
patternlab.data.patternLabHead = results;
211-
212-
// If deletePatternDir == true or graph needs to be updated
213-
// rebuild all patterns
214-
let patternsToBuild = null;
215-
216-
// If deletePatternDir == true or graph needs to be updated
217-
// rebuild all patterns
218-
patternsToBuild = null;
219-
220-
if (patternlab.incrementalBuildsEnabled) {
221-
// When the graph was loaded from file, some patterns might have been moved/deleted between runs
222-
// so the graph data become out of sync
223-
patternlab.graph.sync().forEach(n => {
224-
logger.info("[Deleted/Moved] " + n);
225-
});
226-
227-
// TODO Find created or deleted files
228-
const now = new Date().getTime();
229-
markModifiedPatterns(now, patternlab);
230-
patternsToBuild = patternlab.graph.compileOrder();
185+
return patternlab.processAllPatternsRecursive(paths.source.patterns).then(() => {
186+
187+
//take the user defined head and foot and process any data and patterns that apply
188+
const headPatternPromise = processMetaPattern(`_00-head.${patternlab.config.patternExtension}`, 'userHead', patternlab);
189+
const footPatternPromise = processMetaPattern(`_01-foot.${patternlab.config.patternExtension}`, 'userFoot', patternlab);
190+
191+
return Promise.all([headPatternPromise, footPatternPromise]).then(() => {
192+
193+
//cascade any patternStates
194+
lineage_hunter.cascade_pattern_states(patternlab);
195+
196+
//set pattern-specific header if necessary
197+
let head;
198+
if (patternlab.userHead) {
199+
head = patternlab.userHead;
231200
} else {
232-
// build all patterns, mark all to be rebuilt
233-
patternsToBuild = patternlab.patterns;
234-
for (const p of patternsToBuild) {
235-
p.compileState = CompileState.NEEDS_REBUILD;
236-
}
201+
head = patternlab.header;
237202
}
238203

239-
//render all patterns last, so lineageR works
240-
return patternsToBuild
241-
.reduce((previousPromise, pattern) => {
242-
return previousPromise.then(() => patternlab.renderSinglePattern(pattern, head));
243-
}, Promise.resolve())
244-
.then(() => {
245-
// Saves the pattern graph when all files have been compiled
246-
PatternGraph.storeToFile(patternlab);
247-
if (patternlab.config.exportToGraphViz) {
248-
PatternGraph.exportToDot(patternlab, "dependencyGraph.dot");
249-
logger.info(`Exported pattern graph to ${path.join(config.paths.public.root, "dependencyGraph.dot")}`);
204+
//set the pattern-specific header by compiling the general-header with data, and then adding it to the meta header
205+
return render(Pattern.createEmpty({extendedTemplate: patternlab.header}), {
206+
cacheBuster: patternlab.cacheBuster
207+
}).then((results) => {
208+
patternlab.data.patternLabHead = results;
209+
210+
// If deletePatternDir == true or graph needs to be updated
211+
// rebuild all patterns
212+
let patternsToBuild = null;
213+
214+
// If deletePatternDir == true or graph needs to be updated
215+
// rebuild all patterns
216+
patternsToBuild = null;
217+
218+
if (patternlab.incrementalBuildsEnabled) {
219+
// When the graph was loaded from file, some patterns might have been moved/deleted between runs
220+
// so the graph data become out of sync
221+
patternlab.graph.sync().forEach(n => {
222+
logger.info("[Deleted/Moved] " + n);
223+
});
224+
225+
// TODO Find created or deleted files
226+
const now = new Date().getTime();
227+
markModifiedPatterns(now, patternlab);
228+
patternsToBuild = patternlab.graph.compileOrder();
229+
} else {
230+
// build all patterns, mark all to be rebuilt
231+
patternsToBuild = patternlab.patterns;
232+
for (const p of patternsToBuild) {
233+
p.compileState = CompileState.NEEDS_REBUILD;
250234
}
235+
}
251236

252-
//export patterns if necessary
253-
pattern_exporter.export_patterns(patternlab);
254-
255-
}).catch(reason => {
256-
console.log(reason);
257-
logger.error('Error rendering patterns');
258-
});
237+
//render all patterns last, so lineageR works
238+
return patternsToBuild
239+
.reduce((previousPromise, pattern) => {
240+
return previousPromise.then(() => patternlab.renderSinglePattern(pattern, head));
241+
}, Promise.resolve())
242+
.then(() => {
243+
// Saves the pattern graph when all files have been compiled
244+
PatternGraph.storeToFile(patternlab);
245+
if (patternlab.config.exportToGraphViz) {
246+
PatternGraph.exportToDot(patternlab, "dependencyGraph.dot");
247+
logger.info(`Exported pattern graph to ${path.join(config.paths.public.root, "dependencyGraph.dot")}`);
248+
}
249+
250+
//export patterns if necessary
251+
pattern_exporter.export_patterns(patternlab);
252+
253+
}).catch(reason => {
254+
console.log(reason);
255+
logger.error('Error rendering patterns');
256+
});
257+
258+
}).catch(reason => {
259+
console.log(reason);
260+
logger.error('Error rendering pattern lab header');
261+
});
259262

260263
}).catch(reason => {
261264
console.log(reason);
262-
logger.error('Error rendering pattern lab header');
265+
logger.error('Error processing meta patterns');
263266
});
264267

265268
}).catch(reason => {
266269
console.log(reason);
267-
logger.error('Error processing meta patterns');
270+
logger.error('Error processing patterns recursively');
268271
});
269272

270273
}).catch(reason => {
@@ -304,7 +307,7 @@ const patternlab_module = function (config) {
304307
return Promise.resolve();
305308
}
306309
patternlab.isBusy = true;
307-
return buildPatterns(options.cleanPublic).then(() => {
310+
return buildPatterns(options.cleanPublic, options.data).then(() => {
308311

309312
return new ui_builder().buildFrontend(patternlab).then(() => {
310313

@@ -352,7 +355,7 @@ const patternlab_module = function (config) {
352355
return Promise.resolve();
353356
}
354357
patternlab.isBusy = true;
355-
return buildPatterns(options.cleanPublic).then(() => {
358+
return buildPatterns(options.cleanPublic, options.data).then(() => {
356359
patternlab.isBusy = false;
357360
});
358361
},

core/lib/decompose.js

+5-76
Original file line numberDiff line numberDiff line change
@@ -3,65 +3,11 @@
33
const logger = require('./log');
44
const lh = require('./lineage_hunter');
55
const lih = require('./list_item_hunter');
6-
const ph = require('./parameter_hunter');
7-
const smh = require('./style_modifier_hunter');
86
const addPattern = require('./addPattern');
9-
const jsonCopy = require('./json_copy');
10-
const getPartial = require('./get');
7+
const expandPartials = require('./expandPartials');
118

129
const lineage_hunter = new lh();
1310
const list_item_hunter = new lih();
14-
const parameter_hunter = new ph();
15-
const style_modifier_hunter = new smh();
16-
17-
function expandPartials(foundPatternPartials, patternlab, currentPattern) {
18-
19-
// these needs to be inside the function call, unless there is a better way to handle the recursion
20-
const processRecursive = require('./processRecursive');
21-
22-
logger.debug(`found partials for ${currentPattern.patternPartial}`);
23-
24-
// determine if the template contains any pattern parameters. if so they
25-
// must be immediately consumed
26-
return parameter_hunter.find_parameters(currentPattern, patternlab).then(() => {
27-
28-
//do something with the regular old partials
29-
foundPatternPartials.forEach((foundPartial) => {
30-
31-
var partial = currentPattern.findPartial(foundPartial);
32-
var partialPath;
33-
34-
//identify which pattern this partial corresponds to
35-
for (var j = 0; j < patternlab.patterns.length; j++) {
36-
if (patternlab.patterns[j].patternPartial === partial ||
37-
patternlab.patterns[j].relPath.indexOf(partial) > -1)
38-
{
39-
partialPath = patternlab.patterns[j].relPath;
40-
}
41-
}
42-
43-
//recurse through nested partials to fill out this extended template.
44-
return processRecursive(partialPath, patternlab).then(() => { //eslint-disable-line no-loop-func
45-
//complete assembly of extended template
46-
//create a copy of the partial so as to not pollute it after the getPartial call.
47-
var partialPattern = getPartial(partial, patternlab);
48-
var cleanPartialPattern = jsonCopy(partialPattern, `partial pattern ${partial}`);
49-
50-
//if partial has style modifier data, replace the styleModifier value
51-
if (currentPattern.stylePartials && currentPattern.stylePartials.length > 0) {
52-
style_modifier_hunter.consume_style_modifier(cleanPartialPattern, foundPartial, patternlab);
53-
}
54-
55-
//this is what we came here for
56-
logger.debug(`within ${currentPattern.patternPartial}, replacing extendedTemplate partial ${foundPartial} with ${cleanPartialPattern.patternPartial}'s extededTemplate`);
57-
currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPartial, cleanPartialPattern.extendedTemplate);
58-
return Promise.resolve();
59-
});
60-
});
61-
}).catch(reason => {
62-
logger.error(reason);
63-
});
64-
}
6511

6612
/**
6713
* A helper that unravels a pattern looking for partials or listitems to unravel.
@@ -73,31 +19,14 @@ function expandPartials(foundPatternPartials, patternlab, currentPattern) {
7319
module.exports = function (pattern, patternlab, ignoreLineage) {
7420

7521
//set the extendedTemplate to operate on later if we find partials to replace
76-
pattern.extendedTemplate = pattern.template;
77-
78-
//find how many partials there may be for the given pattern
79-
const foundPatternPartials = pattern.findPartials();
22+
if (!pattern.extendedTemplate) {
23+
pattern.extendedTemplate = pattern.template;
24+
}
8025

8126
//find any listItem blocks that within the pattern, even if there are no partials
8227
const listItemPromise = list_item_hunter.process_list_item_partials(pattern, patternlab);
8328

84-
// expand any partials present in this pattern; that is, drill down into
85-
// the template and replace their calls in this template with rendered
86-
// results
87-
let expandPartialPromise = undefined;
88-
if (pattern.engine.expandPartials && (foundPatternPartials !== null && foundPatternPartials.length > 0)) {
89-
90-
// eslint-disable-next-line
91-
expandPartialPromise = expandPartials(foundPatternPartials, patternlab, pattern).then(() => {
92-
93-
// update the extendedTemplate in the partials object in case this
94-
// pattern is consumed later
95-
patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate;
96-
97-
});
98-
} else {
99-
expandPartialPromise = Promise.resolve();
100-
}
29+
const expandPartialPromise = expandPartials(pattern, patternlab);
10130

10231
let lineagePromise;
10332

core/lib/expandPartials.js

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
"use strict";
2+
3+
const logger = require('./log');
4+
const ph = require('./parameter_hunter');
5+
const smh = require('./style_modifier_hunter');
6+
const jsonCopy = require('./json_copy');
7+
const getPartial = require('./get');
8+
9+
const parameter_hunter = new ph();
10+
const style_modifier_hunter = new smh();
11+
12+
module.exports = function (currentPattern, patternlab) {
13+
14+
const processRecursive = require('./processRecursive');
15+
16+
//find how many partials there may be for the given pattern
17+
const foundPatternPartials = currentPattern.findPartials();
18+
19+
// expand any partials present in this pattern; that is, drill down into
20+
// the template and replace their calls in this template with rendered
21+
// results
22+
if (currentPattern.engine.expandPartials && (foundPatternPartials !== null && foundPatternPartials.length > 0)) {
23+
24+
logger.debug(`found partials for ${currentPattern.patternPartial}`);
25+
26+
// determine if the template contains any pattern parameters. if so they
27+
// must be immediately consumed
28+
return parameter_hunter.find_parameters(currentPattern, patternlab).then(() => {
29+
30+
//do something with the regular old partials
31+
foundPatternPartials.forEach((foundPartial) => {
32+
33+
var partial = currentPattern.findPartial(foundPartial);
34+
var partialPattern = getPartial(partial, patternlab);
35+
36+
//recurse through nested partials to fill out this extended template.
37+
return processRecursive(partialPattern.relPath, patternlab).then(() => { //eslint-disable-line no-loop-func
38+
39+
//complete assembly of extended template
40+
//create a copy of the partial so as to not pollute it after the getPartial call.
41+
var cleanPartialPattern = jsonCopy(partialPattern, `partial pattern ${partial}`);
42+
43+
//if partial has style modifier data, replace the styleModifier value
44+
if (currentPattern.stylePartials && currentPattern.stylePartials.length > 0) {
45+
style_modifier_hunter.consume_style_modifier(cleanPartialPattern, foundPartial, patternlab);
46+
}
47+
48+
//this is what we came here for
49+
logger.debug(`within ${currentPattern.patternPartial}, replacing extendedTemplate partial ${foundPartial} with ${cleanPartialPattern.patternPartial}'s extendedTemplate`);
50+
51+
currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPartial, cleanPartialPattern.extendedTemplate);
52+
53+
// update the extendedTemplate in the partials object in case this
54+
// pattern is consumed later
55+
patternlab.partials[currentPattern.patternPartial] = currentPattern.extendedTemplate;
56+
57+
return Promise.resolve();
58+
}).catch(reason => {
59+
console.log(reason);
60+
logger.error(reason);
61+
});
62+
});
63+
64+
}).catch(reason => {
65+
console.log(reason);
66+
logger.error(reason);
67+
});
68+
}
69+
return Promise.resolve();
70+
};

0 commit comments

Comments
 (0)