From d0bff73b58435be156a6ec096f98fb15fd1d18fe Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 28 Jul 2016 09:20:00 -0400 Subject: [PATCH 01/44] removing patternlab.partials as renderPattern param --- core/lib/list_item_hunter.js | 7 ++----- core/lib/pattern_assembler.js | 9 --------- core/lib/style_modifier_hunter.js | 3 --- 3 files changed, 2 insertions(+), 17 deletions(-) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 35c077f5d..741740214 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -106,11 +106,11 @@ var list_item_hunter = function () { } //render with data - thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData, patternlab.partials); + thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); } else { //just render with mergedData - thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData, patternlab.partials); + thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); } //add the rendered HTML to our string @@ -121,9 +121,6 @@ var list_item_hunter = function () { var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate; - }); } } diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 9d355063c..2303f087f 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -100,7 +100,6 @@ var pattern_assembler = function () { if (pattern.relPath === patternlab.patterns[i].relPath) { //if relPath already exists, overwrite that element patternlab.patterns[i] = pattern; - patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate || pattern.template; isNew = false; break; } @@ -117,12 +116,8 @@ var pattern_assembler = function () { if (pattern.isPattern) { - patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate || pattern.template; - // do plugin-specific registration pattern.registerPartial(); - } else { - patternlab.partials[pattern.patternPartial] = pattern.patternDesc; } patternlab.patterns.push(pattern); @@ -353,10 +348,6 @@ var pattern_assembler = function () { if (currentPattern.engine.expandPartials && (foundPatternPartials !== null && foundPatternPartials.length > 0)) { // eslint-disable-next-line expandPartials(foundPatternPartials, list_item_hunter, patternlab, currentPattern); - - // update the extendedTemplate in the partials object in case this - // pattern is consumed later - patternlab.partials[currentPattern.patternPartial] = currentPattern.extendedTemplate; } //find pattern lineage diff --git a/core/lib/style_modifier_hunter.js b/core/lib/style_modifier_hunter.js index 8c0b7413f..4bef7460a 100644 --- a/core/lib/style_modifier_hunter.js +++ b/core/lib/style_modifier_hunter.js @@ -16,9 +16,6 @@ var style_modifier_hunter = function () { //replace the stylemodifier placeholder with the class name pattern.extendedTemplate = pattern.extendedTemplate.replace(/{{[ ]?styleModifier[ ]?}}/i, styleModifier); - - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate; } } From a3bddeb6c85cb526821e3261a6ee662f9c20f07c Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 28 Jul 2016 10:16:18 -0400 Subject: [PATCH 02/44] adding patternPartials, allData, and dataKeys to pattern object prototype --- core/lib/object_factory.js | 1 + core/lib/pattern_assembler.js | 50 +++++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/core/lib/object_factory.js b/core/lib/object_factory.js index 74b62f39e..60a92d463 100644 --- a/core/lib/object_factory.js +++ b/core/lib/object_factory.js @@ -56,6 +56,7 @@ var Pattern = function (relPath, data) { this.lineageRIndex = []; this.isPseudoPattern = false; this.engine = patternEngines.getEngineForPattern(this); + this.patternPartials = null; }; // Pattern methods diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 2c5b687be..ab39be0cb 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -29,8 +29,8 @@ var pattern_assembler = function () { //else look by verbose syntax for (var i = 0; i < patternlab.patterns.length; i++) { switch (partialName) { + case patternlab.patterns[i].relPath: case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName: - case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': return patternlab.patterns[i]; } } @@ -117,7 +117,7 @@ var pattern_assembler = function () { if (pattern.isPattern) { // do plugin-specific registration - pattern.registerPartial(); + pattern.registerPartial(patternlab); } patternlab.patterns.push(pattern); @@ -271,6 +271,17 @@ var pattern_assembler = function () { console.log(err); } + //merge global data into a clone of local jsonFileData + var localDataClone = JSON.parse(JSON.stringify(currentPattern.jsonFileData)); + currentPattern.allData = plutils.mergeData(patternlab.data, localDataClone); + + //add allData keys to currentPattern.dataKeys + currentPattern.dataKeys = getDataKeys(currentPattern.allData, []); + for (var i = 0; i < list_item_hunter.items.length; i++) { + currentPattern.dataKeys.push('listItems.' + list_item_hunter.items[i]); + currentPattern.dataKeys.push('listitems.' + list_item_hunter.items[i]); + } + //look for a listitems.json file for this template try { var listJsonFileName = path.resolve(patternsPath, currentPattern.subdir, currentPattern.fileName + ".listitems.json"); @@ -336,7 +347,7 @@ var pattern_assembler = function () { currentPattern.extendedTemplate = currentPattern.template; //find how many partials there may be for the given pattern - var foundPatternPartials = currentPattern.findPartials(); + currentPattern.patternPartials = currentPattern.findPartials(); //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -345,9 +356,9 @@ var pattern_assembler = function () { // the template and replace their calls in this template with rendered // results - if (currentPattern.engine.expandPartials && (foundPatternPartials !== null && foundPatternPartials.length > 0)) { + if (currentPattern.engine.expandPartials && (currentPattern.patternPartials !== null && currentPattern.patternPartials.length > 0)) { // eslint-disable-next-line - expandPartials(foundPatternPartials, list_item_hunter, patternlab, currentPattern); + expandPartials(currentPattern.patternPartials, list_item_hunter, patternlab, currentPattern); } //find pattern lineage @@ -443,6 +454,32 @@ var pattern_assembler = function () { } } + /** + * Recursively get all the property keys from the JSON data for a pattern. + * + * @param {object} data + * @param {array} uniqueKeys The array of unique keys to be added to and returned. + * @returns {array} keys A flat, one-dimensional array. + */ + function getDataKeys(data, uniqueKeys) { + for (var key in data) { + if (data.hasOwnProperty(key)) { + if (data.constructor !== Array) { + if (uniqueKeys.indexOf(key) === -1) { + uniqueKeys.push(key); + } else { + continue; + } + } + if (typeof data[key] === 'object') { + getDataKeys(data[key], uniqueKeys); + } + } + } + + return uniqueKeys; + } + return { find_pattern_partials: function (pattern) { return pattern.findPartials(); @@ -488,6 +525,9 @@ var pattern_assembler = function () { }, parse_pattern_markdown: function (pattern, patternlab) { parsePatternMarkdown(pattern, patternlab); + }, + get_data_keys: function (data, uniqueKeys) { + return getDataKeys(data, uniqueKeys); } }; From 97401111060d6a69f0c786f0cb1e60da15223f66 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 28 Jul 2016 10:16:51 -0400 Subject: [PATCH 03/44] adding patternPartials, allData, and dataKeys to pattern object prototype --- core/lib/list_item_hunter.js | 3 ++- core/lib/object_factory.js | 1 + core/lib/pattern_assembler.js | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 741740214..091ff2663 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -128,7 +128,8 @@ var list_item_hunter = function () { return { process_list_item_partials: function (pattern, patternlab) { processListItemPartials(pattern, patternlab); - } + }, + items: items }; }; diff --git a/core/lib/object_factory.js b/core/lib/object_factory.js index 60a92d463..663f3722b 100644 --- a/core/lib/object_factory.js +++ b/core/lib/object_factory.js @@ -57,6 +57,7 @@ var Pattern = function (relPath, data) { this.isPseudoPattern = false; this.engine = patternEngines.getEngineForPattern(this); this.patternPartials = null; + this.dataKeys = []; }; // Pattern methods diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index ab39be0cb..b2bd869f2 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -277,6 +277,7 @@ var pattern_assembler = function () { //add allData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(currentPattern.allData, []); + //add listItem keys to currentPattern.dataKeys for (var i = 0; i < list_item_hunter.items.length; i++) { currentPattern.dataKeys.push('listItems.' + list_item_hunter.items[i]); currentPattern.dataKeys.push('listitems.' + list_item_hunter.items[i]); From 1a5998797e488896ad6d57003bbfa5f43a3164a4 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 28 Jul 2016 10:23:24 -0400 Subject: [PATCH 04/44] adding allData to pattern object prototype --- core/lib/object_factory.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/lib/object_factory.js b/core/lib/object_factory.js index 663f3722b..65e5ed0f7 100644 --- a/core/lib/object_factory.js +++ b/core/lib/object_factory.js @@ -57,6 +57,7 @@ var Pattern = function (relPath, data) { this.isPseudoPattern = false; this.engine = patternEngines.getEngineForPattern(this); this.patternPartials = null; + this.allData = {}; this.dataKeys = []; }; From 29a4ae0ef5c8c41f1453839638a00a220d891cfb Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 29 Jul 2016 07:04:18 -0400 Subject: [PATCH 05/44] fixing unit tests --- core/lib/pattern_assembler.js | 7 ++++--- test/parameter_hunter_tests.js | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index b2bd869f2..63baf1ba2 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -112,10 +112,10 @@ var pattern_assembler = function () { console.log('found new pattern ' + pattern.patternPartial); } - // do global registration - - if (pattern.isPattern) { + //TODO: Next line slated for deletion. Here only to pass unit tests. + patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate || pattern.template; + // do plugin-specific registration pattern.registerPartial(patternlab); } @@ -225,6 +225,7 @@ var pattern_assembler = function () { } + var list_item_hunter = new lih(); var pseudopattern_hunter = new pph(); //extract some information diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 1019d5569..7db9ec85d 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -6,6 +6,7 @@ //setup current pattern from what we would have during execution function currentPatternClosure() { return { + "relPath": "02-organisms/02-comments/01-sticky-comment.mustache", "fileName": "01-sticky-comment", "subdir": "02-organisms/02-comments", "name": "02-organisms-02-comments-01-sticky-comment", @@ -28,6 +29,7 @@ return { patterns: [ { + "relPath": "01-molecules/06-components/02-single-comment.mustache", "fileName": "02-single-comment", "subdir": "01-molecules/06-components", "name": "01-molecules-06-components-02-single-comment", From 89996a740f81e4c9f54e634c16c96b0297e6c81e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 29 Jul 2016 08:48:39 -0400 Subject: [PATCH 06/44] parameter-hunter-to-partial-hunte --- core/lib/parameter_hunter.js | 301 ---------------------------------- core/lib/partial_hunter.js | 106 ++++++++++++ core/lib/pattern_assembler.js | 82 +++------ 3 files changed, 128 insertions(+), 361 deletions(-) delete mode 100644 core/lib/parameter_hunter.js create mode 100644 core/lib/partial_hunter.js diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js deleted file mode 100644 index b2b9832e2..000000000 --- a/core/lib/parameter_hunter.js +++ /dev/null @@ -1,301 +0,0 @@ -"use strict"; - -var parameter_hunter = function () { - - var extend = require('util')._extend, - JSON5 = require('json5'), - pa = require('./pattern_assembler'), - smh = require('./style_modifier_hunter'), - plutils = require('./utilities'), - style_modifier_hunter = new smh(), - pattern_assembler = new pa(); - - /** - * This function is really to accommodate the lax JSON-like syntax allowed by - * Pattern Lab PHP for parameter submissions to partials. Unfortunately, no - * easily searchable library was discovered for this. What we had to do was - * write a custom script to crawl through the parameter string, and wrap the - * keys and values in double-quotes as necessary. - * The steps on a high-level are as follows: - * * Further escape all escaped quotes and colons. Use the string - * representation of their unicodes for this. This has the added bonus - * of being interpreted correctly by JSON5.parse() without further - * modification. This will be useful later in the function. - * * Once escaped quotes are out of the way, we know the remaining quotes - * are either key/value wrappers or wrapped within those wrappers. We know - * that remaining commas and colons are either delimiters, or wrapped - * within quotes to not be recognized as such. - * * A do-while loop crawls paramString to write keys to a keys array and - * values to a values array. - * * Start by parsing the first key. Determine the type of wrapping quote, - * if any. - * * By knowing the open wrapper, we know that the next quote of that kind - * (if the key is wrapped in quotes), HAS to be the close wrapper. - * Similarly, if the key is unwrapped, we know the next colon HAS to be - * the delimiter between key and value. - * * Save the key to the keys array. - * * Next, search for a value. It will either be the next block wrapped in - * quotes, or a string of alphanumerics, decimal points, or minus signs. - * * Save the value to the values array. - * * The do-while loop truncates the paramString value while parsing. Its - * condition for completion is when the paramString is whittled down to an - * empty string. - * * After the keys and values arrays are built, a for loop iterates through - * them to build the final paramStringWellFormed string. - * * No quote substitution had been done prior to this loop. In this loop, - * all keys are ensured to be wrapped in double-quotes. String values are - * also ensured to be wrapped in double-quotes. - * * Unescape escaped unicodes except for double-quotes. Everything beside - * double-quotes will be wrapped in double-quotes without need for escape. - * * Return paramStringWellFormed. - * - * @param {string} pString - * @returns {string} paramStringWellFormed - */ - function paramToJson(pString) { - var colonPos = -1; - var keys = []; - var paramString = pString; // to not reassign param - var paramStringWellFormed; - var quotePos = -1; - var regex; - var values = []; - var wrapper; - - //replace all escaped double-quotes with escaped unicode - paramString = paramString.replace(/\\"/g, '\\u0022'); - - //replace all escaped single-quotes with escaped unicode - paramString = paramString.replace(/\\'/g, '\\u0027'); - - //replace all escaped colons with escaped unicode - paramString = paramString.replace(/\\:/g, '\\u0058'); - - //with escaped chars out of the way, crawl through paramString looking for - //keys and values - do { - - //check if searching for a key - if (paramString[0] === '{' || paramString[0] === ',') { - paramString = paramString.substring(1, paramString.length).trim(); - - //search for end quote if wrapped in quotes. else search for colon. - //everything up to that position will be saved in the keys array. - switch (paramString[0]) { - - //need to search for end quote pos in case the quotes wrap a colon - case '"': - case '\'': - wrapper = paramString[0]; - quotePos = paramString.indexOf(wrapper, 1); - break; - - default: - colonPos = paramString.indexOf(':'); - } - - if (quotePos > -1) { - keys.push(paramString.substring(0, quotePos + 1).trim()); - - //truncate the beginning from paramString and look for a value - paramString = paramString.substring(quotePos + 1, paramString.length).trim(); - - //unset quotePos - quotePos = -1; - - } else if (colonPos > -1) { - keys.push(paramString.substring(0, colonPos).trim()); - - //truncate the beginning from paramString and look for a value - paramString = paramString.substring(colonPos, paramString.length); - - //unset colonPos - colonPos = -1; - - //if there are no more colons, and we're looking for a key, there is - //probably a problem. stop any further processing. - } else { - paramString = ''; - break; - } - } - - //now, search for a value - if (paramString[0] === ':') { - paramString = paramString.substring(1, paramString.length).trim(); - - //the only reason we're using regexes here, instead of indexOf(), is - //because we don't know if the next delimiter is going to be a comma or - //a closing curly brace. since it's not much of a performance hit to - //use regexes as sparingly as here, and it's much more concise and - //readable, we'll use a regex for match() and replace() instead of - //performing conditional logic with indexOf(). - switch (paramString[0]) { - - //since a quote of same type as its wrappers would be escaped, and we - //escaped those even further with their unicodes, it is safe to look - //for wrapper pairs and conclude that their contents are values - case '"': - regex = /^"(.|\s)*?"/; - break; - case '\'': - regex = /^'(.|\s)*?'/; - break; - - //if there is no value wrapper, regex for alphanumerics, decimal - //points, and minus signs for exponential notation. - default: - regex = /^[\w\-\.]*/; - } - values.push(paramString.match(regex)[0].trim()); - - //truncate the beginning from paramString and continue either - //looking for a key, or returning - paramString = paramString.replace(regex, '').trim(); - - //exit do while if the final char is '}' - if (paramString === '}') { - paramString = ''; - break; - } - - //if there are no more colons, and we're looking for a value, there is - //probably a problem. stop any further processing. - } else { - paramString = ''; - break; - } - } while (paramString); - - //build paramStringWellFormed string for JSON parsing - paramStringWellFormed = '{'; - for (var i = 0; i < keys.length; i++) { - - //keys - //replace single-quote wrappers with double-quotes - if (keys[i][0] === '\'' && keys[i][keys[i].length - 1] === '\'') { - paramStringWellFormed += '"'; - - //any enclosed double-quotes must be escaped - paramStringWellFormed += keys[i].substring(1, keys[i].length - 1).replace(/"/g, '\\"'); - paramStringWellFormed += '"'; - } else { - - //open wrap with double-quotes if no wrapper - if (keys[i][0] !== '"' && keys[i][0] !== '\'') { - paramStringWellFormed += '"'; - - //this is to clean up vestiges from Pattern Lab PHP's escaping scheme. - //F.Y.I. Pattern Lab PHP would allow special characters like question - //marks in parameter keys so long as the key was unwrapped and the - //special character escaped with a backslash. In Node, we need to wrap - //those keys and unescape those characters. - keys[i] = keys[i].replace(/\\/g, ''); - } - - paramStringWellFormed += keys[i]; - - //close wrap with double-quotes if no wrapper - if (keys[i][keys[i].length - 1] !== '"' && keys[i][keys[i].length - 1] !== '\'') { - paramStringWellFormed += '"'; - } - } - - //colon delimiter. - paramStringWellFormed += ':'; - - //values - //replace single-quote wrappers with double-quotes - if (values[i][0] === '\'' && values[i][values[i].length - 1] === '\'') { - paramStringWellFormed += '"'; - - //any enclosed double-quotes must be escaped - paramStringWellFormed += values[i].substring(1, values[i].length - 1).replace(/"/g, '\\"'); - paramStringWellFormed += '"'; - - //for everything else, just add the value however it's wrapped - } else { - paramStringWellFormed += values[i]; - } - - //comma delimiter - if (i < keys.length - 1) { - paramStringWellFormed += ','; - } - } - paramStringWellFormed += '}'; - - //unescape escaped unicode except for double-quotes - paramStringWellFormed = paramStringWellFormed.replace(/\\u0027/g, '\''); - paramStringWellFormed = paramStringWellFormed.replace(/\\u0058/g, ':'); - - return paramStringWellFormed; - } - - function findparameters(pattern, patternlab) { - - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { - - //compile this partial immeadiately, essentially consuming it. - pattern.parameteredPartials.forEach(function (pMatch) { - //find the partial's name and retrieve it - var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.findPartial(partialName, patternlab); - - //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190 - partialPattern.extendedTemplate = partialPattern.template; - - if (patternlab.config.debug) { - console.log('found patternParameters for ' + partialName); - } - - //strip out the additional data, convert string to JSON. - var leftParen = pMatch.indexOf('('); - var rightParen = pMatch.lastIndexOf(')'); - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = paramToJson(paramString); - - var paramData = {}; - var globalData = {}; - var localData = {}; - - try { - paramData = JSON5.parse(paramStringWellFormed); - globalData = JSON5.parse(JSON5.stringify(patternlab.data)); - localData = JSON5.parse(JSON5.stringify(pattern.jsonFileData || {})); - } catch (err) { - console.log('There was an error parsing JSON for ' + pattern.relPath); - console.log(err); - } - - var allData = plutils.mergeData(globalData, localData); - allData = plutils.mergeData(allData, paramData); - - //if partial has style modifier data, replace the styleModifier value - if (pattern.stylePartials && pattern.stylePartials.length > 0) { - style_modifier_hunter.consume_style_modifier(partialPattern, pMatch, patternlab); - } - - //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally - allData.link = extend({}, patternlab.data.link); - - var renderedPartial = pattern_assembler.renderPattern(partialPattern.extendedTemplate, allData, patternlab.partials); - - //remove the parameter from the partial and replace it with the rendered partial + paramData - pattern.extendedTemplate = pattern.extendedTemplate.replace(pMatch, renderedPartial); - - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate; - }); - } - } - - return { - find_parameters: function (pattern, patternlab) { - findparameters(pattern, patternlab); - } - }; - -}; - -module.exports = parameter_hunter; diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js new file mode 100644 index 000000000..36780704c --- /dev/null +++ b/core/lib/partial_hunter.js @@ -0,0 +1,106 @@ +"use strict"; + +var partial_hunter = function () { + + var lih = require('./list_item_hunter'), + smh = require('./style_modifier_hunter'), + list_item_hunter = new lih(), + style_modifier_hunter = new smh(); + + function replacePartials(pattern, patternlab) { + var i, + j, + dataKeys = pattern.dataKeys, + isMatch, + newTemplate = pattern.extendedTemplate, + partialContent, + partialsAfter, + partialsBefore = pattern.findPartials() || [], + pMatch, + regex, + regexStr, + tag, + tmpPattern, + tmpTemplate; + + //escape data keys so they are not erased by a render + for (i = 0; i < dataKeys.length; i++) { + regex = new RegExp('\\{\\{(\\S?\\s*' + dataKeys[i] + '\\s*\\}?\\}\\})', 'g'); + newTemplate = newTemplate.replace(regex, '\u0002$1'); + } + + //escape partial includes so they are not erased by a render + newTemplate = newTemplate.replace(/\{\{>/g, '\u0002>'); + + //render this pattern immediately, so as to delete blocks not keyed to allData + newTemplate = pattern.engine.renderPattern(newTemplate, pattern.allData); + + //unescape data keys and partial includes + newTemplate = newTemplate.replace(/\u0002/g, '{{'); +if (pattern.relPath === '02-organisms/social/social-quiz.mustache') { +// console.info(patternlab.partials); +//process.exit(); + console.info(pattern.relPath); + console.info(newTemplate); +} + + //render this pattern immediately, so as to delete false conditions +// tmpTemplate = pattern.engine.renderPattern(tmpTemplate, pattern.allData); + + //unescape partial includes +// newTemplate = newTemplate.replace(/\u0002/g, '{{>'); + partialsAfter = pattern.engine.findPartials(newTemplate) || []; + + //delete partials within false conditions + /* + for (i = 0; i < partialsBefore.length; i++) { + isMatch = false; + + for (j = 0; j < partialsAfter.length; j++) { + if (partialsBefore[i] === partialsAfter[j]) { + isMatch = true; + break; + } + } + + if (!isMatch) { + newTemplate = newTemplate.replace(partialsBefore[i], ''); + } + } + */ + + //replace remaining partials with their content + for (i = 0; i < partialsAfter.length; i++) { + pMatch = partialsAfter[i]; + + for (j in patternlab.partials) { + if (patternlab.partials.hasOwnProperty(j)) { + tag = j; + partialContent = patternlab.partials[j].content; + + if (pMatch === tag) { + + //check if this tag has any style modifiers + if (tag.search(pattern.engine.findPartialsWithStyleModifiersRE) > -1) { + //if so, add the style modifiers to partialContent + tmpPattern = {extendedTemplate: partialContent}; + style_modifier_hunter.consume_style_modifier(tmpPattern, tag, patternlab); + partialContent = tmpPattern.extendedTemplate; + } + + newTemplate = newTemplate.replace(tag, partialContent); + } + } + } + } + return newTemplate; + } + + return { + replace_partials: function (pattern, patternlab) { + return replacePartials(pattern, patternlab); + } + }; +}; + +module.exports = partial_hunter; diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 63baf1ba2..ae0aff51d 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -9,8 +9,7 @@ var path = require('path'), patternEngines = require('./pattern_engines'), lh = require('./lineage_hunter'), lih = require('./list_item_hunter'), - smh = require('./style_modifier_hunter'), - ph = require('./parameter_hunter'), + ph = require('./partial_hunter'), JSON5 = require('json5'); var markdown_parser = new mp(); @@ -113,9 +112,6 @@ var pattern_assembler = function () { } if (pattern.isPattern) { - //TODO: Next line slated for deletion. Here only to pass unit tests. - patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate || pattern.template; - // do plugin-specific registration pattern.registerPartial(patternlab); } @@ -310,13 +306,14 @@ var pattern_assembler = function () { //add the raw template to memory currentPattern.template = fs.readFileSync(path.resolve(patternsPath, relPath), 'utf8'); + currentPattern.extendedTemplate = currentPattern.template; + + //find any listItem blocks within the pattern + list_item_hunter.process_list_item_partials(currentPattern, patternlab); //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = currentPattern.findPartialsWithStyleModifiers(); - //find any pattern parameters that may be in the current pattern - currentPattern.parameteredPartials = currentPattern.findPartialsWithPatternParameters(); - //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); @@ -326,17 +323,21 @@ var pattern_assembler = function () { return currentPattern; } - function processPatternRecursive(file, patternlab) { + function processPatternRecursive(file, patternlab, origPatternParam) { - var lineage_hunter = new lh(), - list_item_hunter = new lih(); + var lineage_hunter = new lh(); //find current pattern in patternlab object using var file as a partial var currentPattern, i; - for (i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].relPath === file) { - currentPattern = patternlab.patterns[i]; + if (origPatternParam) { + currentPattern = origPatternParam; + + } else { + for (i = 0; i < patternlab.patterns.length; i++) { + if (patternlab.patterns[i].relPath === file) { + currentPattern = patternlab.patterns[i]; + } } } @@ -346,70 +347,31 @@ var pattern_assembler = function () { //we are processing a markdown only pattern if (currentPattern.engine === null) { return; } - currentPattern.extendedTemplate = currentPattern.template; - //find how many partials there may be for the given pattern currentPattern.patternPartials = currentPattern.findPartials(); - //find any listItem blocks that within the pattern, even if there are no partials - list_item_hunter.process_list_item_partials(currentPattern, patternlab); - - // expand any partials present in this pattern; that is, drill down into - // the template and replace their calls in this template with rendered - // results - + //expand any partials present in this pattern; that is, drill down into the + //template and replace their calls in this template with rendered results if (currentPattern.engine.expandPartials && (currentPattern.patternPartials !== null && currentPattern.patternPartials.length > 0)) { // eslint-disable-next-line - expandPartials(currentPattern.patternPartials, list_item_hunter, patternlab, currentPattern); + expandPartials(currentPattern, patternlab); } //find pattern lineage lineage_hunter.find_lineage(currentPattern, patternlab); - - //add to patternlab object so we can look these up later. - addPattern(currentPattern, patternlab); } - function expandPartials(foundPatternPartials, list_item_hunter, patternlab, currentPattern) { + function expandPartials(currentPattern, patternlab) { - var style_modifier_hunter = new smh(), - parameter_hunter = new ph(); + var partial_hunter = new ph(); if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.patternPartial); } - // determine if the template contains any pattern parameters. if so they - // must be immediately consumed - parameter_hunter.find_parameters(currentPattern, patternlab); - - //do something with the regular old partials - for (var i = 0; i < foundPatternPartials.length; i++) { - var partial = currentPattern.findPartial(foundPatternPartials[i]); - var partialPath; - - //identify which pattern this partial corresponds to - for (var j = 0; j < patternlab.patterns.length; j++) { - if (patternlab.patterns[j].patternPartial === partial || - patternlab.patterns[j].relPath.indexOf(partial) > -1) - { - partialPath = patternlab.patterns[j].relPath; - } - } + currentPattern.extendedTemplate = partial_hunter.replace_partials(currentPattern, patternlab); - //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPath, patternlab); - - //complete assembly of extended template - var partialPattern = getPartial(partial, patternlab); - - //if partial has style modifier data, replace the styleModifier value - if (currentPattern.stylePartials && currentPattern.stylePartials.length > 0) { - style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); - } - - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); - } + processPatternRecursive(currentPattern.relPath, patternlab, currentPattern); } function parseDataLinksHelper(patternlab, obj, key) { From 8ee0bb39aa31430705f1885ca56ece087f812e97 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 29 Jul 2016 10:09:27 -0400 Subject: [PATCH 07/44] stopping point --- core/lib/object_factory.js | 4 +- core/lib/partial_hunter.js | 7 +- ...unter_tests.js => partial_hunter_tests.js} | 181 ++++++++++-------- 3 files changed, 105 insertions(+), 87 deletions(-) rename test/{parameter_hunter_tests.js => partial_hunter_tests.js} (64%) diff --git a/core/lib/object_factory.js b/core/lib/object_factory.js index 65e5ed0f7..2621464a1 100644 --- a/core/lib/object_factory.js +++ b/core/lib/object_factory.js @@ -74,9 +74,9 @@ Pattern.prototype = { return null; }, - registerPartial: function () { + registerPartial: function (patternlab) { if (this.engine && typeof this.engine.registerPartial === 'function') { - this.engine.registerPartial(this); + this.engine.registerPartial(this, patternlab); } }, diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index 36780704c..98ac814b9 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -93,12 +93,15 @@ if (pattern.relPath === '02-organisms/social/social-quiz.mustache') { } } } - return newTemplate; +console.info(pattern.extendedTemplate); +console.info(newTemplate); + + pattern.extendedTemplate = newTemplate; } return { replace_partials: function (pattern, patternlab) { - return replacePartials(pattern, patternlab); + replacePartials(pattern, patternlab); } }; }; diff --git a/test/parameter_hunter_tests.js b/test/partial_hunter_tests.js similarity index 64% rename from test/parameter_hunter_tests.js rename to test/partial_hunter_tests.js index 7db9ec85d..61ea6117e 100644 --- a/test/parameter_hunter_tests.js +++ b/test/partial_hunter_tests.js @@ -1,11 +1,13 @@ (function () { "use strict"; - var ph = require('../core/lib/parameter_hunter'); + var pa = require('../core/lib/pattern_assembler'); + var ph = require('../core/lib/partial_hunter'); + var Pattern = require('../core/lib/object_factory').Pattern; //setup current pattern from what we would have during execution function currentPatternClosure() { - return { + return Pattern.createEmpty({ "relPath": "02-organisms/02-comments/01-sticky-comment.mustache", "fileName": "01-sticky-comment", "subdir": "02-organisms/02-comments", @@ -17,12 +19,8 @@ "flatPatternPath": "02-organisms-02-comments", "patternPartial": "organisms-sticky-comment", "template": "{{> molecules-single-comment(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}", - "extendedTemplate": "{{> molecules-single-comment(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}", - "parameteredPartials": [ - "{{> molecules-single-comment(description: 'We are all in the gutter, but some of us are looking at the stars.') }}", - "{{> molecules-single-comment(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}" - ] - }; + "extendedTemplate": "{{> molecules-single-comment(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}" + }); } function patternlabClosure() { @@ -53,61 +51,91 @@ } }; - exports['parameter_hunter'] = { - 'parameter hunter finds and extends templates' : function(test){ + exports['partial_hunter'] = { + 'partial hunter finds and extends templates' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var pattern_assembler = new pa(); + var partial_hunter = new ph(); - parameter_hunter.find_parameters(currentPattern, patternlab); + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

A life is like a garden. Perfect moments can be had, but not preserved, except in memory.

'); test.done(); }, - 'parameter hunter finds and extends templates with mixed parameter and global data' : function(test){ + 'partial hunter finds and extends templates with global data' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var pattern_assembler = new pa(); + var partial_hunter = new ph(); + currentPattern.template = "{{> molecules-single-comment }}"; + currentPattern.extendedTemplate = currentPattern.template; patternlab.patterns[0].template = "

{{foo}}

{{description}}

"; patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; - patternlab.data.foo = 'Bar'; - patternlab.data.description = 'Baz'; + currentPattern.allData = { + foo: 'Bar', + description: 'Baz' + }; + + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); + currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern, currentPattern.allData); + test.equals(currentPattern.extendedTemplate, '

Bar

Baz

'); + + test.done(); + }, - parameter_hunter.find_parameters(currentPattern, patternlab); + 'partial hunter finds and extends templates with mixed parameter and global data' : function(test){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); + var partial_hunter = new ph(); + + patternlab.patterns[0].template = "

{{foo}}

{{description}}

"; + patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + currentPattern.allData = { + foo: 'Bar', + description: 'Baz' + }; + + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); + currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern, currentPattern.allData); test.equals(currentPattern.extendedTemplate, '

Bar

A life is like a garden. Perfect moments can be had, but not preserved, except in memory.

'); test.done(); }, - 'parameter hunter finds and extends templates with verbose partials' : function(test){ +/* + 'partial hunter finds and extends templates with verbose partials' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> 01-molecules/06-components/02-single-comment(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = "{{> 01-molecules/06-components/02-single-comment(description: 'We are all in the gutter, but some of us are looking at the stars.') }}"; - currentPattern.parameteredPartials[1] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

A life is like a garden. Perfect moments can be had, but not preserved, except in memory.

'); test.done(); }, - 'parameter hunter finds and extends templates with fully-pathed partials' : function(test){ + 'partial hunter finds and extends templates with fully-pathed partials' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> 01-molecules/06-components/02-single-comment.mustache(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = "{{> 01-molecules/06-components/02-single-comment.mustache(description: 'We are all in the gutter, but some of us are looking at the stars.') }}"; - currentPattern.parameteredPartials[1] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

A life is like a garden. Perfect moments can be had, but not preserved, except in memory.

'); test.done(); @@ -115,200 +143,188 @@ //previous tests were for unquoted parameter keys and single-quoted values. //test other quoting options. - 'parameter hunter parses parameters with unquoted keys and unquoted values' : function(test){ + 'partial hunter parses parameters with unquoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(description: true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); }, - 'parameter hunter parses parameters with unquoted keys and double-quoted values' : function(test){ + 'partial hunter parses parameters with unquoted keys and double-quoted values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(description: \"true\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); }, - 'parameter hunter parses parameters with single-quoted keys and unquoted values' : function(test){ + 'partial hunter parses parameters with single-quoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment('description': true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); }, - 'parameter hunter parses parameters with single-quoted keys and single-quoted values wrapping internal escaped single-quotes' : function(test){ + 'partial hunter parses parameters with single-quoted keys and single-quoted values wrapping internal escaped single-quotes' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment('description': 'true not,\\'true\\'') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not,'true'

'); test.done(); }, - 'parameter hunter parses parameters with single-quoted keys and double-quoted values wrapping internal single-quotes' : function(test){ + 'partial hunter parses parameters with single-quoted keys and double-quoted values wrapping internal single-quotes' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment('description': \"true not:'true'\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not:'true'

'); test.done(); }, - 'parameter hunter parses parameters with double-unquoted keys and unquoted values' : function(test){ + 'partial hunter parses parameters with double-unquoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(\"description\": true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); }, - 'parameter hunter parses parameters with double-quoted keys and single-quoted values wrapping internal double-quotes' : function(test){ + 'partial hunter parses parameters with double-quoted keys and single-quoted values wrapping internal double-quotes' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not{\"true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not{"true"

'); test.done(); }, - 'parameter hunter parses parameters with double-quoted keys and double-quoted values wrapping internal escaped double-quotes' : function(test){ + 'partial hunter parses parameters with double-quoted keys and double-quoted values wrapping internal escaped double-quotes' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not}\\\"true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not}"true"

'); test.done(); }, - 'parameter hunter parses parameters with combination of quoting schemes for keys and values' : function(test){ + 'partial hunter parses parameters with combination of quoting schemes for keys and values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(description: true, 'foo': false, \"bar\": false, 'single': true, 'singlesingle': 'true', 'singledouble': \"true\", \"double\": true, \"doublesingle\": 'true', \"doubledouble\": \"true\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); }, - 'parameter hunter parses parameters with values containing a closing parenthesis' : function(test){ + 'partial hunter parses parameters with values containing a closing parenthesis' : function(test){ // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(description: 'Hello ) World') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

Hello ) World

'); test.done(); }, - 'parameter hunter parses parameters that follow a non-quoted value' : function(test){ + 'partial hunter parses parameters that follow a non-quoted value' : function(test){ // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); patternlab.patterns[0].template = "

{{foo}}

{{bar}}

"; patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; currentPattern.template = "{{> molecules-single-comment(foo: true, bar: \"Hello World\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

Hello World

'); test.done(); }, - 'parameter hunter parses parameters whose keys contain escaped quotes' : function(test){ + 'partial hunter parses parameters whose keys contain escaped quotes' : function(test){ // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); patternlab.patterns[0].template = "

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; currentPattern.template = "{{> molecules-single-comment('silly\\\'key': true, bar: \"Hello World\", \"another\\\"silly-key\": 42 ) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); test.done(); }, - 'parameter hunter skips malformed parameters' : function(test){ + 'partial hunter skips malformed parameters' : function(test){ // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); patternlab.patterns[0].template = "

{{foo}}

"; patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; @@ -316,33 +332,32 @@ currentPattern.abspath = __filename; currentPattern.template = "{{> molecules-single-comment( missing-val: , : missing-key, : , , foo: \"Hello World\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; console.log('\nPattern Lab should catch JSON.parse() errors and output useful debugging information...'); - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

'); test.done(); }, - 'parameter hunter parses parameters containing html tags' : function(test){ + 'partial hunter parses parameters containing html tags' : function(test){ // From issue #145 https://github.com/pattern-lab/patternlab-node/issues/145 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); + var partial_hunter = new ph(); patternlab.patterns[0].template = "

{{{ tag1 }}}

{{{ tag2 }}}

{{{ tag3 }}}

"; patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; currentPattern.template = "{{> molecules-single-comment(tag1: 'Single-quoted', tag2: \"Double-quoted\", tag3: 'With attributes') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

Single-quoted

Double-quoted

With attributes

'); test.done(); } +*/ }; From 0b7d24c0fe9905219c32768d225886ae31939de1 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 05:49:54 -0400 Subject: [PATCH 08/44] partial_hunters_tests.js passes --- core/lib/partial_hunter.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index 98ac814b9..159fb1806 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -93,8 +93,6 @@ if (pattern.relPath === '02-organisms/social/social-quiz.mustache') { } } } -console.info(pattern.extendedTemplate); -console.info(newTemplate); pattern.extendedTemplate = newTemplate; } From 325381c766d34f11ba3730e09cb393a9d16b5544 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 05:50:25 -0400 Subject: [PATCH 09/44] partial_hunter_tests.js passes --- test/partial_hunter_tests.js | 51 ++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/test/partial_hunter_tests.js b/test/partial_hunter_tests.js index 61ea6117e..cbadfe220 100644 --- a/test/partial_hunter_tests.js +++ b/test/partial_hunter_tests.js @@ -112,15 +112,17 @@ test.done(); }, -/* 'partial hunter finds and extends templates with verbose partials' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> 01-molecules/06-components/02-single-comment(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

A life is like a garden. Perfect moments can be had, but not preserved, except in memory.

'); @@ -130,11 +132,14 @@ 'partial hunter finds and extends templates with fully-pathed partials' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> 01-molecules/06-components/02-single-comment.mustache(description: 'A life is like a garden. Perfect moments can be had, but not preserved, except in memory.') }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

A life is like a garden. Perfect moments can be had, but not preserved, except in memory.

'); @@ -146,11 +151,14 @@ 'partial hunter parses parameters with unquoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(description: true) }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); @@ -160,11 +168,14 @@ 'partial hunter parses parameters with unquoted keys and double-quoted values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(description: \"true\") }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); @@ -174,11 +185,14 @@ 'partial hunter parses parameters with single-quoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment('description': true) }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); @@ -188,11 +202,14 @@ 'partial hunter parses parameters with single-quoted keys and single-quoted values wrapping internal escaped single-quotes' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment('description': 'true not,\\'true\\'') }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not,'true'

'); @@ -202,11 +219,14 @@ 'partial hunter parses parameters with single-quoted keys and double-quoted values wrapping internal single-quotes' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment('description': \"true not:'true'\") }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not:'true'

'); @@ -216,11 +236,14 @@ 'partial hunter parses parameters with double-unquoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(\"description\": true) }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); @@ -230,11 +253,14 @@ 'partial hunter parses parameters with double-quoted keys and single-quoted values wrapping internal double-quotes' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not{\"true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not{"true"

'); @@ -244,11 +270,14 @@ 'partial hunter parses parameters with double-quoted keys and double-quoted values wrapping internal escaped double-quotes' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not}\\\"true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not}"true"

'); @@ -258,11 +287,14 @@ 'partial hunter parses parameters with combination of quoting schemes for keys and values' : function(test){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(description: true, 'foo': false, \"bar\": false, 'single': true, 'singlesingle': 'true', 'singledouble': \"true\", \"double\": true, \"doublesingle\": 'true', \"doubledouble\": \"true\") }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); @@ -273,11 +305,14 @@ // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); currentPattern.template = "{{> molecules-single-comment(description: 'Hello ) World') }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

Hello ) World

'); @@ -288,6 +323,7 @@ // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); patternlab.patterns[0].template = "

{{foo}}

{{bar}}

"; @@ -296,6 +332,8 @@ currentPattern.template = "{{> molecules-single-comment(foo: true, bar: \"Hello World\") }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

Hello World

'); @@ -306,6 +344,7 @@ // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); patternlab.patterns[0].template = "

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; @@ -314,6 +353,8 @@ currentPattern.template = "{{> molecules-single-comment('silly\\\'key': true, bar: \"Hello World\", \"another\\\"silly-key\": 42 ) }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); @@ -324,6 +365,7 @@ // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); patternlab.patterns[0].template = "

{{foo}}

"; @@ -334,7 +376,10 @@ currentPattern.extendedTemplate = currentPattern.template; console.log('\nPattern Lab should catch JSON.parse() errors and output useful debugging information...'); + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); + currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern.extendedTemplate, patternlab.data); test.equals(currentPattern.extendedTemplate, '

'); test.done(); @@ -344,6 +389,7 @@ // From issue #145 https://github.com/pattern-lab/patternlab-node/issues/145 var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); + var pattern_assembler = new pa(); var partial_hunter = new ph(); patternlab.patterns[0].template = "

{{{ tag1 }}}

{{{ tag2 }}}

{{{ tag3 }}}

"; @@ -352,12 +398,13 @@ currentPattern.template = "{{> molecules-single-comment(tag1: 'Single-quoted', tag2: \"Double-quoted\", tag3: 'With attributes') }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.registerPartial(patternlab); + currentPattern.engine.preprocessPartials(pattern_assembler, patternlab); partial_hunter.replace_partials(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

Single-quoted

Double-quoted

With attributes

'); test.done(); } -*/ }; From b2953a72f6940dc044aee946e29b9076246715af Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 11:22:31 -0400 Subject: [PATCH 10/44] working list_item_hunter.js and unit tests --- core/lib/list_item_hunter.js | 106 ++++++++-------- test/list_item_hunter_tests.js | 225 +++++++++++++-------------------- 2 files changed, 144 insertions(+), 187 deletions(-) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 091ff2663..2e48e349c 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -13,7 +13,53 @@ var list_item_hunter = function () { style_modifier_hunter = new smh(), items = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty']; + function getEnd(liMatch) { + return liMatch.replace('#', '/'); + }; + + function getPatternBlock(pattern, liMatch, end) { + return pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch) + liMatch.length, pattern.extendedTemplate.indexOf(end)); + } + + function preprocessListItemPartials(pattern, patternlab) { + //find any listitem blocks + var matches = pattern.findListItems(); + + if (matches !== null) { + matches.forEach(function (liMatch) { + var end = getEnd(liMatch); + var patternBlock = getPatternBlock(pattern, liMatch, end); + var partials = pattern.engine.findPartials(patternBlock); + + //escape listitem blocks with partials + if (partials) { + var liMatchEscaped = '\u0002' + liMatch.slice(2); + var endEscaped = '\u0002' + end.slice(2); + var find = liMatch + patternBlock + end; + var replace = liMatchEscaped + patternBlock + endEscaped; + + pattern.extendedTemplate = pattern.extendedTemplate.replace(find, replace); + } + }); + } + } + + function postprocessListItemPartials(pattern, patternlab) { + //find any listitem blocks + var matches = pattern.extendedTemplate.match(/\u0002(.|\s)*?\}\}/g); + + if (matches !== null) { + matches.forEach(function (liMatch) { + var replace = '{{' + liMatch.slice(1); + + pattern.extendedTemplate = pattern.extendedTemplate.replace(liMatch, replace); + }); + } + } + function processListItemPartials(pattern, patternlab) { + preprocessListItemPartials(pattern, patternlab); + //find any listitem blocks var matches = pattern.findListItems(); @@ -26,8 +72,8 @@ var list_item_hunter = function () { //find the boundaries of the block var loopNumberString = liMatch.split('.')[1].split('}')[0].trim(); - var end = liMatch.replace('#', '/'); - var patternBlock = pattern.template.substring(pattern.template.indexOf(liMatch) + liMatch.length, pattern.template.indexOf(end)).trim(); + var end = getEnd(liMatch); + var patternBlock = getPatternBlock(pattern, liMatch, end).trim(); //build arrays that repeat the block, however large we need to var repeatedBlockTemplate = []; @@ -59,59 +105,11 @@ var list_item_hunter = function () { //combine listItem data with pattern data with global data var itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" - var globalData; - var localData; - try { - globalData = JSON5.parse(JSON5.stringify(patternlab.data)); - localData = JSON5.parse(JSON5.stringify(pattern.jsonFileData)); - } catch (err) { - console.log('There was an error parsing JSON for ' + pattern.relPath); - console.log(err); - } - - var allData = plutils.mergeData(globalData, localData); - allData = plutils.mergeData(allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup + var allData = plutils.mergeData(pattern.allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup allData.link = extend({}, patternlab.data.link); - //check for partials within the repeated block - var foundPartials = Pattern.createEmpty({'template': thisBlockTemplate}).findPartials(); - - if (foundPartials && foundPartials.length > 0) { - - for (var j = 0; j < foundPartials.length; j++) { - - //get the partial - var partialName = foundPartials[j].match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.findPartial(partialName, patternlab); - - //create a copy of the partial so as to not pollute it after the get_pattern_by_key call. - var cleanPartialPattern; - try { - cleanPartialPattern = JSON5.parse(JSON5.stringify(partialPattern)); - } catch (err) { - console.log('There was an error parsing JSON for ' + pattern.relPath); - console.log(err); - } - - //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #356 - cleanPartialPattern.extendedTemplate = cleanPartialPattern.template; - - //if partial has style modifier data, replace the styleModifier value - if (foundPartials[j].indexOf(':') > -1) { - style_modifier_hunter.consume_style_modifier(cleanPartialPattern, foundPartials[j], patternlab); - } - - //replace its reference within the block with the extended template - thisBlockTemplate = thisBlockTemplate.replace(foundPartials[j], cleanPartialPattern.extendedTemplate); - } - - //render with data - thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); - - } else { - //just render with mergedData - thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); - } + //just render with mergedData + thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); //add the rendered HTML to our string repeatedBlockHtml = repeatedBlockHtml + thisBlockHTML; @@ -123,6 +121,8 @@ var list_item_hunter = function () { }); } + + postprocessListItemPartials(pattern, patternlab); } return { diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index 2ab591d6f..2d4fc2caf 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -116,14 +116,6 @@ }, 'process_list_item_partials finds partials and outputs repeated renders': function(test){ - //arrange - //setup current pattern from what we would have during execution - var currentPattern = createFakeListPattern({ - "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", - "extendedTemplate": "{{#listItems.two}}{{> test-simple }}{{/listItems.two}}", - "key": "test-patternName" - }); - var patternlab = createFakePatternLab({ "patterns": [ { @@ -136,30 +128,19 @@ ] }); - var list_item_hunter = new lih(); - //act - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); + pattern.registerPartial(patternlab); + pattern.engine.preprocessPartials(pattern_assembler, patternlab); + pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert - test.equals(currentPattern.extendedTemplate, "FooBar" ); + test.equals(pattern.extendedTemplate.trim(), "FooBar" ); test.done(); }, 'process_list_item_partials finds verbose partials and outputs repeated renders' : function(test){ - var pattern1 = createFakeListPattern({ - "template": "{{#listItems.one}}{{> 00-test/00-foo.mustache }}{{/listItems.one}}", - "extendedTemplate" : "{{#listItems.one}}{{> 00-test/00-foo.mustache }}{{/listItems.one}}", - "key": "test-patternName1" - }); - - var pattern2 = createFakeListPattern({ - "template": "{{#listItems.two}}{{> 00-test/00-bar.mustache }}{{/listItems.two}}", - "extendedTemplate" : "{{#listItems.two}}{{> 00-test/00-bar.mustache }}{{/listItems.two}}", - "key": "test-patternName2" - }); - var patternlab = createFakePatternLab({ "patterns": [ Pattern.create('00-test/00-foo.mustache', null, { @@ -170,54 +151,31 @@ "template": "{{ title }}", "extendedTemplate": "{{ title }}" }) - ] + ], + data: { + link: {} + } }); - // { - // "template": "{{ title }}", - // "extendedTemplate" : "{{ title }}", - // "subdir": "00-test", - // "fileName": "00-foo", - // "jsonFileData" : {}, - // "patternPartial": "test-foo", - // }, - // { - // "template": "{{ title }}", - // "extendedTemplate" : "{{ title }}", - // "subdir": "00-test", - // "fileName": "01-bar", - // "jsonFileData" : {}, - // "patternPartial": "test-bar", - // } - - var list_item_hunter = new lih(); - //act - list_item_hunter.process_list_item_partials(pattern1, patternlab); - list_item_hunter.process_list_item_partials(pattern2, patternlab); + var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-verbose-foo.mustache", patternlab); + pattern1.registerPartial(patternlab); + pattern1.engine.preprocessPartials(pattern_assembler, patternlab); + pattern_assembler.process_pattern_recursive(pattern1.relPath, patternlab, pattern1); + + var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/02-listitem-verbose-bar.mustache", patternlab); + pattern2.registerPartial(patternlab); + pattern2.engine.preprocessPartials(pattern_assembler, patternlab); + pattern_assembler.process_pattern_recursive(pattern2.relPath, patternlab, pattern2); //assert - test.equals(pattern1.extendedTemplate, "Foo" ); - test.equals(pattern2.extendedTemplate, "FooBar" ); + test.equals(pattern1.extendedTemplate.trim(), "Foo" ); + test.equals(pattern2.extendedTemplate.trim(), "FooBar" ); test.done(); }, 'process_list_item_partials overwrites listItem property if that property is in local .listitem.json': function(test) { - //arrange - //setup current pattern from what we would have during execution - var currentPattern = createFakeListPattern({ - "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", - "extendedTemplate": "{{#listItems.two}}{{> test-simple }}{{/listItems.two}}", - "key": "test-patternName", - "jsonFileData": {}, - "listitems": { - "2": [ - { "title": "One" }, - { "title": "Two" } - ] - } - }); var patternlab = createFakePatternLab({ "patterns": [ createFakeListPattern({ @@ -228,13 +186,21 @@ }) ] }); - var list_item_hunter = new lih(); //act - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); + pattern.listitems = { + "2": [ + { "title": "One" }, + { "title": "Two" } + ] + }; + pattern.registerPartial(patternlab); + pattern.engine.preprocessPartials(pattern_assembler, patternlab); + pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert - test.equals(currentPattern.extendedTemplate, "OneTwo" ); + test.equals(pattern.extendedTemplate.trim(), "OneTwo" ); test.done(); }, @@ -264,39 +230,30 @@ }) ] }); - var list_item_hunter = new lih(); //act - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); + pattern.template = "{{#listItems.one}}{{> test-simple }}{{/listItems.one}}"; + pattern.extendedTemplate = pattern.template; + pattern.listitems = { + "2": [ + { "title": "One" }, + { "title": "Two" } + ] + }; + pattern.registerPartial(patternlab); + pattern.engine.preprocessPartials(pattern_assembler, patternlab); + pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert - test.equals(currentPattern.extendedTemplate, "Foo" ); + test.equals(pattern.extendedTemplate.trim(), "Foo" ); test.done(); }, 'process_list_item_partials uses local listItem property if that property is not set globally' : function(test){ - //arrange - //setup current pattern from what we would have during execution - var currentPattern = createFakeListPattern({ - "template": "{{#listItems.one}}{{ title }}{{/listItems.one}}", - "extendedTemplate": "{{#listItems.one}}{{> test-simple }}{{/listItems.one}}", - "key": "test-patternName", - "jsonFileData": {}, - "listitems": { - "1": [ - { "title": "One" } - ], - "2": [ - { "title": "One" }, - { "title": "Two" } - ] - } - }); - var patternlab = createFakePatternLab({ "patterns": [ - createFakeListPattern({ "template": "{{ title }}", "extendedTemplate": "{{ title }}", @@ -307,24 +264,32 @@ }); delete patternlab.listitems["1"]; // remove the "1" list - var list_item_hunter = new lih(); - //act - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); + pattern.template = "{{#listItems.one}}{{> test-simple }}{{/listItems.one}}"; + pattern.extendedTemplate = pattern.template; + pattern.listitems = { + "1": [ + { "title": "One" } + ], + "2": [ + { "title": "One" }, + { "title": "Two" } + ] + }; + pattern.registerPartial(patternlab); + pattern.engine.preprocessPartials(pattern_assembler, patternlab); + pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert test.equals(typeof patternlab.listitems["1"], "undefined"); - test.equals(currentPattern.extendedTemplate, "One" ); + test.equals(pattern.extendedTemplate.trim(), "One" ); test.done(); }, 'process_list_item_partials - correctly ignores bookended partials without a style modifier when the same partial has a style modifier between' : function(test){ //arrange - var fs = require('fs-extra'); - var pa = require('../core/lib/pattern_assembler'); - var pattern_assembler = new pa(); - var list_item_hunter = new lih(); var patterns_dir = './test/files/_patterns'; var pl = {}; @@ -332,6 +297,11 @@ pl.data = {}; pl.data.link = {}; pl.config.debug = false; + pl.config.paths = { + "source": { + "patterns": "./test/files/_patterns" + } + }; pl.patterns = []; pl.partials = {}; pl.config.patterns = { source: patterns_dir }; @@ -351,60 +321,47 @@ ] }; - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var bookendPattern = new Pattern('00-test/11-bookend-listitem.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/11-bookend-listitem.mustache', 'utf8'); - bookendPattern.extendedTemplate = bookendPattern.template; - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); - + //act + var atomPattern = pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); pl.patterns.push(atomPattern); - pl.patterns.push(bookendPattern); + atomPattern.registerPartial(pl); + atomPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); - //act - list_item_hunter.process_list_item_partials(bookendPattern, pl); + var bookendPattern = pattern_assembler.process_pattern_iterative('00-test/11-bookend-listitem.mustache', pl); + pl.patterns.push(bookendPattern); + bookendPattern.registerPartial(pl); + bookendPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(bookendPattern.relPath, pl, bookendPattern); //assert. here we expect {{styleModifier}} to be replaced with an empty string or the styleModifier value from the found partial with the :styleModifier - var expectedValue = '
Foo Foo Foo Bar Bar Bar
'; + var expectedValue = '
Foo Foo Foo Bar Bar Bar
'; test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, 'process_list_item_partials - correctly ignores already processed partial that had a style modifier when the same partial no longer has one' : function(test){ //arrange - var fs = require('fs-extra'); - var list_item_hunter = new lih(); - var pl = createFakePatternLab(); - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(pl.config.paths.source.patterns + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var anotherStyledAtomPattern = new Pattern('00-test/12-another-styled-atom.mustache'); - anotherStyledAtomPattern.template = fs.readFileSync(pl.config.paths.source.patterns + '/00-test/12-another-styled-atom.mustache', 'utf8'); - anotherStyledAtomPattern.extendedTemplate = anotherStyledAtomPattern.template; - anotherStyledAtomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(anotherStyledAtomPattern); - - var listPattern = new Pattern('00-test/13-listitem.mustache'); - listPattern.template = fs.readFileSync(pl.config.paths.source.patterns + '/00-test/13-listitem.mustache', 'utf8'); - listPattern.extendedTemplate = listPattern.template; - listPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(listPattern); - + //act + var atomPattern = pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); pl.patterns.push(atomPattern); - pl.patterns.push(anotherStyledAtomPattern); - pl.patterns.push(listPattern); + atomPattern.registerPartial(pl); + atomPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); - //act + var anotherStyledAtomPattern = pattern_assembler.process_pattern_iterative('00-test/12-another-styled-atom.mustache', pl); + pl.patterns.push(anotherStyledAtomPattern); + anotherStyledAtomPattern.registerPartial(pl); + anotherStyledAtomPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(anotherStyledAtomPattern.relPath, pl, anotherStyledAtomPattern); - //might need to cal processPatternRecursive instead - pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl); - pattern_assembler.process_pattern_recursive(anotherStyledAtomPattern.relPath, pl); - pattern_assembler.process_pattern_recursive(listPattern.relPath, pl); + var listPattern = pattern_assembler.process_pattern_iterative('00-test/13-listitem.mustache', pl); + pl.patterns.push(listPattern); + listPattern.registerPartial(pl); + listPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(listPattern.relPath, pl, listPattern); //assert. var expectedValue = '
FooM
'; From 8d47307d03eab0e5bdc1176b3918c12b112d91cd Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 11:29:19 -0400 Subject: [PATCH 11/44] working engine_mustache_tests.js --- test/engine_mustache_tests.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/engine_mustache_tests.js b/test/engine_mustache_tests.js index da811be0e..cfc28454b 100644 --- a/test/engine_mustache_tests.js +++ b/test/engine_mustache_tests.js @@ -42,7 +42,8 @@ function testFindPartials(test, partialTests) { '01-molecules/00-testing/00-test-mol.mustache', // relative path now null, // data { - template: partialTests.join(eol) + template: partialTests.join(eol), + extendedTemplate: partialTests.join(eol) } ); @@ -68,7 +69,8 @@ function testFindPartialsWithStyleModifiers(test, partialTests) { '01-molecules/00-testing/00-test-mol.mustache', // relative path now null, // data { - template: partialTests.join(eol) + template: partialTests.join(eol), + extendedTemplate: partialTests.join(eol) } ); @@ -94,7 +96,8 @@ function testFindPartialsWithPatternParameters(test, partialTests) { '01-molecules/00-testing/00-test-mol.mustache', // relative path now null, // data { - template: partialTests.join(eol) + template: partialTests.join(eol), + extendedTemplate: partialTests.join(eol) } ); From 89b0b9e3545206f55dff22fe6d82c155854ff312 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 11:32:33 -0400 Subject: [PATCH 12/44] mutation instead of return --- core/lib/pattern_assembler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index ae0aff51d..e1bbe5103 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -369,7 +369,7 @@ var pattern_assembler = function () { console.log('found partials for ' + currentPattern.patternPartial); } - currentPattern.extendedTemplate = partial_hunter.replace_partials(currentPattern, patternlab); + partial_hunter.replace_partials(currentPattern, patternlab); processPatternRecursive(currentPattern.relPath, patternlab, currentPattern); } From e4ce892eaf507fb033532aed1a5be8b999f10bec Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 11:38:09 -0400 Subject: [PATCH 13/44] adding test/_patterns/01-test1 dir --- test/files/_patterns/01-test1/00-listitem-partial.mustache | 1 + test/files/_patterns/01-test1/01-listitem-verbose-foo.mustache | 1 + test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache | 1 + 3 files changed, 3 insertions(+) create mode 100644 test/files/_patterns/01-test1/00-listitem-partial.mustache create mode 100644 test/files/_patterns/01-test1/01-listitem-verbose-foo.mustache create mode 100644 test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache diff --git a/test/files/_patterns/01-test1/00-listitem-partial.mustache b/test/files/_patterns/01-test1/00-listitem-partial.mustache new file mode 100644 index 000000000..5f53ce639 --- /dev/null +++ b/test/files/_patterns/01-test1/00-listitem-partial.mustache @@ -0,0 +1 @@ +{{#listItems.two}}{{> test-simple }}{{/listItems.two}} diff --git a/test/files/_patterns/01-test1/01-listitem-verbose-foo.mustache b/test/files/_patterns/01-test1/01-listitem-verbose-foo.mustache new file mode 100644 index 000000000..b4e988359 --- /dev/null +++ b/test/files/_patterns/01-test1/01-listitem-verbose-foo.mustache @@ -0,0 +1 @@ +{{#listItems.one}}{{> 00-test/00-foo.mustache }}{{/listItems.one}} diff --git a/test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache b/test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache new file mode 100644 index 000000000..c9b143352 --- /dev/null +++ b/test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache @@ -0,0 +1 @@ +{{#listItems.two}}{{> 00-test/00-bar.mustache }}{{/listItems.two}} From 271845356c45cb57ec3895564269fc6d006f9fea Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 11:41:25 -0400 Subject: [PATCH 14/44] pattern_assembler correctly processes list items --- core/lib/pattern_assembler.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index e1bbe5103..e38910f25 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -363,6 +363,7 @@ var pattern_assembler = function () { function expandPartials(currentPattern, patternlab) { + var list_item_hunter = new lih(); var partial_hunter = new ph(); if (patternlab.config.debug) { @@ -371,6 +372,9 @@ var pattern_assembler = function () { partial_hunter.replace_partials(currentPattern, patternlab); + //find any listItem blocks within the pattern + list_item_hunter.process_list_item_partials(currentPattern, patternlab); + processPatternRecursive(currentPattern.relPath, patternlab, currentPattern); } From e63bbf8b2fd562e8d8ce100d6f51435a73b4a246 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 12:15:24 -0400 Subject: [PATCH 15/44] more working unit tests --- .../01-test1/00-listitem-partial.mustache | 2 +- .../01-test1/02-listitem-verbose-bar.mustache | 2 +- test/lineage_hunter_tests.js | 4 +++ test/list_item_hunter_tests.js | 18 +++++------ test/pattern_assembler_tests.js | 32 ++++++++++++++++++- 5 files changed, 46 insertions(+), 12 deletions(-) diff --git a/test/files/_patterns/01-test1/00-listitem-partial.mustache b/test/files/_patterns/01-test1/00-listitem-partial.mustache index 5f53ce639..41c3b013e 100644 --- a/test/files/_patterns/01-test1/00-listitem-partial.mustache +++ b/test/files/_patterns/01-test1/00-listitem-partial.mustache @@ -1 +1 @@ -{{#listItems.two}}{{> test-simple }}{{/listItems.two}} +{{#listItems.two}}{{> test1-simple }}{{/listItems.two}} diff --git a/test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache b/test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache index c9b143352..a6d988fa5 100644 --- a/test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache +++ b/test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache @@ -1 +1 @@ -{{#listItems.two}}{{> 00-test/00-bar.mustache }}{{/listItems.two}} +{{#listItems.two}}{{> 00-test/01-bar.mustache }}{{/listItems.two}} diff --git a/test/lineage_hunter_tests.js b/test/lineage_hunter_tests.js index f689d049b..0936d6298 100644 --- a/test/lineage_hunter_tests.js +++ b/test/lineage_hunter_tests.js @@ -49,6 +49,7 @@ exports['lineage hunter '] = { ); extend(currentPattern, { "template": "\r\n
\r\n\t{{> atoms-logo }}\r\n\tSearch\r\n\tMenu\r\n\t{{> molecules-primary-nav }}\r\n\t{{> molecules-search }}\r\n
\r\n\r\n", + "extendedTemplate": "\r\n
\r\n\t{{> atoms-logo }}\r\n\tSearch\r\n\tMenu\r\n\t{{> molecules-primary-nav }}\r\n\t{{> molecules-search }}\r\n
\r\n\r\n", "patternPartialCode": "\r\n
\r\n\"Logo\tSearch\r\n\tMenu\r\n\r\n
\r\n
\r\n\t Search\r\n\t \r\n\t \r\n\t \r\n
\r\n
\r\n\r\n" }); @@ -60,6 +61,7 @@ exports['lineage hunter '] = { "filename": "00-logo.mustache", "data": null, "template": "\"Logo", + "extendedTemplate": "\"Logo", "patternPartialCode": "\"Logo", "patternBaseName": "logo", "patternLink": "00-atoms-03-images-00-logo/00-atoms-03-images-00-logo.html", @@ -79,6 +81,7 @@ exports['lineage hunter '] = { "filename": "00-primary-nav.mustache", "data": null, "template": "\r\n", + "extendedTemplate": "\r\n", "patternPartialCode": "\r\n", "patternBaseName": "primary-nav", "patternLink": "01-molecules-05-navigation-00-primary-nav/01-molecules-05-navigation-00-primary-nav.html", @@ -98,6 +101,7 @@ exports['lineage hunter '] = { "filename": "00-search.mustache", "data": null, "template": "
\r\n
\r\n\t Search\r\n\t \r\n\t \r\n\t \r\n
\r\n
", + "extendedTemplate": "
\r\n
\r\n\t Search\r\n\t \r\n\t \r\n\t \r\n
\r\n
", "patternPartialCode": "
\r\n
\r\n\t Search\r\n\t \r\n\t \r\n\t \r\n
\r\n
", "patternBaseName": "search", "patternLink": "01-molecules-04-forms-00-search/01-molecules-04-forms-00-search.html", diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index 2d4fc2caf..4fe0eb402 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -121,7 +121,7 @@ { "template": "{{ title }}", "extendedTemplate" : "{{ title }}", - "patternPartial": "test-simple", + "patternPartial": "test1-simple", "jsonFileData" : {} } @@ -147,7 +147,7 @@ "template": "{{ title }}", "extendedTemplate": "{{ title }}" }), - Pattern.create('00-test/00-bar.mustache', null, { + Pattern.create('00-test/01-bar.mustache', null, { "template": "{{ title }}", "extendedTemplate": "{{ title }}" }) @@ -181,7 +181,7 @@ createFakeListPattern({ "template": "{{ title }}", "extendedTemplate": "{{ title }}", - "patternPartial": "test-simple", + "patternPartial": "test1-simple", "jsonFileData": {} }) ] @@ -209,8 +209,8 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = createFakeListPattern({ - "template": "{{#listItems.one}}{{ title }}{{/listItems.one}}", - "extendedTemplate": "{{#listItems.one}}{{> test-simple }}{{/listItems.one}}", + "template": "{{#listItems.one}}{{> test1-simple }}{{/listItems.one}}", + "extendedTemplate": "{{#listItems.one}}{{> test1-simple }}{{/listItems.one}}", "key": "test-patternName", "jsonFileData": {}, "listitems": { @@ -225,7 +225,7 @@ createFakeListPattern({ "template": "{{ title }}", "extendedTemplate": "{{ title }}", - "patternPartial": "test-simple", + "patternPartial": "test1-simple", "jsonFileData" : {} }) ] @@ -233,7 +233,7 @@ //act var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); - pattern.template = "{{#listItems.one}}{{> test-simple }}{{/listItems.one}}"; + pattern.template = "{{#listItems.one}}{{> test1-simple }}{{/listItems.one}}"; pattern.extendedTemplate = pattern.template; pattern.listitems = { "2": [ @@ -257,7 +257,7 @@ createFakeListPattern({ "template": "{{ title }}", "extendedTemplate": "{{ title }}", - "patternPartial": "test-simple", + "patternPartial": "test1-simple", "jsonFileData": {} }) ] @@ -266,7 +266,7 @@ //act var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); - pattern.template = "{{#listItems.one}}{{> test-simple }}{{/listItems.one}}"; + pattern.template = "{{#listItems.one}}{{> test1-simple }}{{/listItems.one}}"; pattern.extendedTemplate = pattern.template; pattern.listitems = { "1": [ diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index b0fa5e4a0..44472e3f7 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -7,7 +7,7 @@ exports['pattern_assembler'] = { 'process_pattern_recursive recursively includes partials' : function(test){ - test.expect(3); + // test.expect(3); //tests inclusion of partial that will be discovered by diveSync later in iteration than parent //prepare to diveSync @@ -36,6 +36,20 @@ //diveSync once to perform iterative populating of patternlab object plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab); + // preprocess partials so they can be recursively included respecting any parameters they may be submitting + var engine; + for (var i = 0; i < patternlab.patterns.length; i++) { + if (patternlab.patterns[i].isPattern) { + engine = patternlab.patterns[i].engine; + break; + } + } + + if (typeof engine.preprocessPartials === 'function') { + engine.preprocessPartials(pattern_assembler, patternlab); +} +/* + //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements plMain.process_all_patterns_recursive(pattern_assembler, patterns_dir, patternlab); @@ -59,8 +73,11 @@ //test that 00-foo.mustache included partial 01-bar.mustache test.equals(fooExtended, 'bar'); +*/ test.done(); }, + +/* 'processPatternRecursive - correctly replaces all stylemodifiers when multiple duplicate patterns with different stylemodifiers found' : function(test){ //arrange var fs = require('fs-extra'); @@ -83,10 +100,12 @@ var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); var groupPattern = new Pattern('00-test/04-group.mustache'); groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/04-group.mustache', 'utf8'); + groupPattern.extendedTemplate = groupPattern.template; groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); pattern_assembler.addPattern(atomPattern, pl); @@ -123,11 +142,13 @@ var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); var groupPattern = new Pattern('00-test/10-multiple-classes-numeric.mustache'); groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/10-multiple-classes-numeric.mustache', 'utf8'); + groupPattern.extendedTemplate = groupPattern.template; groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); groupPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(groupPattern); @@ -164,10 +185,12 @@ var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); var mixedPattern = new Pattern('00-test/06-mixed.mustache'); mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/06-mixed.mustache', 'utf8'); + mixedPattern.extendedTemplate = mixedPattern.template; mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); pattern_assembler.addPattern(atomPattern, pl); @@ -203,10 +226,12 @@ var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); var bookendPattern = new Pattern('00-test/09-bookend.mustache'); bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/09-bookend.mustache', 'utf8'); + bookendPattern.extendedTemplate = bookendPattern.template; bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); pattern_assembler.addPattern(atomPattern, pl); @@ -243,11 +268,13 @@ var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); var mixedPattern = new Pattern('00-test/07-mixed-params.mustache'); mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/07-mixed-params.mustache', 'utf8'); + mixedPattern.extendedTemplate = mixedPattern.template; mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); mixedPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(mixedPattern); @@ -284,11 +311,13 @@ var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); var bookendPattern = new Pattern('00-test/08-bookend-params.mustache'); bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/08-bookend-params.mustache', 'utf8'); + bookendPattern.extendedTemplate = bookendPattern.template; bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); bookendPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(bookendPattern); @@ -490,5 +519,6 @@ test.equals(patternlab.partials['test-bar'], 'bar'); test.done(); } +*/ }; })(); From 9e96be0e2158092043c644a951aa9ee3812ad9b5 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 12:15:48 -0400 Subject: [PATCH 16/44] pattern_assembler.js to work with refactor --- core/lib/pattern_assembler.js | 40 +++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index e38910f25..8fd9233d9 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -111,6 +111,9 @@ var pattern_assembler = function () { console.log('found new pattern ' + pattern.patternPartial); } + // do global registration + + if (pattern.isPattern) { // do plugin-specific registration pattern.registerPartial(patternlab); @@ -274,7 +277,6 @@ var pattern_assembler = function () { //add allData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(currentPattern.allData, []); - //add listItem keys to currentPattern.dataKeys for (var i = 0; i < list_item_hunter.items.length; i++) { currentPattern.dataKeys.push('listItems.' + list_item_hunter.items[i]); currentPattern.dataKeys.push('listitems.' + list_item_hunter.items[i]); @@ -318,13 +320,12 @@ var pattern_assembler = function () { addPattern(currentPattern, patternlab); //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json - pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); +// pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); return currentPattern; } function processPatternRecursive(file, patternlab, origPatternParam) { - var lineage_hunter = new lh(); //find current pattern in patternlab object using var file as a partial @@ -340,6 +341,28 @@ var pattern_assembler = function () { } } } +//console.info(file); +if (file !== '02-organisms/accordions/_format-editions~format.mustache') { +// return; + /* +console.info(file); +console.info(currentPattern.extendedTemplate); +console.info(); +console.info(); +*/ +} +//console.info(currentPattern.dataKeys); +//console.info(currentPattern.extendedTemplate); +if (file.indexOf('04-pages/video-page.mustache') > -1) { +//console.info('currentPattern.extendedTemplate'); +//console.info(currentPattern.extendedTemplate); +//console.info(patternlab.partialsCompiled['03-templates/system/page(04_video_page\\?: true)']); + /* + console.info('GUH'); + console.info(file); + process.exit(); + */ +} //return if processing an ignored file if (typeof currentPattern === 'undefined') { return; } @@ -349,22 +372,26 @@ var pattern_assembler = function () { //find how many partials there may be for the given pattern currentPattern.patternPartials = currentPattern.findPartials(); +if (currentPattern.relPath === '01-molecules/listing-items/titles-item.mustache') { +// console.info(currentPattern.template); +// console.info(currentPattern.patternPartials); +} //expand any partials present in this pattern; that is, drill down into the //template and replace their calls in this template with rendered results if (currentPattern.engine.expandPartials && (currentPattern.patternPartials !== null && currentPattern.patternPartials.length > 0)) { // eslint-disable-next-line - expandPartials(currentPattern, patternlab); + expandPartials(patternlab, currentPattern); } //find pattern lineage lineage_hunter.find_lineage(currentPattern, patternlab); } - function expandPartials(currentPattern, patternlab) { + function expandPartials(patternlab, currentPattern) { - var list_item_hunter = new lih(); var partial_hunter = new ph(); + var list_item_hunter = new lih(); if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.patternPartial); @@ -389,7 +416,6 @@ var pattern_assembler = function () { for (var i = 0; i < linkMatches.length; i++) { expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; if (expandedLink) { - expandedLink = expandedLink.replace('\\', '/'); if (patternlab.config.debug) { console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); } From 958746b51ec72159a35600332d8bd2c7511f5eb4 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 12:19:20 -0400 Subject: [PATCH 17/44] new test file --- test/files/_patterns/01-test1/03-simple.mustache | 1 + 1 file changed, 1 insertion(+) create mode 100644 test/files/_patterns/01-test1/03-simple.mustache diff --git a/test/files/_patterns/01-test1/03-simple.mustache b/test/files/_patterns/01-test1/03-simple.mustache new file mode 100644 index 000000000..6d5a89f8a --- /dev/null +++ b/test/files/_patterns/01-test1/03-simple.mustache @@ -0,0 +1 @@ +{{ title }} From e36b9b3cbf96cb8ed201fa072680be31a67f1750 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 14:44:06 -0400 Subject: [PATCH 18/44] tabs to spaces in pattern_assembler_tests.js --- test/pattern_assembler_tests.js | 976 ++++++++++++++++---------------- 1 file changed, 486 insertions(+), 490 deletions(-) diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 44472e3f7..0da065f8c 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -1,524 +1,520 @@ (function () { - "use strict"; + "use strict"; - var pa = require('../core/lib/pattern_assembler'); + var pa = require('../core/lib/pattern_assembler'); var Pattern = require('../core/lib/object_factory').Pattern; var path = require('path'); - exports['pattern_assembler'] = { - 'process_pattern_recursive recursively includes partials' : function(test){ - // test.expect(3); + exports['pattern_assembler'] = { + 'process_pattern_recursive recursively includes partials' : function(test){ + test.expect(3); - //tests inclusion of partial that will be discovered by diveSync later in iteration than parent - //prepare to diveSync - var diveSync = require('diveSync'); - var fs = require('fs-extra'); - var pa = require('../core/lib/pattern_assembler'); + //tests inclusion of partial that will be discovered by diveSync later in iteration than parent + //prepare to diveSync + var diveSync = require('diveSync'); + var fs = require('fs-extra'); + var pa = require('../core/lib/pattern_assembler'); var plMain = require('../core/lib/patternlab'); - var pattern_assembler = new pa(); - var patterns_dir = './test/files/_patterns'; - var patternlab = {}; - patternlab.config = fs.readJSONSync('./patternlab-config.json'); - patternlab.config.paths.source.patterns = patterns_dir; + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + var patternlab = {}; + patternlab.config = fs.readJSONSync('./patternlab-config.json'); + patternlab.config.paths.source.patterns = patterns_dir; - //patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); + //patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); patternlab.data = {}; - //patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); + //patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); patternlab.listitems = {}; - //patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/header.html'), 'utf8'); + //patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/header.html'), 'utf8'); patternlab.header = ''; - //patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/footer.html'), 'utf8'); + //patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/footer.html'), 'utf8'); patternlab.footer = ''; - patternlab.patterns = []; - patternlab.data.link = {}; - patternlab.partials = {}; - - //diveSync once to perform iterative populating of patternlab object - plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab); - - // preprocess partials so they can be recursively included respecting any parameters they may be submitting - var engine; - for (var i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].isPattern) { - engine = patternlab.patterns[i].engine; + patternlab.patterns = []; + patternlab.data.link = {}; + patternlab.partials = {}; + + //diveSync once to perform iterative populating of patternlab object + plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab); + + // preprocess partials so they can be recursively included respecting any parameters they may be submitting + var engine; + for (var i = 0; i < patternlab.patterns.length; i++) { + if (patternlab.patterns[i].isPattern) { + engine = patternlab.patterns[i].engine; + break; + } + } + + if (typeof engine.preprocessPartials === 'function') { + engine.preprocessPartials(pattern_assembler, patternlab); + } + + //diveSync again to recursively include partials, filling out the + //extendedTemplate property of the patternlab.patterns elements + plMain.process_all_patterns_recursive(pattern_assembler, patterns_dir, patternlab); + + //get test output for comparison + var foo = fs.readFileSync(patterns_dir + '/00-test/00-foo.mustache', 'utf8').trim(); + var bar = fs.readFileSync(patterns_dir + '/00-test/01-bar.mustache', 'utf8').trim(); + var fooExtended; + + //get extended pattern + for(var i = 0; i < patternlab.patterns.length; i++){ + if(patternlab.patterns[i].fileName === '00-foo'){ + fooExtended = patternlab.patterns[i].extendedTemplate.trim(); break; + } } - } - if (typeof engine.preprocessPartials === 'function') { - engine.preprocessPartials(pattern_assembler, patternlab); -} -/* - - //diveSync again to recursively include partials, filling out the - //extendedTemplate property of the patternlab.patterns elements - plMain.process_all_patterns_recursive(pattern_assembler, patterns_dir, patternlab); - - //get test output for comparison - var foo = fs.readFileSync(patterns_dir + '/00-test/00-foo.mustache', 'utf8').trim(); - var bar = fs.readFileSync(patterns_dir + '/00-test/01-bar.mustache', 'utf8').trim(); - var fooExtended; - - //get extended pattern - for(var i = 0; i < patternlab.patterns.length; i++){ - if(patternlab.patterns[i].fileName === '00-foo'){ - fooExtended = patternlab.patterns[i].extendedTemplate.trim(); - break; - } - } - - //check initial values - test.equals(foo, '{{> test-bar }}'); - test.equals(bar, 'bar'); - //test that 00-foo.mustache included partial 01-bar.mustache - test.equals(fooExtended, 'bar'); - -*/ - test.done(); - }, - -/* - 'processPatternRecursive - correctly replaces all stylemodifiers when multiple duplicate patterns with different stylemodifiers found' : function(test){ - //arrange - var fs = require('fs-extra'); - var pattern_assembler = new pa(); - var patterns_dir = './test/files/_patterns'; - - var pl = {}; - pl.config = { - paths: { - source: { - patterns: patterns_dir - } - } - }; - pl.data = {}; - pl.data.link = {}; - pl.config.debug = false; - pl.patterns = []; - pl.partials = {}; - - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var groupPattern = new Pattern('00-test/04-group.mustache'); - groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/04-group.mustache', 'utf8'); - groupPattern.extendedTemplate = groupPattern.template; - groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(groupPattern, pl); - - //act - - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '04-group.mustache', pl, {}); - - //assert - var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; - test.equals(groupPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); - test.done(); - }, - 'processPatternRecursive - correctly replaces multiple stylemodifier classes on same partial' : function(test){ - //arrange - var fs = require('fs-extra'); - var pattern_assembler = new pa(); - var patterns_dir = './test/files/_patterns'; - - var pl = {}; - pl.config = { - paths: { - source: { - patterns: patterns_dir - } - } - }; - pl.data = {}; - pl.data.link = {}; - pl.config.debug = false; - pl.patterns = []; - pl.partials = {}; - - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); - - var groupPattern = new Pattern('00-test/10-multiple-classes-numeric.mustache'); - groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/10-multiple-classes-numeric.mustache', 'utf8'); - groupPattern.extendedTemplate = groupPattern.template; - groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); - groupPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(groupPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(groupPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '10-multiple-classes-numeric.mustache', pl, {}); - - //assert - var expectedValue = '
{{message}} {{message}} bar
'; - test.equals(groupPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); - test.done(); - }, - 'processPatternRecursive - correctly ignores a partial without a style modifier when the same partial later has a style modifier' : function(test){ - //arrange - var fs = require('fs-extra'); - var pattern_assembler = new pa(); - var patterns_dir = './test/files/_patterns'; - - var pl = {}; - pl.config = { - paths: { - source: { - patterns: patterns_dir - } - } - }; - pl.data = {}; - pl.data.link = {}; - pl.config.debug = false; - pl.patterns = []; - pl.partials = {}; - - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var mixedPattern = new Pattern('00-test/06-mixed.mustache'); - mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/06-mixed.mustache', 'utf8'); - mixedPattern.extendedTemplate = mixedPattern.template; - mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(mixedPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '06-mixed.mustache', pl, {}); - - //assert. here we expect {{styleModifier}} to be in the first group, since it was not replaced by anything. rendering with data will then remove this (correctly) - var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; - test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); - test.done(); - }, - 'processPatternRecursive - correctly ignores bookended partials without a style modifier when the same partial has a style modifier between' : function(test){ - //arrange - var fs = require('fs-extra'); - var pattern_assembler = new pa(); - var patterns_dir = './test/files/_patterns'; - - var pl = {}; - pl.config = { - paths: { - source: { - patterns: patterns_dir - } - } - }; - pl.data = {}; - pl.data.link = {}; - pl.config.debug = false; - pl.patterns = []; - pl.partials = {}; - - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var bookendPattern = new Pattern('00-test/09-bookend.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/09-bookend.mustache', 'utf8'); - bookendPattern.extendedTemplate = bookendPattern.template; - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(bookendPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '09-bookend.mustache', pl, {}); - - //assert. here we expect {{styleModifier}} to be in the first and last group, since it was not replaced by anything. rendering with data will then remove this (correctly) - var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; + //check initial values + test.equals(foo, '{{> test-bar }}'); + test.equals(bar, 'bar'); + //test that 00-foo.mustache included partial 01-bar.mustache + test.equals(fooExtended, 'bar'); + + test.done(); + }, + + 'processPatternRecursive - correctly replaces all stylemodifiers when multiple duplicate patterns with different stylemodifiers found' : function(test){ + //arrange + var fs = require('fs-extra'); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + + var pl = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; + pl.data = {}; + pl.data.link = {}; + pl.config.debug = false; + pl.patterns = []; + pl.partials = {}; + + var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); + atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; + atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); + + var groupPattern = new Pattern('00-test/04-group.mustache'); + groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/04-group.mustache', 'utf8'); + groupPattern.extendedTemplate = groupPattern.template; + groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); + + pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.addPattern(groupPattern, pl); + + //act + + pattern_assembler.process_pattern_recursive('00-test' + path.sep + '04-group.mustache', pl, {}); + + //assert + var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; + test.equals(groupPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + test.done(); + }, + 'processPatternRecursive - correctly replaces multiple stylemodifier classes on same partial' : function(test){ + //arrange + var fs = require('fs-extra'); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + + var pl = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; + pl.data = {}; + pl.data.link = {}; + pl.config.debug = false; + pl.patterns = []; + pl.partials = {}; + + var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); + atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; + atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); + atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); + + var groupPattern = new Pattern('00-test/10-multiple-classes-numeric.mustache'); + groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/10-multiple-classes-numeric.mustache', 'utf8'); + groupPattern.extendedTemplate = groupPattern.template; + groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); + groupPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(groupPattern); + + pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.addPattern(groupPattern, pl); + + //act + pattern_assembler.process_pattern_recursive('00-test' + path.sep + '10-multiple-classes-numeric.mustache', pl, {}); + + //assert + var expectedValue = '
{{message}} {{message}} bar
'; + test.equals(groupPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + test.done(); + }, + 'processPatternRecursive - correctly ignores a partial without a style modifier when the same partial later has a style modifier' : function(test){ + //arrange + var fs = require('fs-extra'); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + + var pl = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; + pl.data = {}; + pl.data.link = {}; + pl.config.debug = false; + pl.patterns = []; + pl.partials = {}; + + var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); + atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; + atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); + + var mixedPattern = new Pattern('00-test/06-mixed.mustache'); + mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/06-mixed.mustache', 'utf8'); + mixedPattern.extendedTemplate = mixedPattern.template; + mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); + + pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.addPattern(mixedPattern, pl); + + //act + pattern_assembler.process_pattern_recursive('00-test' + path.sep + '06-mixed.mustache', pl, {}); + + //assert. here we expect {{styleModifier}} to be in the first group, since it was not replaced by anything. rendering with data will then remove this (correctly) + var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; + test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + test.done(); + }, + 'processPatternRecursive - correctly ignores bookended partials without a style modifier when the same partial has a style modifier between' : function(test){ + //arrange + var fs = require('fs-extra'); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + + var pl = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; + pl.data = {}; + pl.data.link = {}; + pl.config.debug = false; + pl.patterns = []; + pl.partials = {}; + + var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); + atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; + atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); + + var bookendPattern = new Pattern('00-test/09-bookend.mustache'); + bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/09-bookend.mustache', 'utf8'); + bookendPattern.extendedTemplate = bookendPattern.template; + bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); + + pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.addPattern(bookendPattern, pl); + + //act + pattern_assembler.process_pattern_recursive('00-test' + path.sep + '09-bookend.mustache', pl, {}); + + //assert. here we expect {{styleModifier}} to be in the first and last group, since it was not replaced by anything. rendering with data will then remove this (correctly) + var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; var actualValue = bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' '); - test.equals(actualValue.trim(), expectedValue.trim(), 'actual value:\n' + actualValue + '\nexpected value:\n' + expectedValue); - test.done(); - }, - 'processPatternRecursive - correctly ignores a partial without a style modifier when the same partial later has a style modifier and pattern parameters' : function(test){ - //arrange - var fs = require('fs-extra'); - var pattern_assembler = new pa(); - var patterns_dir = './test/files/_patterns'; - - var pl = {}; - pl.config = { - paths: { - source: { - patterns: patterns_dir - } - } - }; - pl.data = {}; - pl.data.link = {}; - pl.config.debug = false; - pl.patterns = []; - pl.partials = {}; - - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); - - var mixedPattern = new Pattern('00-test/07-mixed-params.mustache'); - mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/07-mixed-params.mustache', 'utf8'); - mixedPattern.extendedTemplate = mixedPattern.template; - mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); - mixedPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(mixedPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(mixedPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '07-mixed-params.mustache', pl, {}); - - //assert. here we expect {{styleModifier}} to be in the first span, since it was not replaced by anything. rendering with data will then remove this (correctly) - var expectedValue = '
{{message}} 2 3 4
'; - test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); - test.done(); - }, - 'processPatternRecursive - correctly ignores bookended partials without a style modifier when the same partial has a style modifier and pattern parameters between' : function(test){ - //arrange - var fs = require('fs-extra'); - var pattern_assembler = new pa(); - var patterns_dir = './test/files/_patterns'; - - var pl = {}; - pl.config = { - paths: { - source: { - patterns: patterns_dir - } - } - }; - pl.data = {}; - pl.data.link = {}; - pl.config.debug = false; - pl.patterns = []; - pl.partials = {}; - - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); - - var bookendPattern = new Pattern('00-test/08-bookend-params.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/08-bookend-params.mustache', 'utf8'); - bookendPattern.extendedTemplate = bookendPattern.template; - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); - bookendPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(bookendPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(bookendPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '08-bookend-params.mustache', pl, {}); - - //assert. here we expect {{styleModifier}} to be in the first and last span, since it was not replaced by anything. rendering with data will then remove this (correctly) - var expectedValue = '
{{message}} 2 3 {{message}}
'; - test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); - test.done(); - }, - 'setState - applies any patternState matching the pattern' : function(test){ - //arrange - var pa = require('../core/lib/pattern_assembler'); - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.config = {}; - patternlab.config.patternStates = {}; - patternlab.config.patternStates["pages-homepage-emergency"] = "inprogress"; - - var pattern = { + test.equals(actualValue.trim(), expectedValue.trim(), 'actual value:\n' + actualValue + '\nexpected value:\n' + expectedValue); + test.done(); + }, + 'processPatternRecursive - correctly ignores a partial without a style modifier when the same partial later has a style modifier and pattern parameters' : function(test){ + //arrange + var fs = require('fs-extra'); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + + var pl = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; + pl.data = {}; + pl.data.link = {}; + pl.config.debug = false; + pl.patterns = []; + pl.partials = {}; + + var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); + atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; + atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); + atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); + + var mixedPattern = new Pattern('00-test/07-mixed-params.mustache'); + mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/07-mixed-params.mustache', 'utf8'); + mixedPattern.extendedTemplate = mixedPattern.template; + mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); + mixedPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(mixedPattern); + + pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.addPattern(mixedPattern, pl); + + //act + pattern_assembler.process_pattern_recursive('00-test' + path.sep + '07-mixed-params.mustache', pl, {}); + + //assert. here we expect {{styleModifier}} to be in the first span, since it was not replaced by anything. rendering with data will then remove this (correctly) + var expectedValue = '
{{message}} 2 3 4
'; + test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + test.done(); + }, + 'processPatternRecursive - correctly ignores bookended partials without a style modifier when the same partial has a style modifier and pattern parameters between' : function(test){ + //arrange + var fs = require('fs-extra'); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + + var pl = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; + pl.data = {}; + pl.data.link = {}; + pl.config.debug = false; + pl.patterns = []; + pl.partials = {}; + + var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); + atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + atomPattern.extendedTemplate = atomPattern.template; + atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); + atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); + + var bookendPattern = new Pattern('00-test/08-bookend-params.mustache'); + bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/08-bookend-params.mustache', 'utf8'); + bookendPattern.extendedTemplate = bookendPattern.template; + bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); + bookendPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(bookendPattern); + + pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.addPattern(bookendPattern, pl); + + //act + pattern_assembler.process_pattern_recursive('00-test' + path.sep + '08-bookend-params.mustache', pl, {}); + + //assert. here we expect {{styleModifier}} to be in the first and last span, since it was not replaced by anything. rendering with data will then remove this (correctly) + var expectedValue = '
{{message}} 2 3 {{message}}
'; + test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + test.done(); + }, + 'setState - applies any patternState matching the pattern' : function(test){ + //arrange + var pa = require('../core/lib/pattern_assembler'); + var pattern_assembler = new pa(); + var patternlab = {}; + patternlab.config = {}; + patternlab.config.patternStates = {}; + patternlab.config.patternStates["pages-homepage-emergency"] = "inprogress"; + + var pattern = { patternPartial: "pages-homepage-emergency" - }; - - //act - pattern_assembler.setPatternState(pattern, patternlab); - - //assert - test.equals(pattern.patternState, "inprogress"); - test.done(); - }, - 'setState - does not apply any patternState if nothing matches the pattern' : function(test){ - //arrange - var pa = require('../core/lib/pattern_assembler'); - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.config = {}; - patternlab.config.patternStates = {}; - patternlab.config.patternStates["pages-homepage-emergency"] = "inprogress"; - - var pattern = { + }; + + //act + pattern_assembler.setPatternState(pattern, patternlab); + + //assert + test.equals(pattern.patternState, "inprogress"); + test.done(); + }, + 'setState - does not apply any patternState if nothing matches the pattern' : function(test){ + //arrange + var pa = require('../core/lib/pattern_assembler'); + var pattern_assembler = new pa(); + var patternlab = {}; + patternlab.config = {}; + patternlab.config.patternStates = {}; + patternlab.config.patternStates["pages-homepage-emergency"] = "inprogress"; + + var pattern = { key: "pages-homepage", patternState: "" - }; - - //act - pattern_assembler.setPatternState(pattern, patternlab); - - //assert - test.equals(pattern.patternState, ""); - test.done(); - }, - 'parseDataLinks - replaces found link.* data for their expanded links' : function(test){ - //arrange - var diveSync = require('diveSync'); - var fs = require('fs-extra'); - var pa = require('../core/lib/pattern_assembler'); + }; + + //act + pattern_assembler.setPatternState(pattern, patternlab); + + //assert + test.equals(pattern.patternState, ""); + test.done(); + }, + 'parseDataLinks - replaces found link.* data for their expanded links' : function(test){ + //arrange + var diveSync = require('diveSync'); + var fs = require('fs-extra'); + var pa = require('../core/lib/pattern_assembler'); var plMain = require('../core/lib/patternlab'); - var pattern_assembler = new pa(); - var patterns_dir = './test/files/_patterns/'; - var patternlab = {}; - //THIS IS BAD - patternlab.config = fs.readJSONSync('./patternlab-config.json'); - patternlab.config.paths.source.patterns = patterns_dir; + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns/'; + var patternlab = {}; + //THIS IS BAD + patternlab.config = fs.readJSONSync('./patternlab-config.json'); + patternlab.config.paths.source.patterns = patterns_dir; patternlab.data = {}; patternlab.listitems = {}; patternlab.header = {}; patternlab.footer = {}; //patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); //patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); - //patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/header.html'), 'utf8'); - //patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/footer.html'), 'utf8'); - patternlab.patterns = []; - patternlab.data.link = {}; - patternlab.partials = {}; - - //diveSync once to perform iterative populating of patternlab object - plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab); - - //for the sake of the test, also imagining I have the following pages... - patternlab.data.link['twitter-brad'] = 'https://twitter.com/brad_frost'; - patternlab.data.link['twitter-dave'] = 'https://twitter.com/dmolsen'; - patternlab.data.link['twitter-brian'] = 'https://twitter.com/bmuenzenmeyer'; - - patternlab.data.brad = { url: "link.twitter-brad" }; - patternlab.data.dave = { url: "link.twitter-dave" }; - patternlab.data.brian = { url: "link.twitter-brian" }; - - - var pattern; - for(var i = 0; i < patternlab.patterns.length; i++){ - if(patternlab.patterns[i].patternPartial === 'test-nav'){ - pattern = patternlab.patterns[i]; - } - } - - //assert before - test.equals(pattern.jsonFileData.brad.url, "link.twitter-brad"); - test.equals(pattern.jsonFileData.dave.url, "link.twitter-dave"); - test.equals(pattern.jsonFileData.brian.url, "link.twitter-brian"); - - //act - pattern_assembler.parse_data_links(patternlab); - - //assert after - test.equals(pattern.jsonFileData.brad.url, "https://twitter.com/brad_frost"); - test.equals(pattern.jsonFileData.dave.url, "https://twitter.com/dmolsen"); - test.equals(pattern.jsonFileData.brian.url, "https://twitter.com/bmuenzenmeyer"); - - test.equals(patternlab.data.brad.url, "https://twitter.com/brad_frost"); - test.equals(patternlab.data.dave.url, "https://twitter.com/dmolsen"); - test.equals(patternlab.data.brian.url, "https://twitter.com/bmuenzenmeyer"); - test.done(); - }, - 'get_pattern_by_key - returns the fuzzy result when no others found' : function(test){ - //arrange - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.patterns = []; - - patternlab.patterns.push({ + //patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/header.html'), 'utf8'); + //patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'templates/pattern-header-footer/footer.html'), 'utf8'); + patternlab.patterns = []; + patternlab.data.link = {}; + patternlab.partials = {}; + + //diveSync once to perform iterative populating of patternlab object + plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab); + + //for the sake of the test, also imagining I have the following pages... + patternlab.data.link['twitter-brad'] = 'https://twitter.com/brad_frost'; + patternlab.data.link['twitter-dave'] = 'https://twitter.com/dmolsen'; + patternlab.data.link['twitter-brian'] = 'https://twitter.com/bmuenzenmeyer'; + + patternlab.data.brad = { url: "link.twitter-brad" }; + patternlab.data.dave = { url: "link.twitter-dave" }; + patternlab.data.brian = { url: "link.twitter-brian" }; + + + var pattern; + for(var i = 0; i < patternlab.patterns.length; i++){ + if(patternlab.patterns[i].patternPartial === 'test-nav'){ + pattern = patternlab.patterns[i]; + } + } + + //assert before + test.equals(pattern.jsonFileData.brad.url, "link.twitter-brad"); + test.equals(pattern.jsonFileData.dave.url, "link.twitter-dave"); + test.equals(pattern.jsonFileData.brian.url, "link.twitter-brian"); + + //act + pattern_assembler.parse_data_links(patternlab); + + //assert after + test.equals(pattern.jsonFileData.brad.url, "https://twitter.com/brad_frost"); + test.equals(pattern.jsonFileData.dave.url, "https://twitter.com/dmolsen"); + test.equals(pattern.jsonFileData.brian.url, "https://twitter.com/bmuenzenmeyer"); + + test.equals(patternlab.data.brad.url, "https://twitter.com/brad_frost"); + test.equals(patternlab.data.dave.url, "https://twitter.com/dmolsen"); + test.equals(patternlab.data.brian.url, "https://twitter.com/bmuenzenmeyer"); + test.done(); + }, + 'get_pattern_by_key - returns the fuzzy result when no others found' : function(test){ + //arrange + var pattern_assembler = new pa(); + var patternlab = {}; + patternlab.patterns = []; + + patternlab.patterns.push({ patternPartial: 'character-han-solo', - subdir: 'character', - fileName: 'han-solo' - }); - - //act - var result = pattern_assembler.findPartial('character-han', patternlab); - //assert - test.equals(result, patternlab.patterns[0]); - test.done(); - }, - 'get_pattern_by_key - returns the exact key if found' : function(test){ - //arrange - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.patterns = []; - - patternlab.patterns.push({ + subdir: 'character', + fileName: 'han-solo' + }); + + //act + var result = pattern_assembler.findPartial('character-han', patternlab); + //assert + test.equals(result, patternlab.patterns[0]); + test.done(); + }, + 'get_pattern_by_key - returns the exact key if found' : function(test){ + //arrange + var pattern_assembler = new pa(); + var patternlab = {}; + patternlab.patterns = []; + + patternlab.patterns.push({ patternPartial: 'molecules-primary-nav-jagged', - subdir: 'molecules', - fileName: 'primary-nav-jagged' - }, { + subdir: 'molecules', + fileName: 'primary-nav-jagged' + }, { patternPartial: 'molecules-primary-nav', - subdir: 'molecules', - fileName: 'molecules-primary-nav' - }); - - //act - var result = pattern_assembler.findPartial('molecules-primary-nav', patternlab); - //assert - test.equals(result, patternlab.patterns[1]); - test.done(); - }, - 'addPattern - adds pattern extended template to patternlab partial object' : function(test){ - //arrange - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.patterns = []; - patternlab.partials = {}; - patternlab.data = {link: {}}; + subdir: 'molecules', + fileName: 'molecules-primary-nav' + }); + + //act + var result = pattern_assembler.findPartial('molecules-primary-nav', patternlab); + //assert + test.equals(result, patternlab.patterns[1]); + test.done(); + }, + 'addPattern - adds pattern extended template to patternlab partial object' : function(test){ + //arrange + var pattern_assembler = new pa(); + var patternlab = {}; + patternlab.patterns = []; + patternlab.partials = {}; + patternlab.data = {link: {}}; patternlab.config = { debug: false }; - var pattern = new Pattern('00-test/01-bar.mustache'); - pattern.extendedTemplate = 'barExtended'; - pattern.template = 'bar'; - - //act - pattern_assembler.addPattern(pattern, patternlab); - - //assert - test.equals(patternlab.patterns.length, 1); - test.equals(patternlab.partials['test-bar'] != undefined, true); - test.equals(patternlab.partials['test-bar'], 'barExtended'); - test.done(); - }, - 'addPattern - adds pattern template to patternlab partial object if extendedtemplate does not exist yet' : function(test){ - //arrange - var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.patterns = []; - patternlab.partials = {}; - patternlab.data = {link: {}}; + var pattern = new Pattern('00-test/01-bar.mustache'); + pattern.extendedTemplate = 'barExtended'; + pattern.template = 'bar'; + + //act + pattern_assembler.addPattern(pattern, patternlab); + + //assert + test.equals(patternlab.patterns.length, 1); + test.equals(patternlab.partials['test-bar'] != undefined, true); + test.equals(patternlab.partials['test-bar'], 'barExtended'); + test.done(); + }, + 'addPattern - adds pattern template to patternlab partial object if extendedtemplate does not exist yet' : function(test){ + //arrange + var pattern_assembler = new pa(); + var patternlab = {}; + patternlab.patterns = []; + patternlab.partials = {}; + patternlab.data = {link: {}}; patternlab.config = { debug: false }; - var pattern = new Pattern('00-test/01-bar.mustache'); - pattern.extendedTemplate = undefined; - pattern.template = 'bar'; - - //act - pattern_assembler.addPattern(pattern, patternlab); - - //assert - test.equals(patternlab.patterns.length, 1); - test.equals(patternlab.partials['test-bar'] != undefined, true); - test.equals(patternlab.partials['test-bar'], 'bar'); - test.done(); - } -*/ - }; + var pattern = new Pattern('00-test/01-bar.mustache'); + pattern.extendedTemplate = undefined; + pattern.template = 'bar'; + + //act + pattern_assembler.addPattern(pattern, patternlab); + + //assert + test.equals(patternlab.patterns.length, 1); + test.equals(patternlab.partials['test-bar'] != undefined, true); + test.equals(patternlab.partials['test-bar'], 'bar'); + test.done(); + } + }; })(); From 3ab0f836ee9965647d23fb2c49fd94e09c77e3a6 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 15:40:58 -0400 Subject: [PATCH 19/44] working pattern_assembler_tests.js --- test/list_item_hunter_tests.js | 11 -- test/pattern_assembler_tests.js | 184 ++++++++------------------------ 2 files changed, 45 insertions(+), 150 deletions(-) diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index 4fe0eb402..8fea01d6c 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -130,7 +130,6 @@ //act var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); - pattern.registerPartial(patternlab); pattern.engine.preprocessPartials(pattern_assembler, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); @@ -159,12 +158,10 @@ //act var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-verbose-foo.mustache", patternlab); - pattern1.registerPartial(patternlab); pattern1.engine.preprocessPartials(pattern_assembler, patternlab); pattern_assembler.process_pattern_recursive(pattern1.relPath, patternlab, pattern1); var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/02-listitem-verbose-bar.mustache", patternlab); - pattern2.registerPartial(patternlab); pattern2.engine.preprocessPartials(pattern_assembler, patternlab); pattern_assembler.process_pattern_recursive(pattern2.relPath, patternlab, pattern2); @@ -195,7 +192,6 @@ { "title": "Two" } ] }; - pattern.registerPartial(patternlab); pattern.engine.preprocessPartials(pattern_assembler, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); @@ -241,7 +237,6 @@ { "title": "Two" } ] }; - pattern.registerPartial(patternlab); pattern.engine.preprocessPartials(pattern_assembler, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); @@ -277,7 +272,6 @@ { "title": "Two" } ] }; - pattern.registerPartial(patternlab); pattern.engine.preprocessPartials(pattern_assembler, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); @@ -324,13 +318,11 @@ //act var atomPattern = pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); pl.patterns.push(atomPattern); - atomPattern.registerPartial(pl); atomPattern.engine.preprocessPartials(pattern_assembler, pl); pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); var bookendPattern = pattern_assembler.process_pattern_iterative('00-test/11-bookend-listitem.mustache', pl); pl.patterns.push(bookendPattern); - bookendPattern.registerPartial(pl); bookendPattern.engine.preprocessPartials(pattern_assembler, pl); pattern_assembler.process_pattern_recursive(bookendPattern.relPath, pl, bookendPattern); @@ -347,19 +339,16 @@ //act var atomPattern = pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); pl.patterns.push(atomPattern); - atomPattern.registerPartial(pl); atomPattern.engine.preprocessPartials(pattern_assembler, pl); pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); var anotherStyledAtomPattern = pattern_assembler.process_pattern_iterative('00-test/12-another-styled-atom.mustache', pl); pl.patterns.push(anotherStyledAtomPattern); - anotherStyledAtomPattern.registerPartial(pl); anotherStyledAtomPattern.engine.preprocessPartials(pattern_assembler, pl); pattern_assembler.process_pattern_recursive(anotherStyledAtomPattern.relPath, pl, anotherStyledAtomPattern); var listPattern = pattern_assembler.process_pattern_iterative('00-test/13-listitem.mustache', pl); pl.patterns.push(listPattern); - listPattern.registerPartial(pl); listPattern.engine.preprocessPartials(pattern_assembler, pl); pattern_assembler.process_pattern_recursive(listPattern.relPath, pl, listPattern); diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 0da065f8c..038dbe896 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -11,9 +11,7 @@ //tests inclusion of partial that will be discovered by diveSync later in iteration than parent //prepare to diveSync - var diveSync = require('diveSync'); var fs = require('fs-extra'); - var pa = require('../core/lib/pattern_assembler'); var plMain = require('../core/lib/patternlab'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns'; @@ -33,7 +31,7 @@ patternlab.data.link = {}; patternlab.partials = {}; - //diveSync once to perform iterative populating of patternlab object + //iteratively populate the patternlab object plMain.process_all_patterns_iterative(pattern_assembler, patterns_dir, patternlab); // preprocess partials so they can be recursively included respecting any parameters they may be submitting @@ -49,7 +47,7 @@ engine.preprocessPartials(pattern_assembler, patternlab); } - //diveSync again to recursively include partials, filling out the + //recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements plMain.process_all_patterns_recursive(pattern_assembler, patterns_dir, patternlab); @@ -77,7 +75,6 @@ 'processPatternRecursive - correctly replaces all stylemodifiers when multiple duplicate patterns with different stylemodifiers found' : function(test){ //arrange - var fs = require('fs-extra'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns'; @@ -95,22 +92,10 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var groupPattern = new Pattern('00-test/04-group.mustache'); - groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/04-group.mustache', 'utf8'); - groupPattern.extendedTemplate = groupPattern.template; - groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(groupPattern, pl); - - //act - - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '04-group.mustache', pl, {}); + var groupPattern = pattern_assembler.process_pattern_iterative('00-test/04-group.mustache', pl); + pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); + groupPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(groupPattern.relPath, pl, groupPattern); //assert var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; @@ -119,7 +104,6 @@ }, 'processPatternRecursive - correctly replaces multiple stylemodifier classes on same partial' : function(test){ //arrange - var fs = require('fs-extra'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns'; @@ -137,23 +121,13 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); - - var groupPattern = new Pattern('00-test/10-multiple-classes-numeric.mustache'); - groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/10-multiple-classes-numeric.mustache', 'utf8'); - groupPattern.extendedTemplate = groupPattern.template; - groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); - groupPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(groupPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(groupPattern, pl); + var groupPattern = pattern_assembler.process_pattern_iterative('00-test/10-multiple-classes-numeric.mustache', pl); + pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); + groupPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(groupPattern.relPath, pl, groupPattern); //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '10-multiple-classes-numeric.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('00-test/10-multiple-classes-numeric.mustache', pl, groupPattern); //assert var expectedValue = '
{{message}} {{message}} bar
'; @@ -162,7 +136,6 @@ }, 'processPatternRecursive - correctly ignores a partial without a style modifier when the same partial later has a style modifier' : function(test){ //arrange - var fs = require('fs-extra'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns'; @@ -180,21 +153,10 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var mixedPattern = new Pattern('00-test/06-mixed.mustache'); - mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/06-mixed.mustache', 'utf8'); - mixedPattern.extendedTemplate = mixedPattern.template; - mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(mixedPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '06-mixed.mustache', pl, {}); + var mixedPattern = pattern_assembler.process_pattern_iterative('00-test/06-mixed.mustache', pl); + pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); + mixedPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(mixedPattern.relPath, pl, mixedPattern); //assert. here we expect {{styleModifier}} to be in the first group, since it was not replaced by anything. rendering with data will then remove this (correctly) var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; @@ -203,7 +165,6 @@ }, 'processPatternRecursive - correctly ignores bookended partials without a style modifier when the same partial has a style modifier between' : function(test){ //arrange - var fs = require('fs-extra'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns'; @@ -221,21 +182,10 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var bookendPattern = new Pattern('00-test/09-bookend.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/09-bookend.mustache', 'utf8'); - bookendPattern.extendedTemplate = bookendPattern.template; - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(bookendPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '09-bookend.mustache', pl, {}); + var bookendPattern = pattern_assembler.process_pattern_iterative('00-test/09-bookend.mustache', pl); + pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); + bookendPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(bookendPattern.relPath, pl, bookendPattern); //assert. here we expect {{styleModifier}} to be in the first and last group, since it was not replaced by anything. rendering with data will then remove this (correctly) var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; @@ -245,7 +195,6 @@ }, 'processPatternRecursive - correctly ignores a partial without a style modifier when the same partial later has a style modifier and pattern parameters' : function(test){ //arrange - var fs = require('fs-extra'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns'; @@ -263,23 +212,10 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); - - var mixedPattern = new Pattern('00-test/07-mixed-params.mustache'); - mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/07-mixed-params.mustache', 'utf8'); - mixedPattern.extendedTemplate = mixedPattern.template; - mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); - mixedPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(mixedPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(mixedPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '07-mixed-params.mustache', pl, {}); + var mixedPattern = pattern_assembler.process_pattern_iterative('00-test/07-mixed-params.mustache', pl); + pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); + mixedPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(mixedPattern.relPath, pl, mixedPattern); //assert. here we expect {{styleModifier}} to be in the first span, since it was not replaced by anything. rendering with data will then remove this (correctly) var expectedValue = '
{{message}} 2 3 4
'; @@ -288,7 +224,6 @@ }, 'processPatternRecursive - correctly ignores bookended partials without a style modifier when the same partial has a style modifier and pattern parameters between' : function(test){ //arrange - var fs = require('fs-extra'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns'; @@ -306,23 +241,10 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new Pattern('00-test/03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.extendedTemplate = atomPattern.template; - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); - - var bookendPattern = new Pattern('00-test/08-bookend-params.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/08-bookend-params.mustache', 'utf8'); - bookendPattern.extendedTemplate = bookendPattern.template; - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); - bookendPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(bookendPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(bookendPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('00-test' + path.sep + '08-bookend-params.mustache', pl, {}); + var bookendPattern = pattern_assembler.process_pattern_iterative('00-test/08-bookend-params.mustache', pl); + pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); + bookendPattern.engine.preprocessPartials(pattern_assembler, pl); + pattern_assembler.process_pattern_recursive(bookendPattern.relPath, pl, bookendPattern); //assert. here we expect {{styleModifier}} to be in the first and last span, since it was not replaced by anything. rendering with data will then remove this (correctly) var expectedValue = '
{{message}} 2 3 {{message}}
'; @@ -402,9 +324,9 @@ patternlab.data.link['twitter-dave'] = 'https://twitter.com/dmolsen'; patternlab.data.link['twitter-brian'] = 'https://twitter.com/bmuenzenmeyer'; - patternlab.data.brad = { url: "link.twitter-brad" }; - patternlab.data.dave = { url: "link.twitter-dave" }; - patternlab.data.brian = { url: "link.twitter-brian" }; + patternlab.data.brad = { url: "link.twitter-brad" }; + patternlab.data.dave = { url: "link.twitter-dave" }; + patternlab.data.brian = { url: "link.twitter-brian" }; var pattern; @@ -475,45 +397,29 @@ 'addPattern - adds pattern extended template to patternlab partial object' : function(test){ //arrange var pattern_assembler = new pa(); - var patternlab = {}; - patternlab.patterns = []; - patternlab.partials = {}; - patternlab.data = {link: {}}; - patternlab.config = { debug: false }; - - var pattern = new Pattern('00-test/01-bar.mustache'); - pattern.extendedTemplate = 'barExtended'; - pattern.template = 'bar'; - - //act - pattern_assembler.addPattern(pattern, patternlab); + var patterns_dir = './test/files/_patterns'; - //assert - test.equals(patternlab.patterns.length, 1); - test.equals(patternlab.partials['test-bar'] != undefined, true); - test.equals(patternlab.partials['test-bar'], 'barExtended'); - test.done(); - }, - 'addPattern - adds pattern template to patternlab partial object if extendedtemplate does not exist yet' : function(test){ - //arrange - var pattern_assembler = new pa(); var patternlab = {}; patternlab.patterns = []; patternlab.partials = {}; patternlab.data = {link: {}}; - patternlab.config = { debug: false }; - - var pattern = new Pattern('00-test/01-bar.mustache'); - pattern.extendedTemplate = undefined; - pattern.template = 'bar'; + patternlab.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; - //act - pattern_assembler.addPattern(pattern, patternlab); + var fooPattern = pattern_assembler.process_pattern_iterative('00-test/00-foo.mustache', patternlab); + pattern_assembler.process_pattern_iterative('00-test/01-bar.mustache', patternlab); + fooPattern.engine.preprocessPartials(pattern_assembler, patternlab); + pattern_assembler.process_pattern_recursive(fooPattern.relPath, patternlab, fooPattern); //assert - test.equals(patternlab.patterns.length, 1); - test.equals(patternlab.partials['test-bar'] != undefined, true); - test.equals(patternlab.partials['test-bar'], 'bar'); + test.equals(patternlab.patterns.length, 2); + test.equals(patternlab.partials['{{> test-bar }}'].partial, 'test-bar'); + test.equals(patternlab.partials['{{> test-bar }}'].content.trim(), 'bar'); test.done(); } }; From 18cee7a61edba984426606ff194d031e049212f3 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 15:44:07 -0400 Subject: [PATCH 20/44] cleaning up pattern_assembler.js --- core/lib/pattern_assembler.js | 80 ++++++++++++----------------------- 1 file changed, 27 insertions(+), 53 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 8fd9233d9..80d26ed8d 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -193,6 +193,32 @@ var pattern_assembler = function () { } } + /** + * Recursively get all the property keys from the JSON data for a pattern. + * + * @param {object} data + * @param {array} uniqueKeys The array of unique keys to be added to and returned. + * @returns {array} keys A flat, one-dimensional array. + */ + function getDataKeys(data, uniqueKeys) { + for (var key in data) { + if (data.hasOwnProperty(key)) { + if (data.constructor !== Array) { + if (uniqueKeys.indexOf(key) === -1) { + uniqueKeys.push(key); + } else { + continue; + } + } + if (typeof data[key] === 'object') { + getDataKeys(data[key], uniqueKeys); + } + } + } + + return uniqueKeys; + } + function processPatternIterative(relPath, patternlab) { //check if the found file is a top-level markdown file @@ -320,7 +346,7 @@ var pattern_assembler = function () { addPattern(currentPattern, patternlab); //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json -// pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); + pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); return currentPattern; } @@ -341,28 +367,6 @@ var pattern_assembler = function () { } } } -//console.info(file); -if (file !== '02-organisms/accordions/_format-editions~format.mustache') { -// return; - /* -console.info(file); -console.info(currentPattern.extendedTemplate); -console.info(); -console.info(); -*/ -} -//console.info(currentPattern.dataKeys); -//console.info(currentPattern.extendedTemplate); -if (file.indexOf('04-pages/video-page.mustache') > -1) { -//console.info('currentPattern.extendedTemplate'); -//console.info(currentPattern.extendedTemplate); -//console.info(patternlab.partialsCompiled['03-templates/system/page(04_video_page\\?: true)']); - /* - console.info('GUH'); - console.info(file); - process.exit(); - */ -} //return if processing an ignored file if (typeof currentPattern === 'undefined') { return; } @@ -372,10 +376,6 @@ if (file.indexOf('04-pages/video-page.mustache') > -1) { //find how many partials there may be for the given pattern currentPattern.patternPartials = currentPattern.findPartials(); -if (currentPattern.relPath === '01-molecules/listing-items/titles-item.mustache') { -// console.info(currentPattern.template); -// console.info(currentPattern.patternPartials); -} //expand any partials present in this pattern; that is, drill down into the //template and replace their calls in this template with rendered results @@ -448,32 +448,6 @@ if (currentPattern.relPath === '01-molecules/listing-items/titles-item.mustache' } } - /** - * Recursively get all the property keys from the JSON data for a pattern. - * - * @param {object} data - * @param {array} uniqueKeys The array of unique keys to be added to and returned. - * @returns {array} keys A flat, one-dimensional array. - */ - function getDataKeys(data, uniqueKeys) { - for (var key in data) { - if (data.hasOwnProperty(key)) { - if (data.constructor !== Array) { - if (uniqueKeys.indexOf(key) === -1) { - uniqueKeys.push(key); - } else { - continue; - } - } - if (typeof data[key] === 'object') { - getDataKeys(data[key], uniqueKeys); - } - } - } - - return uniqueKeys; - } - return { find_pattern_partials: function (pattern) { return pattern.findPartials(); From 321466400b287785ee58097831d3c7dbca5f28fe Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 30 Jul 2016 16:26:42 -0400 Subject: [PATCH 21/44] preprocessing partials --- core/lib/patternlab.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index d721de09f..89f0c5085 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -235,6 +235,19 @@ var patternlab_engine = function (config) { // diveSync once to perform iterative populating of patternlab object processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab); + // preprocess partials so they can be recursively included respecting any parameters they may be submitting + var engine; + for (var i = 0; i < patternlab.patterns.length; i++) { + if (patternlab.patterns[i].isPattern) { + engine = patternlab.patterns[i].engine; + break; + } + } + + if (typeof engine.preprocessPartials === 'function') { + engine.preprocessPartials(pattern_assembler, patternlab); + } + //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements processAllPatternsRecursive(pattern_assembler, patterns_dir, patternlab); From c905356cfea49dfc6fe28028e204782c555e85bc Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sun, 31 Jul 2016 13:24:37 -0400 Subject: [PATCH 22/44] patternlab.js updates --- core/lib/patternlab.js | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 89f0c5085..fc3b062b4 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -80,8 +80,7 @@ function processAllPatternsRecursive(pattern_assembler, patterns_dir, patternlab var patternlab_engine = function (config) { 'use strict'; - var JSON5 = require('json5'), - fs = require('fs-extra'), + var fs = require('fs-extra'), pa = require('./pattern_assembler'), pe = require('./pattern_exporter'), lh = require('./lineage_hunter'), @@ -314,21 +313,13 @@ var patternlab_engine = function (config) { pattern.patternLineageRExists = pattern.lineageR.length > 0; pattern.patternLineageEExists = pattern.patternLineageExists || pattern.patternLineageRExists; - //render the pattern, but first consolidate any data we may have - var allData; - try { - allData = JSON5.parse(JSON5.stringify(patternlab.data)); - } catch (err) { - console.log('There was an error parsing JSON for ' + pattern.relPath); - console.log(err); - } - allData = plutils.mergeData(allData, pattern.jsonFileData); - allData.cacheBuster = patternlab.cacheBuster; + //set cacheBuster property + pattern.allData.cacheBuster = patternlab.cacheBuster; - var headHTML = pattern_assembler.renderPattern(pattern.header, allData); + var headHTML = pattern_assembler.renderPattern(pattern.header, pattern.allData); //render the extendedTemplate with all data - pattern.patternPartialCode = pattern_assembler.renderPattern(pattern, allData); + pattern.extendedTemplate = pattern_assembler.renderPattern(pattern, pattern.allData); //todo see if this is still needed //pattern.patternPartialCodeE = entity_encoder.encode(pattern.patternPartialCode); @@ -380,7 +371,7 @@ var patternlab_engine = function (config) { outputFileSuffixes = _.extend(outputFileSuffixes, patternlab.config.outputFileSuffixes); //write the compiled template to the public patterns directory - var patternPage = headHTML + pattern.patternPartialCode + footerHTML; + var patternPage = headHTML + pattern.extendedTemplate + footerHTML; fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', outputFileSuffixes.rendered + '.html'), patternPage); //write the mustache file too From d601a6852ae507df548107a1d9f24aa4d0d0bcad Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sun, 31 Jul 2016 14:59:32 -0400 Subject: [PATCH 23/44] tighter partial_hunter logic --- core/lib/partial_hunter.js | 51 ++++++++++++-------------------------- 1 file changed, 16 insertions(+), 35 deletions(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index 159fb1806..f9d0e46df 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -14,8 +14,8 @@ var partial_hunter = function () { isMatch, newTemplate = pattern.extendedTemplate, partialContent, - partialsAfter, - partialsBefore = pattern.findPartials() || [], + partials, + partialsUnique, pMatch, regex, regexStr, @@ -37,41 +37,18 @@ var partial_hunter = function () { //unescape data keys and partial includes newTemplate = newTemplate.replace(/\u0002/g, '{{'); -if (pattern.relPath === '02-organisms/social/social-quiz.mustache') { -// console.info(patternlab.partials); -//process.exit(); - console.info(pattern.relPath); - console.info(newTemplate); -} - - //render this pattern immediately, so as to delete false conditions -// tmpTemplate = pattern.engine.renderPattern(tmpTemplate, pattern.allData); - - //unescape partial includes -// newTemplate = newTemplate.replace(/\u0002/g, '{{>'); - partialsAfter = pattern.engine.findPartials(newTemplate) || []; - - //delete partials within false conditions - /* - for (i = 0; i < partialsBefore.length; i++) { - isMatch = false; - - for (j = 0; j < partialsAfter.length; j++) { - if (partialsBefore[i] === partialsAfter[j]) { - isMatch = true; - break; - } - } - if (!isMatch) { - newTemplate = newTemplate.replace(partialsBefore[i], ''); - } - } - */ + //find all remaining partial tags + partials = pattern.engine.findPartials(newTemplate) || []; + + //create array of unique elements so the tags can be use for global replace + partialsUnique = partials.filter(function (value, index, thisArray) { + return thisArray.indexOf(value) === index; + }); //replace remaining partials with their content - for (i = 0; i < partialsAfter.length; i++) { - pMatch = partialsAfter[i]; + for (i = 0; i < partialsUnique.length; i++) { + pMatch = partialsUnique[i]; for (j in patternlab.partials) { if (patternlab.partials.hasOwnProperty(j)) { @@ -88,7 +65,11 @@ if (pattern.relPath === '02-organisms/social/social-quiz.mustache') { partialContent = tmpPattern.extendedTemplate; } - newTemplate = newTemplate.replace(tag, partialContent); + //we want to globally replace instances of this tag in case it was + //included within a partial from within this for loop + regexStr = pattern.engine.escapeReservedRegexChars(tag); + regex = new RegExp(regexStr, 'g'); + newTemplate = newTemplate.replace(regex, partialContent); } } } From 95851db2ff13f16b90429ea2e168602304592441 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sun, 31 Jul 2016 15:30:02 -0400 Subject: [PATCH 24/44] dataKeys array includes mustache tags with dotted-object-key notation --- core/lib/pattern_assembler.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 80d26ed8d..1ba2ed749 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -198,20 +198,34 @@ var pattern_assembler = function () { * * @param {object} data * @param {array} uniqueKeys The array of unique keys to be added to and returned. + * @param {string} prefixParam The dotted-object-key notation tracing the lineage of nested objects. * @returns {array} keys A flat, one-dimensional array. */ - function getDataKeys(data, uniqueKeys) { + function getDataKeys(data, uniqueKeys, prefixParam) { + var prefix = prefixParam || ''; + var prefixSplit; + var prefixTmp; + for (var key in data) { if (data.hasOwnProperty(key)) { if (data.constructor !== Array) { if (uniqueKeys.indexOf(key) === -1) { uniqueKeys.push(key); + if (prefix) { + prefixSplit = prefix.split('.'); + prefixTmp = ''; + for (var i = prefixSplit.length - 2; i >= 0; i--) { + prefixTmp = prefixSplit[i] + '.' + prefixTmp; + uniqueKeys.push(prefixTmp + key); + } + } } else { continue; } } if (typeof data[key] === 'object') { - getDataKeys(data[key], uniqueKeys); + prefix += key + '.'; + getDataKeys(data[key], uniqueKeys, prefix); } } } From 6c4767f4bcef4bde1007abba771c24c50490d407 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sun, 31 Jul 2016 16:35:16 -0400 Subject: [PATCH 25/44] more efficient data parse and stronger getDataKeys --- core/lib/pattern_assembler.js | 70 ++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 1ba2ed749..58e8843b8 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -208,24 +208,34 @@ var pattern_assembler = function () { for (var key in data) { if (data.hasOwnProperty(key)) { + if (data.constructor !== Array) { if (uniqueKeys.indexOf(key) === -1) { uniqueKeys.push(key); - if (prefix) { - prefixSplit = prefix.split('.'); - prefixTmp = ''; - for (var i = prefixSplit.length - 2; i >= 0; i--) { - prefixTmp = prefixSplit[i] + '.' + prefixTmp; + } + + if (prefix) { + prefixSplit = prefix.split('.'); + prefixTmp = ''; + + for (var i = prefixSplit.length - 2; i >= 0; i--) { + prefixTmp = prefixSplit[i] + '.' + prefixTmp; + + if (uniqueKeys.indexOf(prefixTmp + key) === -1) { uniqueKeys.push(prefixTmp + key); } } - } else { - continue; } } - if (typeof data[key] === 'object') { - prefix += key + '.'; - getDataKeys(data[key], uniqueKeys, prefix); + + if (data[key] instanceof Object) { + prefixTmp = ''; + + if (data.constructor !== Array) { + prefixTmp = prefix + key + '.'; + } + + getDataKeys(data[key], uniqueKeys, prefixTmp); } } } @@ -292,27 +302,36 @@ var pattern_assembler = function () { setState(currentPattern, patternlab, true); //look for a json file for this template + var jsonFilename = ''; + var jsonFilenameStats; + var jsonFileStr = ''; try { - var jsonFilename = path.resolve(patternsPath, currentPattern.subdir, currentPattern.fileName + ".json"); + var jsonFilename = path.resolve(patternsPath, currentPattern.subdir, currentPattern.fileName + '.json'); + var jsonFilenameStats = fs.statSync(jsonFilename); + } catch (err) { + //not a file + } + + if (jsonFilenameStats && jsonFilenameStats.isFile()) { try { - var jsonFilenameStats = fs.statSync(jsonFilename); - } catch (err) { - //not a file - } - if (jsonFilenameStats && jsonFilenameStats.isFile()) { - currentPattern.jsonFileData = fs.readJSONSync(jsonFilename); + jsonFileStr = fs.readFileSync(jsonFilename, 'utf8'); + currentPattern.jsonFileData = JSON5.parse(jsonFileStr); if (patternlab.config.debug) { console.log('processPatternIterative: found pattern-specific data.json for ' + currentPattern.patternPartial); } + } catch (err) { + console.log('There was an error parsing sibling JSON for ' + currentPattern.relPath); + console.log(err); } } - catch (err) { - console.log('There was an error parsing sibling JSON for ' + currentPattern.relPath); - console.log(err); - } //merge global data into a clone of local jsonFileData - var localDataClone = JSON.parse(JSON.stringify(currentPattern.jsonFileData)); + var localDataClone = {}; + try { + localDataClone = JSON5.parse(jsonFileStr); + } catch (err) { + //already threw error in last try/catch + } currentPattern.allData = plutils.mergeData(patternlab.data, localDataClone); //add allData keys to currentPattern.dataKeys @@ -365,18 +384,19 @@ var pattern_assembler = function () { return currentPattern; } - function processPatternRecursive(file, patternlab, origPatternParam) { + function processPatternRecursive(relPath, patternlab, origPatternParam) { var lineage_hunter = new lh(); - //find current pattern in patternlab object using var file as a partial var currentPattern, i; + //find current pattern in patternlab object either as passed as a param + //or by identifying by relPath if (origPatternParam) { currentPattern = origPatternParam; } else { for (i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].relPath === file) { + if (patternlab.patterns[i].relPath === relPath) { currentPattern = patternlab.patterns[i]; } } From c85a44f440595a01ef315c016cbc6216a6e6d340 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sun, 31 Jul 2016 22:29:35 -0400 Subject: [PATCH 26/44] more efficient getDataKeys --- core/lib/partial_hunter.js | 13 +++++++++---- core/lib/pattern_assembler.js | 11 ++++++----- core/lib/patternlab.js | 7 +++++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index f9d0e46df..b9ecfb85a 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -10,7 +10,6 @@ var partial_hunter = function () { function replacePartials(pattern, patternlab) { var i, j, - dataKeys = pattern.dataKeys, isMatch, newTemplate = pattern.extendedTemplate, partialContent, @@ -23,9 +22,15 @@ var partial_hunter = function () { tmpPattern, tmpTemplate; - //escape data keys so they are not erased by a render - for (i = 0; i < dataKeys.length; i++) { - regex = new RegExp('\\{\\{(\\S?\\s*' + dataKeys[i] + '\\s*\\}?\\}\\})', 'g'); + //escape global data keys so they are not erased by a render + for (i = 0; i < patternlab.dataKeys.length; i++) { + regex = new RegExp('\\{\\{(\\S?\\s*' + patternlab.dataKeys[i] + '\\s*\\}?\\}\\})', 'g'); + newTemplate = newTemplate.replace(regex, '\u0002$1'); + } + + //escape local data keys so they are not erased by a render + for (i = 0; i < pattern.dataKeys.length; i++) { + regex = new RegExp('\\{\\{(\\S?\\s*' + pattern.dataKeys[i] + '\\s*\\}?\\}\\})', 'g'); newTemplate = newTemplate.replace(regex, '\u0002$1'); } diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 58e8843b8..482d932fa 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -197,14 +197,15 @@ var pattern_assembler = function () { * Recursively get all the property keys from the JSON data for a pattern. * * @param {object} data - * @param {array} uniqueKeys The array of unique keys to be added to and returned. + * @param {array} uniqueKeysParam The array of unique keys to be added to and returned. * @param {string} prefixParam The dotted-object-key notation tracing the lineage of nested objects. * @returns {array} keys A flat, one-dimensional array. */ - function getDataKeys(data, uniqueKeys, prefixParam) { + function getDataKeys(data, uniqueKeysParam, prefixParam) { var prefix = prefixParam || ''; var prefixSplit; var prefixTmp; + var uniqueKeys = uniqueKeysParam || []; for (var key in data) { if (data.hasOwnProperty(key)) { @@ -335,7 +336,7 @@ var pattern_assembler = function () { currentPattern.allData = plutils.mergeData(patternlab.data, localDataClone); //add allData keys to currentPattern.dataKeys - currentPattern.dataKeys = getDataKeys(currentPattern.allData, []); + currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); for (var i = 0; i < list_item_hunter.items.length; i++) { currentPattern.dataKeys.push('listItems.' + list_item_hunter.items[i]); currentPattern.dataKeys.push('listitems.' + list_item_hunter.items[i]); @@ -386,8 +387,8 @@ var pattern_assembler = function () { function processPatternRecursive(relPath, patternlab, origPatternParam) { var lineage_hunter = new lh(); - - var currentPattern, i; + var currentPattern; + var i; //find current pattern in patternlab object either as passed as a param //or by identifying by relPath diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index fc3b062b4..55af92abe 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -200,6 +200,13 @@ var patternlab_engine = function (config) { plutils.logRed('missing or malformed' + paths.source.data + 'data.json Pattern Lab may not work without this file.'); patternlab.data = {}; } + try { + var pattern_assembler = new pa(); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data); + } catch (ex) { + plutils.logRed(ex); + patternlab.dataKeys = []; + } try { patternlab.listitems = fs.readJSONSync(path.resolve(paths.source.data, 'listitems.json')); } catch (ex) { From 8c10e16fca1fb6e3cb984e971d3511f084af234e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 1 Aug 2016 09:23:17 -0400 Subject: [PATCH 27/44] code cleanup --- core/lib/list_item_hunter.js | 15 +++---- core/lib/partial_hunter.js | 78 ++++++++++++++++++++++++----------- core/lib/pattern_assembler.js | 33 +++------------ 3 files changed, 66 insertions(+), 60 deletions(-) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 2e48e349c..1deecb505 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -5,23 +5,20 @@ var list_item_hunter = function () { var extend = require('util')._extend, JSON5 = require('json5'), pa = require('./pattern_assembler'), - smh = require('./style_modifier_hunter'), - plutils = require('./utilities'), - Pattern = require('./object_factory').Pattern; + plutils = require('./utilities'); var pattern_assembler = new pa(), - style_modifier_hunter = new smh(), items = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty']; function getEnd(liMatch) { return liMatch.replace('#', '/'); - }; + } function getPatternBlock(pattern, liMatch, end) { return pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch) + liMatch.length, pattern.extendedTemplate.indexOf(end)); } - function preprocessListItemPartials(pattern, patternlab) { + function preprocessListItemPartials(pattern) { //find any listitem blocks var matches = pattern.findListItems(); @@ -44,7 +41,7 @@ var list_item_hunter = function () { } } - function postprocessListItemPartials(pattern, patternlab) { + function postprocessListItemPartials(pattern) { //find any listitem blocks var matches = pattern.extendedTemplate.match(/\u0002(.|\s)*?\}\}/g); @@ -58,7 +55,7 @@ var list_item_hunter = function () { } function processListItemPartials(pattern, patternlab) { - preprocessListItemPartials(pattern, patternlab); + preprocessListItemPartials(pattern); //find any listitem blocks var matches = pattern.findListItems(); @@ -122,7 +119,7 @@ var list_item_hunter = function () { }); } - postprocessListItemPartials(pattern, patternlab); + postprocessListItemPartials(pattern); } return { diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index b9ecfb85a..a086c1580 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -2,35 +2,67 @@ var partial_hunter = function () { - var lih = require('./list_item_hunter'), - smh = require('./style_modifier_hunter'), - list_item_hunter = new lih(), - style_modifier_hunter = new smh(); + var smh = require('./style_modifier_hunter'); + var style_modifier_hunter = new smh(); function replacePartials(pattern, patternlab) { - var i, - j, - isMatch, - newTemplate = pattern.extendedTemplate, - partialContent, - partials, - partialsUnique, - pMatch, - regex, - regexStr, - tag, - tmpPattern, - tmpTemplate; - - //escape global data keys so they are not erased by a render + var dataKey; + var dataKeysRegex; + var escapedKeys = ''; + var i; + var j; + var newTemplate = pattern.extendedTemplate; + var partialContent; + var partials; + var partialsUnique; + var pMatch; + var regex; + var regexStr; + var tag; + var tmpPattern; + + //escape all tags that match keys in the JSON data. + //it can be significantly faster to process large dataKey arrays in one read + //with a large regex than to read many times and process with small regexes. + //this is especially true with large templates. + //escape global data keys for (i = 0; i < patternlab.dataKeys.length; i++) { - regex = new RegExp('\\{\\{(\\S?\\s*' + patternlab.dataKeys[i] + '\\s*\\}?\\}\\})', 'g'); - newTemplate = newTemplate.replace(regex, '\u0002$1'); + dataKey = patternlab.dataKeys[i]; + if (typeof pattern.engine.escapeReservedRegexChars === 'function') { + dataKey = pattern.engine.escapeReservedRegexChars(dataKey); + } + escapedKeys += dataKey; + if (i < patternlab.dataKeys.length - 1) { + escapedKeys += '|'; + } } - //escape local data keys so they are not erased by a render + //escape local data keys for (i = 0; i < pattern.dataKeys.length; i++) { - regex = new RegExp('\\{\\{(\\S?\\s*' + pattern.dataKeys[i] + '\\s*\\}?\\}\\})', 'g'); + dataKey = pattern.dataKeys[i]; + if (typeof pattern.engine.escapeReservedRegexChars === 'function') { + dataKey = pattern.engine.escapeReservedRegexChars(dataKey); + } + if (i === 0) { + escapedKeys += '|'; + } + escapedKeys += dataKey; + if (i < patternlab.dataKeys.length - 1) { + escapedKeys += '|'; + } + } + + escapedKeys += ')'; + + dataKeysRegex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)(' + escapedKeys + '\\s*)\\}\\}', 'g'); + + newTemplate = newTemplate.replace(dataKeysRegex, '\u0002$1}}'); + + //removing empty lines for some reason reduces rendering time considerably. + newTemplate = newTemplate.replace(/^\s*$\n/gm, ''); + + for (i = 0; i < patternlab.dataKeys.length; i++) { + regex = new RegExp('\\{\\{(\\S?\\s*' + patternlab.dataKeys[i] + '\\s*\\}?\\}\\})', 'g'); newTemplate = newTemplate.replace(regex, '\u0002$1'); } diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 482d932fa..8b8528da7 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -198,45 +198,22 @@ var pattern_assembler = function () { * * @param {object} data * @param {array} uniqueKeysParam The array of unique keys to be added to and returned. - * @param {string} prefixParam The dotted-object-key notation tracing the lineage of nested objects. * @returns {array} keys A flat, one-dimensional array. */ - function getDataKeys(data, uniqueKeysParam, prefixParam) { - var prefix = prefixParam || ''; - var prefixSplit; - var prefixTmp; + function getDataKeys(data, uniqueKeysParam) { var uniqueKeys = uniqueKeysParam || []; for (var key in data) { if (data.hasOwnProperty(key)) { - if (data.constructor !== Array) { if (uniqueKeys.indexOf(key) === -1) { uniqueKeys.push(key); - } - - if (prefix) { - prefixSplit = prefix.split('.'); - prefixTmp = ''; - - for (var i = prefixSplit.length - 2; i >= 0; i--) { - prefixTmp = prefixSplit[i] + '.' + prefixTmp; - - if (uniqueKeys.indexOf(prefixTmp + key) === -1) { - uniqueKeys.push(prefixTmp + key); - } - } + } else { + continue; } } - - if (data[key] instanceof Object) { - prefixTmp = ''; - - if (data.constructor !== Array) { - prefixTmp = prefix + key + '.'; - } - - getDataKeys(data[key], uniqueKeys, prefixTmp); + if (typeof data[key] === 'object') { + getDataKeys(data[key], uniqueKeys); } } } From f493ee7ee1f13d2e0367105b355a921fd6f59f1e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 1 Aug 2016 10:18:32 -0400 Subject: [PATCH 28/44] more efficient data key escape --- core/lib/partial_hunter.js | 11 +---------- core/lib/pattern_assembler.js | 4 ---- core/lib/patternlab.js | 32 +++++++++++++++++++++++++++++--- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index a086c1580..987701a35 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -26,16 +26,7 @@ var partial_hunter = function () { //with a large regex than to read many times and process with small regexes. //this is especially true with large templates. //escape global data keys - for (i = 0; i < patternlab.dataKeys.length; i++) { - dataKey = patternlab.dataKeys[i]; - if (typeof pattern.engine.escapeReservedRegexChars === 'function') { - dataKey = pattern.engine.escapeReservedRegexChars(dataKey); - } - escapedKeys += dataKey; - if (i < patternlab.dataKeys.length - 1) { - escapedKeys += '|'; - } - } + escapedKeys = patternlab.dataKeysEscape; //escape local data keys for (i = 0; i < pattern.dataKeys.length; i++) { diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 8b8528da7..ef59d24db 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -314,10 +314,6 @@ var pattern_assembler = function () { //add allData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); - for (var i = 0; i < list_item_hunter.items.length; i++) { - currentPattern.dataKeys.push('listItems.' + list_item_hunter.items[i]); - currentPattern.dataKeys.push('listitems.' + list_item_hunter.items[i]); - } //look for a listitems.json file for this template try { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 55af92abe..0bf00023e 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -84,6 +84,7 @@ var patternlab_engine = function (config) { pa = require('./pattern_assembler'), pe = require('./pattern_exporter'), lh = require('./lineage_hunter'), + lih = require('./list_item_hunter'), buildFrontEnd = require('./ui_builder'), plutils = require('./utilities'), sm = require('./starterkit_manager'), @@ -194,6 +195,10 @@ var patternlab_engine = function (config) { } function buildPatterns(deletePatternDir) { + var i; + var list_item_hunter = new lih(); + var pattern_assembler = new pa(); + try { patternlab.data = buildPatternData(paths.source.data, fs); } catch (ex) { @@ -201,7 +206,8 @@ var patternlab_engine = function (config) { patternlab.data = {}; } try { - var pattern_assembler = new pa(); + //create this properties to later escape all tags that match keys in the + //JSON data so these tags persist through recursive partial includes. patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data); } catch (ex) { plutils.logRed(ex); @@ -237,19 +243,39 @@ var patternlab_engine = function (config) { patterns_dir = paths.source.patterns; pattern_assembler.combine_listItems(patternlab); + for (i = 0; i < list_item_hunter.items.length; i++) { + patternlab.dataKeys.push('listItems.' + list_item_hunter.items[i]); + patternlab.dataKeys.push('listitems.' + list_item_hunter.items[i]); + } // diveSync once to perform iterative populating of patternlab object processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab); - // preprocess partials so they can be recursively included respecting any parameters they may be submitting + // get the templating engine used for this implementation of pattern lab var engine; - for (var i = 0; i < patternlab.patterns.length; i++) { + for (i = 0; i < patternlab.patterns.length; i++) { if (patternlab.patterns[i].isPattern) { engine = patternlab.patterns[i].engine; break; } } + //create this properties to later escape all tags that match keys in the + //JSON data so these tags persist through recursive partial includes. + patternlab.dataKeysEscape = ''; + var dataKey; + for (var i = 0; i < patternlab.dataKeys.length; i++) { + dataKey = patternlab.dataKeys[i]; + if (typeof engine.escapeReservedRegexChars === 'function') { + dataKey = engine.escapeReservedRegexChars(dataKey); + } + patternlab.dataKeysEscape += dataKey; + if (i < patternlab.dataKeys.length - 1) { + patternlab.dataKeysEscape += '|'; + } + } + + // preprocess partials so they can be recursively included respecting any parameters they may be submitting if (typeof engine.preprocessPartials === 'function') { engine.preprocessPartials(pattern_assembler, patternlab); } From 4127fa011ef3ee5439f915d60810a774fbdb285d Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 1 Aug 2016 10:22:15 -0400 Subject: [PATCH 29/44] removing extraneous block --- core/lib/partial_hunter.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index 987701a35..ac3c413cc 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -52,11 +52,6 @@ var partial_hunter = function () { //removing empty lines for some reason reduces rendering time considerably. newTemplate = newTemplate.replace(/^\s*$\n/gm, ''); - for (i = 0; i < patternlab.dataKeys.length; i++) { - regex = new RegExp('\\{\\{(\\S?\\s*' + patternlab.dataKeys[i] + '\\s*\\}?\\}\\})', 'g'); - newTemplate = newTemplate.replace(regex, '\u0002$1'); - } - //escape partial includes so they are not erased by a render newTemplate = newTemplate.replace(/\{\{>/g, '\u0002>'); From 6861e7395f9b883d5914920e41a1f5af154ca256 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 1 Aug 2016 21:27:18 -0400 Subject: [PATCH 30/44] pseudopattern_hunger.js partially working --- core/lib/partial_hunter.js | 2 ++ core/lib/pseudopattern_hunter.js | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index ac3c413cc..16b05cc85 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -45,6 +45,8 @@ var partial_hunter = function () { escapedKeys += ')'; + //apply replacement based on allowable characters from lines 78 and 79 of mustache.js + //of the Mustache for JS project. dataKeysRegex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)(' + escapedKeys + '\\s*)\\}\\}', 'g'); newTemplate = newTemplate.replace(dataKeysRegex, '\u0002$1}}'); diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index eb8753be2..6db51084e 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -9,7 +9,8 @@ var pseudopattern_hunter = function () { lh = require('./lineage_hunter'), Pattern = require('./object_factory').Pattern, plutils = require('./utilities'), - path = require('path'); + path = require('path'), + JSON5 = require('json5'); var pattern_assembler = new pa(); @@ -32,25 +33,31 @@ var pseudopattern_hunter = function () { } //we want to do everything we normally would here, except instead read the pseudoPattern data + var variantFileData = {}; + var variantFilename = path.resolve(paths.source.patterns, pseudoPatterns[i]); + var variantFileStr = ''; try { - var variantFileData = fs.readJSONSync(path.resolve(paths.source.patterns, pseudoPatterns[i])); + variantFileStr = fs.readFileSync(variantFilename, 'utf8'); + variantFileData = JSON5.parse(variantFileStr); } catch (err) { console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); console.log(err); } //extend any existing data with variant data - variantFileData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); + var variantLocalData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); + var variantAllData = plutils.mergeData(currentPattern.allData, variantFileData); var variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; var variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); - var patternVariant = Pattern.create(variantFilePath, variantFileData, { + var patternVariant = Pattern.create(variantFilePath, variantLocalData, { //use the same template as the non-variant template: currentPattern.template, fileExtension: currentPattern.fileExtension, extendedTemplate: currentPattern.extendedTemplate, isPseudoPattern: true, basePattern: currentPattern, + allData: variantAllData, // use the same template engine as the non-variant engine: currentPattern.engine From 2a5199e8a27352becbf9ea718eef38c0a78d2ccd Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 1 Aug 2016 21:37:34 -0400 Subject: [PATCH 31/44] working pseudopattern_hunger.js --- core/lib/pseudopattern_hunter.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 6db51084e..868193e93 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -33,20 +33,23 @@ var pseudopattern_hunter = function () { } //we want to do everything we normally would here, except instead read the pseudoPattern data - var variantFileData = {}; var variantFilename = path.resolve(paths.source.patterns, pseudoPatterns[i]); var variantFileStr = ''; + var variantLocalData = {}; + var variantAllData = {}; try { variantFileStr = fs.readFileSync(variantFilename, 'utf8'); - variantFileData = JSON5.parse(variantFileStr); + variantLocalData = JSON5.parse(variantFileStr); + //clone. do not reference + variantAllData = JSON5.parse(variantFileStr); } catch (err) { console.log('There was an error parsing pseudopattern JSON for ' + currentPattern.relPath); console.log(err); } //extend any existing data with variant data - var variantLocalData = plutils.mergeData(currentPattern.jsonFileData, variantFileData); - var variantAllData = plutils.mergeData(currentPattern.allData, variantFileData); + plutils.mergeData(currentPattern.jsonFileData, variantLocalData); + plutils.mergeData(currentPattern.allData, variantAllData); var variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; var variantFilePath = path.join(currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); @@ -58,6 +61,7 @@ var pseudopattern_hunter = function () { isPseudoPattern: true, basePattern: currentPattern, allData: variantAllData, + dataKeys: pattern_assembler.get_data_keys(variantLocalData), // use the same template engine as the non-variant engine: currentPattern.engine From d3641199ed2f124d56f26e0fd34114bde2e9ffec Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 2 Aug 2016 06:31:39 -0400 Subject: [PATCH 32/44] working pseudopattern_hunter.js --- core/lib/pattern_assembler.js | 26 ++++++++++++++++---------- core/lib/patternlab.js | 4 ++-- core/lib/pseudopattern_hunter.js | 1 - 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index ef59d24db..31e15c5b7 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -222,6 +222,7 @@ var pattern_assembler = function () { } function processPatternIterative(relPath, patternlab) { + var list_item_hunter = new lih(); //check if the found file is a top-level markdown file var fileObject = path.parse(relPath); @@ -252,9 +253,6 @@ var pattern_assembler = function () { } - var list_item_hunter = new lih(); - var pseudopattern_hunter = new pph(); - //extract some information var filename = fileObject.base; var ext = fileObject.ext; @@ -352,14 +350,12 @@ var pattern_assembler = function () { //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); - //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json - pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); - return currentPattern; } - function processPatternRecursive(relPath, patternlab, origPatternParam) { + function processPatternRecursive(relPath, patternlab, origPatternParam, levelParam) { var lineage_hunter = new lh(); + var pseudopattern_hunter = new pph(); var currentPattern; var i; @@ -382,6 +378,16 @@ var pattern_assembler = function () { //we are processing a markdown only pattern if (currentPattern.engine === null) { return; } + //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json + //only do this at the top level of recursion + var level; + if (typeof levelParam === 'undefined') { + pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); + level = 1; + } else { + level++; + } + //find how many partials there may be for the given pattern currentPattern.patternPartials = currentPattern.findPartials(); @@ -389,14 +395,14 @@ var pattern_assembler = function () { //template and replace their calls in this template with rendered results if (currentPattern.engine.expandPartials && (currentPattern.patternPartials !== null && currentPattern.patternPartials.length > 0)) { // eslint-disable-next-line - expandPartials(patternlab, currentPattern); + expandPartials(patternlab, currentPattern, level); } //find pattern lineage lineage_hunter.find_lineage(currentPattern, patternlab); } - function expandPartials(patternlab, currentPattern) { + function expandPartials(patternlab, currentPattern, level) { var partial_hunter = new ph(); var list_item_hunter = new lih(); @@ -410,7 +416,7 @@ var pattern_assembler = function () { //find any listItem blocks within the pattern list_item_hunter.process_list_item_partials(currentPattern, patternlab); - processPatternRecursive(currentPattern.relPath, patternlab, currentPattern); + processPatternRecursive(currentPattern.relPath, patternlab, currentPattern, level); } function parseDataLinksHelper(patternlab, obj, key) { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 0bf00023e..3e105120b 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -260,8 +260,8 @@ var patternlab_engine = function (config) { } } - //create this properties to later escape all tags that match keys in the - //JSON data so these tags persist through recursive partial includes. + //create properties to later escape all tags that match keys in the JSON + //data so these tags persist through recursive partial includes. patternlab.dataKeysEscape = ''; var dataKey; for (var i = 0; i < patternlab.dataKeys.length; i++) { diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 868193e93..478d9549a 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -12,7 +12,6 @@ var pseudopattern_hunter = function () { path = require('path'), JSON5 = require('json5'); - var pattern_assembler = new pa(); var lineage_hunter = new lh(); var paths = patternlab.config.paths; From 525552ebe926a0eafc4c5063e521ec8e0615edfc Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 2 Aug 2016 09:12:41 -0400 Subject: [PATCH 33/44] working list_item_hunter_tests.js --- core/lib/patternlab.js | 71 +++++++++++++++++++--------------- test/list_item_hunter_tests.js | 34 ++++++++-------- 2 files changed, 56 insertions(+), 49 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 3e105120b..0dd56c359 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -53,6 +53,43 @@ function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab ); } +function preprocessPatternlabPartials(pattern_assembler, list_item_hunter, patternlab) { + // get the templating engine used for this implementation of pattern lab + var engine; + for (i = 0; i < patternlab.patterns.length; i++) { + if (patternlab.patterns[i].isPattern) { + engine = patternlab.patterns[i].engine; + break; + } + } + + // push list item keywords into dataKeys property + for (i = 0; i < list_item_hunter.items.length; i++) { + patternlab.dataKeys.push('listItems.' + list_item_hunter.items[i]); + patternlab.dataKeys.push('listitems.' + list_item_hunter.items[i]); + } + + // create properties to later escape all tags that match keys in the JSON + // data so these tags persist through recursive partial includes. + patternlab.dataKeysEscape = ''; + var dataKey; + for (var i = 0; i < patternlab.dataKeys.length; i++) { + dataKey = patternlab.dataKeys[i]; + if (typeof engine.escapeReservedRegexChars === 'function') { + dataKey = engine.escapeReservedRegexChars(dataKey); + } + patternlab.dataKeysEscape += dataKey; + if (i < patternlab.dataKeys.length - 1) { + patternlab.dataKeysEscape += '|'; + } + } + + // preprocess partials so they can be recursively included respecting any parameters they may be submitting + if (typeof engine.preprocessPartials === 'function') { + engine.preprocessPartials(pattern_assembler, patternlab); + } +} + function processAllPatternsRecursive(pattern_assembler, patterns_dir, patternlab) { diveSync( patterns_dir, @@ -243,42 +280,11 @@ var patternlab_engine = function (config) { patterns_dir = paths.source.patterns; pattern_assembler.combine_listItems(patternlab); - for (i = 0; i < list_item_hunter.items.length; i++) { - patternlab.dataKeys.push('listItems.' + list_item_hunter.items[i]); - patternlab.dataKeys.push('listitems.' + list_item_hunter.items[i]); - } // diveSync once to perform iterative populating of patternlab object processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab); - // get the templating engine used for this implementation of pattern lab - var engine; - for (i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].isPattern) { - engine = patternlab.patterns[i].engine; - break; - } - } - - //create properties to later escape all tags that match keys in the JSON - //data so these tags persist through recursive partial includes. - patternlab.dataKeysEscape = ''; - var dataKey; - for (var i = 0; i < patternlab.dataKeys.length; i++) { - dataKey = patternlab.dataKeys[i]; - if (typeof engine.escapeReservedRegexChars === 'function') { - dataKey = engine.escapeReservedRegexChars(dataKey); - } - patternlab.dataKeysEscape += dataKey; - if (i < patternlab.dataKeys.length - 1) { - patternlab.dataKeysEscape += '|'; - } - } - - // preprocess partials so they can be recursively included respecting any parameters they may be submitting - if (typeof engine.preprocessPartials === 'function') { - engine.preprocessPartials(pattern_assembler, patternlab); - } + preprocessPatternlabPartials(pattern_assembler, list_item_hunter, patternlab); //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements @@ -452,6 +458,7 @@ var patternlab_engine = function (config) { // have a better way to do this patternlab_engine.build_pattern_data = buildPatternData; patternlab_engine.process_all_patterns_iterative = processAllPatternsIterative; +patternlab_engine.preprocess_patternlab_partials = preprocessPatternlabPartials; patternlab_engine.process_all_patterns_recursive = processAllPatternsRecursive; module.exports = patternlab_engine; diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index 8fea01d6c..74b55b9cc 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -5,6 +5,8 @@ var Pattern = require('../core/lib/object_factory').Pattern; var extend = require('util')._extend; var pa = require('../core/lib/pattern_assembler'); + var patternEngine = require('../core/lib/patternlab'); + var list_item_hunter = new lih(); var pattern_assembler = new pa(); // fake pattern creators @@ -59,6 +61,7 @@ "link": {}, "partials": [] }, + "dataKeys": [], "config": { "debug": false, "paths": { @@ -84,7 +87,6 @@ "key": "test-patternName" }); var patternlab = createFakePatternLab(); - var list_item_hunter = new lih(); //act list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -104,7 +106,6 @@ "key": "test-patternName" }); var patternlab = createFakePatternLab(); - var list_item_hunter = new lih(); //act list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -130,7 +131,7 @@ //act var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); - pattern.engine.preprocessPartials(pattern_assembler, patternlab); + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert @@ -158,11 +159,9 @@ //act var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-verbose-foo.mustache", patternlab); - pattern1.engine.preprocessPartials(pattern_assembler, patternlab); - pattern_assembler.process_pattern_recursive(pattern1.relPath, patternlab, pattern1); - var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/02-listitem-verbose-bar.mustache", patternlab); - pattern2.engine.preprocessPartials(pattern_assembler, patternlab); + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); + pattern_assembler.process_pattern_recursive(pattern1.relPath, patternlab, pattern1); pattern_assembler.process_pattern_recursive(pattern2.relPath, patternlab, pattern2); //assert @@ -193,6 +192,7 @@ ] }; pattern.engine.preprocessPartials(pattern_assembler, patternlab); + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert @@ -237,7 +237,7 @@ { "title": "Two" } ] }; - pattern.engine.preprocessPartials(pattern_assembler, patternlab); + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert @@ -272,7 +272,7 @@ { "title": "Two" } ] }; - pattern.engine.preprocessPartials(pattern_assembler, patternlab); + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert @@ -289,6 +289,7 @@ var pl = {}; pl.config = {}; pl.data = {}; + pl.dataKeys = []; pl.data.link = {}; pl.config.debug = false; pl.config.paths = { @@ -318,12 +319,12 @@ //act var atomPattern = pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); pl.patterns.push(atomPattern); - atomPattern.engine.preprocessPartials(pattern_assembler, pl); - pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); var bookendPattern = pattern_assembler.process_pattern_iterative('00-test/11-bookend-listitem.mustache', pl); pl.patterns.push(bookendPattern); - bookendPattern.engine.preprocessPartials(pattern_assembler, pl); + + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, pl); + pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); pattern_assembler.process_pattern_recursive(bookendPattern.relPath, pl, bookendPattern); //assert. here we expect {{styleModifier}} to be replaced with an empty string or the styleModifier value from the found partial with the :styleModifier @@ -339,17 +340,16 @@ //act var atomPattern = pattern_assembler.process_pattern_iterative('00-test/03-styled-atom.mustache', pl); pl.patterns.push(atomPattern); - atomPattern.engine.preprocessPartials(pattern_assembler, pl); - pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); var anotherStyledAtomPattern = pattern_assembler.process_pattern_iterative('00-test/12-another-styled-atom.mustache', pl); pl.patterns.push(anotherStyledAtomPattern); - anotherStyledAtomPattern.engine.preprocessPartials(pattern_assembler, pl); - pattern_assembler.process_pattern_recursive(anotherStyledAtomPattern.relPath, pl, anotherStyledAtomPattern); var listPattern = pattern_assembler.process_pattern_iterative('00-test/13-listitem.mustache', pl); pl.patterns.push(listPattern); - listPattern.engine.preprocessPartials(pattern_assembler, pl); + + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, pl); + pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); + pattern_assembler.process_pattern_recursive(anotherStyledAtomPattern.relPath, pl, anotherStyledAtomPattern); pattern_assembler.process_pattern_recursive(listPattern.relPath, pl, listPattern); //assert. From d8c80b1fabae436007ba448c705d46d9fb9379b1 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 2 Aug 2016 18:14:39 -0400 Subject: [PATCH 34/44] fixing viewwall --- core/lib/patternlab.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 0dd56c359..2c33142a2 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -358,7 +358,7 @@ var patternlab_engine = function (config) { var headHTML = pattern_assembler.renderPattern(pattern.header, pattern.allData); //render the extendedTemplate with all data - pattern.extendedTemplate = pattern_assembler.renderPattern(pattern, pattern.allData); + pattern.patternPartialCode = pattern_assembler.renderPattern(pattern, pattern.allData); //todo see if this is still needed //pattern.patternPartialCodeE = entity_encoder.encode(pattern.patternPartialCode); @@ -410,7 +410,7 @@ var patternlab_engine = function (config) { outputFileSuffixes = _.extend(outputFileSuffixes, patternlab.config.outputFileSuffixes); //write the compiled template to the public patterns directory - var patternPage = headHTML + pattern.extendedTemplate + footerHTML; + var patternPage = headHTML + pattern.patternPartialCode + footerHTML; fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', outputFileSuffixes.rendered + '.html'), patternPage); //write the mustache file too From 762d975f7f08333c4f0931652c4bf65b7b103e44 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 3 Aug 2016 06:32:40 -0400 Subject: [PATCH 35/44] working unit tests --- ...{03-simple.mustache => 00-simple.mustache} | 0 ....mustache => 01-listitem-partial.mustache} | 0 ...tache => 02-listitem-verbose-foo.mustache} | 0 ...tache => 03-listitem-verbose-bar.mustache} | 0 .../01-test1/04-parametered-partial.mustache | 7 ++ .../01-test1/05-recursive-includer.mustache | 1 + .../01-test1/06-anti-infinity-tester.mustache | 1 + test/list_item_hunter_tests.js | 12 +-- test/partial_hunter_tests.js | 76 ++++++++++++++++++- 9 files changed, 90 insertions(+), 7 deletions(-) rename test/files/_patterns/01-test1/{03-simple.mustache => 00-simple.mustache} (100%) rename test/files/_patterns/01-test1/{00-listitem-partial.mustache => 01-listitem-partial.mustache} (100%) rename test/files/_patterns/01-test1/{01-listitem-verbose-foo.mustache => 02-listitem-verbose-foo.mustache} (100%) rename test/files/_patterns/01-test1/{02-listitem-verbose-bar.mustache => 03-listitem-verbose-bar.mustache} (100%) create mode 100644 test/files/_patterns/01-test1/04-parametered-partial.mustache create mode 100644 test/files/_patterns/01-test1/05-recursive-includer.mustache create mode 100644 test/files/_patterns/01-test1/06-anti-infinity-tester.mustache diff --git a/test/files/_patterns/01-test1/03-simple.mustache b/test/files/_patterns/01-test1/00-simple.mustache similarity index 100% rename from test/files/_patterns/01-test1/03-simple.mustache rename to test/files/_patterns/01-test1/00-simple.mustache diff --git a/test/files/_patterns/01-test1/00-listitem-partial.mustache b/test/files/_patterns/01-test1/01-listitem-partial.mustache similarity index 100% rename from test/files/_patterns/01-test1/00-listitem-partial.mustache rename to test/files/_patterns/01-test1/01-listitem-partial.mustache diff --git a/test/files/_patterns/01-test1/01-listitem-verbose-foo.mustache b/test/files/_patterns/01-test1/02-listitem-verbose-foo.mustache similarity index 100% rename from test/files/_patterns/01-test1/01-listitem-verbose-foo.mustache rename to test/files/_patterns/01-test1/02-listitem-verbose-foo.mustache diff --git a/test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache b/test/files/_patterns/01-test1/03-listitem-verbose-bar.mustache similarity index 100% rename from test/files/_patterns/01-test1/02-listitem-verbose-bar.mustache rename to test/files/_patterns/01-test1/03-listitem-verbose-bar.mustache diff --git a/test/files/_patterns/01-test1/04-parametered-partial.mustache b/test/files/_patterns/01-test1/04-parametered-partial.mustache new file mode 100644 index 000000000..c6bf814e8 --- /dev/null +++ b/test/files/_patterns/01-test1/04-parametered-partial.mustache @@ -0,0 +1,7 @@ +{{> test1-simple(title: 'foo') }} +{{# foo }} + {{> test1-parametered-partial(bar: true) }} +{{/ foo }} +{{# bar }} + {{> test1-simple(title: 'bar') }} +{{/ bar }} diff --git a/test/files/_patterns/01-test1/05-recursive-includer.mustache b/test/files/_patterns/01-test1/05-recursive-includer.mustache new file mode 100644 index 000000000..2c970de51 --- /dev/null +++ b/test/files/_patterns/01-test1/05-recursive-includer.mustache @@ -0,0 +1 @@ +{{> test1-parametered-partial }} diff --git a/test/files/_patterns/01-test1/06-anti-infinity-tester.mustache b/test/files/_patterns/01-test1/06-anti-infinity-tester.mustache new file mode 100644 index 000000000..f29b81561 --- /dev/null +++ b/test/files/_patterns/01-test1/06-anti-infinity-tester.mustache @@ -0,0 +1 @@ +{{> test1-parametered-partial(foo: true) }} diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index 74b55b9cc..9d54614fd 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -130,7 +130,7 @@ }); //act - var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); @@ -158,8 +158,8 @@ }); //act - var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-verbose-foo.mustache", patternlab); - var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/02-listitem-verbose-bar.mustache", patternlab); + var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/02-listitem-verbose-foo.mustache", patternlab); + var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/03-listitem-verbose-bar.mustache", patternlab); patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); pattern_assembler.process_pattern_recursive(pattern1.relPath, patternlab, pattern1); pattern_assembler.process_pattern_recursive(pattern2.relPath, patternlab, pattern2); @@ -184,7 +184,7 @@ }); //act - var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); pattern.listitems = { "2": [ { "title": "One" }, @@ -228,7 +228,7 @@ }); //act - var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); pattern.template = "{{#listItems.one}}{{> test1-simple }}{{/listItems.one}}"; pattern.extendedTemplate = pattern.template; pattern.listitems = { @@ -260,7 +260,7 @@ delete patternlab.listitems["1"]; // remove the "1" list //act - var pattern = pattern_assembler.process_pattern_iterative("01-test1/00-listitem-partial.mustache", patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); pattern.template = "{{#listItems.one}}{{> test1-simple }}{{/listItems.one}}"; pattern.extendedTemplate = pattern.template; pattern.listitems = { diff --git a/test/partial_hunter_tests.js b/test/partial_hunter_tests.js index cbadfe220..9199e131a 100644 --- a/test/partial_hunter_tests.js +++ b/test/partial_hunter_tests.js @@ -1,9 +1,11 @@ (function () { "use strict"; + var lih = require('../core/lib/list_item_hunter'); var pa = require('../core/lib/pattern_assembler'); var ph = require('../core/lib/partial_hunter'); var Pattern = require('../core/lib/object_factory').Pattern; + var patternEngine = require('../core/lib/patternlab'); //setup current pattern from what we would have during execution function currentPatternClosure() { @@ -404,9 +406,81 @@ test.equals(currentPattern.extendedTemplate, '

Single-quoted

Double-quoted

With attributes

'); test.done(); - } + }, + 'partial hunter correctly parses partial parameters for recursion beyond a single level' : function(test){ + var list_item_hunter = new lih(); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + //arrange + var pl = {}; + pl.config = { + debug: false, + paths: { + source: { + patterns: patterns_dir + } + } + }; + pl.data = { + link: {} + } + pl.dataKeys = []; + pl.partials = {}; + pl.patterns = []; + + var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/05-recursive-includer.mustache", pl); + var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/04-parametered-partial.mustache", pl); + var pattern3 = pattern_assembler.process_pattern_iterative("01-test1/00-simple.mustache", pl); + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, pl); + pattern_assembler.process_pattern_recursive(pattern1.relPath, pl, pattern1); + pattern_assembler.process_pattern_recursive(pattern2.relPath, pl, pattern2); + pattern_assembler.process_pattern_recursive(pattern3.relPath, pl, pattern3); + + //assert. + var expectedValue = 'foo'; + test.equals(pattern1.extendedTemplate.trim(), expectedValue); + test.done(); + }, + 'partial hunter correctly limits recursion on partials that call themselves but within restricted conditions' : function(test){ + var list_item_hunter = new lih(); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; + + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + //arrange + var pl = {}; + pl.config = { + debug: false, + paths: { + source: { + patterns: patterns_dir + } + } + }; + pl.data = { + link: {} + } + pl.dataKeys = []; + pl.partials = {}; + pl.patterns = []; + + var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/06-anti-infinity-tester.mustache", pl); + var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/04-parametered-partial.mustache", pl); + var pattern3 = pattern_assembler.process_pattern_iterative("01-test1/00-simple.mustache", pl); + patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, pl); + pattern_assembler.process_pattern_recursive(pattern1.relPath, pl, pattern1); + pattern_assembler.process_pattern_recursive(pattern2.relPath, pl, pattern2); + pattern_assembler.process_pattern_recursive(pattern3.relPath, pl, pattern3); + + //assert. + var expectedValue = 'foo\n foo\n\n bar'; + test.equals(pattern1.extendedTemplate.trim(), expectedValue); + test.done(); + } }; }()); From ddbd0024ae46b965438a0b9ad8c72b997f217304 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 3 Aug 2016 06:33:50 -0400 Subject: [PATCH 36/44] eslinted --- core/lib/patternlab.js | 2 +- core/lib/pseudopattern_hunter.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 2c33142a2..458e39418 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -56,6 +56,7 @@ function processAllPatternsIterative(pattern_assembler, patterns_dir, patternlab function preprocessPatternlabPartials(pattern_assembler, list_item_hunter, patternlab) { // get the templating engine used for this implementation of pattern lab var engine; + var i; for (i = 0; i < patternlab.patterns.length; i++) { if (patternlab.patterns[i].isPattern) { engine = patternlab.patterns[i].engine; @@ -232,7 +233,6 @@ var patternlab_engine = function (config) { } function buildPatterns(deletePatternDir) { - var i; var list_item_hunter = new lih(); var pattern_assembler = new pa(); diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 478d9549a..f7718e686 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -39,6 +39,7 @@ var pseudopattern_hunter = function () { try { variantFileStr = fs.readFileSync(variantFilename, 'utf8'); variantLocalData = JSON5.parse(variantFileStr); + //clone. do not reference variantAllData = JSON5.parse(variantFileStr); } catch (err) { From 2ae4274a70dc006bf63ceb753fe5be1c089538b2 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 3 Aug 2016 06:36:26 -0400 Subject: [PATCH 37/44] findPartial -> getPartial in unit tests --- test/lineage_hunter_tests.js | 8 ++++---- test/pattern_assembler_tests.js | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/lineage_hunter_tests.js b/test/lineage_hunter_tests.js index 0936d6298..4445f98bd 100644 --- a/test/lineage_hunter_tests.js +++ b/test/lineage_hunter_tests.js @@ -182,7 +182,7 @@ exports['lineage hunter '] = { lineage_hunter.cascade_pattern_states(pl); //assert - var consumerPatternReturned = pattern_assembler.findPartial('test-foo', pl); + var consumerPatternReturned = pattern_assembler.getPartial('test-foo', pl); test.equals(consumerPatternReturned.patternState, 'inreview'); test.done(); }, @@ -210,7 +210,7 @@ exports['lineage hunter '] = { lineage_hunter.cascade_pattern_states(pl); //assert - var consumerPatternReturned = pattern_assembler.findPartial('test-foo', pl); + var consumerPatternReturned = pattern_assembler.getPartial('test-foo', pl); test.equals(consumerPatternReturned.lineage[0].lineageState, 'inreview'); test.done(); }, @@ -237,7 +237,7 @@ exports['lineage hunter '] = { lineage_hunter.cascade_pattern_states(pl); //assert - var consumedPatternReturned = pattern_assembler.findPartial('test-bar', pl); + var consumedPatternReturned = pattern_assembler.getPartial('test-bar', pl); test.equals(consumedPatternReturned.lineageR[0].lineageState, 'inreview'); test.done(); @@ -265,7 +265,7 @@ exports['lineage hunter '] = { lineage_hunter.cascade_pattern_states(pl); //assert - var consumerPatternReturned = pattern_assembler.findPartial('test-foo', pl); + var consumerPatternReturned = pattern_assembler.getPartial('test-foo', pl); test.equals(consumerPatternReturned.lineage.length, 1); test.equals(consumerPatternReturned.lineage[0].lineageState, 'inreview'); test.equals(consumerPatternReturned.patternState, 'inreview'); diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 038dbe896..4b2f7d7d4 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -367,7 +367,7 @@ }); //act - var result = pattern_assembler.findPartial('character-han', patternlab); + var result = pattern_assembler.getPartial('character-han', patternlab); //assert test.equals(result, patternlab.patterns[0]); test.done(); @@ -389,7 +389,7 @@ }); //act - var result = pattern_assembler.findPartial('molecules-primary-nav', patternlab); + var result = pattern_assembler.getPartial('molecules-primary-nav', patternlab); //assert test.equals(result, patternlab.patterns[1]); test.done(); From 0a14bfc34fd67288ba3a82a09eae0c89de93ddf9 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 3 Aug 2016 06:46:08 -0400 Subject: [PATCH 38/44] tabs to spaces in list_item_hunter_test.js --- test/list_item_hunter_tests.js | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index 9d54614fd..09f3ae12a 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -130,9 +130,9 @@ }); //act - var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); - pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); + pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert test.equals(pattern.extendedTemplate.trim(), "FooBar" ); @@ -158,11 +158,11 @@ }); //act - var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/02-listitem-verbose-foo.mustache", patternlab); - var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/03-listitem-verbose-bar.mustache", patternlab); + var pattern1 = pattern_assembler.process_pattern_iterative("01-test1/02-listitem-verbose-foo.mustache", patternlab); + var pattern2 = pattern_assembler.process_pattern_iterative("01-test1/03-listitem-verbose-bar.mustache", patternlab); patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); - pattern_assembler.process_pattern_recursive(pattern1.relPath, patternlab, pattern1); - pattern_assembler.process_pattern_recursive(pattern2.relPath, patternlab, pattern2); + pattern_assembler.process_pattern_recursive(pattern1.relPath, patternlab, pattern1); + pattern_assembler.process_pattern_recursive(pattern2.relPath, patternlab, pattern2); //assert test.equals(pattern1.extendedTemplate.trim(), "Foo" ); @@ -184,7 +184,7 @@ }); //act - var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); pattern.listitems = { "2": [ { "title": "One" }, @@ -193,7 +193,7 @@ }; pattern.engine.preprocessPartials(pattern_assembler, patternlab); patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); - pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); + pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert test.equals(pattern.extendedTemplate.trim(), "OneTwo" ); @@ -228,7 +228,7 @@ }); //act - var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); pattern.template = "{{#listItems.one}}{{> test1-simple }}{{/listItems.one}}"; pattern.extendedTemplate = pattern.template; pattern.listitems = { @@ -238,7 +238,7 @@ ] }; patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); - pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); + pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert test.equals(pattern.extendedTemplate.trim(), "Foo" ); @@ -260,7 +260,7 @@ delete patternlab.listitems["1"]; // remove the "1" list //act - var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); + var pattern = pattern_assembler.process_pattern_iterative("01-test1/01-listitem-partial.mustache", patternlab); pattern.template = "{{#listItems.one}}{{> test1-simple }}{{/listItems.one}}"; pattern.extendedTemplate = pattern.template; pattern.listitems = { @@ -273,7 +273,7 @@ ] }; patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, patternlab); - pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); + pattern_assembler.process_pattern_recursive(pattern.relPath, patternlab, pattern); //assert test.equals(typeof patternlab.listitems["1"], "undefined"); @@ -324,8 +324,8 @@ pl.patterns.push(bookendPattern); patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, pl); - pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); - pattern_assembler.process_pattern_recursive(bookendPattern.relPath, pl, bookendPattern); + pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); + pattern_assembler.process_pattern_recursive(bookendPattern.relPath, pl, bookendPattern); //assert. here we expect {{styleModifier}} to be replaced with an empty string or the styleModifier value from the found partial with the :styleModifier var expectedValue = '
Foo Foo Foo Bar Bar Bar
'; @@ -348,9 +348,9 @@ pl.patterns.push(listPattern); patternEngine.preprocess_patternlab_partials(pattern_assembler, list_item_hunter, pl); - pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); - pattern_assembler.process_pattern_recursive(anotherStyledAtomPattern.relPath, pl, anotherStyledAtomPattern); - pattern_assembler.process_pattern_recursive(listPattern.relPath, pl, listPattern); + pattern_assembler.process_pattern_recursive(atomPattern.relPath, pl, atomPattern); + pattern_assembler.process_pattern_recursive(anotherStyledAtomPattern.relPath, pl, anotherStyledAtomPattern); + pattern_assembler.process_pattern_recursive(listPattern.relPath, pl, listPattern); //assert. var expectedValue = '
FooM
'; From e6fff1852586e25d66cd59b08bb98db5ba57a00e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 3 Aug 2016 18:24:14 -0400 Subject: [PATCH 39/44] checks for engine --- core/lib/partial_hunter.js | 10 +++++++++- core/lib/pattern_assembler.js | 15 ++++++++++++--- core/lib/patternlab.js | 4 ++-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index 16b05cc85..c35eec020 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -21,6 +21,10 @@ var partial_hunter = function () { var tag; var tmpPattern; + if (!pattern.engine) { + return; + } + //escape all tags that match keys in the JSON data. //it can be significantly faster to process large dataKey arrays in one read //with a large regex than to read many times and process with small regexes. @@ -92,7 +96,11 @@ var partial_hunter = function () { //we want to globally replace instances of this tag in case it was //included within a partial from within this for loop - regexStr = pattern.engine.escapeReservedRegexChars(tag); + if (typeof pattern.engine.escapeReservedRegexChars === 'function') { + regexStr = pattern.engine.escapeReservedRegexChars(tag); + } else { + regexStr = tag; + } regex = new RegExp(regexStr, 'g'); newTemplate = newTemplate.replace(regex, partialContent); } diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 31e15c5b7..fa754bfbb 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -135,11 +135,20 @@ var pattern_assembler = function () { if (pattern instanceof Pattern) { return pattern.render(data, partials); } else { - // otherwise, assume it's a plain mustache template string, and we - // therefore just need to create a dummpy pattern to be able to render + // otherwise, check for the first loaded templating engine, and we + // therefore just need to create a dummy pattern to be able to render // it var dummyPattern = Pattern.createEmpty({extendedTemplate: pattern}); - return patternEngines.mustache.renderPattern(dummyPattern, data, partials); + var engine; + var engineName = Object.keys(patternEngines)[0]; + if (engineName) { + engine = patternEngines[engineName]; + } + if (engine) { + return engine.renderPattern(dummyPattern, data, partials); + } else { + return pattern; + } } } diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 458e39418..771f239cd 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -76,7 +76,7 @@ function preprocessPatternlabPartials(pattern_assembler, list_item_hunter, patte var dataKey; for (var i = 0; i < patternlab.dataKeys.length; i++) { dataKey = patternlab.dataKeys[i]; - if (typeof engine.escapeReservedRegexChars === 'function') { + if (engine && typeof engine.escapeReservedRegexChars === 'function') { dataKey = engine.escapeReservedRegexChars(dataKey); } patternlab.dataKeysEscape += dataKey; @@ -86,7 +86,7 @@ function preprocessPatternlabPartials(pattern_assembler, list_item_hunter, patte } // preprocess partials so they can be recursively included respecting any parameters they may be submitting - if (typeof engine.preprocessPartials === 'function') { + if (engine && typeof engine.preprocessPartials === 'function') { engine.preprocessPartials(pattern_assembler, patternlab); } } From 48b4e5f5816e2a76a7bcf9d299d25da36f8a02f3 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 19 Aug 2016 08:19:02 -0400 Subject: [PATCH 40/44] fixed lineage hunt --- core/lib/pattern_assembler.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index fa754bfbb..f60bece42 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -403,12 +403,12 @@ var pattern_assembler = function () { //expand any partials present in this pattern; that is, drill down into the //template and replace their calls in this template with rendered results if (currentPattern.engine.expandPartials && (currentPattern.patternPartials !== null && currentPattern.patternPartials.length > 0)) { + //find pattern lineage + lineage_hunter.find_lineage(currentPattern, patternlab); + // eslint-disable-next-line expandPartials(patternlab, currentPattern, level); } - - //find pattern lineage - lineage_hunter.find_lineage(currentPattern, patternlab); } function expandPartials(patternlab, currentPattern, level) { From 3651f612e68cd7c0f42778bc26a06a7d118631e9 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 22 Sep 2016 10:04:16 -0400 Subject: [PATCH 41/44] fixed links --- core/lib/object_factory.js | 2 +- core/lib/pattern_assembler.js | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/core/lib/object_factory.js b/core/lib/object_factory.js index 2621464a1..d7e125b1b 100644 --- a/core/lib/object_factory.js +++ b/core/lib/object_factory.js @@ -57,7 +57,7 @@ var Pattern = function (relPath, data) { this.isPseudoPattern = false; this.engine = patternEngines.getEngineForPattern(this); this.patternPartials = null; - this.allData = {}; + this.allData = null; this.dataKeys = []; }; diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index f60bece42..68a2f5bde 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -310,15 +310,6 @@ var pattern_assembler = function () { } } - //merge global data into a clone of local jsonFileData - var localDataClone = {}; - try { - localDataClone = JSON5.parse(jsonFileStr); - } catch (err) { - //already threw error in last try/catch - } - currentPattern.allData = plutils.mergeData(patternlab.data, localDataClone); - //add allData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); @@ -387,6 +378,12 @@ var pattern_assembler = function () { //we are processing a markdown only pattern if (currentPattern.engine === null) { return; } + //merge global data into local data after iterating through all patterns + //but not after first recursion + if (!currentPattern.allData) { + currentPattern.allData = plutils.mergeData(patternlab.data, currentPattern.jsonFileData); + } + //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json //only do this at the top level of recursion var level; From 32bc7b15d5d3b42b917913ec0ffac9402b79eb98 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 4 Oct 2016 09:16:31 -0400 Subject: [PATCH 42/44] fixing level param type --- core/lib/pattern_assembler.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 68a2f5bde..2e5335ac5 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -386,13 +386,11 @@ var pattern_assembler = function () { //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json //only do this at the top level of recursion - var level; - if (typeof levelParam === 'undefined') { + var level = levelParam ? levelParam : 0; + if (!level) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); - level = 1; - } else { - level++; } + level++; //find how many partials there may be for the given pattern currentPattern.patternPartials = currentPattern.findPartials(); From 523edec9feb4b2362ead450d3a144a79c32140f4 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 7 Oct 2016 08:52:05 -0400 Subject: [PATCH 43/44] typo fix --- core/lib/partial_hunter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index c35eec020..618c826e4 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -42,7 +42,7 @@ var partial_hunter = function () { escapedKeys += '|'; } escapedKeys += dataKey; - if (i < patternlab.dataKeys.length - 1) { + if (i < pattern.dataKeys.length - 1) { escapedKeys += '|'; } } From 9b75e1c7199e4b1c8828d20ecee1afdde5043b15 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Nov 2016 19:10:00 -0400 Subject: [PATCH 44/44] better regex --- core/lib/partial_hunter.js | 9 ++------- core/lib/patternlab.js | 4 ++-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/core/lib/partial_hunter.js b/core/lib/partial_hunter.js index 618c826e4..6dc17076b 100644 --- a/core/lib/partial_hunter.js +++ b/core/lib/partial_hunter.js @@ -38,20 +38,15 @@ var partial_hunter = function () { if (typeof pattern.engine.escapeReservedRegexChars === 'function') { dataKey = pattern.engine.escapeReservedRegexChars(dataKey); } - if (i === 0) { + if (i > 0) { escapedKeys += '|'; } escapedKeys += dataKey; - if (i < pattern.dataKeys.length - 1) { - escapedKeys += '|'; - } } - escapedKeys += ')'; - //apply replacement based on allowable characters from lines 78 and 79 of mustache.js //of the Mustache for JS project. - dataKeysRegex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)(' + escapedKeys + '\\s*)\\}\\}', 'g'); + dataKeysRegex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)(' + escapedKeys + ')\\s*)\\}\\}', 'g'); newTemplate = newTemplate.replace(dataKeysRegex, '\u0002$1}}'); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 771f239cd..9c3da14e3 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -79,10 +79,10 @@ function preprocessPatternlabPartials(pattern_assembler, list_item_hunter, patte if (engine && typeof engine.escapeReservedRegexChars === 'function') { dataKey = engine.escapeReservedRegexChars(dataKey); } - patternlab.dataKeysEscape += dataKey; - if (i < patternlab.dataKeys.length - 1) { + if (i > 0) { patternlab.dataKeysEscape += '|'; } + patternlab.dataKeysEscape += dataKey; } // preprocess partials so they can be recursively included respecting any parameters they may be submitting