From 1df8ee6aa6d0ff32a9033a73687fa1432df02fd1 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 29 Feb 2016 16:54:37 -0500 Subject: [PATCH 001/162] working performant recursive parameter hunter, with debug code --- builder/parameter_hunter.js | 77 ++++++++- builder/pattern_assembler.js | 150 +++++++++++++----- builder/patternlab.js | 5 +- .../02-comments/01-sticky-comment.mustache | 3 +- .../03-templates/00-homepage.mustache | 5 +- .../_patterns/04-pages/00-homepage.mustache | 2 +- 6 files changed, 190 insertions(+), 52 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index cee16596b..8298c8905 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -20,7 +20,9 @@ style_modifier_hunter = new smh(), pattern_assembler = new pa(); - function findparameters(pattern, patternlab){ + function findparameters(pattern, patternlab, startFile){ + var renderedPartial; + var renderedTemplate = pattern.extendedTemplate; if(pattern.parameteredPartials && pattern.parameteredPartials.length > 0){ //compile this partial immeadiately, essentially consuming it. @@ -44,9 +46,23 @@ var paramData = eval(paramString); var globalData = JSON.parse(JSON.stringify(patternlab.data)); - var localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); + var localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); + var startPattern = pattern_assembler.get_pattern_by_key(startFile, patternlab); + var startData = JSON.parse(JSON.stringify(startPattern.jsonFileData || {})); - var allData = pattern_assembler.merge_data(globalData, localData); + //in order to token-replace parameterized tags, prepare for rendering Mustache + //replace global, file-specific, and param data. however, since partial inclusion + //is not done here, escape partial tags by switching them to ERB syntax. +var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + //then set the new delimiter at the beginning of the extended template +// extendedTemplateEscaped = '{{=<% %>=}}' + extendedTemplateEscaped; + + + //render the newly delimited partial +// var renderedPartial = pattern_assembler.renderPattern(extendedTemplateEscaped, paramData, patternlab.partials); + + var allData = pattern_assembler.merge_data(globalData, startData); + allData = pattern_assembler.merge_data(allData, localData); allData = pattern_assembler.merge_data(allData, paramData); //if partial has style modifier data, replace the styleModifier value @@ -57,20 +73,65 @@ //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); +/* + //in pre-render, escape all tags which correspond to keys in the allData object + //in order to do so, escape the partials by switching them to ERB + var escapeLoopsAndConditionals = function(dataKey) { + var escapeString = new RegExp('{{([{#\\^\\/&]?\\s*' + dataKey + '\\s*}?)}}', 'g'); + renderedPartial = renderedPartial.replace(escapeString, '<%$1%>'); + }; + pattern_assembler.traverse_data(allData, escapeLoopsAndConditionals); + + //also escape partial includes and listItems loops + renderedPartial = renderedPartial.replace(/{{> ([^\}]+)}}/g, '<%> $1%>'); + renderedPartial = renderedPartial.replace(/{{([#\/]\s*listItems.[a-z]+\s*)}}/g, '<%$1%>'); +*/ + + //the reasoning for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant Mustache conditionals persisted +console.log(typeof extendedTemplateEscaped); + extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); + + //after that's done, switch back to standard Mustache tags + renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); //remove the parameter from the partial and replace it with the rendered partial + paramData - pattern.extendedTemplate = pattern.extendedTemplate.replace(pMatch, renderedPartial); + renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); +if (startFile.indexOf('04-pages/00-homepage') > -1) { + console.log('pMatch'); + console.log(pMatch); + console.log('renderedPartial'); + console.log(renderedPartial); + console.log('renderedTemplate'); + console.log(renderedTemplate); +} //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.key] = pattern.extendedTemplate; + patternlab.partials[pattern.key] = renderedTemplate; }); + +var parameteredPartialsNew = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); +pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); +pattern.extendedTemplate = renderedTemplate; + +if(pattern.parameteredPartials){ +//pattern.extendedTemplate = findparameters(pattern, patternlab, startFile); +findparameters(pattern, patternlab, startFile); +console.log('doing'); +console.log(pattern); + console.log(renderedPartial); +} +if (startFile.indexOf('04-pages/00-homepage') > -1) { +} + +// return renderedTemplate; } } return { - find_parameters: function(pattern, patternlab){ - findparameters(pattern, patternlab); + find_parameters: function(pattern, patternlab, startFile){ +// return findparameters(pattern, patternlab, startFile); +findparameters(pattern, patternlab, startFile); } }; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index e45e37982..4100d4152 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -30,13 +30,23 @@ // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithPatternParameters(pattern){ - var matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); + var matches; + if(typeof pattern === 'string'){ + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); + } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); + } return matches; } //find and return any {{> template-name* }} within pattern function findPartials(pattern){ - var matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); + var matches; + if(typeof pattern === 'string'){ + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); + } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); + } return matches; } @@ -155,7 +165,15 @@ addPattern(currentPattern, patternlab); } - function processPatternRecursive(file, patternlab, additionalData){ + /** + * Recurse through patternlab object as necessitated by partial inclusions. + * Build out the final output for writing to the public/patterns directory. + * + * @param {string} file The abspath of pattern being processed. + * @param {Object} patternlab The patternlab object. + * @param {string} startFile The abspath of the pattern at the top level of recursion. + */ + function processPatternRecursive(file, patternlab, startFile){ var fs = require('fs-extra'), mustache = require('mustache'), @@ -188,11 +206,27 @@ return; } - currentPattern.extendedTemplate = currentPattern.template; + //determine if the template contains any pattern parameters. if so they must be immediately consumed + //this initial run of find_parameters() resets currentPattern.template with +// parameter_hunter.find_parameters(currentPattern, patternlab); + var extendedTemplate; + + if(currentPattern.parameteredTemplate){ + extendedTemplate = currentPattern.parameteredTemplate; + //for each recursion, unset parameteredTemplate property + currentPattern.parameteredTemplate = null; + + } else{ +// extendedTemplate = currentPattern.template; + //for each recursion, reset extendedTemplate property + currentPattern.extendedTemplate = currentPattern.template; + } //find how many partials there may be for the given pattern var foundPatternPartials = findPartials(currentPattern); +// var startPattern = getpatternbykey(startFile, patternlab); + if(foundPatternPartials !== null && foundPatternPartials.length > 0){ if(patternlab.config.debug){ @@ -202,41 +236,60 @@ //find any listItem blocks list_item_hunter.process_list_item_partials(currentPattern, patternlab); - //determine if the template contains any pattern parameters. if so they must be immediately consumed - parameter_hunter.find_parameters(currentPattern, patternlab); +if(currentPattern.abspath.indexOf('07-messaging/00-alert.mustache') > -1){ +} + + //determine if the template contains any pattern parameters + if(currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0){ + //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() + parameter_hunter.find_parameters(currentPattern, patternlab, startFile); +// currentPattern.extendedTemplate = parameter_hunter.find_parameters(currentPattern, patternlab, startFile); +// foundPatternPartials = parameter_hunter.find_parameters(currentPattern, patternlab, startFile); + //re-evaluate foundPatternPartials +if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ +} + foundPatternPartials = findPartials(currentPattern.extendedTemplate); +if(startFile.indexOf('04-pages/00-homepage') > -1){ +} + } + + - //do something with the regular old partials - for(i = 0; i < foundPatternPartials.length; i++){ - var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); + if(foundPatternPartials && foundPatternPartials.length > 0){ + //do something with the regular old partials + for(i = 0; i < foundPatternPartials.length; i++){ + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); - var partialPath; + var partialPath; - //identify which pattern this partial corresponds to - for(var j = 0; j < patternlab.patterns.length; j++){ - if(patternlab.patterns[j].key === partialKey || - patternlab.patterns[j].abspath.indexOf(partialKey) > -1) - { - partialPath = patternlab.patterns[j].abspath; + //identify which pattern this partial corresponds to + for(var j = 0; j < patternlab.patterns.length; j++){ + if(patternlab.patterns[j].key === partialKey || + patternlab.patterns[j].abspath.indexOf(partialKey) > -1) + { + partialPath = patternlab.patterns[j].abspath; + } } - } - //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPath, patternlab); + //recurse through nested partials to fill out this extended template. + processPatternRecursive(partialPath, patternlab, startFile); +if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ +} - //complete assembly of extended template - var partialPattern = getpatternbykey(partialKey, patternlab); + //complete assembly of extended template + var partialPattern = getpatternbykey(partialKey, 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); - } + //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); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; + //update the extendedTemplate in the partials object in case this pattern is consumed later + patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; + } } - } else{ //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -250,20 +303,19 @@ //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); +if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ +} } function getpatternbykey(key, patternlab){ - //look for exact key matches - for(var i = 0; i < patternlab.patterns.length; i++){ - if(patternlab.patterns[i].key === key){ - return patternlab.patterns[i]; - } - } - - //else look by verbose syntax for(var i = 0; i < patternlab.patterns.length; i++){ switch(key){ + //look for exact key matches + case patternlab.patterns[i].key: + //look for abspath matches + case patternlab.patterns[i].abspath: + //look by verbose syntax case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName: case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': return patternlab.patterns[i]; @@ -310,6 +362,23 @@ return obj2; } + /** + * Recurse through data object and apply a function at each step. + * + * @param {Object} data JSON object. + * @param {Object} callback The function to be applied on the data at the recursion step. + */ + function traverseData(dataObj, callback){ + for(var i in dataObj){ + if(dataObj.hasOwnProperty(i)){ + callback.apply(this, [i, dataObj[i]]); + if(dataObj[i] !== null && typeof dataObj[i] === 'object'){ + traverseData(dataObj[i], callback); + } + } + } + } + function buildListItems(container){ //combine all list items into one structure var list = []; @@ -398,8 +467,8 @@ process_pattern_iterative: function(file, patternlab){ processPatternIterative(file, patternlab); }, - process_pattern_recursive: function(file, patternlab, additionalData){ - processPatternRecursive(file, patternlab, additionalData); + process_pattern_recursive: function(file, patternlab, startFile){ + processPatternRecursive(file, patternlab, startFile); }, get_pattern_by_key: function(key, patternlab){ return getpatternbykey(key, patternlab); @@ -407,6 +476,9 @@ merge_data: function(existingData, newData){ return mergeData(existingData, newData); }, + traverse_data: function(dataObj, callback){ + return traverseData(dataObj, callback); + }, combine_listItems: function(patternlab){ buildListItems(patternlab); }, diff --git a/builder/patternlab.js b/builder/patternlab.js index d68c3e14b..51702e506 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -111,7 +111,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); }); @@ -132,6 +132,9 @@ var patternlab_engine = function (config) { allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); //render the extendedTemplate with all data +if(typeof pattern.extendedTemplate === 'undefined') { +console.log(pattern); +} pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, allData); //add footer info before writing diff --git a/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache b/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache index ac0b28dc4..56fe2f96b 100644 --- a/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache +++ b/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache @@ -2,8 +2,7 @@

Selected Comments

diff --git a/source/_patterns/03-templates/00-homepage.mustache b/source/_patterns/03-templates/00-homepage.mustache index 40f9b1588..580d3c9ad 100644 --- a/source/_patterns/03-templates/00-homepage.mustache +++ b/source/_patterns/03-templates/00-homepage.mustache @@ -2,8 +2,11 @@ {{> organisms-header }}
{{# emergency }} - {{> molecules-alert }} + {{> molecules-alert(alertClass: 'error') }} {{/ emergency }} + {{# foo }} + {{> molecules-alert(alertClass: 'foo') }} + {{/ foo }} {{# hero }} {{> molecules-block-hero }} {{/ hero}} diff --git a/source/_patterns/04-pages/00-homepage.mustache b/source/_patterns/04-pages/00-homepage.mustache index d9894d4a7..6d918a24d 100644 --- a/source/_patterns/04-pages/00-homepage.mustache +++ b/source/_patterns/04-pages/00-homepage.mustache @@ -1 +1 @@ -{{> templates-homepage }} +{{> templates-homepage(emergency: true) }} From f441666df2b8b848c6f02ecbcc8b6afb02c2123c Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 29 Feb 2016 20:25:59 -0500 Subject: [PATCH 002/162] code cleanup: else blocks to standard, removing startFile params, removing console.log --- builder/parameter_hunter.js | 53 +++++++++--------------------------- builder/pattern_assembler.js | 11 ++++---- builder/patternlab.js | 2 +- 3 files changed, 19 insertions(+), 47 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index d057f9534..53138a252 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -40,8 +40,7 @@ var parameter_hunter = function () { //except to prevent infinite loops. if (colonPos === -1) { colonPos = paramString.length - 1; - } - else { + } else { colonPos += 1; } paramStringWellFormed += paramString.substring(0, colonPos); @@ -54,8 +53,7 @@ var parameter_hunter = function () { //except for unclosed quotes to prevent infinite loops. if (quotePos === -1) { quotePos = paramString.length - 1; - } - else { + } else { quotePos += 2; } @@ -75,34 +73,30 @@ var parameter_hunter = function () { //move param key to paramStringWellFormed var. paramStringWellFormed += paramStringTmp; paramString = paramString.substring(quotePos, paramString.length).trim(); - } //if param value is wrapped in double quotes, just move to paramStringWellFormed var. - else if (paramString[0] === '"') { + } else if (paramString[0] === '"') { quotePos = paramString.search(/[^\\]"/); //except for unclosed quotes to prevent infinite loops. if (quotePos === -1) { quotePos = paramString.length - 1; - } - else { + } else { quotePos += 2; } //move param key to paramStringWellFormed var. paramStringWellFormed += paramString.substring(0, quotePos); paramString = paramString.substring(quotePos, paramString.length).trim(); - } //if param value is not wrapped in quotes, move everthing up to the delimiting comma to paramStringWellFormed var. - else { + } else { delimitPos = paramString.indexOf(','); //except to prevent infinite loops. if (delimitPos === -1) { delimitPos = paramString.length - 1; - } - else { + } else { delimitPos += 1; } paramStringWellFormed += paramString.substring(0, delimitPos); @@ -121,7 +115,7 @@ var parameter_hunter = function () { return paramStringWellFormed; } - function findparameters(pattern, patternlab, startFile) { + function findparameters(pattern, patternlab) { var renderedPartial; var renderedTemplate = pattern.extendedTemplate; @@ -144,22 +138,17 @@ var parameter_hunter = function () { var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; var paramStringWellFormed = paramToJson(paramString); - var paramData = {}; var globalData = {}; var localData = {}; - var startPattern = {}; - var startData = {}; + var paramData = {}; try { - paramData = JSON.parse(paramStringWellFormed); globalData = JSON.parse(JSON.stringify(patternlab.data)); localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); - startPattern = pattern_assembler.get_pattern_by_key(startFile, patternlab); - startData = JSON.parse(JSON.stringify(startPattern.jsonFileData || {})); + paramData = JSON.parse(paramStringWellFormed); } catch (e) { console.log(e); } -console.log(paramData); //if partial has style modifier data, replace the styleModifier value if (pattern.stylePartials && pattern.stylePartials.length > 0) { @@ -167,8 +156,7 @@ console.log(paramData); } //assemble the allData object to render non-partial Mustache tags. - var allData = pattern_assembler.merge_data(globalData, startData); - allData = pattern_assembler.merge_data(allData, localData); + var allData = pattern_assembler.merge_data(globalData, localData); allData = pattern_assembler.merge_data(allData, paramData); //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally @@ -188,16 +176,6 @@ console.log(paramData); //remove the parameter from the partial and replace it with the rendered partial + paramData renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); - /* -if (startFile.indexOf('04-pages/00-homepage') > -1) { - console.log('pMatch'); - console.log(pMatch); - console.log('renderedPartial'); - console.log(renderedPartial); - console.log('renderedTemplate'); - console.log(renderedTemplate); -} -*/ //update the extendedTemplate in the partials object in case this pattern is consumed later patternlab.partials[pattern.key] = renderedTemplate; @@ -211,19 +189,14 @@ if (startFile.indexOf('04-pages/00-homepage') > -1) { //recurse if renderedTemplate still has parametered partials. if (pattern.parameteredPartials) { - findparameters(pattern, patternlab, startFile); -/* -console.log('doing'); -console.log(pattern); -console.log(renderedPartial); -*/ + findparameters(pattern, patternlab); } } } return { - find_parameters: function(pattern, patternlab, startFile){ - findparameters(pattern, patternlab, startFile); + find_parameters: function(pattern, patternlab){ + findparameters(pattern, patternlab); } }; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 2f138a146..8e9ec29a8 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -222,9 +222,8 @@ var pattern_assembler = function () { * * @param {string} file The abspath of pattern being processed. * @param {Object} patternlab The patternlab object. - * @param {string} startFile The abspath of the pattern at the top level of recursion. */ - function processPatternRecursive(file, patternlab, startFile) { + function processPatternRecursive(file, patternlab) { var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -270,7 +269,7 @@ var pattern_assembler = function () { //determine if the template contains any pattern parameters if(currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0){ //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() - parameter_hunter.find_parameters(currentPattern, patternlab, startFile); + parameter_hunter.find_parameters(currentPattern, patternlab); //re-evaluate foundPatternPartials foundPatternPartials = findPartials(currentPattern.extendedTemplate); } @@ -291,7 +290,7 @@ var pattern_assembler = function () { } //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPath, patternlab, startFile); + processPatternRecursive(partialPath, patternlab); //complete assembly of extended template var partialPattern = getpatternbykey(partialKey, patternlab); @@ -412,8 +411,8 @@ var pattern_assembler = function () { process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab, startFile) { - processPatternRecursive(file, patternlab, startFile); + process_pattern_recursive: function (file, patternlab) { + processPatternRecursive(file, patternlab); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); diff --git a/builder/patternlab.js b/builder/patternlab.js index fc3ca06b1..b4705deaf 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -113,7 +113,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); }); From 8f0d873eb0c8734d5161785fdfcc47182387dae1 Mon Sep 17 00:00:00 2001 From: BRIAN MUENZENMEYER Date: Wed, 24 Feb 2016 12:31:16 -0600 Subject: [PATCH 003/162] unit test coverage for #250 --- .../00-test/12-parameter-partial.mustache | 6 + .../13-another-parameter-partial.mustache | 1 + test/parameter_hunter_tests.js | 118 ++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 test/files/_patterns/00-test/12-parameter-partial.mustache create mode 100644 test/files/_patterns/00-test/13-another-parameter-partial.mustache diff --git a/test/files/_patterns/00-test/12-parameter-partial.mustache b/test/files/_patterns/00-test/12-parameter-partial.mustache new file mode 100644 index 000000000..e3799746a --- /dev/null +++ b/test/files/_patterns/00-test/12-parameter-partial.mustache @@ -0,0 +1,6 @@ +{{> test-bar }} +{{# flag}} + {{> test-styled-atom:baz(message: 'foo') }} + {{> test-bar }} +{{/ flag}} +{{> test-bar }} diff --git a/test/files/_patterns/00-test/13-another-parameter-partial.mustache b/test/files/_patterns/00-test/13-another-parameter-partial.mustache new file mode 100644 index 000000000..34856e8b1 --- /dev/null +++ b/test/files/_patterns/00-test/13-another-parameter-partial.mustache @@ -0,0 +1 @@ +{{> test-parameter-partial(flag: true) }} \ No newline at end of file diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 3672a4a79..5573a30dc 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -1,4 +1,5 @@ (function () { +<<<<<<< HEAD "use strict"; var ph = require('../builder/parameter_hunter'); @@ -56,6 +57,61 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); +======= + "use strict"; + + var ph = require('../builder/parameter_hunter'); + var pa = require('../builder/pattern_assembler'); + var object_factory = require('../builder/object_factory'); + + exports['parameter_hunter'] = { + 'pattern hunter finds and extends templates' : function(test){ + + //setup current pattern from what we would have during execution + var currentPattern = { + "fileName": "01-sticky-comment", + "subdir": "02-organisms/02-comments", + "name": "02-organisms-02-comments-01-sticky-comment", + "patternName": "sticky-comment", + "patternLink": "02-organisms-02-comments-01-sticky-comment/02-organisms-02-comments-01-sticky-comment.html", + "patternGroup": "organisms", + "patternSubGroup": "comments", + "flatPatternPath": "02-organisms-02-comments", + "key": "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.') }}" + ] + }; + var patternlab = { + patterns: [ + { + "fileName": "02-single-comment", + "subdir": "01-molecules/06-components", + "name": "01-molecules-06-components-02-single-comment", + "patternName": "single-comment", + "patternLink": "01-molecules-06-components-02-single-comment/01-molecules-06-components-02-single-comment.html", + "patternGroup": "molecules", + "patternSubGroup": "components", + "flatPatternPath": "01-molecules-06-components", + "key": "molecules-single-comment", + "template": "

{{description}}

", + "extendedTemplate": "

{{description}}

" + } + ], + config: { + debug: false + }, + data: { + description: 'Not a quote from a smart man' + }, + partials: {}, + }; + + var parameter_hunter = new ph(); +>>>>>>> 4af2266... unit test coverage for #250 parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

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

'); @@ -142,6 +198,7 @@ test.done(); }, +<<<<<<< HEAD 'parameter hunter parses parameters with single-quoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); @@ -157,6 +214,67 @@ test.done(); }, +======= + 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ + + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + //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 object_factory.oPattern('test/files/_patterns/00-test/01-bar.mustache', '00-test', '01-bar.mustache'); + atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/01-bar.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 stylePattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); + stylePattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + stylePattern.extendedTemplate = stylePattern.template; + stylePattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(stylePattern); + stylePattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(stylePattern); + + var innerParameteredPattern = new object_factory.oPattern('test/files/_patterns/00-test/12-parameter-partial.mustache', '00-test', '12-parameter-partial.mustache'); + innerParameteredPattern.template = fs.readFileSync(patterns_dir + '/00-test/12-parameter-partial.mustache', 'utf8'); + innerParameteredPattern.extendedTemplate = innerParameteredPattern.template; + innerParameteredPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(innerParameteredPattern); + innerParameteredPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(innerParameteredPattern); + + var outerParameteredPattern = new object_factory.oPattern('test/files/_patterns/00-test/13-another-parameter-partial.mustache', '00-test', '13-another-parameter-partial.mustache'); + outerParameteredPattern.template = fs.readFileSync(patterns_dir + '/00-test/13-another-parameter-partial.mustache', 'utf8'); + outerParameteredPattern.extendedTemplate = outerParameteredPattern.template; + outerParameteredPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(outerParameteredPattern); + outerParameteredPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(outerParameteredPattern); + + pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.addPattern(stylePattern, pl); + pattern_assembler.addPattern(innerParameteredPattern, pl); + pattern_assembler.addPattern(outerParameteredPattern, pl); + + //act + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/13-another-parameter-partial.mustache', pl, {}); + + //assert. + var expectedValue = 'bar foo bar bar'; + test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + test.done(); + } +>>>>>>> 4af2266... unit test coverage for #250 'parameter hunter parses parameters with single-quoted keys and single-quoted values wrapping internal escaped single-quotes' : function(test){ var currentPattern = currentPatternClosure(); From 68bbd2ffa6534acfeb46eb5f2b0506fb7ece91ff Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 29 Feb 2016 22:31:10 -0500 Subject: [PATCH 004/162] working unit test for parameter hunter --- builder/parameter_hunter.js | 7 +- builder/pattern_assembler.js | 21 +++-- test/parameter_hunter_tests.js | 157 ++++++++------------------------ test/pattern_assembler_tests.js | 12 +-- 4 files changed, 61 insertions(+), 136 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 53138a252..9f0f4028d 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -181,10 +181,11 @@ var parameter_hunter = function () { patternlab.partials[pattern.key] = renderedTemplate; }); - //after iterating through parameteredPartials, re-evaluate whether renderedTemplate - //has parametered partials within its just-rendered parametered partials. + //after iterating through parameteredPartials, reassign the current pattern's + //stylePartials, parameteredPartials, and extendedTemplate properties based on + //the most recent evaluation of renderedTemplate. + pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(renderedTemplate); pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); - //fill out extendedTemplate with renderedTemplate. pattern.extendedTemplate = renderedTemplate; //recurse if renderedTemplate still has parametered partials. diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 8e9ec29a8..611711102 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -14,7 +14,12 @@ var pattern_assembler = function () { // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithStyleModifiers(pattern) { - var matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + var matches; + if (typeof pattern === 'string') { + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + } return matches; } @@ -267,24 +272,22 @@ var pattern_assembler = function () { list_item_hunter.process_list_item_partials(currentPattern, patternlab); //determine if the template contains any pattern parameters - if(currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0){ + if (currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0) { //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab); //re-evaluate foundPatternPartials foundPatternPartials = findPartials(currentPattern.extendedTemplate); } - if(foundPatternPartials && foundPatternPartials.length > 0){ + if (foundPatternPartials && foundPatternPartials.length > 0) { //do something with the regular old partials - for(i = 0; i < foundPatternPartials.length; i++){ + for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); var partialPath; //identify which pattern this partial corresponds to - for(var j = 0; j < patternlab.patterns.length; j++){ - if(patternlab.patterns[j].key === partialKey || - patternlab.patterns[j].abspath.indexOf(partialKey) > -1) - { + for (var j = 0; j < patternlab.patterns.length; j++) { + if (patternlab.patterns[j].key === partialKey || patternlab.patterns[j].abspath.indexOf(partialKey) > -1) { partialPath = patternlab.patterns[j].abspath; } } @@ -296,7 +299,7 @@ var pattern_assembler = function () { var partialPattern = getpatternbykey(partialKey, patternlab); //if partial has style modifier data, replace the styleModifier value - if(currentPattern.stylePartials && currentPattern.stylePartials.length > 0){ + if (currentPattern.stylePartials && currentPattern.stylePartials.length > 0) { style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 5573a30dc..ec0983dbc 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -1,5 +1,4 @@ (function () { -<<<<<<< HEAD "use strict"; var ph = require('../builder/parameter_hunter'); @@ -57,61 +56,6 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); -======= - "use strict"; - - var ph = require('../builder/parameter_hunter'); - var pa = require('../builder/pattern_assembler'); - var object_factory = require('../builder/object_factory'); - - exports['parameter_hunter'] = { - 'pattern hunter finds and extends templates' : function(test){ - - //setup current pattern from what we would have during execution - var currentPattern = { - "fileName": "01-sticky-comment", - "subdir": "02-organisms/02-comments", - "name": "02-organisms-02-comments-01-sticky-comment", - "patternName": "sticky-comment", - "patternLink": "02-organisms-02-comments-01-sticky-comment/02-organisms-02-comments-01-sticky-comment.html", - "patternGroup": "organisms", - "patternSubGroup": "comments", - "flatPatternPath": "02-organisms-02-comments", - "key": "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.') }}" - ] - }; - var patternlab = { - patterns: [ - { - "fileName": "02-single-comment", - "subdir": "01-molecules/06-components", - "name": "01-molecules-06-components-02-single-comment", - "patternName": "single-comment", - "patternLink": "01-molecules-06-components-02-single-comment/01-molecules-06-components-02-single-comment.html", - "patternGroup": "molecules", - "patternSubGroup": "components", - "flatPatternPath": "01-molecules-06-components", - "key": "molecules-single-comment", - "template": "

{{description}}

", - "extendedTemplate": "

{{description}}

" - } - ], - config: { - debug: false - }, - data: { - description: 'Not a quote from a smart man' - }, - partials: {}, - }; - - var parameter_hunter = new ph(); ->>>>>>> 4af2266... unit test coverage for #250 parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

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

'); @@ -198,7 +142,6 @@ test.done(); }, -<<<<<<< HEAD 'parameter hunter parses parameters with single-quoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); @@ -214,67 +157,6 @@ test.done(); }, -======= - 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ - - // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js - //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 object_factory.oPattern('test/files/_patterns/00-test/01-bar.mustache', '00-test', '01-bar.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/01-bar.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 stylePattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - stylePattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - stylePattern.extendedTemplate = stylePattern.template; - stylePattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(stylePattern); - stylePattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(stylePattern); - - var innerParameteredPattern = new object_factory.oPattern('test/files/_patterns/00-test/12-parameter-partial.mustache', '00-test', '12-parameter-partial.mustache'); - innerParameteredPattern.template = fs.readFileSync(patterns_dir + '/00-test/12-parameter-partial.mustache', 'utf8'); - innerParameteredPattern.extendedTemplate = innerParameteredPattern.template; - innerParameteredPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(innerParameteredPattern); - innerParameteredPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(innerParameteredPattern); - - var outerParameteredPattern = new object_factory.oPattern('test/files/_patterns/00-test/13-another-parameter-partial.mustache', '00-test', '13-another-parameter-partial.mustache'); - outerParameteredPattern.template = fs.readFileSync(patterns_dir + '/00-test/13-another-parameter-partial.mustache', 'utf8'); - outerParameteredPattern.extendedTemplate = outerParameteredPattern.template; - outerParameteredPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(outerParameteredPattern); - outerParameteredPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(outerParameteredPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(stylePattern, pl); - pattern_assembler.addPattern(innerParameteredPattern, pl); - pattern_assembler.addPattern(outerParameteredPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/13-another-parameter-partial.mustache', pl, {}); - - //assert. - var expectedValue = 'bar foo bar bar'; - test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); - test.done(); - } ->>>>>>> 4af2266... unit test coverage for #250 'parameter hunter parses parameters with single-quoted keys and single-quoted values wrapping internal escaped single-quotes' : function(test){ var currentPattern = currentPatternClosure(); @@ -348,6 +230,45 @@ parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not}"true"

'); + test.done(); + }, + + 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + //arrange + var fs = require('fs-extra'); + var path = require('path'); + var object_factory = require('../builder/object_factory'); + var pa = require('../builder/pattern_assembler'); + 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 = {}; + + pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl); + pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl); + pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl); + pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + + //act + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + var outerParameteredPattern = pattern_assembler.get_pattern_by_key(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + + //assert. + var expectedValue = 'bar foo bar bar'; + test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); } }; diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 5ba989a11..6a5c6da4d 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -308,7 +308,7 @@ pattern_assembler.addPattern(groupPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/04-group.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/04-group.mustache', pl); //assert var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; @@ -349,7 +349,7 @@ pattern_assembler.addPattern(groupPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache', pl); //assert var expectedValue = '
{{message}} {{message}} bar
'; @@ -388,7 +388,7 @@ pattern_assembler.addPattern(mixedPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/06-mixed.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/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}}
'; @@ -427,7 +427,7 @@ pattern_assembler.addPattern(bookendPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/09-bookend.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/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}}
'; @@ -468,7 +468,7 @@ pattern_assembler.addPattern(mixedPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/07-mixed-params.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/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
'; @@ -509,7 +509,7 @@ pattern_assembler.addPattern(bookendPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/08-bookend-params.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/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}}
'; From ec1c1cdb747aaccd375cd8583bef924717d81601 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:14:33 -0500 Subject: [PATCH 005/162] using getpatternbykey to stay DRY --- builder/pattern_assembler.js | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 611711102..9ff0b4b96 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -148,7 +148,8 @@ var pattern_assembler = function () { return patternlab.patterns[i]; } } - throw 'Could not find pattern with key ' + key; + + return null; } function processPatternIterative(file, patternlab) { @@ -241,19 +242,13 @@ var pattern_assembler = function () { style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); - //find current pattern in patternlab object using var file as a key - var currentPattern, - i; + var i; // for the for loops - for (i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].abspath === file) { - currentPattern = patternlab.patterns[i]; - break; - } - } + //find current pattern in patternlab object using var file as a key + var currentPattern = getpatternbykey(file, patternlab); //return if processing an ignored file - if (typeof currentPattern === 'undefined') { + if (currentPattern === null) { return; } @@ -283,26 +278,19 @@ var pattern_assembler = function () { //do something with the regular old partials for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); - var partialPath; //identify which pattern this partial corresponds to - for (var j = 0; j < patternlab.patterns.length; j++) { - if (patternlab.patterns[j].key === partialKey || patternlab.patterns[j].abspath.indexOf(partialKey) > -1) { - partialPath = patternlab.patterns[j].abspath; - } - } + var partialPattern = getpatternbykey(partialKey, patternlab); //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPath, patternlab); - - //complete assembly of extended template - var partialPattern = getpatternbykey(partialKey, patternlab); + processPatternRecursive(partialPattern.abspath, 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); } + //complete assembly of extended template currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); //update the extendedTemplate in the partials object in case this pattern is consumed later From 5450d3ce479d03b9fecc632529cfedf3f6a12ee9 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:22:03 -0500 Subject: [PATCH 006/162] whitespace edits --- builder/parameter_hunter.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 9f0f4028d..09fceaefa 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -120,11 +120,13 @@ var parameter_hunter = function () { var renderedTemplate = pattern.extendedTemplate; 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.get_pattern_by_key(partialName, patternlab); + //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190 partialPattern.extendedTemplate = partialPattern.template; @@ -196,7 +198,7 @@ var parameter_hunter = function () { } return { - find_parameters: function(pattern, patternlab){ + find_parameters: function (pattern, patternlab) { findparameters(pattern, patternlab); } }; From 8c2625a6daf05da0edbbe85cfc5e7bb38b0b56eb Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:23:49 -0500 Subject: [PATCH 007/162] reverting test changes in source dir --- .../02-organisms/02-comments/01-sticky-comment.mustache | 3 ++- source/_patterns/03-templates/00-homepage.mustache | 5 +---- source/_patterns/04-pages/00-homepage.mustache | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache b/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache index 56fe2f96b..ac0b28dc4 100644 --- a/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache +++ b/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache @@ -2,7 +2,8 @@

Selected Comments

    - {{> molecules-single-comment }} + {{> 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.') }}
diff --git a/source/_patterns/03-templates/00-homepage.mustache b/source/_patterns/03-templates/00-homepage.mustache index 580d3c9ad..40f9b1588 100644 --- a/source/_patterns/03-templates/00-homepage.mustache +++ b/source/_patterns/03-templates/00-homepage.mustache @@ -2,11 +2,8 @@ {{> organisms-header }}
{{# emergency }} - {{> molecules-alert(alertClass: 'error') }} + {{> molecules-alert }} {{/ emergency }} - {{# foo }} - {{> molecules-alert(alertClass: 'foo') }} - {{/ foo }} {{# hero }} {{> molecules-block-hero }} {{/ hero}} diff --git a/source/_patterns/04-pages/00-homepage.mustache b/source/_patterns/04-pages/00-homepage.mustache index 6d918a24d..d9894d4a7 100644 --- a/source/_patterns/04-pages/00-homepage.mustache +++ b/source/_patterns/04-pages/00-homepage.mustache @@ -1 +1 @@ -{{> templates-homepage(emergency: true) }} +{{> templates-homepage }} From b798a8a903d5d331ababe84bc4f40dda5967d57d Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:36:18 -0500 Subject: [PATCH 008/162] moving data vars in parameter_hunter.js outside for loop --- builder/parameter_hunter.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 09fceaefa..19b39db97 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -121,6 +121,20 @@ var parameter_hunter = function () { if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + var globalData = {}; + var localData = {}; + var paramData = {}; + + try { + globalData = JSON.parse(JSON.stringify(patternlab.data)); + localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); + } catch (e) { + console.log(e); + } + + //assemble the allData object to render non-partial Mustache tags. + var allData = pattern_assembler.merge_data(globalData, localData); + //compile this partial immeadiately, essentially consuming it. pattern.parameteredPartials.forEach(function (pMatch) { //find the partial's name and retrieve it @@ -140,13 +154,7 @@ var parameter_hunter = function () { var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; var paramStringWellFormed = paramToJson(paramString); - var globalData = {}; - var localData = {}; - var paramData = {}; - try { - globalData = JSON.parse(JSON.stringify(patternlab.data)); - localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); paramData = JSON.parse(paramStringWellFormed); } catch (e) { console.log(e); @@ -158,7 +166,6 @@ var parameter_hunter = function () { } //assemble the allData object to render non-partial Mustache tags. - var allData = pattern_assembler.merge_data(globalData, localData); allData = pattern_assembler.merge_data(allData, paramData); //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally From fec34deff915fbe99266cb96ad3080e387494c4a Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:46:05 -0500 Subject: [PATCH 009/162] lines before comments per eslint --- builder/.pattern_assembler.js.swp | Bin 0 -> 28672 bytes builder/pattern_assembler.js | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..1a77c0f3d6247dfa79abb709122ea66dafcf4ac5 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 9ff0b4b96..d51538c2b 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -127,10 +127,13 @@ var pattern_assembler = function () { for (i = 0; i < patternlab.patterns.length; i++) { switch (key) { + //look for exact key matches case patternlab.patterns[i].key: + //look for abspath matches case patternlab.patterns[i].abspath: + //else look by verbose syntax case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName: case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': @@ -268,13 +271,16 @@ var pattern_assembler = function () { //determine if the template contains any pattern parameters if (currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0) { + //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab); + //re-evaluate foundPatternPartials foundPatternPartials = findPartials(currentPattern.extendedTemplate); } if (foundPatternPartials && foundPatternPartials.length > 0) { + //do something with the regular old partials for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); From c013275fb3f04ad2a13719c418efbf2903718c5a Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:46:22 -0500 Subject: [PATCH 010/162] removing .swp file --- builder/.pattern_assembler.js.swp | Bin 28672 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index 1a77c0f3d6247dfa79abb709122ea66dafcf4ac5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 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 From 3b515560487cec816bb0e03f490f029d902f6799 Mon Sep 17 00:00:00 2001 From: hee01 Date: Tue, 1 Mar 2016 18:20:46 -0500 Subject: [PATCH 011/162] fixing delimitPos in paramToJson. eliminating more extraneous recursion paths in parameter_hunter.js --- builder/parameter_hunter.js | 127 ++++++++++++++++++++--------------- builder/pattern_assembler.js | 39 ++++++----- 2 files changed, 94 insertions(+), 72 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 19b39db97..060ad9b21 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -96,15 +96,14 @@ var parameter_hunter = function () { //except to prevent infinite loops. if (delimitPos === -1) { delimitPos = paramString.length - 1; - } else { - delimitPos += 1; } + paramStringWellFormed += paramString.substring(0, delimitPos); paramString = paramString.substring(delimitPos, paramString.length).trim(); } //break at the end. - if (paramString.length === 1) { + if (paramString.length <= 1) { paramStringWellFormed += paramString.trim(); paramString = ''; break; @@ -135,60 +134,78 @@ var parameter_hunter = function () { //assemble the allData object to render non-partial Mustache tags. var allData = pattern_assembler.merge_data(globalData, localData); - //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.get_pattern_by_key(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.indexOf(')'); - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = paramToJson(paramString); - - try { - paramData = JSON.parse(paramStringWellFormed); - } catch (e) { - console.log(e); - } - - //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); - } - - //assemble the allData object to render non-partial Mustache tags. - allData = pattern_assembler.merge_data(allData, paramData); - - //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally - allData.link = extend({}, patternlab.data.link); + //compile this partial immediately, essentially consuming it. + //the reasoning for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant Mustache conditionals persisted. + //in order to token-replace parameterized tags, prepare for rendering Mustache + //replace global and file-specific data. however, since partial inclusion + //is not done here, escape partial tags by switching them to ERB syntax. + var templateEscaped = renderedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + templateEscaped = pattern_assembler.renderPattern(templateEscaped, allData); - //the reasoning for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant Mustache conditionals persisted + //after that's done, switch back to standard Mustache tags + renderedTemplate = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - //in order to token-replace parameterized tags, prepare for rendering Mustache - //replace global, file-specific, and param data. however, since partial inclusion - //is not done here, escape partial tags by switching them to ERB syntax. - var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); - extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); - - //after that's done, switch back to standard Mustache tags - renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - //remove the parameter from the partial and replace it with the rendered partial + paramData - renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); + //re-evaluate parameteredPartials after rendering + pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.key] = renderedTemplate; - }); + if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + + //iterate through most recently evaluated parameteredPartials + pattern.parameteredPartials.forEach(function (pMatch) { + //find the partial's name and retrieve it + var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(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.indexOf(')'); + var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; + var paramStringWellFormed = '{}'; + paramStringWellFormed = paramToJson(paramString); + + try { + paramData = JSON.parse(paramStringWellFormed); + } catch (e) { + console.log(e); + } + + //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); + } + + //assemble the allData object to render non-partial Mustache tags. + allData = pattern_assembler.merge_data(allData, paramData); + + //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally + allData.link = extend({}, patternlab.data.link); + + //the reasoning for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant Mustache conditionals persisted. + //in order to token-replace parameterized tags, prepare for rendering Mustache + //replace global, file-specific, and param data. however, since partial inclusion + //is not done here, escape partial tags by switching them to ERB syntax. + var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); + + //after that's done, switch back to standard Mustache tags + renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + //remove the parameter from the partial and replace it with the rendered partial + paramData + renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); + + //update the extendedTemplate in the partials object in case this pattern is consumed later + patternlab.partials[pattern.key] = renderedTemplate; + }); + } //after iterating through parameteredPartials, reassign the current pattern's //stylePartials, parameteredPartials, and extendedTemplate properties based on @@ -198,7 +215,7 @@ var parameter_hunter = function () { pattern.extendedTemplate = renderedTemplate; //recurse if renderedTemplate still has parametered partials. - if (pattern.parameteredPartials) { + if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { findparameters(pattern, patternlab); } } diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index d51538c2b..f4e71c83c 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -16,9 +16,9 @@ var pattern_assembler = function () { function findPartialsWithStyleModifiers(pattern) { var matches; if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g); } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g); } return matches; } @@ -27,9 +27,9 @@ var pattern_assembler = function () { function findPartialsWithPatternParameters(pattern) { var matches; if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g); } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g); } return matches; } @@ -38,9 +38,9 @@ var pattern_assembler = function () { function findPartials(pattern) { var matches; if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g); } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g); } return matches; } @@ -283,24 +283,29 @@ var pattern_assembler = function () { //do something with the regular old partials for (i = 0; i < foundPatternPartials.length; i++) { - var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); //identify which pattern this partial corresponds to var partialPattern = getpatternbykey(partialKey, patternlab); - //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPattern.abspath, patternlab); + if (partialPattern === null) { + throw 'Could not find pattern with key ' + partialKey; - //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); - } + } else { + //recurse through nested partials to fill out this extended template. + processPatternRecursive(partialPattern.abspath, 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); + } - //complete assembly of extended template - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); + //complete assembly of extended template + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; + //update the extendedTemplate in the partials object in case this pattern is consumed later + patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; + } } } From 7663c56385b75eb1f28a312067bb272849e0188a Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 20:48:31 -0500 Subject: [PATCH 012/162] unit test --- builder/parameter_hunter.js | 4 ++-- test/parameter_hunter_tests.js | 23 +++++++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 060ad9b21..b564835e7 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -140,7 +140,7 @@ var parameter_hunter = function () { //in order to token-replace parameterized tags, prepare for rendering Mustache //replace global and file-specific data. however, since partial inclusion //is not done here, escape partial tags by switching them to ERB syntax. - var templateEscaped = renderedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + var templateEscaped = renderedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); templateEscaped = pattern_assembler.renderPattern(templateEscaped, allData); //after that's done, switch back to standard Mustache tags @@ -193,7 +193,7 @@ var parameter_hunter = function () { //in order to token-replace parameterized tags, prepare for rendering Mustache //replace global, file-specific, and param data. however, since partial inclusion //is not done here, escape partial tags by switching them to ERB syntax. - var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); //after that's done, switch back to standard Mustache tags diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index ec0983dbc..447fcc1f6 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -208,12 +208,12 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not{\"true\"') }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not \",true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

true not{"true"

'); + test.equals(currentPattern.extendedTemplate, '

true not ",true"

'); test.done(); }, @@ -223,12 +223,27 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not}\\\"true\\\"\") }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not \\\":true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

true not}"true"

'); + test.equals(currentPattern.extendedTemplate, '

true not ":true"

'); + + test.done(); + }, + + 'parameter 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(); + + 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); + test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); }, From 63897ac16f1c2f6d361f2ec83036ec123f34d1a6 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 06:07:38 -0500 Subject: [PATCH 013/162] periods in comments --- builder/parameter_hunter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index b564835e7..8b8577ab2 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -137,7 +137,7 @@ var parameter_hunter = function () { //compile this partial immediately, essentially consuming it. //the reasoning for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant Mustache conditionals persisted. - //in order to token-replace parameterized tags, prepare for rendering Mustache + //in order to token-replace parameterized tags, prepare for rendering Mustache. //replace global and file-specific data. however, since partial inclusion //is not done here, escape partial tags by switching them to ERB syntax. var templateEscaped = renderedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); @@ -190,7 +190,7 @@ var parameter_hunter = function () { //the reasoning for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant Mustache conditionals persisted. - //in order to token-replace parameterized tags, prepare for rendering Mustache + //in order to token-replace parameterized tags, prepare for rendering Mustache. //replace global, file-specific, and param data. however, since partial inclusion //is not done here, escape partial tags by switching them to ERB syntax. var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); From af090a212aa24bdb2b82c69b0b86bb06d9623532 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 09:00:49 -0500 Subject: [PATCH 014/162] avoiding errors and enabling pseudopatterns --- builder/parameter_hunter.js | 2 ++ builder/pattern_assembler.js | 20 ++++++++++++++++---- builder/patternlab.js | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 8b8577ab2..d1d7379bb 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -183,6 +183,8 @@ var parameter_hunter = function () { } //assemble the allData object to render non-partial Mustache tags. + //need a fresh start on the allData object to work with the paramData specific to this iteration. + allData = pattern_assembler.merge_data(globalData, localData); allData = pattern_assembler.merge_data(allData, paramData); //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index f4e71c83c..22621c2ed 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -215,6 +215,9 @@ var pattern_assembler = function () { //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); + //do the same with extendedTemplate to avoid undefined type errors + currentPattern.extendedTemplate = currentPattern.template; + //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); @@ -231,8 +234,9 @@ var pattern_assembler = function () { * * @param {string} file The abspath of pattern being processed. * @param {Object} patternlab The patternlab object. + * @param {string} startFile The abspath of the pattern at the top level of recursion. */ - function processPatternRecursive(file, patternlab) { + function processPatternRecursive(file, patternlab, startFile) { var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -255,8 +259,16 @@ var pattern_assembler = function () { return; } + //need to start with a fresh extendedTemplate for each recursion step currentPattern.extendedTemplate = currentPattern.template; + //if at top level of recursion, make sure to reset stylePartials and parameteredPartials + //in case we are processing a pseudopattern variant + if (file === startFile) { + currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); + } + //find how many partials there may be for the given pattern var foundPatternPartials = findPartials(currentPattern); @@ -293,7 +305,7 @@ var pattern_assembler = function () { } else { //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPattern.abspath, patternlab); + processPatternRecursive(partialPattern.abspath, patternlab, startFile); //if partial has style modifier data, replace the styleModifier value if (currentPattern.stylePartials && currentPattern.stylePartials.length > 0) { @@ -413,8 +425,8 @@ var pattern_assembler = function () { process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab) { - processPatternRecursive(file, patternlab); + process_pattern_recursive: function (file, patternlab, startFile) { + processPatternRecursive(file, patternlab, startFile); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); diff --git a/builder/patternlab.js b/builder/patternlab.js index b4705deaf..fc3ca06b1 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -113,7 +113,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); }); From efda9536105b5742259bfca56b93ba049d150c40 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 09:35:03 -0500 Subject: [PATCH 015/162] execution optimization and updated unit test --- builder/pattern_assembler.js | 16 +++++----------- test/parameter_hunter_tests.js | 6 +++++- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 22621c2ed..b9c6fa859 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -215,15 +215,6 @@ var pattern_assembler = function () { //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate to avoid undefined type errors - currentPattern.extendedTemplate = currentPattern.template; - - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - - //find any pattern parameters that may be in the current pattern - currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); - //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } @@ -262,10 +253,13 @@ var pattern_assembler = function () { //need to start with a fresh extendedTemplate for each recursion step currentPattern.extendedTemplate = currentPattern.template; - //if at top level of recursion, make sure to reset stylePartials and parameteredPartials - //in case we are processing a pseudopattern variant + //if at top level of recursion, make sure to set stylePartials and parameteredPartials if (file === startFile) { + + //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + + //find any pattern parameters that may be in the current pattern currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); } diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 447fcc1f6..4bdb36d8e 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -278,7 +278,11 @@ pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); //act - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl, path.resolve('test/files/_patterns/00-test/01-bar.mustache')); + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl, path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache')); + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache')); + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache')); var outerParameteredPattern = pattern_assembler.get_pattern_by_key(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); //assert. From 8e1ad2c8e3c93742f23a9ff4ebdc87f05210942a Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 09:40:17 -0500 Subject: [PATCH 016/162] avoiding undefined type error --- builder/pattern_assembler.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index b9c6fa859..3a3799bf4 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -215,6 +215,9 @@ var pattern_assembler = function () { //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); + //do the same with extendedTemplate to avoid undefined type errors + currentPattern.extendedTemplate = currentPattern.template; + //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } From 959e0897d99fe62ea562869e3924cc25cd1a0166 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 09:54:18 -0500 Subject: [PATCH 017/162] execution optimization --- builder/pattern_assembler.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 3a3799bf4..1649dbab7 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -253,9 +253,6 @@ var pattern_assembler = function () { return; } - //need to start with a fresh extendedTemplate for each recursion step - currentPattern.extendedTemplate = currentPattern.template; - //if at top level of recursion, make sure to set stylePartials and parameteredPartials if (file === startFile) { @@ -264,6 +261,10 @@ var pattern_assembler = function () { //find any pattern parameters that may be in the current pattern currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); + + //need to start with a fresh extendedTemplate for each subsequent recursion step + } else { + currentPattern.extendedTemplate = currentPattern.template; } //find how many partials there may be for the given pattern From 3452e9e299f6e50241821f53c58e3a9e85752fbe Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 10:00:42 -0500 Subject: [PATCH 018/162] deleting extraneous empty line --- test/parameter_hunter_tests.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 4bdb36d8e..4e751f1ca 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -278,7 +278,6 @@ pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); //act - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl, path.resolve('test/files/_patterns/00-test/01-bar.mustache')); pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl, path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache')); pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache')); From 0bdaca04803b45ac3e0ce24b148ce008cecd60b2 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 10:43:38 -0500 Subject: [PATCH 019/162] updating unit test --- test/parameter_hunter_tests.js | 23 ++++--- test/pattern_assembler_tests.js | 103 ++++++++++++-------------------- 2 files changed, 51 insertions(+), 75 deletions(-) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 4e751f1ca..8ed612635 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -272,17 +272,22 @@ pl.patterns = []; pl.partials = {}; - pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl); - pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl); - pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl); - pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); + var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var innerParameteredFile = path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'); + var outerParameteredFile = path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'); + + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(styleFile, pl); + pattern_assembler.process_pattern_iterative(innerParameteredFile, pl); + pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); //act - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl, path.resolve('test/files/_patterns/00-test/01-bar.mustache')); - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl, path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache')); - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache')); - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache')); - var outerParameteredPattern = pattern_assembler.get_pattern_by_key(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + pattern_assembler.process_pattern_recursive(atomFile, pl, atomFile); + pattern_assembler.process_pattern_recursive(styleFile, pl, styleFile); + pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, innerParameteredFile); + pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, outerParameteredFile); + var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); //assert. var expectedValue = 'bar foo bar bar'; diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 6a5c6da4d..1a829c4aa 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -251,7 +251,7 @@ return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); } ); @@ -296,19 +296,16 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - var groupPattern = new object_factory.oPattern('test/files/_patterns/00-test/04-group.mustache', '00-test', '04-group.mustache'); - groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/04-group.mustache', 'utf8'); - groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var groupFile = path.resolve('test/files/_patterns/00-test/04-group.mustache'); - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(groupPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(groupFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/04-group.mustache', pl); + pattern_assembler.process_pattern_recursive(groupFile, pl, groupFile); + var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; @@ -335,21 +332,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var groupFile = path.resolve('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache'); - var groupPattern = new object_factory.oPattern('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache', '00-test', '10-multiple-classes-numeric.mustache'); - groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/10-multiple-classes-numeric.mustache', 'utf8'); - 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); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(groupFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache', pl); + pattern_assembler.process_pattern_recursive(groupFile, pl, groupFile); + var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert var expectedValue = '
{{message}} {{message}} bar
'; @@ -376,19 +367,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var mixedPattern = new object_factory.oPattern('test/files/_patterns/00-test/06-mixed.mustache', '00-test', '06-mixed.mustache'); - mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/06-mixed.mustache', 'utf8'); - mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var mixedFile = path.resolve('test/files/_patterns/00-test/06-mixed.mustache'); - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(mixedPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(mixedFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/06-mixed.mustache', pl); + pattern_assembler.process_pattern_recursive(mixedFile, pl, mixedFile); + var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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}}
'; @@ -415,19 +402,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var bookendPattern = new object_factory.oPattern('test/files/_patterns/00-test/09-bookend.mustache', '00-test', '09-bookend.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/09-bookend.mustache', 'utf8'); - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var bookendFile = path.resolve('test/files/_patterns/00-test/09-bookend.mustache'); - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(bookendPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/09-bookend.mustache', pl); + pattern_assembler.process_pattern_recursive(bookendFile, pl, bookendFile); + var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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}}
'; @@ -454,21 +437,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var mixedFile = path.resolve('test/files/_patterns/00-test/07-mixed-params.mustache'); - var mixedPattern = new object_factory.oPattern('test/files/_patterns/00-test/07-mixed-params.mustache', '00-test', '07-mixed-params.mustache'); - mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/07-mixed-params.mustache', 'utf8'); - 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); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(mixedFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/07-mixed-params.mustache', pl); + pattern_assembler.process_pattern_recursive(mixedFile, pl, mixedFile); + var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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
'; @@ -495,21 +472,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); - - var bookendPattern = new object_factory.oPattern('test/files/_patterns/00-test/08-bookend-params.mustache', '00-test', '08-bookend-params.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/08-bookend-params.mustache', 'utf8'); - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); - bookendPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(bookendPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var bookendFile = path.resolve('test/files/_patterns/00-test/08-bookend-params.mustache'); - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(bookendPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/08-bookend-params.mustache', pl); + pattern_assembler.process_pattern_recursive(bookendFile, pl, bookendFile); + var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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}}
'; From 51756151d505490b64b9053fc3abd52121eccf08 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 3 Mar 2016 09:55:21 -0500 Subject: [PATCH 020/162] rendering patterns to dismiss excepted partials --- builder/parameter_hunter.js | 77 +++++++++++-------------------- builder/pattern_assembler.js | 88 ++++++++++++++++++++++++++---------- builder/patternlab.js | 20 -------- builder/patternlab_grunt.js | 2 + 4 files changed, 91 insertions(+), 96 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index d1d7379bb..866fa5238 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -19,21 +19,16 @@ var parameter_hunter = function () { pattern_assembler = new pa(); function paramToJson(pString) { - var paramStringWellFormed = ''; - var paramStringTmp; var colonPos; var delimitPos; - var quotePos; + var paramKey; var paramString = pString; + var paramStringWellFormed = ''; + var paramStringTmp; + var quotePos; do { - //if param key is wrapped in single quotes, replace with double quotes. - paramString = paramString.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); - - //if params key is not wrapped in any quotes, wrap in double quotes. - paramString = paramString.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); - //move param key to paramStringWellFormed var. colonPos = paramString.indexOf(':'); @@ -43,7 +38,19 @@ var parameter_hunter = function () { } else { colonPos += 1; } - paramStringWellFormed += paramString.substring(0, colonPos); + + paramKey = paramString.substring(0, colonPos); + + //if param key is wrapped in single quotes, replace with double quotes. + paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); + + //if params key is not wrapped in any quotes, wrap in double quotes. + paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); + + //this is just here to match the escaping scheme in Pattern Lab PHP. + paramKey = paramKey.replace(/\\/g, ''); + + paramStringWellFormed += paramKey; paramString = paramString.substring(colonPos, paramString.length).trim(); //if param value is wrapped in single quotes, replace with double quotes. @@ -115,36 +122,13 @@ var parameter_hunter = function () { } function findparameters(pattern, patternlab) { - var renderedPartial; - var renderedTemplate = pattern.extendedTemplate; if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { - var globalData = {}; - var localData = {}; - var paramData = {}; - - try { - globalData = JSON.parse(JSON.stringify(patternlab.data)); - localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); - } catch (e) { - console.log(e); - } - - //assemble the allData object to render non-partial Mustache tags. - var allData = pattern_assembler.merge_data(globalData, localData); - - //compile this partial immediately, essentially consuming it. - //the reasoning for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant Mustache conditionals persisted. - //in order to token-replace parameterized tags, prepare for rendering Mustache. - //replace global and file-specific data. however, since partial inclusion - //is not done here, escape partial tags by switching them to ERB syntax. - var templateEscaped = renderedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - templateEscaped = pattern_assembler.renderPattern(templateEscaped, allData); - - //after that's done, switch back to standard Mustache tags - renderedTemplate = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + var renderedPartial; + var renderedTemplate = pattern_assembler.escape_render_unescape_partials(pattern.extendedTemplate, pattern.jsonFileData); //re-evaluate parameteredPartials after rendering pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); @@ -167,6 +151,7 @@ var parameter_hunter = function () { //strip out the additional data, convert string to JSON. var leftParen = pMatch.indexOf('('); var rightParen = pMatch.indexOf(')'); + var paramData = {}; var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; var paramStringWellFormed = '{}'; paramStringWellFormed = paramToJson(paramString); @@ -182,24 +167,14 @@ var parameter_hunter = function () { style_modifier_hunter.consume_style_modifier(partialPattern, pMatch, patternlab); } - //assemble the allData object to render non-partial Mustache tags. - //need a fresh start on the allData object to work with the paramData specific to this iteration. - allData = pattern_assembler.merge_data(globalData, localData); - allData = pattern_assembler.merge_data(allData, paramData); + var allData = pattern_assembler.merge_data(partialPattern.jsonFileData, paramData); //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally allData.link = extend({}, patternlab.data.link); - //the reasoning for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant Mustache conditionals persisted. - //in order to token-replace parameterized tags, prepare for rendering Mustache. - //replace global, file-specific, and param data. however, since partial inclusion - //is not done here, escape partial tags by switching them to ERB syntax. - var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); - - //after that's done, switch back to standard Mustache tags - renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + renderedPartial = pattern_assembler.escape_render_unescape_partials(partialPattern.extendedTemplate, allData); //remove the parameter from the partial and replace it with the rendered partial + paramData renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 1649dbab7..86e64c70f 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -12,44 +12,71 @@ var pattern_assembler = function () { - // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern - function findPartialsWithStyleModifiers(pattern) { + // find regex matches within both pattern strings and pattern objects. + function patternMatcher(pattern, regex) { var matches; - if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g); - } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g); + + if(typeof pattern === 'string'){ + matches = pattern.match(regex); + } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ + matches = pattern.template.match(regex); } + + return matches; + } + + // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern + function findPartialsWithStyleModifiers(pattern) { + var regex = /{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithPatternParameters(pattern) { - var matches; - if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g); - } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g); - } + var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } //find and return any {{> template-name* }} within pattern function findPartials(pattern) { - var matches; - if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g); - } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g); - } + var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } function findListItems(pattern) { - var matches = pattern.template.match(/({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g); + var regex = /({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } + /** + * Render the extendedTemplate excluding partials. The reason for this is to + * eliminate the unwanted recursion paths that would remain if irrelevant + * conditional tags persisted. + * + * @param {string} extendedTemplate The template to render. + * @param {object} data The data to render with. + * @returns {string} templateRendered + */ + function escapeRenderUnescapePartials(extendedTemplate, data) { + + //escape partial tags by switching them to ERB syntax. + var templateEscaped = extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + templateEscaped = renderPattern(templateEscaped, data); + + //after that's done, switch back to standard Mustache tags and return. + var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + return templateRendered; + } + function setState(pattern, patternlab) { if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]) { pattern.patternState = patternlab.config.patternStates[pattern.patternName]; @@ -188,15 +215,17 @@ var pattern_assembler = function () { setState(currentPattern, patternlab); //look for a json file for this template + var globalData = patternlab.data; try { var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); - currentPattern.jsonFileData = fs.readJSONSync(jsonFilename); + var localData = fs.readJSONSync(jsonFilename); + currentPattern.jsonFileData = mergeData(globalData, localData); if (patternlab.config.debug) { console.log('found pattern-specific data.json for ' + currentPattern.key); } } catch (error) { - // do nothing + currentPattern.jsonFileData = globalData; } //look for a listitems.json file for this template @@ -227,7 +256,7 @@ var pattern_assembler = function () { * Build out the final output for writing to the public/patterns directory. * * @param {string} file The abspath of pattern being processed. - * @param {Object} patternlab The patternlab object. + * @param {object} patternlab The patternlab object. * @param {string} startFile The abspath of the pattern at the top level of recursion. */ function processPatternRecursive(file, patternlab, startFile) { @@ -259,9 +288,6 @@ var pattern_assembler = function () { //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - //find any pattern parameters that may be in the current pattern - currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); - //need to start with a fresh extendedTemplate for each subsequent recursion step } else { currentPattern.extendedTemplate = currentPattern.template; @@ -271,7 +297,13 @@ var pattern_assembler = function () { var foundPatternPartials = findPartials(currentPattern); if (foundPatternPartials !== null && foundPatternPartials.length > 0) { + currentPattern.extendedTemplate = escapeRenderUnescapePartials(currentPattern.extendedTemplate, currentPattern.jsonFileData); + + //re-evaluate persistent partials + foundPatternPartials = findPartials(currentPattern.extendedTemplate); + } + if (foundPatternPartials !== null && foundPatternPartials.length > 0) { if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } @@ -279,6 +311,9 @@ var pattern_assembler = function () { //find any listItem blocks list_item_hunter.process_list_item_partials(currentPattern, patternlab); + //evaluate parameteredPartials after rendering + currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); + //determine if the template contains any pattern parameters if (currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0) { @@ -411,6 +446,9 @@ var pattern_assembler = function () { find_list_items: function (pattern) { return findListItems(pattern); }, + escape_render_unescape_partials: function (extendedTemplate, data) { + return escapeRenderUnescapePartials(extendedTemplate, data); + }, setPatternState: function (pattern, patternlab) { setState(pattern, patternlab); }, diff --git a/builder/patternlab.js b/builder/patternlab.js index fc3ca06b1..46e4b62a5 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -73,16 +73,6 @@ var patternlab_engine = function (config) { //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, - { - filter: function (filePath, dir) { - if (dir) { - var remainingPath = filePath.replace(patterns_dir, ''); - var isValidPath = remainingPath.indexOf('/_') === -1; - return isValidPath; - } - return true; - } - }, function (err, file) { //log any errors if (err) { @@ -97,16 +87,6 @@ var patternlab_engine = function (config) { //extendedTemplate property of the patternlab.patterns elements diveSync( patterns_dir, - { - filter: function (filePath, dir) { - if (dir) { - var remainingPath = filePath.replace(patterns_dir, ''); - var isValidPath = remainingPath.indexOf('/_') === -1; - return isValidPath; - } - return true; - } - }, function (err, file) { //log any errors if (err) { diff --git a/builder/patternlab_grunt.js b/builder/patternlab_grunt.js index 69085c291..1c78ac126 100644 --- a/builder/patternlab_grunt.js +++ b/builder/patternlab_grunt.js @@ -12,6 +12,7 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (grunt) { grunt.registerTask('patternlab', 'create design systems with atomic design', function (arg) { +console.log(Date.now() / 1000); var patternlab = patternlab_engine(); if (arguments.length === 0) { @@ -33,6 +34,7 @@ module.exports = function (grunt) { if (arg && (arg !== "v" && arg !== "only_patterns" && arg !== "help")) { patternlab.help(); } +console.log(Date.now() / 1000); }); }; From c5d46a82e45966fee596d3b984302aabc0ee1659 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 3 Mar 2016 10:06:35 -0500 Subject: [PATCH 021/162] passing nodeunit and eslint --- builder/pattern_assembler.js | 124 ++++++++++++++++----------------- builder/patternlab_grunt.js | 2 - test/parameter_hunter_tests.js | 1 + 3 files changed, 63 insertions(+), 64 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 86e64c70f..05a1fde7d 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -16,9 +16,9 @@ var pattern_assembler = function () { function patternMatcher(pattern, regex) { var matches; - if(typeof pattern === 'string'){ + if (typeof pattern === 'string') { matches = pattern.match(regex); - } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ + } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { matches = pattern.template.match(regex); } @@ -56,27 +56,6 @@ var pattern_assembler = function () { return matches; } - /** - * Render the extendedTemplate excluding partials. The reason for this is to - * eliminate the unwanted recursion paths that would remain if irrelevant - * conditional tags persisted. - * - * @param {string} extendedTemplate The template to render. - * @param {object} data The data to render with. - * @returns {string} templateRendered - */ - function escapeRenderUnescapePartials(extendedTemplate, data) { - - //escape partial tags by switching them to ERB syntax. - var templateEscaped = extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - templateEscaped = renderPattern(templateEscaped, data); - - //after that's done, switch back to standard Mustache tags and return. - var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - return templateRendered; - } - function setState(pattern, patternlab) { if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]) { pattern.patternState = patternlab.config.patternStates[pattern.patternName]; @@ -149,6 +128,27 @@ var pattern_assembler = function () { } } + /** + * Render the extendedTemplate excluding partials. The reason for this is to + * eliminate the unwanted recursion paths that would remain if irrelevant + * conditional tags persisted. + * + * @param {string} extendedTemplate The template to render. + * @param {object} data The data to render with. + * @returns {string} templateRendered + */ + function escapeRenderUnescapePartials(extendedTemplate, data) { + + //escape partial tags by switching them to ERB syntax. + var templateEscaped = extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + templateEscaped = renderPattern(templateEscaped, data); + + //after that's done, switch back to standard Mustache tags and return. + var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + return templateRendered; + } + function getpatternbykey(key, patternlab) { var i; // for the for loops @@ -182,6 +182,36 @@ var pattern_assembler = function () { return null; } + function mergeData(obj1, obj2) { + if (typeof obj2 === 'undefined') { + obj2 = {}; //eslint-disable-line no-param-reassign + } + + for (var p in obj1) { //eslint-disable-line guard-for-in + try { + // Only recurse if obj1[p] is an object. + if (obj1[p].constructor === Object) { + // Requires 2 objects as params; create obj2[p] if undefined. + if (typeof obj2[p] === 'undefined') { + obj2[p] = {}; + } + obj2[p] = mergeData(obj1[p], obj2[p]); + + // Pop when recursion meets a non-object. If obj1[p] is a non-object, + // only copy to undefined obj2[p]. This way, obj2 maintains priority. + } else if (typeof obj2[p] === 'undefined') { + obj2[p] = obj1[p]; + } + } catch (e) { + // Property in destination object not set; create it and set its value. + if (typeof obj2[p] === 'undefined') { + obj2[p] = obj1[p]; + } + } + } + return obj2; + } + function processPatternIterative(file, patternlab) { var fs = require('fs-extra'), of = require('./object_factory'), @@ -369,36 +399,6 @@ var pattern_assembler = function () { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab); } - function mergeData(obj1, obj2) { - if (typeof obj2 === 'undefined') { - obj2 = {}; //eslint-disable-line no-param-reassign - } - - for (var p in obj1) { //eslint-disable-line guard-for-in - try { - // Only recurse if obj1[p] is an object. - if (obj1[p].constructor === Object) { - // Requires 2 objects as params; create obj2[p] if undefined. - if (typeof obj2[p] === 'undefined') { - obj2[p] = {}; - } - obj2[p] = mergeData(obj1[p], obj2[p]); - - // Pop when recursion meets a non-object. If obj1[p] is a non-object, - // only copy to undefined obj2[p]. This way, obj2 maintains priority. - } else if (typeof obj2[p] === 'undefined') { - obj2[p] = obj1[p]; - } - } catch (e) { - // Property in destination object not set; create it and set its value. - if (typeof obj2[p] === 'undefined') { - obj2[p] = obj1[p]; - } - } - } - return obj2; - } - function parseDataLinksHelper(patternlab, obj, key) { var linkRE, dataObjAsString, linkMatches, expandedLink; @@ -446,9 +446,6 @@ var pattern_assembler = function () { find_list_items: function (pattern) { return findListItems(pattern); }, - escape_render_unescape_partials: function (extendedTemplate, data) { - return escapeRenderUnescapePartials(extendedTemplate, data); - }, setPatternState: function (pattern, patternlab) { setState(pattern, patternlab); }, @@ -458,11 +455,11 @@ var pattern_assembler = function () { renderPattern: function (template, data, partials) { return renderPattern(template, data, partials); }, - process_pattern_iterative: function (file, patternlab) { - processPatternIterative(file, patternlab); + combine_listItems: function (patternlab) { + buildListItems(patternlab); }, - process_pattern_recursive: function (file, patternlab, startFile) { - processPatternRecursive(file, patternlab, startFile); + escape_render_unescape_partials: function (extendedTemplate, data) { + return escapeRenderUnescapePartials(extendedTemplate, data); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); @@ -470,8 +467,11 @@ var pattern_assembler = function () { merge_data: function (existingData, newData) { return mergeData(existingData, newData); }, - combine_listItems: function (patternlab) { - buildListItems(patternlab); + process_pattern_iterative: function (file, patternlab) { + processPatternIterative(file, patternlab); + }, + process_pattern_recursive: function (file, patternlab, startFile) { + processPatternRecursive(file, patternlab, startFile); }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); diff --git a/builder/patternlab_grunt.js b/builder/patternlab_grunt.js index 1c78ac126..69085c291 100644 --- a/builder/patternlab_grunt.js +++ b/builder/patternlab_grunt.js @@ -12,7 +12,6 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (grunt) { grunt.registerTask('patternlab', 'create design systems with atomic design', function (arg) { -console.log(Date.now() / 1000); var patternlab = patternlab_engine(); if (arguments.length === 0) { @@ -34,7 +33,6 @@ console.log(Date.now() / 1000); if (arg && (arg !== "v" && arg !== "only_patterns" && arg !== "help")) { patternlab.help(); } -console.log(Date.now() / 1000); }); }; diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 4bdb36d8e..690c5e5a2 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -72,6 +72,7 @@ patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; patternlab.data.foo = 'Bar'; patternlab.data.description = 'Baz'; + patternlab.patterns[0].jsonFileData = patternlab.data; parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

Bar

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

'); From 81a47fae002ffbc36358a86b34cfc50bcf9f1084 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 5 Mar 2016 13:33:06 -0500 Subject: [PATCH 022/162] new recursion scheme - processPatternRecursive stays within pattern while recursing --- builder/list_item_hunter.js | 7 +- builder/parameter_hunter.js | 175 +++++++++++++++++++++---------- builder/pattern_assembler.js | 140 ++++++++++++++----------- builder/patternlab.js | 7 +- builder/patternlab_grunt.js | 2 + builder/patternlab_gulp.js | 2 + builder/style_modifier_hunter.js | 3 - 7 files changed, 207 insertions(+), 129 deletions(-) diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 7fcf3d188..d818839ce 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -83,10 +83,10 @@ 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 @@ -97,9 +97,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.key] = pattern.extendedTemplate; - }); } } diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 866fa5238..04567b26f 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -123,77 +123,135 @@ var parameter_hunter = function () { function findparameters(pattern, patternlab) { - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + //however, we only want to render the parameter data, so we need to identify + //those tags, switch them to ERB syntax, and render for ERB syntax. + var tmpTemplate = pattern.tmpTemplate; - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - var renderedPartial; - var renderedTemplate = pattern_assembler.escape_render_unescape_partials(pattern.extendedTemplate, pattern.jsonFileData); + //evaluate parameteredPartials within tmpTemplate + pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); - //re-evaluate parameteredPartials after rendering - pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); + if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + //iterate through most recently evaluated parameteredPartials + pattern.parameteredPartials.forEach(function (pMatch) { + //find the partial's name and retrieve it + var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); - //iterate through most recently evaluated parameteredPartials - pattern.parameteredPartials.forEach(function (pMatch) { - //find the partial's name and retrieve it - var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); + //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 + var renderedPartial = partialPattern.template; - //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); + } - 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.indexOf(')'); + var paramData = {}; + var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; + var paramStringWellFormed = '{}'; + paramStringWellFormed = paramToJson(paramString); + + try { + paramData = JSON.parse(paramStringWellFormed); + } catch (e) { + console.log(e); + } - //strip out the additional data, convert string to JSON. - var leftParen = pMatch.indexOf('('); - var rightParen = pMatch.indexOf(')'); - var paramData = {}; - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = '{}'; - paramStringWellFormed = paramToJson(paramString); - - try { - paramData = JSON.parse(paramStringWellFormed); - } catch (e) { - console.log(e); - } + //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); + } - //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); +/* + var allData = pattern_assembler.merge_data(startPattern.jsonFileData, paramData); + + //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 regex; + var escapedKey; + for (var j in paramData) { + if (paramData.hasOwnProperty(j) && (typeof paramData[j] === 'boolean' || typeof paramData[j] === 'number' || typeof paramData[j] === 'string')) { + //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters + escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log(escapedKey); +// console.log('before'); +// console.log(renderedPartial); +} + //apply replacement based on allowable characters from lines 78 and 79 of mustache.js + //of the Mustache for JS project. + regex = new RegExp('\\{\\{([{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + renderedPartial = renderedPartial.replace(regex, '<%$1%>'); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log('after'); +// console.log(renderedPartial); +} } + } - var allData = pattern_assembler.merge_data(partialPattern.jsonFileData, paramData); - - //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally - allData.link = extend({}, patternlab.data.link); - - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - renderedPartial = pattern_assembler.escape_render_unescape_partials(partialPattern.extendedTemplate, allData); + //then set the new delimiter at the beginning of the extended template + renderedPartial = '{{=<% %>=}}' + renderedPartial; - //remove the parameter from the partial and replace it with the rendered partial + paramData - renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + renderedPartial = pattern_assembler.renderPattern(renderedPartial, paramData); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log('render'); +// console.log(renderedPartial); +} - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.key] = renderedTemplate; - }); - } + tmpTemplate = tmpTemplate.replace(pMatch, renderedPartial); + }); + } - //after iterating through parameteredPartials, reassign the current pattern's - //stylePartials, parameteredPartials, and extendedTemplate properties based on - //the most recent evaluation of renderedTemplate. - pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(renderedTemplate); - pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); - pattern.extendedTemplate = renderedTemplate; + //after iterating through parameteredPartials, reassign the current pattern's + //stylePartials, parameteredPartials, and tmpTemplate properties based on + //the most recent evaluation of tmpTemplate. +/* + pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(tmpTemplate); +*/ + pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); + pattern.tmpTemplate = tmpTemplate; +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log(tmpTemplate); +} + + //recurse if tmpTemplate still has parametered partials. + if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { +// findparameters(pattern, patternlab); + } + } - //recurse if renderedTemplate still has parametered partials. - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { - findparameters(pattern, patternlab); + /** + * Reset the tmpTemplate on each pattern corresponding to the parametered + * partial. This is to start fresh in case the pattern had been processed by + * findparameters or processPatternRecursive before. + * + * @param {object} currentPattern + * @param {object} patternlab + */ + function resetTmpTemplates(currentPattern, patternlab) { +if (currentPattern.parameteredPartials === null) { +console.log('currentPattern.parameteredPartials === null'); +} + var parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(currentPattern.tmpTemplate); + + if (parameteredPartials && parameteredPartials.length > 0) { + for (var i = 0; i < parameteredPartials.length; i++) { + + //find the partial's name and retrieve it + var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); + + //reset tmpTemplate for this partialPattern before recursing + partialPattern.tmpTemplate = partialPattern.template; } } } @@ -201,6 +259,9 @@ var parameter_hunter = function () { return { find_parameters: function (pattern, patternlab) { findparameters(pattern, patternlab); + }, + reset_tmp_templates: function(currentPattern, patternlab) { + resetTmpTemplates(currentPattern, patternlab); } }; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 05a1fde7d..0dd9683d3 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -75,7 +75,6 @@ var pattern_assembler = function () { if (pattern.abspath === patternlab.patterns[i].abspath) { //if abspath already exists, overwrite that element patternlab.patterns[i] = pattern; - patternlab.partials[pattern.key] = pattern.extendedTemplate || pattern.template; isNew = false; break; } @@ -84,7 +83,6 @@ var pattern_assembler = function () { //if the pattern is new, just push to the array if (isNew) { patternlab.patterns.push(pattern); - patternlab.partials[pattern.key] = pattern.extendedTemplate || pattern.template; } } @@ -133,14 +131,14 @@ var pattern_assembler = function () { * eliminate the unwanted recursion paths that would remain if irrelevant * conditional tags persisted. * - * @param {string} extendedTemplate The template to render. + * @param {string} template The template to render. * @param {object} data The data to render with. * @returns {string} templateRendered */ - function escapeRenderUnescapePartials(extendedTemplate, data) { + function escapeRenderUnescapePartials(template, data) { //escape partial tags by switching them to ERB syntax. - var templateEscaped = extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + var templateEscaped = template.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); templateEscaped = renderPattern(templateEscaped, data); //after that's done, switch back to standard Mustache tags and return. @@ -277,6 +275,15 @@ var pattern_assembler = function () { //do the same with extendedTemplate to avoid undefined type errors currentPattern.extendedTemplate = currentPattern.template; + //do the same with tmpTemplate to avoid undefined type errors + currentPattern.tmpTemplate = currentPattern.template; + + //find any stylemodifiers that may be in the current pattern + currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + + //save parameteredPartials before render +// currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); + //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } @@ -287,9 +294,9 @@ var pattern_assembler = function () { * * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. - * @param {string} startFile The abspath of the pattern at the top level of recursion. + * @param {boolean} startRecurse True if and only if at top level of recursion. */ - function processPatternRecursive(file, patternlab, startFile) { + function processPatternRecursive(file, patternlab, startRecurse) { var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -306,57 +313,60 @@ var pattern_assembler = function () { //find current pattern in patternlab object using var file as a key var currentPattern = getpatternbykey(file, patternlab); + var startPattern = getpatternbykey(file, patternlab); + var startFile = file; //return if processing an ignored file - if (currentPattern === null) { + if (currentPattern === null || typeof currentPattern.tmpTemplate === 'undefined') { return; } - //if at top level of recursion, make sure to set stylePartials and parameteredPartials - if (file === startFile) { - - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - - //need to start with a fresh extendedTemplate for each subsequent recursion step - } else { - currentPattern.extendedTemplate = currentPattern.template; - } - - //find how many partials there may be for the given pattern - var foundPatternPartials = findPartials(currentPattern); + //render the template, excepting for partial includes, using the startRecurse's data + currentPattern.tmpTemplate = escapeRenderUnescapePartials(currentPattern.tmpTemplate, startPattern.jsonFileData); - if (foundPatternPartials !== null && foundPatternPartials.length > 0) { - currentPattern.extendedTemplate = escapeRenderUnescapePartials(currentPattern.extendedTemplate, currentPattern.jsonFileData); + var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); - //re-evaluate persistent partials - foundPatternPartials = findPartials(currentPattern.extendedTemplate); - } - - if (foundPatternPartials !== null && foundPatternPartials.length > 0) { +/* + if (foundPatternPartials && foundPatternPartials.length > 0) { if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } +*/ //find any listItem blocks list_item_hunter.process_list_item_partials(currentPattern, patternlab); - //evaluate parameteredPartials after rendering - currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); +// var foundPatternPartials2 = foundPatternPartials; + + //if the template contains any pattern parameters + if (parameteredPartials && parameteredPartials.length > 0) { + if (patternlab.config.debug) { + console.log('found parametered partials for ' + currentPattern.key); + } - //determine if the template contains any pattern parameters - if (currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0) { + //first, iterate through parameteredPartials and reset tmpTemplate for each + parameter_hunter.reset_tmp_templates(currentPattern, patternlab); - //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() + //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab); - //re-evaluate foundPatternPartials - foundPatternPartials = findPartials(currentPattern.extendedTemplate); + //re-evaluate found pattern partials +// foundPatternPartials2 = findPartials(currentPattern.tmpTemplate); + + //recurse, going a level deeper, with each render eliminating nested parameteredPartials + //when there are no more nested parameteredPartials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, false); } + var foundPatternPartials = findPartials(currentPattern.tmpTemplate); + //do something with re-evaluated partials if (foundPatternPartials && foundPatternPartials.length > 0) { + if (patternlab.config.debug) { + console.log('found partials for ' + currentPattern.key); + } +// var partialKey; +// var partialPattern; - //do something with the regular old partials for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); @@ -365,38 +375,48 @@ var pattern_assembler = function () { if (partialPattern === null) { throw 'Could not find pattern with key ' + partialKey; - } else { - //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPattern.abspath, patternlab, startFile); - - //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); - } - //complete assembly of extended template - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); - - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; + //replace each partial tag with the partial's template. + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(foundPatternPartials[i], partialPattern.tmpTemplate); } } +if (startFile.indexOf('04-pages/faq.mustache') > -1) { +//console.log(startRecurse); +//console.log(currentPattern.tmpTemplate); +//console.log('\n'); +//console.log('\n'); +//console.log('\n'); +//console.log('\n'); +} + + //recurse, going a level deeper, with each render eliminating nested partials + //when there are no more nested partials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, false); } - } else { + +// } + + //do only at the end of the top level of recursion + if (startRecurse) { + + //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.tmpTemplate; + //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(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); + //find pattern lineage + lineage_hunter.find_lineage(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); + //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); + } } function parseDataLinksHelper(patternlab, obj, key) { @@ -470,8 +490,8 @@ var pattern_assembler = function () { process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab, startFile) { - processPatternRecursive(file, patternlab, startFile); + process_pattern_recursive: function (file, patternlab, startRecurse) { + processPatternRecursive(file, patternlab, startRecurse); }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); diff --git a/builder/patternlab.js b/builder/patternlab.js index 46e4b62a5..16e61e83f 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -60,7 +60,6 @@ var patternlab_engine = function (config) { patternlab.header = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'pattern-header-footer/header.html'), 'utf8'); patternlab.footer = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'pattern-header-footer/footer.html'), 'utf8'); patternlab.patterns = []; - patternlab.partials = {}; patternlab.data.link = {}; var pattern_assembler = new pa(), @@ -93,9 +92,9 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); - }); - + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, true); + } + ); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference diff --git a/builder/patternlab_grunt.js b/builder/patternlab_grunt.js index 69085c291..1c78ac126 100644 --- a/builder/patternlab_grunt.js +++ b/builder/patternlab_grunt.js @@ -12,6 +12,7 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (grunt) { grunt.registerTask('patternlab', 'create design systems with atomic design', function (arg) { +console.log(Date.now() / 1000); var patternlab = patternlab_engine(); if (arguments.length === 0) { @@ -33,6 +34,7 @@ module.exports = function (grunt) { if (arg && (arg !== "v" && arg !== "only_patterns" && arg !== "help")) { patternlab.help(); } +console.log(Date.now() / 1000); }); }; diff --git a/builder/patternlab_gulp.js b/builder/patternlab_gulp.js index 82cf2a4ce..c6364ad09 100644 --- a/builder/patternlab_gulp.js +++ b/builder/patternlab_gulp.js @@ -13,8 +13,10 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (gulp) { gulp.task('patternlab', ['clean'], function (cb) { +console.log(Date.now() / 1000); var patternlab = patternlab_engine(); patternlab.build(false); +console.log(Date.now() / 1000); cb(); }); diff --git a/builder/style_modifier_hunter.js b/builder/style_modifier_hunter.js index 742009ce4..16c37c1d1 100644 --- a/builder/style_modifier_hunter.js +++ b/builder/style_modifier_hunter.js @@ -26,9 +26,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.key] = pattern.extendedTemplate; } } From c9b4af5846103c3ee66e322638b87576ecf2ea99 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 7 Mar 2016 09:55:31 -0500 Subject: [PATCH 023/162] working recursion limiter --- builder/parameter_hunter.js | 98 ++++++------ builder/pattern_assembler.js | 297 ++++++++++++++++++++++++++--------- builder/patternlab.js | 2 +- 3 files changed, 277 insertions(+), 120 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 04567b26f..4c3687f16 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -121,37 +121,38 @@ var parameter_hunter = function () { return paramStringWellFormed; } - function findparameters(pattern, patternlab) { + function findparameters(pattern, patternlab, parameteredPartials) { //the reason for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant conditional tags persisted. //however, we only want to render the parameter data, so we need to identify //those tags, switch them to ERB syntax, and render for ERB syntax. - var tmpTemplate = pattern.tmpTemplate; +// var tmpTemplate = pattern.tmpTemplate; //evaluate parameteredPartials within tmpTemplate - pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); +// pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { +// if (pattern.parameteredPartials && pattern.parameteredPartials.length) { //iterate through most recently evaluated parameteredPartials - pattern.parameteredPartials.forEach(function (pMatch) { +// pattern.parameteredPartials.forEach(function (pMatch) { + for (var i = 0; i < parameteredPartials.length; i++) { //find the partial's name and retrieve it - var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; + var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 - var renderedPartial = partialPattern.template; + partialPattern.tmpTemplate = 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.indexOf(')'); + var leftParen = parameteredPartials[i].indexOf('('); + var rightParen = parameteredPartials[i].indexOf(')'); var paramData = {}; - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; + var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; var paramStringWellFormed = '{}'; paramStringWellFormed = paramToJson(paramString); @@ -162,8 +163,8 @@ var parameter_hunter = function () { } //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); + if (pattern.stylePartials && pattern.stylePartials.length) { + style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); } /* @@ -180,36 +181,43 @@ var parameter_hunter = function () { //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log(escapedKey); -// console.log('before'); -// console.log(renderedPartial); -} //apply replacement based on allowable characters from lines 78 and 79 of mustache.js //of the Mustache for JS project. - regex = new RegExp('\\{\\{([{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - renderedPartial = renderedPartial.replace(regex, '<%$1%>'); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log('after'); -// console.log(renderedPartial); -} + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%$1%>'); } } //then set the new delimiter at the beginning of the extended template - renderedPartial = '{{=<% %>=}}' + renderedPartial; + partialPattern.tmpTemplate = '{{=<% %>=}}' + partialPattern.tmpTemplate; //the reason for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant conditional tags persisted. - renderedPartial = pattern_assembler.renderPattern(renderedPartial, paramData); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log('render'); -// console.log(renderedPartial); + partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); + + //replace parameteredPartials with their rendered values. + var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp(pMatch, 'g'); + pattern.tmpTemplate = pattern.tmpTemplate.replace(regex, partialPattern.tmpTemplate); +if (pattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { +if(j.indexOf('02_global_header') > -1) { + console.log(escapedKey); + console.log(pattern.tmpTemplate); } - - tmpTemplate = tmpTemplate.replace(pMatch, renderedPartial); - }); - } +} + pattern.tmpTemplate = pattern.tmpTemplate.replace(/^$\n/gm, ''); +// return tmpTemplate; +if (pattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { + if (pMatch === '{{> 03-templates/field/field(title_synopsis\\?: true) }}') { + /* + console.log(pMatch); + console.log('tmpTemplate after'); + console.log(tmpTemplate); + */ + } +} + } +// } //after iterating through parameteredPartials, reassign the current pattern's //stylePartials, parameteredPartials, and tmpTemplate properties based on @@ -217,14 +225,14 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) /* pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(tmpTemplate); */ - pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); - pattern.tmpTemplate = tmpTemplate; +// pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); +// pattern.tmpTemplate = tmpTemplate; if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { // console.log(tmpTemplate); } //recurse if tmpTemplate still has parametered partials. - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + if (pattern.parameteredPartials && pattern.parameteredPartials.length) { // findparameters(pattern, patternlab); } } @@ -234,16 +242,12 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) * partial. This is to start fresh in case the pattern had been processed by * findparameters or processPatternRecursive before. * - * @param {object} currentPattern + * @param {object} currentPattern + * @param {array} parameteredPartials * @param {object} patternlab */ - function resetTmpTemplates(currentPattern, patternlab) { -if (currentPattern.parameteredPartials === null) { -console.log('currentPattern.parameteredPartials === null'); -} - var parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(currentPattern.tmpTemplate); - - if (parameteredPartials && parameteredPartials.length > 0) { + function resetTmpTemplates(parameteredPartials, patternlab) { + if (parameteredPartials && parameteredPartials.length) { for (var i = 0; i < parameteredPartials.length; i++) { //find the partial's name and retrieve it @@ -257,11 +261,11 @@ console.log('currentPattern.parameteredPartials === null'); } return { - find_parameters: function (pattern, patternlab) { - findparameters(pattern, patternlab); + find_parameters: function (pattern, patternlab, parameteredPartials, tmpTemplate) { + findparameters(pattern, patternlab, parameteredPartials, tmpTemplate); }, - reset_tmp_templates: function(currentPattern, patternlab) { - resetTmpTemplates(currentPattern, patternlab); + reset_tmp_templates: function(parameteredPartials, patternlab) { + resetTmpTemplates(parameteredPartials, patternlab); } }; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 0dd9683d3..d69e28c25 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -127,9 +127,47 @@ var pattern_assembler = function () { } /** - * Render the extendedTemplate excluding partials. The reason for this is to - * eliminate the unwanted recursion paths that would remain if irrelevant - * conditional tags persisted. + * Render the template excluding partials. The reason for this is to eliminate + * the unwanted recursion paths that would remain if irrelevant conditional + * tags persisted. Targeting non-partial tags that are not keyed in the JSON + * data for this pattern. Those will be deleted after this runs. + * + * @param {string} template The template to render. + * @param {object} data The data to render with. + * @param {object} dataKeys The data to render with. + * @returns {string} templateRendered + */ + function escapeRenderUnescape(pattern) { + + //escape partial tags by switching them to ERB syntax. + var escapedKey; + var regex; + var templateEscaped = pattern.tmpTemplate; + + for (var i = 0; i < pattern.dataKeys.length; i++) { + escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + templateEscaped = templateEscaped.replace(regex, '<%$1%>'); + } + templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log(templateEscaped); +} + + var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); + templateRendered = templateRendered.replace(/<%([^%]+)%>/g, '{{$1}}'); + + //after that's done, switch back to standard Mustache tags and return. +// var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + return templateRendered; + } + + /** + * Render the template excluding partials. The reason for this is to eliminate + * the unwanted recursion paths that would remain if irrelevant conditional + * tags persisted. Escaping partial tags so a full render of non-partial tags + * eliminate irrelevant conditional tags. * * @param {string} template The template to render. * @param {object} data The data to render with. @@ -147,6 +185,30 @@ var pattern_assembler = function () { return templateRendered; } + /** + * Recursively get all the property keys from the JSON data for a pattern. + * + * @param {object} data + * @param {array} keys At top level of recursion, this should be undefined. + * @returns {array} keys A flat, one-dimensional array. + */ + function getDataKeys(data) { + var keys = []; + + for (var key in data) { + if (data.hasOwnProperty(key)) { + if (!(typeof data === 'object' && data instanceof Array)) { + keys.push(key); + } + if (typeof data[key] === 'object') { + keys = keys.concat(getDataKeys(data[key])); + } + } + } + + return keys; + } + function getpatternbykey(key, patternlab) { var i; // for the for loops @@ -255,6 +317,7 @@ var pattern_assembler = function () { catch (error) { currentPattern.jsonFileData = globalData; } + currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); //look for a listitems.json file for this template try { @@ -281,9 +344,6 @@ var pattern_assembler = function () { //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - //save parameteredPartials before render -// currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); - //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } @@ -294,9 +354,23 @@ var pattern_assembler = function () { * * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. - * @param {boolean} startRecurse True if and only if at top level of recursion. + * @param {number} recursionLevel Top level === 0. Increments by 1 after that. */ - function processPatternRecursive(file, patternlab, startRecurse) { + function processPatternRecursive(file, patternlab, recursionLevel) { +console.log(file); +if (file.indexOf('01-molecules/components/user-menu.mustache') > -1) { + /* +console.log('RECURSION LEVEL: ' + recursionLevel); +// console.log(currentPattern.jsonFileData); +// console.log(getDataKeys(currentPattern.jsonFileData)); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +console.log('currentPattern.extendedTemplate'); +console.log(currentPattern.extendedTemplate); +// console.log('getDataKeys(currentPattern.jsonFileData)'); +// console.log(currentPattern.dataKeys); +*/ +} var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -313,100 +387,178 @@ var pattern_assembler = function () { //find current pattern in patternlab object using var file as a key var currentPattern = getpatternbykey(file, patternlab); - var startPattern = getpatternbykey(file, patternlab); - var startFile = file; +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +// console.log(file); +} //return if processing an ignored file if (currentPattern === null || typeof currentPattern.tmpTemplate === 'undefined') { return; } - //render the template, excepting for partial includes, using the startRecurse's data - currentPattern.tmpTemplate = escapeRenderUnescapePartials(currentPattern.tmpTemplate, startPattern.jsonFileData); - - var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); - -/* - if (foundPatternPartials && foundPatternPartials.length > 0) { - if (patternlab.config.debug) { - console.log('found partials for ' + currentPattern.key); - } -*/ + //find any listItem blocks + list_item_hunter.process_list_item_partials(currentPattern, patternlab); - //find any listItem blocks - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + //render the template, excepting for partial includes, using jsonFileData +if (typeof currentPattern.dataKeys === 'undefined') { +console.log(typeof currentPattern.jsonFileData); + console.log('UNDEFINED'); +} +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log('RECURSION LEVEL: ' + recursionLevel); +// console.log(currentPattern.jsonFileData); +// console.log(getDataKeys(currentPattern.jsonFileData)); +console.log('currentPattern.tmpTemplate before: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +// console.log('getDataKeys(currentPattern.jsonFileData)'); +// console.log(currentPattern.dataKeys); +} + currentPattern.tmpTemplate = escapeRenderUnescape(currentPattern); + var tmpTemplate = escapeRenderUnescape(currentPattern); +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log(currentPattern.jsonFileData); +// console.log(getDataKeys(currentPattern.jsonFileData)); +console.log('currentPattern.tmpTemplate after: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +// console.log('getDataKeys(currentPattern.jsonFileData)'); +// console.log(currentPattern.dataKeys); +} -// var foundPatternPartials2 = foundPatternPartials; + var parameteredPartials = findPartialsWithPatternParameters(tmpTemplate); - //if the template contains any pattern parameters - if (parameteredPartials && parameteredPartials.length > 0) { + //if the template contains any pattern parameters + if (parameteredPartials && parameteredPartials.length) { if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + /* +console.log('RECURSION LEVEL: ' + recursionLevel); +console.log('parameteredPartials before'); +console.log(parameteredPartials); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +//console.log('tmpTemplate'); +//console.log(tmpTemplate); +*/ +} + + //first, iterate through parameteredPartials and reset tmpTemplate for each +// parameter_hunter.reset_tmp_templates(parameteredPartials, patternlab); + + //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + /* +console.log('parameteredPartials after'); +console.log(parameteredPartials); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +//console.log('tmpTemplate'); +//console.log(tmpTemplate); +*/ +} - //first, iterate through parameteredPartials and reset tmpTemplate for each - parameter_hunter.reset_tmp_templates(currentPattern, patternlab); + //recurse, going a level deeper, with each render eliminating nested parameteredPartials + //when there are no more nested parameteredPartials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); - //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() - parameter_hunter.find_parameters(currentPattern, patternlab); + tmpTemplate = escapeRenderUnescapePartials(currentPattern.tmpTemplate, currentPattern.jsonFileData); + } - //re-evaluate found pattern partials -// foundPatternPartials2 = findPartials(currentPattern.tmpTemplate); +tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); + var foundPatternPartials = findPartials(tmpTemplate); - //recurse, going a level deeper, with each render eliminating nested parameteredPartials - //when there are no more nested parameteredPartials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, false); - } + //since we're done with tmpTemplate, free it from memory + tmpTemplate = ''; - var foundPatternPartials = findPartials(currentPattern.tmpTemplate); - //do something with re-evaluated partials - if (foundPatternPartials && foundPatternPartials.length > 0) { + //recurse through non-parametered partials + if (foundPatternPartials && foundPatternPartials.length) { if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } -// var partialKey; -// var partialPattern; - for (i = 0; i < foundPatternPartials.length; i++) { - var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + /* +console.log('RECURSION LEVEL: ' + recursionLevel); +console.log('foundPatternPartials before'); +console.log(foundPatternPartials); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +//console.log('tmpTemplate size: ' + tmpTemplate.length + 'B'); +//console.log(tmpTemplate); +*/ +} + for (i = 0; i < foundPatternPartials.length; i++) { + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); + + //identify which pattern this partial corresponds to + var partialPattern = getpatternbykey(partialKey, patternlab); - //identify which pattern this partial corresponds to - var partialPattern = getpatternbykey(partialKey, patternlab); + if (partialPattern === null) { + throw 'Could not find pattern with key ' + partialKey; + } else { - if (partialPattern === null) { - throw 'Could not find pattern with key ' + partialKey; - } else { + //replace each partial tag with the partial's template. + //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters + var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + var regex = new RegExp(escapedPartial, 'g'); - //replace each partial tag with the partial's template. - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(foundPatternPartials[i], partialPattern.tmpTemplate); - } - } -if (startFile.indexOf('04-pages/faq.mustache') > -1) { -//console.log(startRecurse); -//console.log(currentPattern.tmpTemplate); -//console.log('\n'); -//console.log('\n'); -//console.log('\n'); -//console.log('\n'); +//console.log(currentPattern.abspath); +if (currentPattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { +// console.log(regex); } - - //recurse, going a level deeper, with each render eliminating nested partials - //when there are no more nested partials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, false); + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, partialPattern.template); +currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^$\n/gm, ''); +//tmpTemplate = tmpTemplate.replace(regex, partialPattern.tmpTemplate); +//tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); + } } +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + + /* +console.log('foundPatternPartials after'); +console.log(foundPatternPartials); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +//console.log('tmpTemplate size: ' + tmpTemplate.length + 'B'); +//console.log(tmpTemplate); +*/ +} + //recurse, going a level deeper, with each render eliminating nested partials + //when there are no more nested partials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); +if (currentPattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { + /* +console.log('currentPattern.tmpTemplate'); +console.log(currentPattern.tmpTemplate); +*/ +} + } -// } - +//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { +//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { //do only at the end of the top level of recursion - if (startRecurse) { + if (recursionLevel === 0) { //if partial has style modifier data, replace the styleModifier value - if (currentPattern.stylePartials && currentPattern.stylePartials.length > 0) { + if (currentPattern.stylePartials && currentPattern.stylePartials.length) { style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } - currentPattern.extendedTemplate = currentPattern.tmpTemplate; + currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); +//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + /* +// console.log(currentPattern.jsonFileData); +// console.log(getDataKeys(currentPattern.jsonFileData)); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +console.log('currentPattern.extendedTemplate'); +console.log(currentPattern.extendedTemplate); +*/ +} //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -416,6 +568,9 @@ if (startFile.indexOf('04-pages/faq.mustache') > -1) { //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); + + //since we're done with currentPattern.tmpTemplate, free it from memory + currentPattern.tmpTemplate = ''; } } @@ -490,8 +645,8 @@ if (startFile.indexOf('04-pages/faq.mustache') > -1) { process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab, startRecurse) { - processPatternRecursive(file, patternlab, startRecurse); + process_pattern_recursive: function (file, patternlab, recursionLevel) { + processPatternRecursive(file, patternlab, recursionLevel); }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); @@ -501,5 +656,3 @@ if (startFile.indexOf('04-pages/faq.mustache') > -1) { }; module.exports = pattern_assembler; - - diff --git a/builder/patternlab.js b/builder/patternlab.js index 16e61e83f..1648029d4 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -92,7 +92,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, true); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0); } ); From 2d1023710a07d9b7cca7f728f63e2dfe10d40434 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 8 Mar 2016 08:45:11 -0500 Subject: [PATCH 024/162] limiting recursion by winnowing tags at partial level --- builder/parameter_hunter.js | 171 +++++++++------------------- builder/pattern_assembler.js | 212 ++++++++++------------------------- 2 files changed, 113 insertions(+), 270 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 4c3687f16..0a82d9fa2 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -136,136 +136,77 @@ var parameter_hunter = function () { //iterate through most recently evaluated parameteredPartials // pattern.parameteredPartials.forEach(function (pMatch) { - for (var i = 0; i < parameteredPartials.length; i++) { - //find the partial's name and retrieve it - var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); + for (var i = 0; i < parameteredPartials.length; i++) { + //find the partial's name and retrieve it + var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); + + if (!partialPattern) { + throw 'Could not find pattern with key ' + partialName; + continue; + } - //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 - partialPattern.tmpTemplate = partialPattern.template; + //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 + partialPattern.tmpTemplate = partialPattern.template; - if (patternlab.config.debug) { - console.log('found patternParameters for ' + partialName); - } + if (patternlab.config.debug) { + console.log('found patternParameters for ' + partialName); + } - //strip out the additional data, convert string to JSON. - var leftParen = parameteredPartials[i].indexOf('('); - var rightParen = parameteredPartials[i].indexOf(')'); - var paramData = {}; - var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = '{}'; - paramStringWellFormed = paramToJson(paramString); - - try { - paramData = JSON.parse(paramStringWellFormed); - } catch (e) { - console.log(e); - } + //strip out the additional data, convert string to JSON. + var leftParen = parameteredPartials[i].indexOf('('); + var rightParen = parameteredPartials[i].indexOf(')'); + var paramData = {}; + var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; + var paramStringWellFormed = '{}'; + paramStringWellFormed = paramToJson(paramString); + + try { + paramData = JSON.parse(paramStringWellFormed); + } catch (e) { + console.log(e); + } - //if partial has style modifier data, replace the styleModifier value - if (pattern.stylePartials && pattern.stylePartials.length) { - style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); - } + //if partial has style modifier data, replace the styleModifier value + if (pattern.stylePartials && pattern.stylePartials.length) { + style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); + } -/* - var allData = pattern_assembler.merge_data(startPattern.jsonFileData, paramData); - - //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 regex; - var escapedKey; - for (var j in paramData) { - if (paramData.hasOwnProperty(j) && (typeof paramData[j] === 'boolean' || typeof paramData[j] === 'number' || typeof paramData[j] === 'string')) { - //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters - escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - - //apply replacement based on allowable characters from lines 78 and 79 of mustache.js - //of the Mustache for JS project. - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%$1%>'); - } + var regex; + var escapedKey; + for (var j in paramData) { + if (paramData.hasOwnProperty(j) && (typeof paramData[j] === 'boolean' || typeof paramData[j] === 'number' || typeof paramData[j] === 'string')) { + //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters + escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + + //apply replacement based on allowable characters from lines 78 and 79 of mustache.js + //of the Mustache for JS project. + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%$1%>'); } - - //then set the new delimiter at the beginning of the extended template - partialPattern.tmpTemplate = '{{=<% %>=}}' + partialPattern.tmpTemplate; - - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); - - //replace parameteredPartials with their rendered values. - var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp(pMatch, 'g'); - pattern.tmpTemplate = pattern.tmpTemplate.replace(regex, partialPattern.tmpTemplate); -if (pattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { -if(j.indexOf('02_global_header') > -1) { - console.log(escapedKey); - console.log(pattern.tmpTemplate); -} -} - pattern.tmpTemplate = pattern.tmpTemplate.replace(/^$\n/gm, ''); -// return tmpTemplate; -if (pattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { - if (pMatch === '{{> 03-templates/field/field(title_synopsis\\?: true) }}') { - /* - console.log(pMatch); - console.log('tmpTemplate after'); - console.log(tmpTemplate); - */ - } -} } -// } - //after iterating through parameteredPartials, reassign the current pattern's - //stylePartials, parameteredPartials, and tmpTemplate properties based on - //the most recent evaluation of tmpTemplate. -/* - pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(tmpTemplate); -*/ -// pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); -// pattern.tmpTemplate = tmpTemplate; -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log(tmpTemplate); -} - - //recurse if tmpTemplate still has parametered partials. - if (pattern.parameteredPartials && pattern.parameteredPartials.length) { -// findparameters(pattern, patternlab); - } - } + //then set the new delimiter at the beginning of the extended template + partialPattern.tmpTemplate = '{{=<% %>=}}' + partialPattern.tmpTemplate; - /** - * Reset the tmpTemplate on each pattern corresponding to the parametered - * partial. This is to start fresh in case the pattern had been processed by - * findparameters or processPatternRecursive before. - * - * @param {object} currentPattern - * @param {array} parameteredPartials - * @param {object} patternlab - */ - function resetTmpTemplates(parameteredPartials, patternlab) { - if (parameteredPartials && parameteredPartials.length) { - for (var i = 0; i < parameteredPartials.length; i++) { - - //find the partial's name and retrieve it - var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); - - //reset tmpTemplate for this partialPattern before recursing - partialPattern.tmpTemplate = partialPattern.template; - } + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); + partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); + + //replace parameteredPartials with their rendered values. + var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp(pMatch, 'g'); + pattern.tmpTemplate = pattern.tmpTemplate.replace(regex, partialPattern.tmpTemplate); + + // Free tmpTemplate from memory. + partialPattern.tmpTemplate = ''; } } return { find_parameters: function (pattern, patternlab, parameteredPartials, tmpTemplate) { findparameters(pattern, patternlab, parameteredPartials, tmpTemplate); - }, - reset_tmp_templates: function(parameteredPartials, patternlab) { - resetTmpTemplates(parameteredPartials, patternlab); } }; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index d69e28c25..907f11ba8 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -137,28 +137,26 @@ var pattern_assembler = function () { * @param {object} dataKeys The data to render with. * @returns {string} templateRendered */ - function escapeRenderUnescape(pattern) { - - //escape partial tags by switching them to ERB syntax. + function winnowUnusedTags(template, pattern) { var escapedKey; var regex; - var templateEscaped = pattern.tmpTemplate; + var templateEscaped = template; + //escaped all tags that match keys in the JSON data. for (var i = 0; i < pattern.dataKeys.length; i++) { escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); } + + //escape partial tags by switching them to ERB syntax. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log(templateEscaped); -} + //render to winnow used tags. var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); - templateRendered = templateRendered.replace(/<%([^%]+)%>/g, '{{$1}}'); - //after that's done, switch back to standard Mustache tags and return. -// var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + //after that's done, switch only partial tags back to standard Mustache tags and return. + templateRendered = templateRendered.replace(/<%>([^%]+)%>/g, '{{>$1}}'); return templateRendered; } @@ -174,7 +172,6 @@ console.log(templateEscaped); * @returns {string} templateRendered */ function escapeRenderUnescapePartials(template, data) { - //escape partial tags by switching them to ERB syntax. var templateEscaped = template.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); templateEscaped = renderPattern(templateEscaped, data); @@ -304,21 +301,6 @@ console.log(templateEscaped); //see if this file has a state setState(currentPattern, patternlab); - //look for a json file for this template - var globalData = patternlab.data; - try { - var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); - var localData = fs.readJSONSync(jsonFilename); - currentPattern.jsonFileData = mergeData(globalData, localData); - if (patternlab.config.debug) { - console.log('found pattern-specific data.json for ' + currentPattern.key); - } - } - catch (error) { - currentPattern.jsonFileData = globalData; - } - currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); - //look for a listitems.json file for this template try { var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".listitems.json"); @@ -335,11 +317,12 @@ console.log(templateEscaped); //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate to avoid undefined type errors - currentPattern.extendedTemplate = currentPattern.template; + //do the same with extendedTemplate to avoid undefined type errors. + //trying to keep memory footprint small, so set it to empty string at first. + currentPattern.extendedTemplate = ''; //do the same with tmpTemplate to avoid undefined type errors - currentPattern.tmpTemplate = currentPattern.template; + currentPattern.tmpTemplate = ''; //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); @@ -357,20 +340,6 @@ console.log(templateEscaped); * @param {number} recursionLevel Top level === 0. Increments by 1 after that. */ function processPatternRecursive(file, patternlab, recursionLevel) { -console.log(file); -if (file.indexOf('01-molecules/components/user-menu.mustache') > -1) { - /* -console.log('RECURSION LEVEL: ' + recursionLevel); -// console.log(currentPattern.jsonFileData); -// console.log(getDataKeys(currentPattern.jsonFileData)); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -console.log('currentPattern.extendedTemplate'); -console.log(currentPattern.extendedTemplate); -// console.log('getDataKeys(currentPattern.jsonFileData)'); -// console.log(currentPattern.dataKeys); -*/ -} var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -387,12 +356,9 @@ console.log(currentPattern.extendedTemplate); //find current pattern in patternlab object using var file as a key var currentPattern = getpatternbykey(file, patternlab); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -// console.log(file); -} //return if processing an ignored file - if (currentPattern === null || typeof currentPattern.tmpTemplate === 'undefined') { + if (!currentPattern || typeof currentPattern.tmpTemplate === 'undefined') { return; } @@ -400,77 +366,49 @@ if (file.indexOf('04-pages/00-homepage.mustache') > -1) { list_item_hunter.process_list_item_partials(currentPattern, patternlab); //render the template, excepting for partial includes, using jsonFileData -if (typeof currentPattern.dataKeys === 'undefined') { -console.log(typeof currentPattern.jsonFileData); - console.log('UNDEFINED'); -} -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log('RECURSION LEVEL: ' + recursionLevel); -// console.log(currentPattern.jsonFileData); -// console.log(getDataKeys(currentPattern.jsonFileData)); -console.log('currentPattern.tmpTemplate before: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -// console.log('getDataKeys(currentPattern.jsonFileData)'); -// console.log(currentPattern.dataKeys); -} - currentPattern.tmpTemplate = escapeRenderUnescape(currentPattern); - var tmpTemplate = escapeRenderUnescape(currentPattern); -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log(currentPattern.jsonFileData); -// console.log(getDataKeys(currentPattern.jsonFileData)); -console.log('currentPattern.tmpTemplate after: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -// console.log('getDataKeys(currentPattern.jsonFileData)'); -// console.log(currentPattern.dataKeys); -} - - var parameteredPartials = findPartialsWithPatternParameters(tmpTemplate); + if (recursionLevel === 0) { +console.log(currentPattern.abspath); +console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); + //look for a json file for this template + var globalData = patternlab.data; + try { + var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); + var localData = fs.readJSONSync(jsonFilename); + currentPattern.jsonFileData = mergeData(globalData, localData); + if (patternlab.config.debug) { + console.log('found pattern-specific data.json for ' + currentPattern.key); + } + } + catch (error) { + currentPattern.jsonFileData = globalData; + } + currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); + + currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.template, currentPattern); +console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); + } + + var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); //if the template contains any pattern parameters if (parameteredPartials && parameteredPartials.length) { if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - /* -console.log('RECURSION LEVEL: ' + recursionLevel); -console.log('parameteredPartials before'); -console.log(parameteredPartials); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -//console.log('tmpTemplate'); -//console.log(tmpTemplate); -*/ -} - - //first, iterate through parameteredPartials and reset tmpTemplate for each -// parameter_hunter.reset_tmp_templates(parameteredPartials, patternlab); //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - /* -console.log('parameteredPartials after'); -console.log(parameteredPartials); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -//console.log('tmpTemplate'); -//console.log(tmpTemplate); -*/ -} //recurse, going a level deeper, with each render eliminating nested parameteredPartials //when there are no more nested parameteredPartials, we'll pop back up processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); - - tmpTemplate = escapeRenderUnescapePartials(currentPattern.tmpTemplate, currentPattern.jsonFileData); } -tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); - var foundPatternPartials = findPartials(tmpTemplate); + //delete empty lines. good for memory management and debugging. + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); - //since we're done with tmpTemplate, free it from memory - tmpTemplate = ''; + //find non-parametered partials. + var foundPatternPartials = findPartials(currentPattern.tmpTemplate); //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { @@ -478,24 +416,13 @@ tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); console.log('found partials for ' + currentPattern.key); } -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - /* -console.log('RECURSION LEVEL: ' + recursionLevel); -console.log('foundPatternPartials before'); -console.log(foundPatternPartials); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -//console.log('tmpTemplate size: ' + tmpTemplate.length + 'B'); -//console.log(tmpTemplate); -*/ -} for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); //identify which pattern this partial corresponds to var partialPattern = getpatternbykey(partialKey, patternlab); - if (partialPattern === null) { + if (!partialPattern) { throw 'Could not find pattern with key ' + partialKey; } else { @@ -504,61 +431,32 @@ console.log(currentPattern.tmpTemplate); var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); -//console.log(currentPattern.abspath); -if (currentPattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { -// console.log(regex); -} - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, partialPattern.template); -currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^$\n/gm, ''); -//tmpTemplate = tmpTemplate.replace(regex, partialPattern.tmpTemplate); -//tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowUnusedTags(partialPattern.template, currentPattern)); + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); } } -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - - /* -console.log('foundPatternPartials after'); -console.log(foundPatternPartials); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -//console.log('tmpTemplate size: ' + tmpTemplate.length + 'B'); -//console.log(tmpTemplate); -*/ -} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); -if (currentPattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { - /* -console.log('currentPattern.tmpTemplate'); -console.log(currentPattern.tmpTemplate); -*/ -} } -//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { -//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + //delete empty lines again. good for memory management and debugging. + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); + //do only at the end of the top level of recursion if (recursionLevel === 0) { +//if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +//} + // Switched ERB escaped tags back to standard Mustache tags. + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); //if partial has style modifier data, replace the styleModifier value if (currentPattern.stylePartials && currentPattern.stylePartials.length) { - style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); +// style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); -//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - /* -// console.log(currentPattern.jsonFileData); -// console.log(getDataKeys(currentPattern.jsonFileData)); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -console.log('currentPattern.extendedTemplate'); -console.log(currentPattern.extendedTemplate); -*/ -} //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -571,6 +469,10 @@ console.log(currentPattern.extendedTemplate); //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; + currentPattern.jsonFileData = null; + currentPattern.dataKeys = null; + +console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); } } @@ -633,8 +535,8 @@ console.log(currentPattern.extendedTemplate); combine_listItems: function (patternlab) { buildListItems(patternlab); }, - escape_render_unescape_partials: function (extendedTemplate, data) { - return escapeRenderUnescapePartials(extendedTemplate, data); + winnow_unused_tags: function (template, pattern) { + return winnowUnusedTags(template, pattern); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); From a69edccc3dd2e0892d1cb8819cc1e0e03e8d4392 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 8 Mar 2016 09:34:31 -0500 Subject: [PATCH 025/162] correct requires and better exception handling --- builder/pattern_assembler.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 907f11ba8..3bcb168bd 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -240,7 +240,7 @@ var pattern_assembler = function () { } function mergeData(obj1, obj2) { - if (typeof obj2 === 'undefined') { + if (!obj2) { obj2 = {}; //eslint-disable-line no-param-reassign } @@ -340,6 +340,9 @@ var pattern_assembler = function () { * @param {number} recursionLevel Top level === 0. Increments by 1 after that. */ function processPatternRecursive(file, patternlab, recursionLevel) { + var fs = require('fs-extra'), + path = require('path'); + var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -371,6 +374,12 @@ console.log(currentPattern.abspath); console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); //look for a json file for this template var globalData = patternlab.data; +// var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); +// var localData = fs.readJSONSync(jsonFilename); +if (!globalData) { +console.log('localData === null'); + console.log(currentPattern.abspath); +} try { var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); var localData = fs.readJSONSync(jsonFilename); From e81d9e352732124f7719450791ca1ce6e3bbd429 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 9 Mar 2016 07:03:21 -0500 Subject: [PATCH 026/162] unique partials --- builder/.pattern_assembler.js.swp | Bin 0 -> 53248 bytes builder/parameter_hunter.js | 23 +++++ builder/pattern_assembler.js | 158 ++++++++++++++++++++++-------- builder/patternlab.js | 5 + 4 files changed, 143 insertions(+), 43 deletions(-) create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..fab4c0386d6ad907f13f9710cdeabecff07cbb91 GIT binary patch literal 53248 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 XOM5fQIY -1) { + console.log('unique parameteredPartials'); + console.log(uniquePartials); +} + //find the partial's name and retrieve it var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 3bcb168bd..f802352e2 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -240,9 +240,7 @@ var pattern_assembler = function () { } function mergeData(obj1, obj2) { - if (!obj2) { - obj2 = {}; //eslint-disable-line no-param-reassign - } + obj2 = obj2 || {}; //eslint-disable-line no-param-reassign for (var p in obj1) { //eslint-disable-line guard-for-in try { @@ -338,8 +336,9 @@ var pattern_assembler = function () { * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. * @param {number} recursionLevel Top level === 0. Increments by 1 after that. + * @param {object} currentPattern Only submitted on recursionLevel > 0. */ - function processPatternRecursive(file, patternlab, recursionLevel) { + function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { var fs = require('fs-extra'), path = require('path'); @@ -355,52 +354,79 @@ var pattern_assembler = function () { style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); - var i; // for the for loops - - //find current pattern in patternlab object using var file as a key - var currentPattern = getpatternbykey(file, patternlab); - - //return if processing an ignored file - if (!currentPattern || typeof currentPattern.tmpTemplate === 'undefined') { - return; - } - - //find any listItem blocks - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + var i, j; // for the for loops - //render the template, excepting for partial includes, using jsonFileData +var processBegin; +var processEnd; if (recursionLevel === 0) { -console.log(currentPattern.abspath); -console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); + +//console.log(file); +if (file.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +processBegin = Date.now() / 1000; +console.log('PROCESS BEGIN: ' + processBegin); +} + //skip .json files + if (path.extname(file) === '.json') { + return; + } + //look for a json file for this template var globalData = patternlab.data; -// var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); -// var localData = fs.readJSONSync(jsonFilename); -if (!globalData) { -console.log('localData === null'); - console.log(currentPattern.abspath); -} + var jsonFilename; + var localData; + + //first, determine if this is a recursible pattern. no point continuing if it isn't. try { - var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); - var localData = fs.readJSONSync(jsonFilename); - currentPattern.jsonFileData = mergeData(globalData, localData); - if (patternlab.config.debug) { - console.log('found pattern-specific data.json for ' + currentPattern.key); - } + jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; + localData = fs.readJSONSync(jsonFilename); } catch (error) { - currentPattern.jsonFileData = globalData; + return; + } + + if (patternlab.config.debug) { + console.log('found pattern-specific data.json for ' + currentPattern.key); } - currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); + //find current pattern in patternlab object using var file as a key + currentPattern = getpatternbykey(file, patternlab); +if (file.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); +} + + //return if processing an ignored file + if (!currentPattern || typeof currentPattern.tmpTemplate === 'undefined') { + return; + } + + currentPattern.jsonFileData = mergeData(globalData, localData); + currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.template, currentPattern); -console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); + } +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +console.log('RECURSION LEVEL: ' + recursionLevel); +console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); +console.log('DATA SIZE: ' + JSON.stringify(currentPattern).length + 'B'); +} + + //find current pattern in patternlab object using var file as a key +// var currentPattern = getpatternbykey(file, patternlab); + + //find any listItem blocks + list_item_hunter.process_list_item_partials(currentPattern, patternlab); + + //render the template, excepting for partial includes, using jsonFileData var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); //if the template contains any pattern parameters if (parameteredPartials && parameteredPartials.length) { +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +console.log('parameteredPartials'); +console.log(parameteredPartials); +} + if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } @@ -410,22 +436,43 @@ console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); //recurse, going a level deeper, with each render eliminating nested parameteredPartials //when there are no more nested parameteredPartials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } //delete empty lines. good for memory management and debugging. - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); +// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.tmpTemplate); + var uniquePartials = []; + var uniquePartial; //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('foundPatternPartials'); + console.log(foundPatternPartials); +} if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } for (i = 0; i < foundPatternPartials.length; i++) { + uniquePartial = true; + + for (j = 0; j < uniquePartials.length; j++) { + if (foundPatternPartials[i] === uniquePartials[j]) { + uniquePartial = false; + break; + } + } + + if (uniquePartial) { + uniquePartials.push(foundPatternPartials[i]); + } else { + continue; + } + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); //identify which pattern this partial corresponds to @@ -441,24 +488,32 @@ console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); var regex = new RegExp(escapedPartial, 'g'); currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowUnusedTags(partialPattern.template, currentPattern)); - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); +// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); } } +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('unique foundPatternPartials'); + console.log(uniquePartials); +} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } //delete empty lines again. good for memory management and debugging. - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); +// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); - //do only at the end of the top level of recursion + //do only when popped to the top level of recursion if (recursionLevel === 0) { -//if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { -//} - // Switched ERB escaped tags back to standard Mustache tags. +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); +} + //switched ERB escaped tags back to standard Mustache tags currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); +} //if partial has style modifier data, replace the styleModifier value if (currentPattern.stylePartials && currentPattern.stylePartials.length) { @@ -466,22 +521,39 @@ console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); } currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); +} //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('LIST ITEMS at: ' + (Date.now() / 1000)); +} //find pattern lineage lineage_hunter.find_lineage(currentPattern, patternlab); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('FOUND LINEAGE at: ' + (Date.now() / 1000)); +} //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); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); +} //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; currentPattern.jsonFileData = null; currentPattern.dataKeys = null; +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); +processEnd = Date.now() / 1000; +console.log('PROCESS END: ' + processEnd); +console.log('PROCESS TIME: ' + (processEnd - processBegin)); +} } } diff --git a/builder/patternlab.js b/builder/patternlab.js index 1648029d4..2573ee59f 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -69,6 +69,7 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); +console.log('DIVESYNC ITERATIVE BEGIN: ' + (Date.now() / 1000)); //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -81,7 +82,9 @@ var patternlab_engine = function (config) { pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); } ); +console.log('DIVESYNC ITERATIVE END: ' + (Date.now() / 1000)); +console.log('DIVESYNC RECURSIVE BEGIN: ' + (Date.now() / 1000)); //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements diveSync( @@ -95,6 +98,7 @@ var patternlab_engine = function (config) { pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0); } ); +console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference @@ -130,6 +134,7 @@ var patternlab_engine = function (config) { //export patterns if necessary pattern_exporter.export_patterns(patternlab); +console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); } function addToPatternPaths(bucketName, pattern) { From 62a217bc38818d81c9535a063ebbe921aeda3b50 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 9 Mar 2016 08:40:52 -0500 Subject: [PATCH 027/162] working list item hunter --- builder/.parameter_hunter.js.swp | Bin 0 -> 28672 bytes builder/.pattern_assembler.js.swp | Bin 53248 -> 49152 bytes builder/.style_modifier_hunter.js.swp | Bin 0 -> 12288 bytes builder/list_item_hunter.js | 6 +- builder/parameter_hunter.js | 10 ++- builder/pattern_assembler.js | 105 ++++++++++++-------------- 6 files changed, 60 insertions(+), 61 deletions(-) create mode 100644 builder/.parameter_hunter.js.swp create mode 100644 builder/.style_modifier_hunter.js.swp diff --git a/builder/.parameter_hunter.js.swp b/builder/.parameter_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..ea39646b7e2ef8696ad099a3802439fb6ab21582 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp index fab4c0386d6ad907f13f9710cdeabecff07cbb91..f8114d92f3c8b284b2015a7b9816ba1cd2d7e3e0 100644 GIT binary patch delta 4841 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 IU4_@xpQtJ20ssI2 literal 0 HcmV?d00001 diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index d818839ce..403b70227 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -79,7 +79,7 @@ var list_item_hunter = function () { } //replace its reference within the block with the extended template - thisBlockTemplate = thisBlockTemplate.replace(foundPartials[j], cleanPartialPattern.extendedTemplate); + thisBlockTemplate = thisBlockTemplate.replace(foundPartials[j], cleanPartialPattern.template); } //render with data @@ -94,8 +94,8 @@ var list_item_hunter = function () { } //replace the block with our generated HTML - var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); - pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); + var repeatingBlock = pattern.tmpTemplate.substring(pattern.tmpTemplate.indexOf(liMatch), pattern.tmpTemplate.indexOf(end) + end.length); + pattern.tmpTemplate = pattern.tmpTemplate.replace(repeatingBlock, repeatedBlockHtml); }); } diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 5968ae246..0c07ac141 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -13,10 +13,12 @@ var parameter_hunter = function () { var extend = require('util')._extend, + lih = require('./list_item_hunter'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), - style_modifier_hunter = new smh(), - pattern_assembler = new pa(); + list_item_hunter = new lih(), + pattern_assembler = new pa(), + style_modifier_hunter = new smh(); function paramToJson(pString) { var colonPos; @@ -195,6 +197,10 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); } + //find any listItem blocks that within the partial + //do this before rendering parametered tags + list_item_hunter.process_list_item_partials(partialPattern, patternlab); + var regex; var escapedKey; for (var j in paramData) { diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index f802352e2..84a00971e 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -145,7 +145,7 @@ var pattern_assembler = function () { //escaped all tags that match keys in the JSON data. for (var i = 0; i < pattern.dataKeys.length; i++) { escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?[^\\}]*' + escapedKey + '[^\\}]*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); } @@ -161,27 +161,6 @@ var pattern_assembler = function () { return templateRendered; } - /** - * Render the template excluding partials. The reason for this is to eliminate - * the unwanted recursion paths that would remain if irrelevant conditional - * tags persisted. Escaping partial tags so a full render of non-partial tags - * eliminate irrelevant conditional tags. - * - * @param {string} template The template to render. - * @param {object} data The data to render with. - * @returns {string} templateRendered - */ - function escapeRenderUnescapePartials(template, data) { - //escape partial tags by switching them to ERB syntax. - var templateEscaped = template.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - templateEscaped = renderPattern(templateEscaped, data); - - //after that's done, switch back to standard Mustache tags and return. - var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - return templateRendered; - } - /** * Recursively get all the property keys from the JSON data for a pattern. * @@ -315,11 +294,11 @@ var pattern_assembler = function () { //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate to avoid undefined type errors. - //trying to keep memory footprint small, so set it to empty string at first. + //do the same with extendedTemplate currentPattern.extendedTemplate = ''; //do the same with tmpTemplate to avoid undefined type errors + //trying to keep memory footprint small, so set it to empty string at first currentPattern.tmpTemplate = ''; //find any stylemodifiers that may be in the current pattern @@ -361,7 +340,7 @@ var processEnd; if (recursionLevel === 0) { //console.log(file); -if (file.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { processBegin = Date.now() / 1000; console.log('PROCESS BEGIN: ' + processBegin); } @@ -373,56 +352,62 @@ console.log('PROCESS BEGIN: ' + processBegin); //look for a json file for this template var globalData = patternlab.data; var jsonFilename; - var localData; + var localData = null; - //first, determine if this is a recursible pattern. no point continuing if it isn't. + //get json data local to this pattern try { jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; localData = fs.readJSONSync(jsonFilename); + + if (patternlab.config.debug) { + console.log('found pattern-specific data.json for ' + currentPattern.key); + } } catch (error) { - return; - } - - if (patternlab.config.debug) { - console.log('found pattern-specific data.json for ' + currentPattern.key); } //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); -if (file.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); } //return if processing an ignored file - if (!currentPattern || typeof currentPattern.tmpTemplate === 'undefined') { + if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { return; } currentPattern.jsonFileData = mergeData(globalData, localData); currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); - currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.template, currentPattern); + currentPattern.tmpTemplate = currentPattern.template; + + //find any listItem blocks that within the pattern + //do this before winnowing unused tags + list_item_hunter.process_list_item_partials(currentPattern, patternlab); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log('LIST ITEMS at: ' + (Date.now() / 1000)); + console.log(currentPattern.tmpTemplate); +} + + currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); } -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('RECURSION LEVEL: ' + recursionLevel); console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); -console.log('DATA SIZE: ' + JSON.stringify(currentPattern).length + 'B'); +console.log(currentPattern.tmpTemplate); } //find current pattern in patternlab object using var file as a key // var currentPattern = getpatternbykey(file, patternlab); - //find any listItem blocks - list_item_hunter.process_list_item_partials(currentPattern, patternlab); - //render the template, excepting for partial includes, using jsonFileData var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); //if the template contains any pattern parameters if (parameteredPartials && parameteredPartials.length) { -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('parameteredPartials'); console.log(parameteredPartials); } @@ -449,7 +434,7 @@ console.log(parameteredPartials); //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('foundPatternPartials'); console.log(foundPatternPartials); } @@ -482,16 +467,30 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m throw 'Could not find pattern with key ' + partialKey; } else { + //find any listItem blocks that within the partial + //do this before winnowing unused tags within that partial + partialPattern.tmpTemplate = partialPattern.template; + list_item_hunter.process_list_item_partials(partialPattern, patternlab); + + var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log('winnowedPartial'); +// console.log(winnowedPartial); + console.log('partialPattern.tmpTemplate'); + console.log(partialPattern.tmpTemplate); +} + //replace each partial tag with the partial's template. //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowUnusedTags(partialPattern.template, currentPattern)); + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowedPartial); + partialPattern.tmpTemplate = ''; // currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); } } -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('unique foundPatternPartials'); console.log(uniquePartials); } @@ -506,12 +505,12 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m //do only when popped to the top level of recursion if (recursionLevel === 0) { -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); } //switched ERB escaped tags back to standard Mustache tags currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); } @@ -521,25 +520,19 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m } currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); } - //find any listItem blocks that within the pattern, even if there are no partials - list_item_hunter.process_list_item_partials(currentPattern, patternlab); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { - console.log('LIST ITEMS at: ' + (Date.now() / 1000)); -} - //find pattern lineage lineage_hunter.find_lineage(currentPattern, patternlab); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('FOUND LINEAGE at: ' + (Date.now() / 1000)); } //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); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); } @@ -548,7 +541,7 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m currentPattern.jsonFileData = null; currentPattern.dataKeys = null; -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); processEnd = Date.now() / 1000; console.log('PROCESS END: ' + processEnd); From 5ec5d0d9fd31f81145e9e800f01a26c6d521629a Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 9 Mar 2016 18:08:30 -0500 Subject: [PATCH 028/162] partially working pseudopattern hunter --- builder/.parameter_hunter.js.swp | Bin 28672 -> 0 bytes builder/.pattern_assembler.js.swp | Bin 49152 -> 0 bytes builder/.style_modifier_hunter.js.swp | Bin 12288 -> 0 bytes builder/parameter_hunter.js | 50 +++++++--------------- builder/pattern_assembler.js | 57 +++++++++++--------------- builder/patternlab.js | 6 +-- builder/pseudopattern_hunter.js | 9 ++++ builder/style_modifier_hunter.js | 2 +- 8 files changed, 50 insertions(+), 74 deletions(-) delete mode 100644 builder/.parameter_hunter.js.swp delete mode 100644 builder/.pattern_assembler.js.swp delete mode 100644 builder/.style_modifier_hunter.js.swp diff --git a/builder/.parameter_hunter.js.swp b/builder/.parameter_hunter.js.swp deleted file mode 100644 index ea39646b7e2ef8696ad099a3802439fb6ab21582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 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 diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index f8114d92f3c8b284b2015a7b9816ba1cd2d7e3e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49152 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 IU4_@xpQtJ20ssI2 diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 0c07ac141..0fd7df31f 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -124,38 +124,15 @@ var parameter_hunter = function () { } function findparameters(pattern, patternlab, parameteredPartials) { - - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - //however, we only want to render the parameter data, so we need to identify - //those tags, switch them to ERB syntax, and render for ERB syntax. -// var tmpTemplate = pattern.tmpTemplate; - - //evaluate parameteredPartials within tmpTemplate -// pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); - -// if (pattern.parameteredPartials && pattern.parameteredPartials.length) { - - //iterate through most recently evaluated parameteredPartials -// pattern.parameteredPartials.forEach(function (pMatch) { - var uniquePartials = []; - var uniquePartial; for (var i = 0; i < parameteredPartials.length; i++) { - uniquePartial = true; - for (var j = 0; j < uniquePartials.length; j++) { - if (parameteredPartials[i] === uniquePartials[j]) { - uniquePartial = false; - break; - } - } - - if (uniquePartial) { - uniquePartials.push(parameteredPartials[i]); - } else { + //limit iteration to one time per partial. eliminate duplicates. + if (uniquePartials.indexOf(parameteredPartials[i]) > -1) { continue; + } else { + uniquePartials.push(parameteredPartials[i]); } if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { console.log('unique parameteredPartials'); @@ -178,6 +155,16 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache console.log('found patternParameters for ' + partialName); } + //if the current tag has styleModifier data, replace the styleModifier value in the partial + //do this before rendering parametered tags + if (pattern_assembler.find_pattern_partials_with_style_modifiers(parameteredPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); + } + + //find any listItem blocks within the partial + //do this before rendering parametered tags + list_item_hunter.process_list_item_partials(partialPattern, patternlab); + //strip out the additional data, convert string to JSON. var leftParen = parameteredPartials[i].indexOf('('); var rightParen = parameteredPartials[i].indexOf(')'); @@ -192,15 +179,6 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache console.log(e); } - //if partial has style modifier data, replace the styleModifier value - if (pattern.stylePartials && pattern.stylePartials.length) { - style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); - } - - //find any listItem blocks that within the partial - //do this before rendering parametered tags - list_item_hunter.process_list_item_partials(partialPattern, patternlab); - var regex; var escapedKey; for (var j in paramData) { diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 84a00971e..8d1cd42b3 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -248,6 +248,8 @@ var pattern_assembler = function () { function processPatternIterative(file, patternlab) { var fs = require('fs-extra'), + lh = require('./lineage_hunter'), + lineage_hunter = new lh(), of = require('./object_factory'), path = require('path'); @@ -301,8 +303,11 @@ var pattern_assembler = function () { //trying to keep memory footprint small, so set it to empty string at first currentPattern.tmpTemplate = ''; - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + //find pattern lineage + //TODO: consider removing the lineage hunter. it only works at the + //iterative level, and isn't called upon any further. we need to keep the + //patternlab object as light as possible. + lineage_hunter.find_lineage(currentPattern, patternlab); //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); @@ -321,19 +326,17 @@ var pattern_assembler = function () { var fs = require('fs-extra'), path = require('path'); - var lh = require('./lineage_hunter'), - ph = require('./parameter_hunter'), + var ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), lih = require('./list_item_hunter'), smh = require('./style_modifier_hunter'); var parameter_hunter = new ph(), - lineage_hunter = new lh(), list_item_hunter = new lih(), style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); - var i, j; // for the for loops + var i; // for the for loops var processBegin; var processEnd; @@ -381,7 +384,7 @@ console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); currentPattern.tmpTemplate = currentPattern.template; - //find any listItem blocks that within the pattern + //find any listItem blocks within the pattern //do this before winnowing unused tags list_item_hunter.process_list_item_partials(currentPattern, patternlab); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { @@ -430,7 +433,6 @@ console.log(parameteredPartials); //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.tmpTemplate); var uniquePartials = []; - var uniquePartial; //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { @@ -443,19 +445,12 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m } for (i = 0; i < foundPatternPartials.length; i++) { - uniquePartial = true; - - for (j = 0; j < uniquePartials.length; j++) { - if (foundPatternPartials[i] === uniquePartials[j]) { - uniquePartial = false; - break; - } - } - if (uniquePartial) { - uniquePartials.push(foundPatternPartials[i]); - } else { + //limit iteration to one time per partial. eliminate duplicates. + if (uniquePartials.indexOf(foundPatternPartials[i]) > -1) { continue; + } else { + uniquePartials.push(foundPatternPartials[i]); } var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); @@ -466,10 +461,15 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m if (!partialPattern) { throw 'Could not find pattern with key ' + partialKey; } else { + partialPattern.tmpTemplate = partialPattern.template; + + //if the current tag has styleModifier data, replace the styleModifier value in the partial + if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); + } - //find any listItem blocks that within the partial + //find any listItem blocks within the partial //do this before winnowing unused tags within that partial - partialPattern.tmpTemplate = partialPattern.template; list_item_hunter.process_list_item_partials(partialPattern, patternlab); var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); @@ -514,22 +514,11 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); } - //if partial has style modifier data, replace the styleModifier value - if (currentPattern.stylePartials && currentPattern.stylePartials.length) { -// style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); - } - - currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); + currentPattern.extendedTemplate = currentPattern.tmpTemplate; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); } - //find pattern lineage - lineage_hunter.find_lineage(currentPattern, patternlab); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('FOUND LINEAGE at: ' + (Date.now() / 1000)); -} - //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); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { @@ -538,7 +527,7 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; - currentPattern.jsonFileData = null; +// currentPattern.jsonFileData = null; currentPattern.dataKeys = null; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { diff --git a/builder/patternlab.js b/builder/patternlab.js index 2573ee59f..e5985c10c 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -113,11 +113,11 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); patternlab.patterns.forEach(function (pattern) { //render the pattern, but first consolidate any data we may have - var allData = JSON.parse(JSON.stringify(patternlab.data)); - allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); +// var allData = JSON.parse(JSON.stringify(patternlab.data)); +// allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); //render the extendedTemplate with all data - pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, allData); + pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, pattern.jsonFileData); //add footer info before writing var patternFooter = pattern_assembler.renderPattern(patternlab.footer, pattern); diff --git a/builder/pseudopattern_hunter.js b/builder/pseudopattern_hunter.js index 6366be9e8..6ea560290 100644 --- a/builder/pseudopattern_hunter.js +++ b/builder/pseudopattern_hunter.js @@ -33,6 +33,9 @@ var pseudopattern_hunter = function () { }); if (pseudoPatterns.length > 0) { +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + console.log('found pseudoPattern variant of ' + currentPattern.key); +} for (var i = 0; i < pseudoPatterns.length; i++) { if (patternlab.config.debug) { console.log('found pseudoPattern variant of ' + currentPattern.key); @@ -48,6 +51,12 @@ var pseudopattern_hunter = function () { var variantFilePath = path.resolve(paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); var variantFileName = currentPattern.fileName + '-' + variantName + '.'; var patternVariant = new of.oPattern(variantFilePath, currentPattern.subdir, variantFileName, variantFileData); +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + console.log(pseudoPatterns[i]); + console.log(variantName); + console.log(variantFilePath); + console.log(variantFileName); +} //see if this file has a state pattern_assembler.setPatternState(patternVariant, patternlab); diff --git a/builder/style_modifier_hunter.js b/builder/style_modifier_hunter.js index 16c37c1d1..acf50de49 100644 --- a/builder/style_modifier_hunter.js +++ b/builder/style_modifier_hunter.js @@ -25,7 +25,7 @@ var style_modifier_hunter = function () { } //replace the stylemodifier placeholder with the class name - pattern.extendedTemplate = pattern.extendedTemplate.replace(/{{[ ]?styleModifier[ ]?}}/i, styleModifier); + pattern.tmpTemplate = pattern.tmpTemplate.replace(/{{[ ]?styleModifier[ ]?}}/i, styleModifier); } } From 9d49785787cb7fa983da0a7441fa8e2f560f0fa8 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 06:32:45 -0500 Subject: [PATCH 029/162] working pseudopattern hunter --- builder/pattern_assembler.js | 145 +++++++++++++++++++++++--------- builder/pseudopattern_hunter.js | 76 ++++++++--------- 2 files changed, 142 insertions(+), 79 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 8d1cd42b3..178828da0 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -266,9 +266,16 @@ var pattern_assembler = function () { //make a new Pattern Object var currentPattern = new of.oPattern(file, subdir, filename); - //if file is named in the syntax for variants, no need to process further - //processPatternRecursive() will run find_pseudopatterns() and look at each pattern for a variant + //if file is named in the syntax for variants, add the variant data to memory. + //processPatternRecursive() will run find_pseudopatterns() to render with the variant data. if (ext === '.json' && filename.indexOf('~') > -1) { + try { + currentPattern.jsonFileData = fs.readJSONSync(file); + addPattern(currentPattern, patternlab); + } + catch (err) { + // do nothing + } return; } @@ -324,6 +331,7 @@ var pattern_assembler = function () { */ function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { var fs = require('fs-extra'), + glob = require('glob'), path = require('path'); var ph = require('./parameter_hunter'), @@ -344,61 +352,120 @@ var processEnd; //console.log(file); if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -processBegin = Date.now() / 1000; -console.log('PROCESS BEGIN: ' + processBegin); +//processBegin = Date.now() / 1000; +//console.log('PROCESS BEGIN: ' + processBegin); } //skip .json files if (path.extname(file) === '.json') { return; } + + //find current pattern in patternlab object using var file as a key + currentPattern = getpatternbykey(file, patternlab); +if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +//console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); +} + + //return if processing an ignored file + if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { + return; + } //look for a json file for this template var globalData = patternlab.data; var jsonFilename; - var localData = null; + var jsonString; + //allData will get overwritten by mergeData, so keep it scoped to this function. + var allData = null; //get json data local to this pattern try { jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; - localData = fs.readJSONSync(jsonFilename); + jsonString = fs.readFileSync(jsonFilename); + + //since mergeData will overwrite its 2nd param, we need to keep allData + //and currentPattern.jsonFileData distinct. + allData = JSON.parse(jsonString); + currentPattern.jsonFileData = JSON.parse(jsonString); if (patternlab.config.debug) { console.log('found pattern-specific data.json for ' + currentPattern.key); } } catch (error) { + //do nothing } - //find current pattern in patternlab object using var file as a key - currentPattern = getpatternbykey(file, patternlab); -if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); + //get data keys for globalData, currentPattern data, and pseudoPattern data. + mergeData(globalData, allData); + mergeData(globalData, currentPattern.jsonFileData); + var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; + var paths = patternlab.config.paths; + var pseudoPatternFiles = glob.sync(needle, { + cwd: paths.source.patterns, + debug: false, + nodir: true + }); + var pseudoPatternsArray = []; + + var pseudoPattern; + if (pseudoPatternFiles.length) { +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('pseudoPatternFiless'); +console.log(pseudoPatternFiles); } - - //return if processing an ignored file - if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { - return; +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('allData'); +console.log(allData); +} + for (i = 0; i < pseudoPatternFiles.length; i++) { + pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('pseudoPattern'); +console.log(pseudoPattern); +} + if (pseudoPattern) { + pseudoPatternsArray.push(pseudoPattern); + //mergeData() overwrites the 2nd param, so we don't need an assignment statement + //we also don't care about the priority of similarly named properties + //because we just want to populate the dataKeys array + mergeData(pseudoPattern.jsonFileData, allData); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('pseudoPattern.jsonFileData'); +console.log(pseudoPattern.jsonFileData); +} + } + } } +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('globalData'); +console.log(globalData); +} - currentPattern.jsonFileData = mergeData(globalData, localData); - currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); + currentPattern.dataKeys = getDataKeys(allData); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('currentPattern.dataKeys'); +console.log(currentPattern.dataKeys); +console.log('currentPattern.jsonFileData'); +console.log(currentPattern.jsonFileData); +} currentPattern.tmpTemplate = currentPattern.template; //find any listItem blocks within the pattern //do this before winnowing unused tags list_item_hunter.process_list_item_partials(currentPattern, patternlab); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('LIST ITEMS at: ' + (Date.now() / 1000)); - console.log(currentPattern.tmpTemplate); +// console.log('LIST ITEMS at: ' + (Date.now() / 1000)); +// console.log(currentPattern.tmpTemplate); } currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); } if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -console.log('RECURSION LEVEL: ' + recursionLevel); -console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); -console.log(currentPattern.tmpTemplate); +//console.log('RECURSION LEVEL: ' + recursionLevel); +//console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); +//console.log(currentPattern.tmpTemplate); } //find current pattern in patternlab object using var file as a key @@ -411,8 +478,8 @@ console.log(currentPattern.tmpTemplate); //if the template contains any pattern parameters if (parameteredPartials && parameteredPartials.length) { if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -console.log('parameteredPartials'); -console.log(parameteredPartials); +//console.log('parameteredPartials'); +//console.log(parameteredPartials); } if (patternlab.config.debug) { @@ -437,8 +504,8 @@ console.log(parameteredPartials); //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('foundPatternPartials'); - console.log(foundPatternPartials); +// console.log('foundPatternPartials'); +// console.log(foundPatternPartials); } if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); @@ -476,8 +543,8 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { // console.log('winnowedPartial'); // console.log(winnowedPartial); - console.log('partialPattern.tmpTemplate'); - console.log(partialPattern.tmpTemplate); +// console.log('partialPattern.tmpTemplate'); +// console.log(partialPattern.tmpTemplate); } //replace each partial tag with the partial's template. @@ -491,8 +558,8 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m } } if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('unique foundPatternPartials'); - console.log(uniquePartials); +// console.log('unique foundPatternPartials'); +// console.log(uniquePartials); } //recurse, going a level deeper, with each render eliminating nested partials @@ -506,24 +573,26 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //do only when popped to the top level of recursion if (recursionLevel === 0) { if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); +// console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); } //switched ERB escaped tags back to standard Mustache tags currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); +// console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); } currentPattern.extendedTemplate = currentPattern.tmpTemplate; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); +// console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); } //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); + if (pseudoPatternsArray.length) { + pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); +// console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); } + } //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; @@ -531,10 +600,10 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m currentPattern.dataKeys = null; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); -processEnd = Date.now() / 1000; -console.log('PROCESS END: ' + processEnd); -console.log('PROCESS TIME: ' + (processEnd - processBegin)); +//console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); +//processEnd = Date.now() / 1000; +//console.log('PROCESS END: ' + processEnd); +//console.log('PROCESS TIME: ' + (processEnd - processBegin)); } } } diff --git a/builder/pseudopattern_hunter.js b/builder/pseudopattern_hunter.js index 6ea560290..aba7bb255 100644 --- a/builder/pseudopattern_hunter.js +++ b/builder/pseudopattern_hunter.js @@ -12,7 +12,7 @@ var pseudopattern_hunter = function () { - function findpseudopatterns(currentPattern, patternlab) { + function findpseudopatterns(currentPattern, patternlab, pseudoPatternsArray) { var glob = require('glob'), fs = require('fs-extra'), pa = require('./pattern_assembler'), @@ -24,59 +24,53 @@ var pseudopattern_hunter = function () { var lineage_hunter = new lh(); var paths = patternlab.config.paths; - //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json - var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; - var pseudoPatterns = glob.sync(needle, { - cwd: paths.source.patterns, - debug: false, - nodir: true - }); - - if (pseudoPatterns.length > 0) { if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { console.log('found pseudoPattern variant of ' + currentPattern.key); } - for (var i = 0; i < pseudoPatterns.length; i++) { - if (patternlab.config.debug) { - console.log('found pseudoPattern variant of ' + currentPattern.key); - } - - //we want to do everything we normally would here, except instead read the pseudoPattern data - var variantFileData = fs.readJSONSync(path.resolve(paths.source.patterns, pseudoPatterns[i])); + for (var i = 0; i < pseudoPatternsArray.length; i++) { + if (patternlab.config.debug) { + console.log('found pseudoPattern variant of ' + currentPattern.key); + } - //extend any existing data with variant data - variantFileData = pattern_assembler.merge_data(currentPattern.jsonFileData, variantFileData); + //we want to do everything we normally would here, except instead read the pseudoPattern data +// var variantFileData = fs.readJSONSync(path.resolve(paths.source.patterns, pseudoPatterns[i])); - var variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; - var variantFilePath = path.resolve(paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); - var variantFileName = currentPattern.fileName + '-' + variantName + '.'; - var patternVariant = new of.oPattern(variantFilePath, currentPattern.subdir, variantFileName, variantFileData); + //extend any existing data with variant data + var variantFileData = pattern_assembler.merge_data(currentPattern.jsonFileData, pseudoPatternsArray[i].jsonFileData); +/* + var variantName = pseudoPatternsArray[i].substring(pseudoPatternsArray[i].indexOf('~') + 1).split('.')[0]; + var variantFilePath = path.resolve(paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); + var variantFileName = currentPattern.fileName + '-' + variantName + '.'; + var patternVariant = new of.oPattern(variantFilePath, currentPattern.subdir, variantFileName, variantFileData); + */ + + //see if this file has a state + pattern_assembler.setPatternState(pseudoPatternsArray[i], patternlab); + + //use the same template as the non-variant +// pseudoPatternsArray.template = currentPattern.template; +// pseudoPatternsArray[i].tmpTemplate = currentPattern.extendedTemplate; + pseudoPatternsArray[i].extendedTemplate = currentPattern.extendedTemplate; if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - console.log(pseudoPatterns[i]); - console.log(variantName); - console.log(variantFilePath); - console.log(variantFileName); + /* + console.log('pseudoPatternsArray[i].extendedTemplate'); + console.log(pseudoPatternsArray[i].extendedTemplate); + console.log('pseudoPatternsArray[i].jsonFileData'); + console.log(pseudoPatternsArray[i].jsonFileData); + */ } - //see if this file has a state - pattern_assembler.setPatternState(patternVariant, patternlab); - - //use the same template as the non-variant - patternVariant.template = currentPattern.template; - patternVariant.extendedTemplate = currentPattern.extendedTemplate; + //find pattern lineage +// lineage_hunter.find_lineage(patternVariant, patternlab); - //find pattern lineage - lineage_hunter.find_lineage(patternVariant, patternlab); - - //add to patternlab object so we can look these up later. - pattern_assembler.addPattern(patternVariant, patternlab); - } + //add to patternlab object so we can look these up later. +// pattern_assembler.addPattern(patternVariant, patternlab); } } return { - find_pseudopatterns: function (pattern, patternlab) { - findpseudopatterns(pattern, patternlab); + find_pseudopatterns: function (pattern, patternlab, pseudoPatternsArray) { + findpseudopatterns(pattern, patternlab, pseudoPatternsArray); } }; From 6afd5a43e2c52f107238fe2e6d70e35f942f54a5 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 07:09:19 -0500 Subject: [PATCH 030/162] stopping point. file writing done in processPatternRecursive so memory can be freed up --- builder/.pattern_assembler.js.swp | Bin 0 -> 49152 bytes builder/.patternlab.js.swp | Bin 0 -> 36864 bytes builder/pattern_assembler.js | 121 ++++++++---------------------- builder/patternlab.js | 17 +++-- 4 files changed, 40 insertions(+), 98 deletions(-) create mode 100644 builder/.pattern_assembler.js.swp create mode 100644 builder/.patternlab.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..2d1ece0b4ee8721635aef95008c5c7541407e123 GIT binary patch literal 49152 zcmeI54VYYYeeXvBub_yn7PMEMdlFt|Hrbuo4JeopD3}BTBw3RH)!k%0J9B1tvNPw5 zb7rzxlBHg~#oDT9eML~I+NWUE=Ux@0(iTOFwpFY4spZ8BYQ44KE#iaLm&exo`Tbwc z+stHllkiBdv+&LAp7VeC{eSmRBk5s#3^*|0z<>h-4h%Rj;J~jI2inb(a=$~9pK6+2 zH=j?*d>(K9o-?0~%=;6}-!}ifnfFgKe?QZFZZZ|vdY)mPUuHhXGw=V4c|L4D|0MJN z>E`+Q=JOYs_a~a?r<%{pOoMIxCz~fdK~w z92jt5z<~h=1{@f0V8DR^2L>E?QgXnpR%J;{Uh$`@f%(%iRzD5!?!{1Fr>Z zK>?fz&H%pwo(mpDG5%NZL2v-ffGW5MJRf}auRL^-Gn7lG=e2@H}j{I^}k!<&nPH@yqR6;5#a);|hw}D&-fVI;AGk zEvm9x9@%^+&^1Mb?i+Rv3_CT52#R&jpJ~r-aB3TzeLUFawr7jgdJwb<>erU*SAs@i z$XVmmhR7y)CPqeTdxrU}?NNX3Q-AD}KMo9Sa7raFtV8@rr53t`nT+s<=af6G`a-e+ z;cTZ`t$T$)^QKgqZMU22OQo>wmgj=~UJEMbi}0rOs*VR613xUiXx(||o^#HNOS8fJ zNZIvAY9pqU5&m#nEq7t0=8x=i_q$=aRcp3mPH28Oj^Rk7Bh}1$#g^w28dHFW&AQw6 zhMkJrc84^-79Fo1dZy==nRVD{x~+E2t%s(NTGc5;k96PYVPHvsYc20pom$H)IMXf9ozvWu1gZ)eT!lYg{I~~^dTf~&aY{v& zJ00?3mia>Il?BH;z%&RMkPMpn7Ly0M+%}!(H9WtalZvTY^@D0l(H5|A<3`&)f~X<} zQMXNE+2Js%!@!yMV1ids?XFcQyjHDwE#btp=XCrUBX!uBpRJW=ZMk8hFq)qeQq(+@ z**D6xb1tw+lO)8`a_w46gIZ#wkI2c2KutBxm{KY5>kCn*s1A|#M!n-y0x$IQZM!n@ zhVC@X)m@k90+|7jjId1x7PDFJFtXRVVT$@6dK<#xB>$qJCSVP;{eN2)6*))MVj zG$W-dJD6tb!L(ab4T8FB&{obLlcHmIx?f3jcUTtQ!eaL5fIMkLu z>*{HH-m8<0G1_W-JeHjLms(YQQh@%H8$#URaoL_6%KAn3$ZO9GNUmmag5icBpXC`pNYZ7mvKc9l2(7^2QnPH+l}~4 z+BMGNqBCEE-M;PpcrHB&8L@U5jJTTSjO*0_-q1+mWWy|X3|B%p#Nw$_hkEN!^Fgs{ zzgzEkg=!G2Up?)%Ru2iYkoSa(>ec#2P|3VDyi9DKza)OHnk)G zM`h}CNa;0yCa>q7ER)?tbl2Ul(nMjbTt;BD%XVTZJN$CZt|)?wqt*evVq2ojAe|17 zqf8;9XV3zf50&VdZhcrp!(^W@DdPxoc7SMEMM+>6Ufn@tmXgYCHrkxCrUdvO&4Ou$ zVCK&;$pYt+mRoVQv;w3_sc)0J-*a{#75Yj%s`+8F)^bJaA9g&y%ogCzC~qf_3lq;>tiT?jw^z&ID`oDb0&&Sc}TVM_hgU5OC zf5BgZo4`B3Tfm#a8^IfZlyNB-{0ulS;J|#{C~>< zY$2VxSM&}vgH}6?ZLpD+y<~zGiuR&1=kl+Z3#=Uk$5ZHS!k#a7_sCv@PHQZ=>iv`$ z{HMeUAFfYm^RWVKO&W{Cs_@7YmM;CJUcDJxjHv^M%ru_HId7p)ZBw%{BM;lu5MTOA@kV zSr8@qKko0`S0oS~{eR93(Z50GzX`kzya~AAmB0Z{13y5|{|g{`|01{wyZ}6mFaII& z=Yy|;FM%(Ddw}@+^Wa{5`fmqs2Co2l@EE@RFMzwjTfidl!DV18cs95f|NiU1nc&;_ z^uGZf05^kiumg;MZ_uCzz_nlujDqKYQ^2#p)4`qi^lt|@f$iYA;921N`1QX59sqZN z8^D!d0~iCxgD>OP{~Y*pa67mSd=T6W-UnUA?h9(Zs?<`clB;Ut zcBU(}miR7{Ude2S$)s02C0#M{#jjU{2_eU>hPX_kB_zmzh>JOAdcnbkJspSzb%7X? z1DYpGRc+ka$ud=O(q-1wZS20wE0CekvoP;~TW-rhv9@hnT!=XtpSO%wyICB;cu{;- zUTz5@QFdT8YG?-SX^QhaGB(e6ZPV4$3)Ct#CzpORQ}ie@#1^$1Clra0?{JLdiIR>1z;R;-Frsa`U(UqY88z2Tj9 zItUZsg$`Cqa(@#kBX*cd#n$g&Z2v9I@z6P_Vi6V%K>55TO|%)_t7) zDh+0Ll@po5ZDjJb@fS25aSjt1P>nbBVI9X1&IX-&MMq#%JbWEqB~zMqVl1lGsd{u} zk>o(|1Rbo_BjvR-oYG`hTR}s)6fWDfW4mU$npk$Jk-AE2*2q*y4L9p?+NmOpyo!>~ zoXGcTAH&>iN`jIIMq(u|U2qmY?khkc`f52OB>|&jz-!X zmffaTi6$X;3kCib7E~E1W?ai=pglB%($suEn0N3N5d{KurcPU*DK5bs^CV`@|jJs&=w-7oSojx<^#<_eiHg84-yP8dGL(M$-R@4rL*^3L~Cfy8i}0I zbXS;TvTd0cyuE0MfA~L7J-8d~{+CD|MR62mI?E)LAf#weO%&Ixy=d>52Nw%NhbAWX zOj7e6#k$GKGtagKMhioCoKjS3uOKA}{!;@%&n6jmDi}-cKYBv3%*ZT@rc;m6w%L>s z&kfy78Ig*Y@t<+KEU&yFXL-BR3xJ2%)Zfg&C+hr#jc^R7meRCD^zk#5f(eU zX_N3g;w~tdTNb{JkY zAeOi@!#CS$_R~@E)V&yAgIJbD{!KS5U7bpmm7nCH5}-u?KMURQ2cknJ;{Sh!j{j5e zFW@`ipTMWVe+RDyF9GKPu?5`wEFA~%N{t0{-ydRtd z?m@>F8^A$u29UD=zX3$||Gwz>;9tOJ!FAww!5(l9SO*?M*S{GY1lNEm@I3H0==(Q; zDXAT0kvVJm4MIt7Z^^7&YJ+4hskq{JH+K|);cTFdgb;xW+Nli2v zQH@p3Bk*Nvw!^~N;+jamB9=ONR!A4tv(C756H@EAAya~=OZlZ4gkg;UeYN5vOERz} z`NG9>2#W*55U~~7HvLvf%TPp3|v1!M8nZ6;B z(z0zgg8fF^f&|qB$25zR6KDlU;qyU@=pbUZ<6>0ol4*y{r^VBB`-|;HbGM1&XK~2q z^%`6%wOb3ST0>w1I$AU!2-;1;o!U;=plwLa$i?UYP$IiSquEA8RPj(kPPNtwbs%}E zRMBDYq1awzgLje@lh@rJ)N~}0QbknInB%otLCcspGIVXX$ zh6sLcMFjC(3x3(yNb}ric)k_&^w5OkPRpH-q#j{|=9R9(E~zNy5XDYUyy%Qxp(QTO zDbPf#d)l=2Q?24*z(}hHGle_>y>W!uNZ9ns#1od)Qmq$UQ61F&Cp&9~U2_R7S$3j$ zh}-z-iZ|Vvv7~SWL2f^d!+q1mMf+{~aeQ!xp=4Mn@~UE?>^GMg~1g8Y4#=g zp>UQ?p#9jWyUCT;nC^&hBcRQ^<}gEsAZ@_vdYrIWt&WLSy4PycHpag(pqEOqS*VNK z43JnxVuw@5VRY9=@#SfndagL3=jo#dh*?6MgYm&}Mdd`)Qp3d#3T-3MypxV(WIL-Q z;4-$n*-qq$6v2D789zYC6sw_#pw>R8sxgZOl{PVbs&hZF;Fhc@ek$5?b|^DYy9RSI z$4XXwWS49wCRO4d155Z74am6LEOS&es_I%5j4G*p7NMdw73Z%d_|%$-rS?*(pQmI< zD*=f6DmHYg8G4;cU?qEGS-Oih6X&97+!}7$s_RP%Q@IdV4jCn4J=q5r%c8Qp25Nn5bMPhqFT;D9H(1 z`VBx^PO;1-%NMr`qeI%{R?Itx4(ai^tS*p5*y`iKYX)v5XiF7vLWQY@Wkz#Fk6yji z%BZ%?QT?o6#*C3EV%8IW6^<)b$SIOKL~)I;V(267Py7t$j~bDUsbgKV%&lX?ck}GIZ**g*d@%x}bChTaaR-*gYe1s^N%g zfld*b8PXGMs}-QST#+&u7<_u@8GAHsSf`giJ0k6;O(>(4wv%q6sg7Ds?;GPcyWga& z&QU5^LS=v{=_3)2uGTwi1Xi|QIaP@YOea|BP!xDpdz4Is22M*M4T)7y3r3+n@u25E zBt~nc9qB@B+=Rmt-W_wl4Ej|Il$=-&n#7U^Y9eVV%VZaopT%h2#Ty`xa8$4z05*nJ zE#PpV1b9b3>;U7Kmgi>)JCBVL4bQ_5&jP}Hq!3P`6`ieBDNndB2886hVLO7QR6_sFpK-nAgLoe=WIe zG0~8T`6C;TAzo%b;xNaMu}a7Sw?pwI+4Jynhsf}nk4g$KnH9(E7_-I4`&(opXv(OR zJQU03)$0`TOb5I52st?CtNBj)b+B7~uuQ|ZK3V-htX6JgL<~Y9YjQ4OE=>29?y6pM z*6-Bo#*n|L{Qo29Qg^ncWD_46_G`U;o=r-Oe+mw!9B9Bc-Ul3x7!A2oTe=d%pX z1t)_0C`kPL9|zZiD!34A1gC=+fRn(_(Btn1_kquWHW&y04V(^+2jcht0{Aqz3v|E+ zAZPt=0Ph6v05$OI;Hlte==MJX_kj0;>p&AcAN&IS{Xf9hz&+qva2ePNeu^IdSKvml z2TXz&f^VY3e;tVL{|@j0a3gp(xD>1c-$jQPzkU^nPJasc>2bN-{{atxPlDUQd%%8h z0TBKE$LRAv0(XKBfH#6a051a%qSrsLT;1OEo%v9+&in+SRD6_2Hk$r5sf1c; zPIaQuP7KrH%~hFgl17W9rWZtpi{ySBXC`f8a`iJ`2Z7hQ2f)F9GzWV;7XWm!6kfv{9ctUyS5nE{dPPlxL~kQWh#BHFkUfd^hJ z>u9wyzK5ZP9JNl_df0fm8NptkU~F-Qx>$gU+W^H`)0HJAq3+1gNj{cbvZ|rlAgvTe zhxMOzmupfGi6x*aU(BPLNq~=JG*&{qG?A4=q$e4Q@>-9_dQc`z0dX_wO|wMHY>T<9 zA`?D~T{D z`8=LR@F(7IlpoioOWB50(}j^eEJD(Nri*u9?Cje5ip|a?n=jqEeZ88TYCbSXD56$f z$QaXy%tj*P?N}z%(o9oUCLa zeb7@zFlYNs0k%^`evbRs$o+&^2%BVps4i9ZIF?vDfa7(pyB8^JR(eQT1|+vNiKw{~ zZ?h}}bG4?EG+K1^!uZY|FWJ0nSF#UGFJ9u!)O;4L$X=x$zz&u!uSk>#2C0%WHaa@m zQ*b$|jz|v`)kGsA$S96MKhA!Ol)8B zsbkr4dI;#<%XFG?^U!iJTQr;4E$sXZ<>dVok>Kj+eL7*-NE$d;rKiMQbYhA(E)6698#Ri*P(VI%ISqD24 zB{iQtGY@S&0OxD6=Hu*bQQFY~3pPkDNK+nocW&%ZFb4ovT z4x-CqbHKimaw=-=nw_mtBObYe!z?yg=;3*xGpaTT0`N>pey1_*wHC7pcSqrLqRNkA z-S9E^sO3wxrLia^#MPU9T%aW_vC8bG9}<7+6d5}7I=iSBAjx3EQWKXgOnb6SnOS5* z_+*xFcwbyN4&RQa=MY9K0s%YiCJ$sn$(>JD*b;Fow$I`Ec!n)NBw*Y zo&Uq&Pr+-z7O)VPD;2Ll`cmenddjDI2 z4_1NagXaOc=WiOg;Hls?bo}k$rQlK^{{8!)^UuMZ;0<6K5ZYf1ME8G~w!99AzF!27 zpwmALz6(AJ-UBv(Q-JvKzl?4#clx~sTn$bG-$s{zHMkZ?9RF!R;`TodUJt})e;yG1 z{vXia{~mk_ybpNb4DfYy_ZxxS(|0L28HkVmYv5hro#1dkdU=rbJ06$Td>skcvOlE- zd)$(T&)M}h`5^gwbY37U)gM8n#+RvcuAq_?BuxrS)!>LTVnH0&4w`X2S-1l4=nFgY z5)PBI?<@UcN$u>Y`mt~2N&Rned8zauUO`&Zz$2L)J-WAR4vBKS0&3DDZ)G`6OH}0j zO6U0#+LR-2zb0!1`Hv+JR#0uG+md82uR9Fgzx+|SoJLzFFRy7mdBeB#jxVPwrMq_R zN{1hn1gp&8xHsOtSlDQb1gYT-uyH4KPVi?l9a zuP05~2C}DJv0aRHDI8XvER~ec6O~jVYEL$1FgcHtCMY79;aXAjwIuFeqg6yBVvMq?!yu!l zTz;HVl+sLzl6g^|MM||LoJa@dxKy;I3rlvWv%luXoasl*kR{u8X?i|K=HrOL(Wq3) z%o2vSQ|RiRmo@h9hV;Bjv@~L*ol<6e_Ad%bx(&F6xO=_3ZE;Y?$)CXiO6V(}WgT{8f;kq%{h?Sz~R=l*dTB{mh-%Nk41U8I>7dO7?5VNeAg z*aA)fKSa0x1dv#OZQywDcJ%w#gWm((QF6tIC235Qegy7{6%m9(WXbf$lISHX!|8V<&96OC1;yB4#9{$8ww0B7%I6Gwf!h8dV~F9^Gb3rxDR# zPXA;S{FR?i*KN0_%?)wtC=tFP3E(F(oWsj1<`sogzFQ{b%VjEZiGnu`y zte%*Yc!$wj(sd*!c}h}Ni;W7DIh^hit0tVTGbQJQBK@;mokpotNq!|&3x`ujJsj35 zl)2OJrqXZm6{*t9$Ru*8_c-m_a9M?umLXAVcct&k?^9%SRKzx(qGW8CnXLwl9HUYM zZ!;kPCIZfmFiD?&ufCo@B0>_wEXk^LdoxQ+_GLx|L~qL;JST(-f9kxGe~CKBFDD6v z8+5MnhUpPc*og|hF~y@OTBTB}SgX?Yihn$3hJ>05>DSDJY`{!haG!qSl&k*U9uAu( zzo!T4QMXNYY#tov4LR&uk;?*l(g5wtSxX>hNBa9d(qGiDzU<9wcH?~3UTlrD9fWA1v@GIt4(qbQ5=adL= zc#E9q|MLBLzlQ!T`v0j$S^WjNzWDy-JOAX)zvqF|z|H9T?*k3+6Lk9@gRg*jupf+p z_o3gv7s&bkhbZ?!(d~iM@hEkD2#8OA3wRoM4bP{*x!^b;zW?v>{B|%0c7U_NZP)>B z1y_M9z$S1ZI2DNR|JT5S*aiY{DUiGVP6nUEE+BXPy#q{uFJcS02iy%l18xV`foU)S zP6c8oxDVU_UI|_fO5h|Q=lQ>cz2Fw`N1zF|0lRDv)wrNg@zLTuY3Pcf^T|CSj?KT|}pQRuUQ@&VHSz*O4nkqh# zx=%Z_vtryFI*rM}%7_)x>=pKV{!)p1HzSiTTWjKQv7s$$dEBHpQL>I+>9fU0r?`71 z*8M>e)7o7U__Wd*%#fCC{|fBhisLo}#|&h77aPTU^+#7HCrTYRHuT;e1JkZ#P393p zS{vV|#3C+#Y3J6_)SnUUmR-3L(xO1lBc-4hTeFSr(S4e^hNDWh(%Ycj3{4Sovc&wV zt`3uEUu%9x=z)KUTZMbv`@4){l0!RH7i)~|K|=fV_o`Co%DyU5MYGFgBs#(mhXF(@ zIn=m*6BNpMx4HtE6r=)X|ZaJ?IN2z7et#tug#kRd9utB;v{v(JmDGByL(uWqKr;5tcY} zBFT14@4GnE#}-T%+i_<<)Bd1L9y%%WBr>r{%eU#T$HJ7rH%1+3a+<|s8S>{$Rc!eD z#1+Y3Dap^~F=sx=sTm{=*>w4GDnJBQdBe4S>W9NBIwDo(iMl2PmT?eJ2ct$KoE#Z@ zO;hJ*5FBv{dSpvmBZlOQ5)Um$@QY%AIa(T}21_TO{YX6))wKM>H3Y+@ZW%`>Rj~KM zlzclFF$G2anRSF@kC()Ewh{tizAM&K-!LZQncH{8xNADKc;&h1hF{VGYSkH2#1qH2ZAZIyE3bSf#;jSgG70tsW?!dNF2b& zfY<`$zW<#-?)?8ZYym$44}x34UT_JJ*#BG5_iqAn&;Lc>JTL}M1SbHw1K_LZ|I=VS zcnZjY525diJ>d0VJGcv7|Iff};1l3humG+E+rf$8??wLy5-+d|Tme>te@Ey4H}Gj7 zXaC;@%HRSZ=l_3>&VLWM3%nWlU8JW8TmajeWivGr0*97;3Mh5#9O7@ShKyy!&Qr)up_%4TI&a(SP8t_H2rdF?Rf z(pP_OLjH;EU-rA3xankKY)^Dupd6LX+EWu5vwl*kTgXo&5i4X)o+q9`Qr0S`zUx8d z+qv0nm6;@D%G|%fv2l}B%HFw|6!?h!xyfSWDBrWTG-K?nqWtT0dTUNt7Kf9>r7eNt z?$!GkY_Ih7b}3iwTR0UyE!@Mds5 zD1)oPDc}L@0QZC62Ume%@F=!`e+Bn|SAiKY1-627!7x}0?!_MPTCfM40ltJCK<@qz zz~$hDU==tGJPv>E2ls)GfdfEzCg%#)fXA={JPN)9ZUq5o0QnApzlFbl4c-OX;7lNQ z2Mm4&9C(s(Krce_Z^E$H^I^+p<;n(RAZ#w<7Rlw5x12Pon=9iCDcYZ4GE*c(x8wJ_ zJo9L1jPoXXCeykl)5HlBlahbx-}{%nvX)kYaV;^5EAiM~6RHXAGMB5064vsZPN!Tf zNwd3-5*gf`slG!rBQA(O^vkk*hAUlCW=0-OggnTbRJ4Q4Dsy&~^?#|9g9|w$C3tWlr`$y< zD~t+AR-x+F#;nGr8Jw}pRhzTzdMyk7FY!W78TZ+F(?bA~_NC0(mi#CGWtTZ=pl~^J z+D%=rCsq@+mHubFFcKS-+@ctT+KAfC{gktw{aOtji(!H)|5M&5S>(FFH2rcZr0P~V Qj7L~S;;KpcTTWj5KmTU}OaK4? literal 0 HcmV?d00001 diff --git a/builder/.patternlab.js.swp b/builder/.patternlab.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..36f8319b6be11f70e4b9cf3f4841fad9c6b0e5a9 GIT binary patch literal 36864 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 BTd@ED literal 0 HcmV?d00001 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 178828da0..3703a02b6 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -332,6 +332,7 @@ var pattern_assembler = function () { function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { var fs = require('fs-extra'), glob = require('glob'), + he = require('html-entities').AllHtmlEntities, path = require('path'); var ph = require('./parameter_hunter'), @@ -340,6 +341,7 @@ var pattern_assembler = function () { smh = require('./style_modifier_hunter'); var parameter_hunter = new ph(), + entity_encoder = new he(), list_item_hunter = new lih(), style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); @@ -350,11 +352,6 @@ var processBegin; var processEnd; if (recursionLevel === 0) { -//console.log(file); -if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//processBegin = Date.now() / 1000; -//console.log('PROCESS BEGIN: ' + processBegin); -} //skip .json files if (path.extname(file) === '.json') { return; @@ -362,9 +359,6 @@ if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); -if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); -} //return if processing an ignored file if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { @@ -397,6 +391,7 @@ if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { } //get data keys for globalData, currentPattern data, and pseudoPattern data. + //mergeData() overwrites the 2nd param, so we don't need assignment statements mergeData(globalData, allData); mergeData(globalData, currentPattern.jsonFileData); var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; @@ -407,81 +402,36 @@ if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { nodir: true }); var pseudoPatternsArray = []; - var pseudoPattern; + if (pseudoPatternFiles.length) { -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('pseudoPatternFiless'); -console.log(pseudoPatternFiles); -} -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('allData'); -console.log(allData); -} for (i = 0; i < pseudoPatternFiles.length; i++) { pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('pseudoPattern'); -console.log(pseudoPattern); -} if (pseudoPattern) { pseudoPatternsArray.push(pseudoPattern); - //mergeData() overwrites the 2nd param, so we don't need an assignment statement - //we also don't care about the priority of similarly named properties - //because we just want to populate the dataKeys array + + //update the allData object. mergeData(pseudoPattern.jsonFileData, allData); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('pseudoPattern.jsonFileData'); -console.log(pseudoPattern.jsonFileData); -} } } } -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('globalData'); -console.log(globalData); -} currentPattern.dataKeys = getDataKeys(allData); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('currentPattern.dataKeys'); -console.log(currentPattern.dataKeys); -console.log('currentPattern.jsonFileData'); -console.log(currentPattern.jsonFileData); -} currentPattern.tmpTemplate = currentPattern.template; //find any listItem blocks within the pattern //do this before winnowing unused tags list_item_hunter.process_list_item_partials(currentPattern, patternlab); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('LIST ITEMS at: ' + (Date.now() / 1000)); -// console.log(currentPattern.tmpTemplate); -} currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); } -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log('RECURSION LEVEL: ' + recursionLevel); -//console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); -//console.log(currentPattern.tmpTemplate); -} - - //find current pattern in patternlab object using var file as a key -// var currentPattern = getpatternbykey(file, patternlab); - - //render the template, excepting for partial includes, using jsonFileData + //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); - //if the template contains any pattern parameters + //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log('parameteredPartials'); -//console.log(parameteredPartials); -} - if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } @@ -494,19 +444,12 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } - //delete empty lines. good for memory management and debugging. -// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); - //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.tmpTemplate); var uniquePartials = []; //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('foundPatternPartials'); -// console.log(foundPatternPartials); -} if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } @@ -540,12 +483,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m list_item_hunter.process_list_item_partials(partialPattern, patternlab); var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('winnowedPartial'); -// console.log(winnowedPartial); -// console.log('partialPattern.tmpTemplate'); -// console.log(partialPattern.tmpTemplate); -} //replace each partial tag with the partial's template. //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters @@ -557,43 +494,42 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m // currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); } } -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('unique foundPatternPartials'); -// console.log(uniquePartials); -} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } - //delete empty lines again. good for memory management and debugging. -// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); - //do only when popped to the top level of recursion if (recursionLevel === 0) { -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); -} + //switched ERB escaped tags back to standard Mustache tags currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); -} currentPattern.extendedTemplate = currentPattern.tmpTemplate; -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); -} - //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json + //look through pseudoPatternsArray again, and update their patternlab objects if (pseudoPatternsArray.length) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); -} } + currentPattern.jsonFileData = parseDataLinksHelper(patternlab, currentPattern.jsonFileData, currentPattern.key); + + //render the extendedTemplate with all data + currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); + + //add footer info before writing + var patternFooter = renderPattern(patternlab.footer, currentPattern.jsonFileData); + + //write the compiled template to the public patterns directory + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); + + //write the mustache file too + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(currentPattern.template)); + + //write the encoded version too + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); + //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; // currentPattern.jsonFileData = null; @@ -682,6 +618,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m process_pattern_recursive: function (file, patternlab, recursionLevel) { processPatternRecursive(file, patternlab, recursionLevel); }, + parse_data_links_helper: function (patternlab, obj, key) { + return parseDataLinksHelper(patternlab, obj, key); + }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); } diff --git a/builder/patternlab.js b/builder/patternlab.js index e5985c10c..840a82a33 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -84,6 +84,13 @@ console.log('DIVESYNC ITERATIVE BEGIN: ' + (Date.now() / 1000)); ); console.log('DIVESYNC ITERATIVE END: ' + (Date.now() / 1000)); + patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); + + //delete the contents of config.patterns.public before writing + if (deletePatternDir) { + fs.emptyDirSync(paths.public.patterns); + } + console.log('DIVESYNC RECURSIVE BEGIN: ' + (Date.now() / 1000)); //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements @@ -102,12 +109,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference - pattern_assembler.parse_data_links(patternlab); - - //delete the contents of config.patterns.public before writing - if (deletePatternDir) { - fs.emptyDirSync(paths.public.patterns); - } +// pattern_assembler.parse_data_links(patternlab); //render all patterns last, so lineageR works patternlab.patterns.forEach(function (pattern) { @@ -115,7 +117,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //render the pattern, but first consolidate any data we may have // var allData = JSON.parse(JSON.stringify(patternlab.data)); // allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); - +/* //render the extendedTemplate with all data pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, pattern.jsonFileData); @@ -130,6 +132,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //write the encoded version too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); + */ }); //export patterns if necessary From 6dbceb206256709360431635cdd95dbfa7860b0e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 08:31:04 -0500 Subject: [PATCH 031/162] fixed frontend render --- builder/.pattern_assembler.js.swp | Bin 49152 -> 0 bytes builder/.patternlab.js.swp | Bin 36864 -> 0 bytes builder/parameter_hunter.js | 2 +- builder/pattern_assembler.js | 55 ++++++++++++++++++------------ builder/pattern_exporter.js | 1 + builder/patternlab.js | 10 +++--- 6 files changed, 41 insertions(+), 27 deletions(-) delete mode 100644 builder/.pattern_assembler.js.swp delete mode 100644 builder/.patternlab.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index 2d1ece0b4ee8721635aef95008c5c7541407e123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49152 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 Qj7L~S;;KpcTTWj5KmTU}OaK4? diff --git a/builder/.patternlab.js.swp b/builder/.patternlab.js.swp deleted file mode 100644 index 36f8319b6be11f70e4b9cf3f4841fad9c6b0e5a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 BTd@ED diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 0fd7df31f..c92b016e8 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -204,7 +204,7 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache //replace parameteredPartials with their rendered values. var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); regex = new RegExp(pMatch, 'g'); - pattern.tmpTemplate = pattern.tmpTemplate.replace(regex, partialPattern.tmpTemplate); + pattern.extendedTemplate = pattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); // Free tmpTemplate from memory. partialPattern.tmpTemplate = ''; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 3703a02b6..f3168a16a 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -303,11 +303,11 @@ var pattern_assembler = function () { //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate + //do the same with extendedTemplate to avoid undefined type errors + //trying to keep memory footprint small, so set it to empty string at first currentPattern.extendedTemplate = ''; - //do the same with tmpTemplate to avoid undefined type errors - //trying to keep memory footprint small, so set it to empty string at first + //do the same with tmpTemplate currentPattern.tmpTemplate = ''; //find pattern lineage @@ -347,16 +347,12 @@ var pattern_assembler = function () { pseudopattern_hunter = new pph(); var i; // for the for loops + var paths = patternlab.config.paths; var processBegin; var processEnd; if (recursionLevel === 0) { - //skip .json files - if (path.extname(file) === '.json') { - return; - } - //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -364,6 +360,20 @@ var processEnd; if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { return; } + + //output .json variant files and return + if (path.extname(file) === '.json') { + //write the compiled template to the public patterns directory + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); + + //write the mustache file too + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(currentPattern.template)); + + //write the encoded version too + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); + + return; + } //look for a json file for this template var globalData = patternlab.data; @@ -395,7 +405,6 @@ var processEnd; mergeData(globalData, allData); mergeData(globalData, currentPattern.jsonFileData); var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; - var paths = patternlab.config.paths; var pseudoPatternFiles = glob.sync(needle, { cwd: paths.source.patterns, debug: false, @@ -417,18 +426,18 @@ var processEnd; } currentPattern.dataKeys = getDataKeys(allData); - currentPattern.tmpTemplate = currentPattern.template; + currentPattern.extendedTemplate = currentPattern.template; //find any listItem blocks within the pattern //do this before winnowing unused tags list_item_hunter.process_list_item_partials(currentPattern, patternlab); - currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.extendedTemplate, currentPattern); } //find parametered partials - var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); + var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { @@ -436,7 +445,7 @@ var processEnd; console.log('found parametered partials for ' + currentPattern.key); } - //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() + //recursively render currentPattern.extendedTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); //recurse, going a level deeper, with each render eliminating nested parameteredPartials @@ -445,7 +454,7 @@ var processEnd; } //find non-parametered partials. - var foundPatternPartials = findPartials(currentPattern.tmpTemplate); + var foundPatternPartials = findPartials(currentPattern.extendedTemplate); var uniquePartials = []; //recurse through non-parametered partials @@ -489,9 +498,9 @@ var processEnd; var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowedPartial); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, winnowedPartial); partialPattern.tmpTemplate = ''; -// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); +// currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/^\s*$\n/gm, ''); } } @@ -504,9 +513,9 @@ var processEnd; if (recursionLevel === 0) { //switched ERB escaped tags back to standard Mustache tags - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); - currentPattern.extendedTemplate = currentPattern.tmpTemplate; +// currentPattern.extendedTemplate = currentPattern.tmpTemplate; //look through pseudoPatternsArray again, and update their patternlab objects if (pseudoPatternsArray.length) { @@ -519,9 +528,13 @@ var processEnd; currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); //add footer info before writing - var patternFooter = renderPattern(patternlab.footer, currentPattern.jsonFileData); + var patternFooter = renderPattern(patternlab.footer, currentPattern); +if (currentPattern.abspath.indexOf('00-homepage') > -1) { + console.log(patternFooter); +} //write the compiled template to the public patterns directory +// fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate); fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); //write the mustache file too @@ -555,9 +568,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m for (var i = 0; i < linkMatches.length; i++) { expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; if (expandedLink) { - if (patternlab.config.debug) { +// if (patternlab.config.debug) { console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); - } +// } dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); } } diff --git a/builder/pattern_exporter.js b/builder/pattern_exporter.js index 23c9777a4..a6cf924d3 100644 --- a/builder/pattern_exporter.js +++ b/builder/pattern_exporter.js @@ -18,6 +18,7 @@ var pattern_exporter = function () { //read the config export options var exportKeys = patternlab.config.patternExportKeys; + //find the chosen patterns to export for (var i = 0; i < exportKeys.length; i++) { for (var j = 0; j < patternlab.patterns.length; j++) { diff --git a/builder/patternlab.js b/builder/patternlab.js index 840a82a33..9df134052 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -69,7 +69,6 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); -console.log('DIVESYNC ITERATIVE BEGIN: ' + (Date.now() / 1000)); //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -82,16 +81,16 @@ console.log('DIVESYNC ITERATIVE BEGIN: ' + (Date.now() / 1000)); pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); } ); -console.log('DIVESYNC ITERATIVE END: ' + (Date.now() / 1000)); patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); +//console.log('patternlab.data'); +//console.log(patternlab.data); //delete the contents of config.patterns.public before writing if (deletePatternDir) { fs.emptyDirSync(paths.public.patterns); } -console.log('DIVESYNC RECURSIVE BEGIN: ' + (Date.now() / 1000)); //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements diveSync( @@ -105,7 +104,6 @@ console.log('DIVESYNC RECURSIVE BEGIN: ' + (Date.now() / 1000)); pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0); } ); -console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference @@ -120,10 +118,12 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); /* //render the extendedTemplate with all data pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, pattern.jsonFileData); +*/ //add footer info before writing var patternFooter = pattern_assembler.renderPattern(patternlab.footer, pattern); +/* //write the compiled template to the public patterns directory fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.patternPartial + patternFooter); @@ -132,7 +132,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //write the encoded version too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); - */ +*/ }); //export patterns if necessary From 4ab68645ece75c868be9d4a22fb42868b8bbaeaf Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 08:40:37 -0500 Subject: [PATCH 032/162] working pseudopatterns --- builder/.pattern_assembler.js.swp | Bin 0 -> 40960 bytes builder/pattern_assembler.js | 27 ++++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..6d7266a386495985776139e10fa3f937fcf0179b GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index f3168a16a..dbf236009 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -348,6 +348,7 @@ var pattern_assembler = function () { var i; // for the for loops var paths = patternlab.config.paths; + var patternFooter; var processBegin; var processEnd; @@ -362,7 +363,21 @@ var processEnd; } //output .json variant files and return + //these variants should occur after their primaries, given that tildes come + //after periods in ASCII order. as such, their extendedTemplates should be + //filled out and renderable. if (path.extname(file) === '.json') { + currentPattern.jsonFileData = parseDataLinksHelper(patternlab, currentPattern.jsonFileData, currentPattern.key); + + //render the extendedTemplate with all data + currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); + + //add footer info before writing + patternFooter = renderPattern(patternlab.footer, currentPattern); +if (currentPattern.abspath.indexOf('00-homepage') > -1) { + console.log(patternFooter); +} + //write the compiled template to the public patterns directory fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); @@ -374,7 +389,8 @@ var processEnd; return; } - + + //continue with regular mustache templates //look for a json file for this template var globalData = patternlab.data; var jsonFilename; @@ -500,7 +516,6 @@ var processEnd; currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, winnowedPartial); partialPattern.tmpTemplate = ''; -// currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/^\s*$\n/gm, ''); } } @@ -515,8 +530,6 @@ var processEnd; //switched ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); -// currentPattern.extendedTemplate = currentPattern.tmpTemplate; - //look through pseudoPatternsArray again, and update their patternlab objects if (pseudoPatternsArray.length) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); @@ -528,13 +541,12 @@ var processEnd; currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); //add footer info before writing - var patternFooter = renderPattern(patternlab.footer, currentPattern); + patternFooter = renderPattern(patternlab.footer, currentPattern); if (currentPattern.abspath.indexOf('00-homepage') > -1) { console.log(patternFooter); } //write the compiled template to the public patterns directory -// fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate); fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); //write the mustache file too @@ -544,8 +556,9 @@ if (currentPattern.abspath.indexOf('00-homepage') > -1) { fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); //since we're done with currentPattern.tmpTemplate, free it from memory + currentPattern.extendedTemplate = ''; currentPattern.tmpTemplate = ''; -// currentPattern.jsonFileData = null; + currentPattern.jsonFileData = null; currentPattern.dataKeys = null; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { From 31810ae9c901ada4f6cc5efd3afcb158db06d154 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 08:59:55 -0500 Subject: [PATCH 033/162] moved file writing to a function --- builder/.pattern_assembler.js.swp | Bin 40960 -> 0 bytes builder/pattern_assembler.js | 84 +++++++++++++----------------- builder/patternlab.js | 32 ------------ 3 files changed, 35 insertions(+), 81 deletions(-) delete mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index 6d7266a386495985776139e10fa3f937fcf0179b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index dbf236009..80ff7ce80 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -246,6 +246,31 @@ var pattern_assembler = function () { return obj2; } + function outputPatternToFS(pattern, patternlab) { + var fs = require('fs-extra'); + var he = require('html-entities').AllHtmlEntities; + var entity_encoder = new he(); + var paths = patternlab.config.paths; + var patternFooter; + + pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); + + //render the extendedTemplate with all data + pattern.extendedTemplate = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); + + //add footer info before writing + patternFooter = renderPattern(patternlab.footer, pattern); + + //write the compiled template to the public patterns directory + fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.extendedTemplate + patternFooter); + + //write the mustache file too + fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); + + //write the encoded version too + fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.extendedTemplate)); + } + function processPatternIterative(file, patternlab) { var fs = require('fs-extra'), lh = require('./lineage_hunter'), @@ -332,7 +357,6 @@ var pattern_assembler = function () { function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { var fs = require('fs-extra'), glob = require('glob'), - he = require('html-entities').AllHtmlEntities, path = require('path'); var ph = require('./parameter_hunter'), @@ -341,14 +365,12 @@ var pattern_assembler = function () { smh = require('./style_modifier_hunter'); var parameter_hunter = new ph(), - entity_encoder = new he(), list_item_hunter = new lih(), style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); var i; // for the for loops var paths = patternlab.config.paths; - var patternFooter; var processBegin; var processEnd; @@ -362,31 +384,12 @@ var processEnd; return; } - //output .json variant files and return - //these variants should occur after their primaries, given that tildes come - //after periods in ASCII order. as such, their extendedTemplates should be - //filled out and renderable. + //output .json pseudoPattern variants to the file system and return. + //diveSync should process these variants after their primaries, given that + //tildes come after periods in ASCII order. as such, their extendedTemplates + //should be filled out and renderable. if (path.extname(file) === '.json') { - currentPattern.jsonFileData = parseDataLinksHelper(patternlab, currentPattern.jsonFileData, currentPattern.key); - - //render the extendedTemplate with all data - currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); - - //add footer info before writing - patternFooter = renderPattern(patternlab.footer, currentPattern); -if (currentPattern.abspath.indexOf('00-homepage') > -1) { - console.log(patternFooter); -} - - //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); - - //write the mustache file too - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(currentPattern.template)); - - //write the encoded version too - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); - + outputPatternToFS(currentPattern, patternlab); return; } @@ -535,27 +538,10 @@ if (currentPattern.abspath.indexOf('00-homepage') > -1) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); } - currentPattern.jsonFileData = parseDataLinksHelper(patternlab, currentPattern.jsonFileData, currentPattern.key); - - //render the extendedTemplate with all data - currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); + //output rendered pattern to the file system + outputPatternToFS(currentPattern, patternlab); - //add footer info before writing - patternFooter = renderPattern(patternlab.footer, currentPattern); -if (currentPattern.abspath.indexOf('00-homepage') > -1) { - console.log(patternFooter); -} - - //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); - - //write the mustache file too - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(currentPattern.template)); - - //write the encoded version too - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); - - //since we're done with currentPattern.tmpTemplate, free it from memory + //since we're done with these currentPattern properties, free them from memory currentPattern.extendedTemplate = ''; currentPattern.tmpTemplate = ''; currentPattern.jsonFileData = null; @@ -581,9 +567,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m for (var i = 0; i < linkMatches.length; i++) { expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; if (expandedLink) { -// if (patternlab.config.debug) { + if (patternlab.config.debug) { console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); -// } + } dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); } } diff --git a/builder/patternlab.js b/builder/patternlab.js index 9df134052..6534e1feb 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -83,8 +83,6 @@ var patternlab_engine = function (config) { ); patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); -//console.log('patternlab.data'); -//console.log(patternlab.data); //delete the contents of config.patterns.public before writing if (deletePatternDir) { @@ -105,36 +103,6 @@ var patternlab_engine = function (config) { } ); - //now that all the main patterns are known, look for any links that might be within data and expand them - //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference -// pattern_assembler.parse_data_links(patternlab); - - //render all patterns last, so lineageR works - patternlab.patterns.forEach(function (pattern) { - - //render the pattern, but first consolidate any data we may have -// var allData = JSON.parse(JSON.stringify(patternlab.data)); -// allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); -/* - //render the extendedTemplate with all data - pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, pattern.jsonFileData); -*/ - - //add footer info before writing - var patternFooter = pattern_assembler.renderPattern(patternlab.footer, pattern); - -/* - //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.patternPartial + patternFooter); - - //write the mustache file too - fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); - - //write the encoded version too - fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); -*/ - }); - //export patterns if necessary pattern_exporter.export_patterns(patternlab); console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); From 81b8115f82c14132c6bf21224265696e7274972f Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 18:21:58 -0500 Subject: [PATCH 034/162] working listItems --- builder/.list_item_hunter.js.swp | Bin 0 -> 20480 bytes builder/.pattern_assembler.js.swp | Bin 0 -> 45056 bytes builder/list_item_hunter.js | 27 ++++++++++-- builder/parameter_hunter.js | 4 -- builder/pattern_assembler.js | 41 +++++++++++++----- builder/pseudopattern_hunter.js | 17 -------- .../07-messaging/00-alert.mustache | 2 +- 7 files changed, 54 insertions(+), 37 deletions(-) create mode 100644 builder/.list_item_hunter.js.swp create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.list_item_hunter.js.swp b/builder/.list_item_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..56811ab4e91526e64f1b78dcf775ab8ad0de813d GIT binary patch literal 20480 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 Il}48JFLp2g-T(jq literal 0 HcmV?d00001 diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..cc5cc9543bd01ab23ab38b6a8972ee1226f88841 GIT binary patch literal 45056 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 literal 0 HcmV?d00001 diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 403b70227..5ee546f12 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -19,9 +19,13 @@ 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 getListItemKeys() { + return items; + } + function processListItemPartials(pattern, patternlab) { //find any listitem blocks - var matches = pattern_assembler.find_list_items(pattern, patternlab); + var matches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (matches !== null) { matches.forEach(function (liMatch) { @@ -32,7 +36,12 @@ 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 patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch) + liMatch.length, pattern.extendedTemplate.indexOf(end)).trim(); +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log(pattern.extendedTemplate); + console.log('patternBlock'); + console.log(patternBlock); +} //build arrays that repeat the block, however large we need to var repeatedBlockTemplate = []; @@ -62,6 +71,7 @@ var list_item_hunter = function () { allData.link = extend({}, patternlab.data.link); //check for partials within the repeated block + /* var foundPartials = pattern_assembler.find_pattern_partials({ 'template' : thisBlockTemplate }); if (foundPartials && foundPartials.length > 0) { @@ -88,20 +98,29 @@ var list_item_hunter = function () { //just render with mergedData thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); } + */ + thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); //add the rendered HTML to our string repeatedBlockHtml = repeatedBlockHtml + thisBlockHTML; } //replace the block with our generated HTML - var repeatingBlock = pattern.tmpTemplate.substring(pattern.tmpTemplate.indexOf(liMatch), pattern.tmpTemplate.indexOf(end) + end.length); - pattern.tmpTemplate = pattern.tmpTemplate.replace(repeatingBlock, repeatedBlockHtml); + var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); + pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log('repeatedBlockHtml'); + console.log(repeatedBlockHtml); +} }); } } return { + get_list_item_keys: function() { + return getListItemKeys(); + }, process_list_item_partials: function (pattern, patternlab) { processListItemPartials(pattern, patternlab); } diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index c92b016e8..a1ecfd84c 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -161,10 +161,6 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); } - //find any listItem blocks within the partial - //do this before rendering parametered tags - list_item_hunter.process_list_item_partials(partialPattern, patternlab); - //strip out the additional data, convert string to JSON. var leftParen = parameteredPartials[i].indexOf('('); var rightParen = parameteredPartials[i].indexOf(')'); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 80ff7ce80..9974dd65c 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -444,15 +444,17 @@ var processEnd; } } + //add allData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(allData); - currentPattern.extendedTemplate = currentPattern.template; - //find any listItem blocks within the pattern - //do this before winnowing unused tags - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + //add listItem keys to currentPattern.dataKeys + currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_keys()); - currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.extendedTemplate, currentPattern); + //add listitems.json keys to currentPattern.dataKeys + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(patternlab.listitems)); + //copy winnowed template to extendedTemplate + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); } //find parametered partials @@ -506,10 +508,6 @@ var processEnd; style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } - //find any listItem blocks within the partial - //do this before winnowing unused tags within that partial - list_item_hunter.process_list_item_partials(partialPattern, patternlab); - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); //replace each partial tag with the partial's template. @@ -521,17 +519,33 @@ var processEnd; partialPattern.tmpTemplate = ''; } } +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log('currentPattern.extendedTemplate'); +// console.log(currentPattern.extendedTemplate); +} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } - //do only when popped to the top level of recursion + //do only when popped back to the top level of recursion if (recursionLevel === 0) { //switched ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log('currentPattern.extendedTemplate'); +// console.log(currentPattern.extendedTemplate); +} + +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +//console.log(patternlab.listitems); +//console.log(currentPattern.dataKeys); +} + + //find and process any listItem blocks within the pattern + list_item_hunter.process_list_item_partials(currentPattern, patternlab); //look through pseudoPatternsArray again, and update their patternlab objects if (pseudoPatternsArray.length) { @@ -544,14 +558,19 @@ var processEnd; //since we're done with these currentPattern properties, free them from memory currentPattern.extendedTemplate = ''; currentPattern.tmpTemplate = ''; - currentPattern.jsonFileData = null; currentPattern.dataKeys = null; + currentPattern.jsonFileData = null; + currentPattern.listitems = null; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { //console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); //processEnd = Date.now() / 1000; //console.log('PROCESS END: ' + processEnd); //console.log('PROCESS TIME: ' + (processEnd - processBegin)); +} + +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +//console.log(currentPattern.dataKeys); } } } diff --git a/builder/pseudopattern_hunter.js b/builder/pseudopattern_hunter.js index aba7bb255..e6036bfcf 100644 --- a/builder/pseudopattern_hunter.js +++ b/builder/pseudopattern_hunter.js @@ -24,32 +24,18 @@ var pseudopattern_hunter = function () { var lineage_hunter = new lh(); var paths = patternlab.config.paths; -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - console.log('found pseudoPattern variant of ' + currentPattern.key); -} for (var i = 0; i < pseudoPatternsArray.length; i++) { if (patternlab.config.debug) { console.log('found pseudoPattern variant of ' + currentPattern.key); } - //we want to do everything we normally would here, except instead read the pseudoPattern data -// var variantFileData = fs.readJSONSync(path.resolve(paths.source.patterns, pseudoPatterns[i])); - //extend any existing data with variant data var variantFileData = pattern_assembler.merge_data(currentPattern.jsonFileData, pseudoPatternsArray[i].jsonFileData); -/* - var variantName = pseudoPatternsArray[i].substring(pseudoPatternsArray[i].indexOf('~') + 1).split('.')[0]; - var variantFilePath = path.resolve(paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); - var variantFileName = currentPattern.fileName + '-' + variantName + '.'; - var patternVariant = new of.oPattern(variantFilePath, currentPattern.subdir, variantFileName, variantFileData); - */ //see if this file has a state pattern_assembler.setPatternState(pseudoPatternsArray[i], patternlab); //use the same template as the non-variant -// pseudoPatternsArray.template = currentPattern.template; -// pseudoPatternsArray[i].tmpTemplate = currentPattern.extendedTemplate; pseudoPatternsArray[i].extendedTemplate = currentPattern.extendedTemplate; if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { /* @@ -62,9 +48,6 @@ if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { //find pattern lineage // lineage_hunter.find_lineage(patternVariant, patternlab); - - //add to patternlab object so we can look these up later. -// pattern_assembler.addPattern(patternVariant, patternlab); } } diff --git a/source/_patterns/01-molecules/07-messaging/00-alert.mustache b/source/_patterns/01-molecules/07-messaging/00-alert.mustache index b5e479b31..a28ce7ffe 100644 --- a/source/_patterns/01-molecules/07-messaging/00-alert.mustache +++ b/source/_patterns/01-molecules/07-messaging/00-alert.mustache @@ -1,3 +1,3 @@
{{ excerpt.short }} -
\ No newline at end of file +
From 07dbf3cef7d461662f07509622d2b66e31cf3d68 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 20:35:39 -0500 Subject: [PATCH 035/162] unique data keys --- builder/.list_item_hunter.js.swp | Bin 20480 -> 0 bytes builder/.pattern_assembler.js.swp | Bin 45056 -> 0 bytes builder/list_item_hunter.js | 24 ++++++++++++------------ builder/pattern_assembler.js | 19 +++++++++++++++---- builder/patternlab.js | 5 +++++ 5 files changed, 32 insertions(+), 16 deletions(-) delete mode 100644 builder/.list_item_hunter.js.swp delete mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.list_item_hunter.js.swp b/builder/.list_item_hunter.js.swp deleted file mode 100644 index 56811ab4e91526e64f1b78dcf775ab8ad0de813d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 Il}48JFLp2g-T(jq diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index cc5cc9543bd01ab23ab38b6a8972ee1226f88841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45056 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 diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 5ee546f12..4fc5499c9 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -38,9 +38,9 @@ var list_item_hunter = function () { var end = liMatch.replace('#', '/'); var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch) + liMatch.length, pattern.extendedTemplate.indexOf(end)).trim(); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log(pattern.extendedTemplate); - console.log('patternBlock'); - console.log(patternBlock); +// console.log(pattern.extendedTemplate); +// console.log('patternBlock'); +// console.log(patternBlock); } //build arrays that repeat the block, however large we need to @@ -53,8 +53,8 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache } //check for a local listitems.json file - var listData = JSON.parse(JSON.stringify(patternlab.listitems)); - listData = pattern_assembler.merge_data(listData, pattern.listitems); +// var listData = JSON.parse(JSON.stringify(patternlab.listitems)); + var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); //iterate over each copied block, rendering its contents along with pattenlab.listitems[i] for (i = 0; i < repeatedBlockTemplate.length; i++) { @@ -63,12 +63,12 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache //combine listItem data with pattern data with global data var itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" - var globalData = JSON.parse(JSON.stringify(patternlab.data)); - var localData = JSON.parse(JSON.stringify(pattern.jsonFileData)); +// var globalData = JSON.parse(JSON.stringify(patternlab.data)); + var patternData = pattern.jsonFileData; - var allData = pattern_assembler.merge_data(globalData, localData); - allData = pattern_assembler.merge_data(allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup - allData.link = extend({}, patternlab.data.link); +// var allData = pattern_assembler.merge_data(globalData, localData); + var allData = pattern_assembler.merge_data(patternData, 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 /* @@ -109,8 +109,8 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('repeatedBlockHtml'); - console.log(repeatedBlockHtml); +// console.log('repeatedBlockHtml'); +// console.log(repeatedBlockHtml); } }); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 9974dd65c..279a5029d 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -182,7 +182,18 @@ var pattern_assembler = function () { } } - return keys; + var uniqueKeys = []; + + //check keys array against uniqueKeys array to eliminate duplicates. + for (var i = 0; i < keys.length; i++) { + if (uniqueKeys.indexOf(keys[i]) > -1) { + continue; + } else { + uniqueKeys.push(keys[i]); + } + } + + return uniqueKeys; } function getpatternbykey(key, patternlab) { @@ -569,9 +580,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //console.log('PROCESS TIME: ' + (processEnd - processBegin)); } -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log(currentPattern.dataKeys); -} } } @@ -637,6 +645,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m winnow_unused_tags: function (template, pattern) { return winnowUnusedTags(template, pattern); }, + get_data_keys: function (data) { + return getDataKeys(data); + }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); }, diff --git a/builder/patternlab.js b/builder/patternlab.js index 6534e1feb..7b6464c92 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -69,6 +69,11 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data); + patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems)); +//console.log('patternlab.dataKeys'); +//console.log(patternlab.dataKeys); + //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, From f625c706cf5b93439fdbd12ecaaffa9a584f078f Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 11 Mar 2016 06:33:03 -0500 Subject: [PATCH 036/162] view all works --- builder/list_item_hunter.js | 64 ++++++++------------------------- builder/pattern_assembler.js | 6 ++-- builder/pseudopattern_hunter.js | 5 ++- 3 files changed, 22 insertions(+), 53 deletions(-) diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 4fc5499c9..1c7438020 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -25,18 +25,18 @@ var list_item_hunter = function () { function processListItemPartials(pattern, patternlab) { //find any listitem blocks - var matches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); - if (matches !== null) { - matches.forEach(function (liMatch) { + var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); + if (liMatches !== null) { + for (var i = 0; i < liMatches.length; i++) { if (patternlab.config.debug) { - console.log('found listItem of size ' + liMatch + ' inside ' + pattern.key); + console.log('found listItem of size ' + liMatches[i] + ' inside ' + pattern.key); } //find the boundaries of the block - var loopNumberString = liMatch.split('.')[1].split('}')[0].trim(); - var end = liMatch.replace('#', '/'); - var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch) + liMatch.length, pattern.extendedTemplate.indexOf(end)).trim(); + var loopNumberString = liMatches[i].split('.')[1].split('}')[0].trim(); + var end = liMatches[i].replace('#', '/'); + var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]) + liMatches[i].length, pattern.extendedTemplate.indexOf(end)).trim(); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { // console.log(pattern.extendedTemplate); // console.log('patternBlock'); @@ -46,74 +46,40 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache //build arrays that repeat the block, however large we need to var repeatedBlockTemplate = []; var repeatedBlockHtml = ''; - var i; // for loops + var j; // for loops - for (i = 0; i < items.indexOf(loopNumberString); i++) { + for (j = 0; j < items.indexOf(loopNumberString); j++) { repeatedBlockTemplate.push(patternBlock); } //check for a local listitems.json file -// var listData = JSON.parse(JSON.stringify(patternlab.listitems)); var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); - //iterate over each copied block, rendering its contents along with pattenlab.listitems[i] - for (i = 0; i < repeatedBlockTemplate.length; i++) { - var thisBlockTemplate = repeatedBlockTemplate[i]; + //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] + for (j = 0; j < repeatedBlockTemplate.length; j++) { + var thisBlockTemplate = repeatedBlockTemplate[j]; var thisBlockHTML = ""; //combine listItem data with pattern data with global data var itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" -// var globalData = JSON.parse(JSON.stringify(patternlab.data)); var patternData = pattern.jsonFileData; - -// var allData = pattern_assembler.merge_data(globalData, localData); var allData = pattern_assembler.merge_data(patternData, 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_assembler.find_pattern_partials({ 'template' : thisBlockTemplate }); - - 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.get_pattern_by_key(partialName, patternlab); - - //create a copy of the partial so as to not pollute it after the get_pattern_by_key call. - var cleanPartialPattern = JSON.parse(JSON.stringify(partialPattern)); - - //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.template); - } - - //render with data - thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); - } else { - //just render with mergedData - thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); - } - */ thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); + //add the rendered HTML to our string repeatedBlockHtml = repeatedBlockHtml + thisBlockHTML; } //replace the block with our generated HTML - var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); + var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]), pattern.extendedTemplate.indexOf(end) + end.length); pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { // console.log('repeatedBlockHtml'); // console.log(repeatedBlockHtml); } - }); + } } } diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 279a5029d..e4eef08ee 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -267,19 +267,19 @@ var pattern_assembler = function () { pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); //render the extendedTemplate with all data - pattern.extendedTemplate = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); + pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); //add footer info before writing patternFooter = renderPattern(patternlab.footer, pattern); //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.extendedTemplate + patternFooter); + fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.patternPartial + patternFooter); //write the mustache file too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); //write the encoded version too - fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.extendedTemplate)); + fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); } function processPatternIterative(file, patternlab) { diff --git a/builder/pseudopattern_hunter.js b/builder/pseudopattern_hunter.js index e6036bfcf..81e4e50db 100644 --- a/builder/pseudopattern_hunter.js +++ b/builder/pseudopattern_hunter.js @@ -47,7 +47,10 @@ if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { } //find pattern lineage -// lineage_hunter.find_lineage(patternVariant, patternlab); + //TODO: consider removing the lineage hunter. it only works at the + //iterative level, and isn't called upon any further. we need to keep the + //patternlab object as light as possible. + lineage_hunter.find_lineage(pseudoPatternsArray[i], patternlab); } } From 91eea3a119a7e882f60d861238b9b5c364388e64 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 11 Mar 2016 08:25:09 -0500 Subject: [PATCH 037/162] freeing more memory --- builder/pattern_assembler.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index e4eef08ee..bfaa78505 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -280,6 +280,13 @@ var pattern_assembler = function () { //write the encoded version too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); + + //since we're done with these pattern properties, free them from memory + pattern.extendedTemplate = ''; + pattern.tmpTemplate = ''; + pattern.dataKeys = null; + pattern.jsonFileData = null; + pattern.listitems = null; } function processPatternIterative(file, patternlab) { @@ -302,10 +309,14 @@ var pattern_assembler = function () { //make a new Pattern Object var currentPattern = new of.oPattern(file, subdir, filename); + //see if this file has a state + setState(currentPattern, patternlab); + //if file is named in the syntax for variants, add the variant data to memory. //processPatternRecursive() will run find_pseudopatterns() to render with the variant data. if (ext === '.json' && filename.indexOf('~') > -1) { try { + currentPattern.patternName = currentPattern.patternName.replace('~', '-'); currentPattern.jsonFileData = fs.readJSONSync(file); addPattern(currentPattern, patternlab); } @@ -320,9 +331,6 @@ var pattern_assembler = function () { return; } - //see if this file has a state - setState(currentPattern, patternlab); - //look for a listitems.json file for this template try { var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".listitems.json"); @@ -396,7 +404,7 @@ var processEnd; } //output .json pseudoPattern variants to the file system and return. - //diveSync should process these variants after their primaries, given that + //diveSync should process these variants after their originals, given that //tildes come after periods in ASCII order. as such, their extendedTemplates //should be filled out and renderable. if (path.extname(file) === '.json') { @@ -566,13 +574,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); - //since we're done with these currentPattern properties, free them from memory - currentPattern.extendedTemplate = ''; - currentPattern.tmpTemplate = ''; - currentPattern.dataKeys = null; - currentPattern.jsonFileData = null; - currentPattern.listitems = null; - if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { //console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); //processEnd = Date.now() / 1000; From 19a926e57b7a93df2b35918bb4ab3187c72a75ca Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 12 Mar 2016 10:02:55 -0500 Subject: [PATCH 038/162] everything except list items --- builder/parameter_hunter.js | 10 +- builder/pattern_assembler.js | 203 ++++++++++++++++++-------------- builder/patternlab.js | 24 +++- builder/pseudopattern_hunter.js | 7 +- package.json | 4 +- 5 files changed, 141 insertions(+), 107 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index a1ecfd84c..25f122c5e 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -129,15 +129,11 @@ var parameter_hunter = function () { for (var i = 0; i < parameteredPartials.length; i++) { //limit iteration to one time per partial. eliminate duplicates. - if (uniquePartials.indexOf(parameteredPartials[i]) > -1) { - continue; - } else { + if (uniquePartials.indexOf(parameteredPartials[i]) === -1) { uniquePartials.push(parameteredPartials[i]); + } else { + continue; } -if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { - console.log('unique parameteredPartials'); - console.log(uniquePartials); -} //find the partial's name and retrieve it var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index bfaa78505..8c61ef7e9 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -87,12 +87,13 @@ var pattern_assembler = function () { } function renderPattern(template, data, partials) { - var mustache = require('mustache'); + var hogan = require('hogan'); + var compiled = hogan.compile(template); if (partials) { - return mustache.render(template, data, partials); + return compiled.render(data, partials); } else { - return mustache.render(template, data); + return compiled.render(data); } } @@ -126,73 +127,47 @@ var pattern_assembler = function () { } } - /** - * Render the template excluding partials. The reason for this is to eliminate - * the unwanted recursion paths that would remain if irrelevant conditional - * tags persisted. Targeting non-partial tags that are not keyed in the JSON - * data for this pattern. Those will be deleted after this runs. - * - * @param {string} template The template to render. - * @param {object} data The data to render with. - * @param {object} dataKeys The data to render with. - * @returns {string} templateRendered - */ - function winnowUnusedTags(template, pattern) { - var escapedKey; - var regex; - var templateEscaped = template; - - //escaped all tags that match keys in the JSON data. - for (var i = 0; i < pattern.dataKeys.length; i++) { - escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?[^\\}]*' + escapedKey + '[^\\}]*\\}?)\\}\\}', 'g'); - templateEscaped = templateEscaped.replace(regex, '<%$1%>'); - } - - //escape partial tags by switching them to ERB syntax. - templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - - //render to winnow used tags. - var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); - - //after that's done, switch only partial tags back to standard Mustache tags and return. - templateRendered = templateRendered.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - return templateRendered; - } - /** * Recursively get all the property keys from the JSON data for a pattern. * * @param {object} data - * @param {array} keys At top level of recursion, this should be undefined. + * @param {array} uniqueKeys At top level of recursion, this should be an empty array. * @returns {array} keys A flat, one-dimensional array. */ - function getDataKeys(data) { - var keys = []; + function getDataKeys(data, uniqueKeys, file) { + var keys; for (var key in data) { if (data.hasOwnProperty(key)) { if (!(typeof data === 'object' && data instanceof Array)) { - keys.push(key); + if (uniqueKeys.indexOf(key) === -1) { +// keys.push(key); + uniqueKeys.push(key); + } else { + continue; + } } if (typeof data[key] === 'object') { - keys = keys.concat(getDataKeys(data[key])); +if (file) { +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +// console.log(uniqueKeys); +} +} + getDataKeys(data[key], uniqueKeys, file); +// uniqueKeys = uniqueKeys.concat(keys); } } } - - var uniqueKeys = []; - - //check keys array against uniqueKeys array to eliminate duplicates. - for (var i = 0; i < keys.length; i++) { - if (uniqueKeys.indexOf(keys[i]) > -1) { - continue; - } else { - uniqueKeys.push(keys[i]); - } - } - +/* +if (file) { +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { + console.log(key); + if (key === 'headline') { + console.log(uniqueKeys); + } +} +} +*/ return uniqueKeys; } @@ -289,6 +264,41 @@ var pattern_assembler = function () { pattern.listitems = null; } + /** + * Render the template excluding partials. The reason for this is to eliminate + * the unwanted recursion paths that would remain if irrelevant conditional + * tags persisted. Targeting non-partial tags that are not keyed in the JSON + * data for this pattern. Those will be deleted after this runs. + * + * @param {string} template The template to render. + * @param {object} data The data to render with. + * @param {object} dataKeys The data to render with. + * @returns {string} templateRendered + */ + function winnowUnusedTags(template, pattern) { + var escapedKey; + var regex; + var templateEscaped = template; + + //escaped all tags that match keys in the JSON data. + for (var i = 0; i < pattern.dataKeys.length; i++) { + escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + templateEscaped = templateEscaped.replace(regex, '<%$1%>'); + } + + //escape partial tags by switching them to ERB syntax. + templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + + //render to winnow used tags. + var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); + + //after that's done, switch only partial tags back to standard Mustache tags and return. + templateRendered = templateRendered.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + return templateRendered; + } + function processPatternIterative(file, patternlab) { var fs = require('fs-extra'), lh = require('./lineage_hunter'), @@ -355,9 +365,10 @@ var pattern_assembler = function () { currentPattern.tmpTemplate = ''; //find pattern lineage - //TODO: consider removing the lineage hunter. it only works at the - //iterative level, and isn't called upon any further. we need to keep the - //patternlab object as light as possible. + //TODO: consider repurposing lineage hunter. it currently only works at the + //iterative level, and isn't called upon any further. however, it could be + //repurposed to target and render only those files affected by a template edit. + //this could bring an enormous performance improvement on large projects. lineage_hunter.find_lineage(currentPattern, patternlab); //add currentPattern to patternlab.patterns array @@ -391,9 +402,11 @@ var pattern_assembler = function () { var i; // for the for loops var paths = patternlab.config.paths; -var processBegin; +var processBegin = Date.now() / 1000; var processEnd; if (recursionLevel === 0) { +//console.log('PROCESS START: ' + processBegin); +//console.log(file); //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -463,14 +476,37 @@ var processEnd; } } +//console.log('ALLDATA SIZE: ' + JSON.stringify(allData).length + 'B'); +processBegin = Date.now() / 1000; //add allData keys to currentPattern.dataKeys - currentPattern.dataKeys = getDataKeys(allData); + currentPattern.dataKeys = getDataKeys(allData, [], file); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +// console.log('currentPattern.dataKeys'); +// console.log(currentPattern.dataKeys); +} +processEnd = Date.now() / 1000; +//console.log('ALLDATA PREPARE END: ' + processEnd); +//console.log('ALLDATA PREPARE TIME: ' + (processEnd - processBegin)); //add listItem keys to currentPattern.dataKeys currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_keys()); +processBegin = Date.now() / 1000; +//console.log('LIST ITEM DATA SIZE: ' + JSON.stringify(patternlab.listitems).length + 'B'); +var listItemKeys = getDataKeys(patternlab.listitems, []); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { + console.log(listItemKeys); + /* + console.log('currentPattern.dataKeys'); + console.log(currentPattern.dataKeys); + */ +} +processEnd = Date.now() / 1000; +//console.log('LIST ITEM DATA PREPARE END: ' + processEnd); +//console.log('LIST ITEM DATA PREPARE TIME: ' + (processEnd - processBegin)); + //add listitems.json keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(patternlab.listitems)); + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(patternlab.listitems, [])); //copy winnowed template to extendedTemplate currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); @@ -478,6 +514,13 @@ var processEnd; //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); +//parameteredPartials = null; +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +// console.log('RECURSION LEVEL: ' + recursionLevel); +// console.log('currentPattern.extendedTemplate: ' + currentPattern.extendedTemplate.length + 'B'); +//console.log('DATA SIZE: ' + JSON.stringify(currentPattern).length + 'B'); +// console.log(currentPattern.extendedTemplate); +} //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { @@ -495,6 +538,7 @@ var processEnd; //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.extendedTemplate); +//foundPatternPartials = null; var uniquePartials = []; //recurse through non-parametered partials @@ -506,10 +550,10 @@ var processEnd; for (i = 0; i < foundPatternPartials.length; i++) { //limit iteration to one time per partial. eliminate duplicates. - if (uniquePartials.indexOf(foundPatternPartials[i]) > -1) { - continue; - } else { + if (uniquePartials.indexOf(foundPatternPartials[i]) === -1) { uniquePartials.push(foundPatternPartials[i]); + } else { + continue; } var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); @@ -538,10 +582,6 @@ var processEnd; partialPattern.tmpTemplate = ''; } } -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('currentPattern.extendedTemplate'); -// console.log(currentPattern.extendedTemplate); -} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up @@ -553,15 +593,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //switched ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('currentPattern.extendedTemplate'); -// console.log(currentPattern.extendedTemplate); -} - -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log(patternlab.listitems); -//console.log(currentPattern.dataKeys); -} //find and process any listItem blocks within the pattern list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -573,14 +604,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); - -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); -//processEnd = Date.now() / 1000; -//console.log('PROCESS END: ' + processEnd); -//console.log('PROCESS TIME: ' + (processEnd - processBegin)); -} - } } @@ -643,11 +666,8 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m combine_listItems: function (patternlab) { buildListItems(patternlab); }, - winnow_unused_tags: function (template, pattern) { - return winnowUnusedTags(template, pattern); - }, - get_data_keys: function (data) { - return getDataKeys(data); + get_data_keys: function (data, uniqueKeys) { + return getDataKeys(data, uniqueKeys); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); @@ -655,6 +675,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m merge_data: function (existingData, newData) { return mergeData(existingData, newData); }, + winnow_unused_tags: function (template, pattern) { + return winnowUnusedTags(template, pattern); + }, process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, diff --git a/builder/patternlab.js b/builder/patternlab.js index 7b6464c92..d727318ef 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -69,11 +69,11 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); - patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data); - patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems)); -//console.log('patternlab.dataKeys'); -//console.log(patternlab.dataKeys); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); + patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); +var processBegin = Date.now() / 1000; +console.log('BUILD PATTERNS BEGIN: ' + processBegin); //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -110,7 +110,10 @@ var patternlab_engine = function (config) { //export patterns if necessary pattern_exporter.export_patterns(patternlab); -console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); +var processEnd = Date.now() / 1000; +console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); +console.log('BUILD PATTERNS END: ' + processEnd); +console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); } function addToPatternPaths(bucketName, pattern) { @@ -177,6 +180,9 @@ console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); fs.outputFileSync(path.resolve(paths.public.styleguide, 'html/styleguide.html'), styleguideHtml); + //unset styleguidePatterns + styleguidePatterns = []; + //build the viewall pages var prevSubdir = '', prevGroup = ''; @@ -246,6 +252,9 @@ console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); var viewAllHtml = pattern_assembler.renderPattern(viewAllTemplate, {partials: viewAllPatterns, patternPartial: patternPartial}); fs.outputFileSync(paths.public.patterns + pattern.flatPatternPath + '/index.html', viewAllHtml); } + + //unset viewAllPatterns + viewAllPatterns = []; } //build the patternlab website @@ -256,6 +265,11 @@ console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); for (i = 0; i < patternlab.patterns.length; i++) { var pattern = patternlab.patterns[i]; + + //unset all pattern.patternPartials here since they take up a lot of memory + //and we won't be needing them again + pattern.patternPartial = ''; + var bucketName = pattern.name.replace(/\\/g, '-').split('-')[1]; //check if the bucket already exists diff --git a/builder/pseudopattern_hunter.js b/builder/pseudopattern_hunter.js index 81e4e50db..4912eb68e 100644 --- a/builder/pseudopattern_hunter.js +++ b/builder/pseudopattern_hunter.js @@ -47,9 +47,10 @@ if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { } //find pattern lineage - //TODO: consider removing the lineage hunter. it only works at the - //iterative level, and isn't called upon any further. we need to keep the - //patternlab object as light as possible. + //TODO: consider repurposing lineage hunter. it currently only works at the + //iterative level, and isn't called upon any further. however, it could be + //repurposed to target and render only those files affected by a template edit. + //this could bring an enormous performance improvement on large projects. lineage_hunter.find_lineage(pseudoPatternsArray[i], patternlab); } } diff --git a/package.json b/package.json index a62664b52..85b4da916 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "diveSync": "^0.3.0", "fs-extra": "^0.26.2", "glob": "^7.0.0", + "hogan": "^1.0.2", "html-entities": "^1.2.0", - "matchdep": "^1.0.0", - "mustache": "^2.2.0" + "matchdep": "^1.0.0" }, "devDependencies": { "bs-html-injector": "^3.0.0", From d1ad42008887ee79728d63dec71155a1634a5288 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 12 Mar 2016 11:16:14 -0500 Subject: [PATCH 039/162] working listitems --- builder/list_item_hunter.js | 41 ++++++++++++++++++++--------- builder/pattern_assembler.js | 50 +++++++++++++++++------------------- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 1c7438020..4505bb875 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -19,7 +19,7 @@ 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 getListItemKeys() { + function getListItemIterationKeys() { return items; } @@ -27,6 +27,7 @@ var list_item_hunter = function () { //find any listitem blocks var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { +//console.log('patternBlock'); for (var i = 0; i < liMatches.length; i++) { if (patternlab.config.debug) { @@ -35,13 +36,11 @@ var list_item_hunter = function () { //find the boundaries of the block var loopNumberString = liMatches[i].split('.')[1].split('}')[0].trim(); - var end = liMatches[i].replace('#', '/'); - var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]) + liMatches[i].length, pattern.extendedTemplate.indexOf(end)).trim(); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log(pattern.extendedTemplate); -// console.log('patternBlock'); -// console.log(patternBlock); +//console.log(loopNumberString); } + var end = liMatches[i].replace('#', '/'); + var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]) + liMatches[i].length, pattern.extendedTemplate.indexOf(end)).trim(); //build arrays that repeat the block, however large we need to var repeatedBlockTemplate = []; @@ -53,18 +52,36 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache } //check for a local listitems.json file - var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); +// var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log(pattern.extendedTemplate); +// console.log(patternBlock); +//console.log(pattern.listitems); +} //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] for (j = 0; j < repeatedBlockTemplate.length; j++) { var thisBlockTemplate = repeatedBlockTemplate[j]; var thisBlockHTML = ""; - //combine listItem data with pattern data with global data - var itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" + var itemData = pattern.listitems['' + items.indexOf(loopNumberString)]; //this is a property like "2" var patternData = pattern.jsonFileData; - var allData = pattern_assembler.merge_data(patternData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup + var allData = pattern_assembler.merge_data(patternData, itemData !== undefined ? itemData[j] : {}); //itemData could be undefined if the listblock contains no partial, just markup +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log(pattern.abspath); +// console.log(thisBlockTemplate); +// console.log(loopNumberString); +/* +console.log('BEGIN pattern.listitems[\'5\']'); +console.log(pattern.listitems['5']); + +console.log('END pattern.listitems[\'5\']'); +*/ +console.log('BEGIN ' + i); +console.log(allData); +console.log('END ' + i); +} thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); //add the rendered HTML to our string @@ -84,8 +101,8 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache } return { - get_list_item_keys: function() { - return getListItemKeys(); + get_list_item_iteration_keys: function() { + return getListItemIterationKeys(); }, process_list_item_partials: function (pattern, patternlab) { processListItemPartials(pattern, patternlab); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 8c61ef7e9..b3d229459 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -131,43 +131,27 @@ var pattern_assembler = function () { * Recursively get all the property keys from the JSON data for a pattern. * * @param {object} data - * @param {array} uniqueKeys At top level of recursion, this should be an empty array. + * @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, file) { + function getDataKeys(data, uniqueKeys) { var keys; for (var key in data) { if (data.hasOwnProperty(key)) { if (!(typeof data === 'object' && data instanceof Array)) { if (uniqueKeys.indexOf(key) === -1) { -// keys.push(key); uniqueKeys.push(key); } else { continue; } } if (typeof data[key] === 'object') { -if (file) { -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -// console.log(uniqueKeys); -} -} - getDataKeys(data[key], uniqueKeys, file); -// uniqueKeys = uniqueKeys.concat(keys); + getDataKeys(data[key], uniqueKeys); } } } -/* -if (file) { -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { - console.log(key); - if (key === 'headline') { - console.log(uniqueKeys); - } -} -} -*/ + return uniqueKeys; } @@ -351,7 +335,7 @@ if (file.indexOf('04-pages/00-homepage.mustache') > -1) { } } catch (err) { - // do nothing + currentPattern.listitems = {}; } //add the raw template to memory @@ -479,7 +463,7 @@ var processEnd; //console.log('ALLDATA SIZE: ' + JSON.stringify(allData).length + 'B'); processBegin = Date.now() / 1000; //add allData keys to currentPattern.dataKeys - currentPattern.dataKeys = getDataKeys(allData, [], file); + currentPattern.dataKeys = getDataKeys(allData, []); if (file.indexOf('04-pages/00-homepage.mustache') > -1) { // console.log('currentPattern.dataKeys'); // console.log(currentPattern.dataKeys); @@ -488,14 +472,14 @@ processEnd = Date.now() / 1000; //console.log('ALLDATA PREPARE END: ' + processEnd); //console.log('ALLDATA PREPARE TIME: ' + (processEnd - processBegin)); - //add listItem keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_keys()); + //add listitem iteration keys to currentPattern.dataKeys + currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); processBegin = Date.now() / 1000; //console.log('LIST ITEM DATA SIZE: ' + JSON.stringify(patternlab.listitems).length + 'B'); var listItemKeys = getDataKeys(patternlab.listitems, []); if (file.indexOf('04-pages/00-homepage.mustache') > -1) { - console.log(listItemKeys); +// console.log(listItemKeys); /* console.log('currentPattern.dataKeys'); console.log(currentPattern.dataKeys); @@ -505,8 +489,20 @@ processEnd = Date.now() / 1000; //console.log('LIST ITEM DATA PREPARE END: ' + processEnd); //console.log('LIST ITEM DATA PREPARE TIME: ' + (processEnd - processBegin)); - //add listitems.json keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(patternlab.listitems, [])); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + // console.log(pattern.extendedTemplate); + // console.log('patternBlock'); + // console.log(patternBlock); +// console.log(patternlab.listitems); +} + //first merge global and local listitem data + mergeData(patternlab.listitems, currentPattern.listitems); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log(currentPattern.listitems); +} + + //add merged listitem keys to currentPattern.dataKeys + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); //copy winnowed template to extendedTemplate currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); From 31319acf8521d7d0afc80cd9b730dac415c89344 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sun, 13 Mar 2016 11:45:07 -0400 Subject: [PATCH 040/162] limiting object clones --- builder/list_item_hunter.js | 42 ++----- builder/pattern_assembler.js | 202 ++++++++++++++++++++------------ builder/patternlab.js | 1 + builder/pseudopattern_hunter.js | 4 +- 4 files changed, 145 insertions(+), 104 deletions(-) diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 4505bb875..038a63e41 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -24,10 +24,18 @@ var list_item_hunter = function () { } function processListItemPartials(pattern, patternlab) { + //find any listitem blocks var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { -//console.log('patternBlock'); + pattern_assembler.combine_listItems(pattern); +console.log('list_item_hunter'); +console.log(patternlab.listitems); + + //merge global and local listitem data and save it to currentPatterns.listitems + pattern.listitems = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); +console.log(pattern.listitems); + for (var i = 0; i < liMatches.length; i++) { if (patternlab.config.debug) { @@ -36,9 +44,6 @@ var list_item_hunter = function () { //find the boundaries of the block var loopNumberString = liMatches[i].split('.')[1].split('}')[0].trim(); -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log(loopNumberString); -} var end = liMatches[i].replace('#', '/'); var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]) + liMatches[i].length, pattern.extendedTemplate.indexOf(end)).trim(); @@ -51,14 +56,6 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache repeatedBlockTemplate.push(patternBlock); } - //check for a local listitems.json file -// var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log(pattern.extendedTemplate); -// console.log(patternBlock); -//console.log(pattern.listitems); -} - //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] for (j = 0; j < repeatedBlockTemplate.length; j++) { var thisBlockTemplate = repeatedBlockTemplate[j]; @@ -68,33 +65,18 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache var patternData = pattern.jsonFileData; var allData = pattern_assembler.merge_data(patternData, itemData !== undefined ? itemData[j] : {}); //itemData could be undefined if the listblock contains no partial, just markup -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log(pattern.abspath); -// console.log(thisBlockTemplate); -// console.log(loopNumberString); -/* -console.log('BEGIN pattern.listitems[\'5\']'); -console.log(pattern.listitems['5']); - -console.log('END pattern.listitems[\'5\']'); -*/ -console.log('BEGIN ' + i); -console.log(allData); -console.log('END ' + i); -} thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); //add the rendered HTML to our string repeatedBlockHtml = repeatedBlockHtml + thisBlockHTML; + + //unset the allData reference to free up memory + allData = null; } //replace the block with our generated HTML var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]), pattern.extendedTemplate.indexOf(end) + end.length); pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('repeatedBlockHtml'); -// console.log(repeatedBlockHtml); -} } } diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index b3d229459..ccf696ebc 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -190,6 +190,10 @@ var pattern_assembler = function () { function mergeData(obj1, obj2) { obj2 = obj2 || {}; //eslint-disable-line no-param-reassign +if (obj1.hasOwnProperty('1')) { + console.log('listitems mergeData'); + console.log(obj2); +} for (var p in obj1) { //eslint-disable-line guard-for-in try { @@ -225,8 +229,21 @@ var pattern_assembler = function () { pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); +var begin = Date.now() / 1000; +if (pattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log(pattern.abspath); +console.log('RENDER BEGIN: ' + begin); +console.log('pattern.extendedTemplate: ' + pattern.extendedTemplate.length + 'B'); +//console.log(pattern.extendedTemplate); +console.log('pattern.jsonFileData: ' + JSON.stringify(pattern.jsonFileData).length + 'B'); +} //render the extendedTemplate with all data pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); +var processEnd = Date.now() / 1000; +if (pattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('RENDER END: ' + processEnd); +console.log('RENDER TIME: ' + (processEnd - begin)); +} //add footer info before writing patternFooter = renderPattern(patternlab.footer, pattern); @@ -244,8 +261,11 @@ var pattern_assembler = function () { pattern.extendedTemplate = ''; pattern.tmpTemplate = ''; pattern.dataKeys = null; - pattern.jsonFileData = null; pattern.listitems = null; + + if (pattern.jsonFileData !== patternlab.data) { + pattern.jsonFileData = null; + } } /** @@ -274,6 +294,9 @@ var pattern_assembler = function () { //escape partial tags by switching them to ERB syntax. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + //removing empty lines for some reason reduced rendering time considerably. + templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); + //render to winnow used tags. var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); @@ -325,28 +348,20 @@ var pattern_assembler = function () { return; } - //look for a listitems.json file for this template - try { - var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".listitems.json"); - currentPattern.listitems = fs.readJSONSync(listJsonFileName); - buildListItems(currentPattern); - if (patternlab.config.debug) { - console.log('found pattern-specific listitems.json for ' + currentPattern.key); - } - } - catch (err) { - currentPattern.listitems = {}; - } - //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate to avoid undefined type errors - //trying to keep memory footprint small, so set it to empty string at first - currentPattern.extendedTemplate = ''; - - //do the same with tmpTemplate + //define tmpTemplate and listitems to avoid undefined type errors + //trying to keep memory footprint small, so set it empty at first currentPattern.tmpTemplate = ''; + currentPattern.listitems = null; + + //do the same with extendedTemplate + //skip this on underscore prefixed files, as they don't use extendedTemplate + //and since it will need to skip in processPatternRecursive + if (filename.charAt(0) !== '_') { + currentPattern.extendedTemplate = ''; + } //find pattern lineage //TODO: consider repurposing lineage hunter. it currently only works at the @@ -389,8 +404,12 @@ var pattern_assembler = function () { var processBegin = Date.now() / 1000; var processEnd; if (recursionLevel === 0) { -//console.log('PROCESS START: ' + processBegin); +processBegin = Date.now() / 1000; //console.log(file); +if (file.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log(file); +console.log('PROCESS START: ' + processBegin); +} //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -399,6 +418,7 @@ var processEnd; if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { return; } +console.log(file); //output .json pseudoPattern variants to the file system and return. //diveSync should process these variants after their originals, given that @@ -413,32 +433,45 @@ var processEnd; //look for a json file for this template var globalData = patternlab.data; var jsonFilename; - var jsonString; + var localJsonString; //allData will get overwritten by mergeData, so keep it scoped to this function. var allData = null; - //get json data local to this pattern try { + + //check if there is json data local to this pattern jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; - jsonString = fs.readFileSync(jsonFilename); - //since mergeData will overwrite its 2nd param, we need to keep allData - //and currentPattern.jsonFileData distinct. - allData = JSON.parse(jsonString); - currentPattern.jsonFileData = JSON.parse(jsonString); + //if so, load it into memory as a string (to create 2 non-referencing objects). + localJsonString = fs.readFileSync(jsonFilename); if (patternlab.config.debug) { console.log('found pattern-specific data.json for ' + currentPattern.key); } } - catch (error) { + catch (err) { + //do nothing } - //get data keys for globalData, currentPattern data, and pseudoPattern data. - //mergeData() overwrites the 2nd param, so we don't need assignment statements - mergeData(globalData, allData); - mergeData(globalData, currentPattern.jsonFileData); + //set currentPattern.jsonFileData + if (localJsonString) { + try { + allData = mergeData(patternlab.data, JSON.parse(localJsonString)); + currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); + } + catch (err) { + + //since we're parsing json, output errors for debugging + console.log(err); + } + + //if this pattern doesn't have a local .json file, save + //CPU steps by just creating a reference to the patternlab.data object. + } else { + currentPattern.jsonFileData = patternlab.data; + } + var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; var pseudoPatternFiles = glob.sync(needle, { cwd: paths.source.patterns, @@ -447,75 +480,99 @@ var processEnd; }); var pseudoPatternsArray = []; var pseudoPattern; +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER GLOB: ' + ((Date.now() / 1000) - processBegin)); +} if (pseudoPatternFiles.length) { + mergeData(patternlab.data, allData); + for (i = 0; i < pseudoPatternFiles.length; i++) { pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); if (pseudoPattern) { pseudoPatternsArray.push(pseudoPattern); //update the allData object. + //pseudoPattern.jsonFileData set in processPatternIterative. mergeData(pseudoPattern.jsonFileData, allData); } } + + + //get data keys for patternlab data, currentPattern data, and pseudoPattern data. + //mergeData() overwrites the 2nd param, so we don't need assignment statements +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('BEFORE FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); +} + //if this pattern doesn't have pseudoPatterns or a local .json file, save + //CPU steps by just creating a reference to the patternlab.data object. + } else if (!localJsonString) { + allData = patternlab.data; + } + + //look for a listitems.json file for this template + var localListItemsString; + try { + var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); + // localListItemsString = fs.readFileSync(listJsonFileName); + currentPattern.listitems = fs.readJSONsync(listJsonFileName); + + if (patternlab.config.debug) { + console.log('found pattern-specific listitems.json for ' + currentPattern.key); + } + } + catch (err) { + //do nothing } -//console.log('ALLDATA SIZE: ' + JSON.stringify(allData).length + 'B'); -processBegin = Date.now() / 1000; + +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); +} + +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER SECOND MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); +} +var alldataBegin = Date.now() / 1000; +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('DATA SIZE: ' + JSON.stringify(allData).length + 'B'); +console.log('DATA PREPARE BEGIN: ' + alldataBegin); +} + //add allData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(allData, []); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -// console.log('currentPattern.dataKeys'); -// console.log(currentPattern.dataKeys); +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER GETDATAKEYS: ' + ((Date.now() / 1000) - alldataBegin)); } -processEnd = Date.now() / 1000; -//console.log('ALLDATA PREPARE END: ' + processEnd); -//console.log('ALLDATA PREPARE TIME: ' + (processEnd - processBegin)); //add listitem iteration keys to currentPattern.dataKeys currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); - -processBegin = Date.now() / 1000; -//console.log('LIST ITEM DATA SIZE: ' + JSON.stringify(patternlab.listitems).length + 'B'); -var listItemKeys = getDataKeys(patternlab.listitems, []); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -// console.log(listItemKeys); - /* - console.log('currentPattern.dataKeys'); - console.log(currentPattern.dataKeys); - */ -} -processEnd = Date.now() / 1000; -//console.log('LIST ITEM DATA PREPARE END: ' + processEnd); -//console.log('LIST ITEM DATA PREPARE TIME: ' + (processEnd - processBegin)); - -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - // console.log(pattern.extendedTemplate); - // console.log('patternBlock'); - // console.log(patternBlock); -// console.log(patternlab.listitems); -} - //first merge global and local listitem data - mergeData(patternlab.listitems, currentPattern.listitems); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log(currentPattern.listitems); +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER FIRST DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); } //add merged listitem keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); + if (currentPattern.listitems) { + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); + if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { + console.log('AFTER SECOND DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); + } + } //copy winnowed template to extendedTemplate currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); +processEnd = Date.now() / 1000; +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('DATA PREPARE END: ' + processEnd); +console.log('DATA PREPARE TIME: ' + (processEnd - alldataBegin)); +} } //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); -//parameteredPartials = null; -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { -// console.log('RECURSION LEVEL: ' + recursionLevel); -// console.log('currentPattern.extendedTemplate: ' + currentPattern.extendedTemplate.length + 'B'); -//console.log('DATA SIZE: ' + JSON.stringify(currentPattern).length + 'B'); -// console.log(currentPattern.extendedTemplate); +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { + console.log('RECURSION LEVEL: ' + recursionLevel); + console.log('TIME: ' + (Date.now() / 1000)); } //if the template contains any pattern parameters, recurse through them @@ -600,6 +657,7 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); +processEnd = Date.now() / 1000; } } diff --git a/builder/patternlab.js b/builder/patternlab.js index d727318ef..8b5c39c08 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -433,6 +433,7 @@ console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); patternlab.viewAllPaths[bucketName][pattern.patternSubGroup] = pattern.flatPatternPath; } +console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); //the patternlab site requires a lot of partials to be rendered. //patternNav diff --git a/builder/pseudopattern_hunter.js b/builder/pseudopattern_hunter.js index 4912eb68e..7f1963d46 100644 --- a/builder/pseudopattern_hunter.js +++ b/builder/pseudopattern_hunter.js @@ -29,8 +29,8 @@ var pseudopattern_hunter = function () { console.log('found pseudoPattern variant of ' + currentPattern.key); } - //extend any existing data with variant data - var variantFileData = pattern_assembler.merge_data(currentPattern.jsonFileData, pseudoPatternsArray[i].jsonFileData); + //extend any existing data with variant data. + pattern_assembler.merge_data(currentPattern.jsonFileData, pseudoPatternsArray[i].jsonFileData); //see if this file has a state pattern_assembler.setPatternState(pseudoPatternsArray[i], patternlab); From 031c12da2c10fe35b965ff3b5120242bf0890c31 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 06:38:22 -0400 Subject: [PATCH 041/162] performant recursive builder --- builder/parameter_hunter.js | 27 +++- builder/pattern_assembler.js | 286 +++++++++++++++++++++++++++-------- 2 files changed, 243 insertions(+), 70 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 25f122c5e..4a6a1f02a 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -145,7 +145,7 @@ var parameter_hunter = function () { } //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 - partialPattern.tmpTemplate = partialPattern.template; + partialPattern.tmpTemplate = partialPattern.escapedTemplate; if (patternlab.config.debug) { console.log('found patternParameters for ' + partialName); @@ -181,18 +181,39 @@ var parameter_hunter = function () { //apply replacement based on allowable characters from lines 78 and 79 of mustache.js //of the Mustache for JS project. regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%$1%>'); + //since ERB is already used for escaping in partialPattern.escapedTemplate, + //using <%% %%> as escaping tags. + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); + regex = new RegExp('<%([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)%>', 'g'); + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); } } +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('partialPattern.abspath'); + console.log(partialPattern.abspath); + console.log('partialPattern.tmpTemplate BEFORE'); + console.log(partialPattern.tmpTemplate); +} + //then set the new delimiter at the beginning of the extended template - partialPattern.tmpTemplate = '{{=<% %>=}}' + partialPattern.tmpTemplate; + partialPattern.tmpTemplate = '{{=<%% %%>=}}' + partialPattern.tmpTemplate; //the reason for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant conditional tags persisted. partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); + +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('partialPattern.tmpTemplate AFTER'); + console.log(partialPattern.tmpTemplate); +} partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('parameter_hunter winnow AFTER'); + console.log(partialPattern.tmpTemplate); +} + //replace parameteredPartials with their rendered values. var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); regex = new RegExp(pMatch, 'g'); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index ccf696ebc..ac78640f3 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -188,6 +188,16 @@ var pattern_assembler = function () { return null; } + /** + * Merge the properties of two JSON objects, with the 2nd taking priority over + * the 1st when the same property key exists for both. + * + * @param {object} obj1 + * @param {object} obj2 If obj2 is null or undefined, be sure to make an + * assignment to the output of this function. In other cases, obj2 get + * mutated, and no assignment is necessary. + * @returns {object} obj2 The mutated obj2 object. + */ function mergeData(obj1, obj2) { obj2 = obj2 || {}; //eslint-disable-line no-param-reassign if (obj1.hasOwnProperty('1')) { @@ -274,36 +284,99 @@ console.log('RENDER TIME: ' + (processEnd - begin)); * tags persisted. Targeting non-partial tags that are not keyed in the JSON * data for this pattern. Those will be deleted after this runs. * - * @param {string} template The template to render. + * @param {string|null} template The template to winnow and render or null if + * setting up the pattern.escapedTemplate property. * @param {object} data The data to render with. * @param {object} dataKeys The data to render with. - * @returns {string} templateRendered + * @returns {string} templateWinnowed */ - function winnowUnusedTags(template, pattern) { + function winnowUnusedTags(template, pattern, patternlab) { + var dataKeys; var escapedKey; + var i; var regex; - var templateEscaped = template; + var templateEscaped; + var templateWinnowed; + +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('winnowUnusedTags'); +} + if (template === null) { + dataKeys = patternlab.dataKeys; + templateEscaped = pattern.template; + } else { + dataKeys = pattern.dataKeys; + templateEscaped = template; +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('dataKeys'); + console.log(dataKeys); +} + } + +var processBegin = Date.now() / 1000; +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log(pattern.abspath); + console.log('template'); + console.log(template); +} //escaped all tags that match keys in the JSON data. - for (var i = 0; i < pattern.dataKeys.length; i++) { - escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + //it can be 10% faster to process large dataKeys arrays in one read with a + //large regex than to read many timesi and process with small regexes. + escapedKey = '('; + if (dataKeys.length) { + for (i = 0; i < dataKeys.length; i++) { + escapedKey += dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&') + '|'; + } + escapedKey = escapedKey.slice(0, escapedKey.length - 1); + } + escapedKey += ')'; regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); - } //escape partial tags by switching them to ERB syntax. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); //removing empty lines for some reason reduced rendering time considerably. templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('templateEscaped'); + console.log(templateEscaped); +} + + if (template === null) { +// if (!template) { + pattern.escapedTemplate = templateEscaped; - //render to winnow used tags. - var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); + } else { + + //render to winnow unused tags. + templateWinnowed = renderPattern(templateEscaped, pattern.jsonFileData); + } //after that's done, switch only partial tags back to standard Mustache tags and return. - templateRendered = templateRendered.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + if (templateWinnowed) { + templateWinnowed = templateWinnowed.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + } - return templateRendered; +var processEnd = Date.now() / 1000; +/* +if (pattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { + console.log('WINNOW BEGIN: ' + processBegin); + console.log('WINNOW END: ' + processEnd); + console.log('WINNOW TIME: ' + (processEnd - processBegin)); +} +*/ +if (typeof templateWinnowed === 'undefined') { +// console.log('templateWinnowed UNDEFINED'); +// console.log(pattern.abspath); +} +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('templateWinnowed'); + console.log(templateWinnowed); +} + + return templateWinnowed; } function processPatternIterative(file, patternlab) { @@ -336,8 +409,7 @@ console.log('RENDER TIME: ' + (processEnd - begin)); currentPattern.patternName = currentPattern.patternName.replace('~', '-'); currentPattern.jsonFileData = fs.readJSONSync(file); addPattern(currentPattern, patternlab); - } - catch (err) { + } catch (err) { // do nothing } return; @@ -356,6 +428,12 @@ console.log('RENDER TIME: ' + (processEnd - begin)); currentPattern.tmpTemplate = ''; currentPattern.listitems = null; + //needs to be initialized as {} in order to run winnowUnusedTags + currentPattern.jsonFileData = {}; + + //this writes currentPattern.escapedTemplate which needs to be initialized + winnowUnusedTags(null, currentPattern, patternlab); + //do the same with extendedTemplate //skip this on underscore prefixed files, as they don't use extendedTemplate //and since it will need to skip in processPatternRecursive @@ -405,10 +483,9 @@ var processBegin = Date.now() / 1000; var processEnd; if (recursionLevel === 0) { processBegin = Date.now() / 1000; -//console.log(file); -if (file.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +if (file.indexOf('01-molecules/components/user-menu.mustache') > -1) { console.log(file); -console.log('PROCESS START: ' + processBegin); +console.log('PROCESS BEGIN: ' + processBegin); } //find current pattern in patternlab object using var file as a key @@ -418,7 +495,6 @@ console.log('PROCESS START: ' + processBegin); if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { return; } -console.log(file); //output .json pseudoPattern variants to the file system and return. //diveSync should process these variants after their originals, given that @@ -434,8 +510,8 @@ console.log(file); var globalData = patternlab.data; var jsonFilename; var localJsonString; - //allData will get overwritten by mergeData, so keep it scoped to this function. - var allData = null; + //localData will get overwritten by mergeData, so keep it scoped to this function. + var localData = null; try { @@ -448,8 +524,7 @@ console.log(file); if (patternlab.config.debug) { console.log('found pattern-specific data.json for ' + currentPattern.key); } - } - catch (err) { + } catch (err) { //do nothing } @@ -457,10 +532,9 @@ console.log(file); //set currentPattern.jsonFileData if (localJsonString) { try { - allData = mergeData(patternlab.data, JSON.parse(localJsonString)); + localData = JSON.parse(localJsonString); currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); - } - catch (err) { + } catch (err) { //since we're parsing json, output errors for debugging console.log(err); @@ -480,34 +554,28 @@ console.log(file); }); var pseudoPatternsArray = []; var pseudoPattern; -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER GLOB: ' + ((Date.now() / 1000) - processBegin)); -} if (pseudoPatternFiles.length) { - mergeData(patternlab.data, allData); +// mergeData(patternlab.data, localData); for (i = 0; i < pseudoPatternFiles.length; i++) { pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); if (pseudoPattern) { pseudoPatternsArray.push(pseudoPattern); - //update the allData object. + //update the localData object. //pseudoPattern.jsonFileData set in processPatternIterative. - mergeData(pseudoPattern.jsonFileData, allData); + mergeData(pseudoPattern.jsonFileData, localData); } } //get data keys for patternlab data, currentPattern data, and pseudoPattern data. //mergeData() overwrites the 2nd param, so we don't need assignment statements -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('BEFORE FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); -} //if this pattern doesn't have pseudoPatterns or a local .json file, save //CPU steps by just creating a reference to the patternlab.data object. - } else if (!localJsonString) { - allData = patternlab.data; +// } else if (!localJsonString) { +// localData = patternlab.data; } //look for a listitems.json file for this template @@ -520,47 +588,63 @@ console.log('BEFORE FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); if (patternlab.config.debug) { console.log('found pattern-specific listitems.json for ' + currentPattern.key); } - } - catch (err) { + } catch (err) { //do nothing } + currentPattern.extendedTemplate = currentPattern.template; +/* + for (i = 0; i < patternlab.dataKeys.length; i++) { + escapedKey = patternlab.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + templateEscaped = currentPattern.template.replace(regex, '<%$1%>'); + } -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); -} + //escape partial tags by switching them to ERB syntax. + templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER SECOND MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); -} -var alldataBegin = Date.now() / 1000; -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('DATA SIZE: ' + JSON.stringify(allData).length + 'B'); -console.log('DATA PREPARE BEGIN: ' + alldataBegin); + //removing empty lines for some reason reduces rendering time considerably. + templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); + currentPattern.escapedTemplate = templateEscaped; + */ +if (currentPattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { +// console.log('templateEscaped BEFORE'); +// console.log(templateEscaped); } - //add allData keys to currentPattern.dataKeys - currentPattern.dataKeys = getDataKeys(allData, []); + //add localData keys to currentPattern.dataKeys + currentPattern.dataKeys = getDataKeys(localData, []); if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { console.log('AFTER GETDATAKEYS: ' + ((Date.now() / 1000) - alldataBegin)); } //add listitem iteration keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); +// currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { console.log('AFTER FIRST DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); } //add merged listitem keys to currentPattern.dataKeys if (currentPattern.listitems) { +console.log('dataKeys'); currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { console.log('AFTER SECOND DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); } } - //copy winnowed template to extendedTemplate - currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); +if (currentPattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { +// console.log('templateEscaped BEFORE'); +// console.log(templateEscaped); +// console.log(currentPattern.escapedTemplate); +// console.log(currentPattern.dataKeys); +} + + + + + +// currentPattern.extendedTemplate = currentPattern.template; processEnd = Date.now() / 1000; if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { console.log('DATA PREPARE END: ' + processEnd); @@ -568,19 +652,32 @@ console.log('DATA PREPARE TIME: ' + (processEnd - alldataBegin)); } } + +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log('RECURSION LEVEL: ' + recursionLevel); +} + //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { - console.log('RECURSION LEVEL: ' + recursionLevel); - console.log('TIME: ' + (Date.now() / 1000)); -} +//parameteredPartials = null; +//if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('parameteredPartials'); + console.log(parameteredPartials); +} //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } + if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { +//console.log('RECURSION LEVEL: ' + recursionLevel); +//console.log('WINNOWING parameteredPartials'); + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); + } + //recursively render currentPattern.extendedTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); @@ -594,12 +691,24 @@ if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { //foundPatternPartials = null; var uniquePartials = []; +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('foundPatternPartials'); + console.log(foundPatternPartials); +} + //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } + //copy winnowed template to extendedTemplate + if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { +//console.log('RECURSION LEVEL: ' + recursionLevel); +//console.log('WINNOWING foundPatternPartials'); + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); + } + for (i = 0; i < foundPatternPartials.length; i++) { //limit iteration to one time per partial. eliminate duplicates. @@ -617,24 +726,40 @@ if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { if (!partialPattern) { throw 'Could not find pattern with key ' + partialKey; } else { - partialPattern.tmpTemplate = partialPattern.template; + if (!partialPattern.tmpTemplate) { + partialPattern.tmpTemplate = partialPattern.escapedTemplate; + + //if the current tag has styleModifier data, replace the styleModifier value in the partial + if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); + } + +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log(partialPattern.abspath); +console.log('partialPattern.escapedTemplate'); +console.log(partialPattern.escapedTemplate); +} - //if the current tag has styleModifier data, replace the styleModifier value in the partial - if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { - style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); - } + var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); + // var winnowedPartial = partialPattern.tmpTemplate; - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); + partialPattern.tmpTemplate = winnowedPartial; + } //replace each partial tag with the partial's template. //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, winnowedPartial); - partialPattern.tmpTemplate = ''; +// partialPattern.tmpTemplate = ''; + //since these partials do not process parameters, there's no need to + //unset the tmpTemplates until after the currentPattern completes + //processing. this will save some cpu cycles by reducing the number + //of times this tmpTemplate needs to be re-generated for this pattern } } +// currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up @@ -643,9 +768,10 @@ if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { //do only when popped back to the top level of recursion if (recursionLevel === 0) { - - //switched ERB escaped tags back to standard Mustache tags - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); + if (currentPattern.extendedTemplate !== currentPattern.template) { + //switch ERB escaped tags back to standard Mustache tags + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); + } //find and process any listItem blocks within the pattern list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -655,9 +781,35 @@ if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); } +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('BEFORE OUTPUT'); + console.log('currentPattern.extendedTemplate'); + console.log(currentPattern.extendedTemplate); +} //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); processEnd = Date.now() / 1000; +var processTime = processEnd - processBegin; +//if (file.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +if (processTime > 0.1) { +console.log(file); +console.log('PROCESS START: ' + processBegin); +console.log('PROCESS END: ' + processEnd); +console.log('PROCESS TIME: ' + processTime); + +} + +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log('PROCESS START: ' + processBegin); +console.log('PROCESS END: ' + processEnd); +console.log('PROCESS TIME: ' + processTime); + +} + + //unset all tmpTemplates + for (i = 0; i < patternlab.patterns.length; i++) { + patternlab.patterns[i].tmpTemplate = ''; + } } } From 2c4816095e0a2a7ba938bcd30fe0db8d47c96d92 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 06:57:57 -0400 Subject: [PATCH 042/162] working listitem hunter --- builder/.list_item_hunter.js.swp | Bin 0 -> 12288 bytes builder/.pattern_assembler.js.swp | Bin 0 -> 57344 bytes builder/.patternlab.js.swp | Bin 0 -> 36864 bytes builder/pattern_assembler.js | 25 +++++++++++++------------ builder/patternlab.js | 3 +++ 5 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 builder/.list_item_hunter.js.swp create mode 100644 builder/.pattern_assembler.js.swp create mode 100644 builder/.patternlab.js.swp diff --git a/builder/.list_item_hunter.js.swp b/builder/.list_item_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..fdc1b9a790bb1ce5f7d8c19c19d970c30b86c097 GIT binary patch literal 12288 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 literal 0 HcmV?d00001 diff --git a/builder/.patternlab.js.swp b/builder/.patternlab.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..3cb6b546c5514f45aeb353dd4f210383374d2c99 GIT binary patch literal 36864 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 UHT}#P$4n=)jI6PMtk2c>Kj|vCnE(I) literal 0 HcmV?d00001 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index ac78640f3..a0f7a0962 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -292,7 +292,7 @@ console.log('RENDER TIME: ' + (processEnd - begin)); */ function winnowUnusedTags(template, pattern, patternlab) { var dataKeys; - var escapedKey; + var escapedKeys; var i; var regex; var templateEscaped; @@ -314,25 +314,26 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) } var processBegin = Date.now() / 1000; -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log(pattern.abspath); - console.log('template'); - console.log(template); -} + //escaped all tags that match keys in the JSON data. //it can be 10% faster to process large dataKeys arrays in one read with a //large regex than to read many timesi and process with small regexes. - escapedKey = '('; if (dataKeys.length) { + escapedKeys = '('; for (i = 0; i < dataKeys.length; i++) { - escapedKey += dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&') + '|'; + escapedKeys += dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + if (i < dataKeys.length - 1) { + escapedKeys += '|'; + } } - escapedKey = escapedKey.slice(0, escapedKey.length - 1); - } - escapedKey += ')'; - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + escapedKeys += ')'; + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKeys + '\\s*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log(templateEscaped); +} + } //escape partial tags by switching them to ERB syntax. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); diff --git a/builder/patternlab.js b/builder/patternlab.js index 8b5c39c08..6adf57ce3 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -16,6 +16,7 @@ var patternlab_engine = function (config) { diveSync = require('diveSync'), of = require('./object_factory'), pa = require('./pattern_assembler'), + lih = require('./list_item_hunter'), mh = require('./media_hunter'), pe = require('./pattern_exporter'), he = require('html-entities').AllHtmlEntities, @@ -64,12 +65,14 @@ var patternlab_engine = function (config) { var pattern_assembler = new pa(), entity_encoder = new he(), + list_item_hunter = new lih(), pattern_exporter = new pe(), patterns_dir = paths.source.patterns; pattern_assembler.combine_listItems(patternlab); patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); + patternlab.dataKeys = patternlab.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); var processBegin = Date.now() / 1000; From f70558e7c90b8f40fc7fadb1aceb6fd7fc318d94 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 07:26:37 -0400 Subject: [PATCH 043/162] working local listitems.json --- builder/.list_item_hunter.js.swp | Bin 12288 -> 0 bytes builder/.pattern_assembler.js.swp | Bin 57344 -> 0 bytes builder/.patternlab.js.swp | Bin 36864 -> 0 bytes builder/list_item_hunter.js | 6 ++--- builder/pattern_assembler.js | 36 ++++++++++++++++++++++++------ 5 files changed, 32 insertions(+), 10 deletions(-) delete mode 100644 builder/.list_item_hunter.js.swp delete mode 100644 builder/.pattern_assembler.js.swp delete mode 100644 builder/.patternlab.js.swp diff --git a/builder/.list_item_hunter.js.swp b/builder/.list_item_hunter.js.swp deleted file mode 100644 index fdc1b9a790bb1ce5f7d8c19c19d970c30b86c097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 diff --git a/builder/.patternlab.js.swp b/builder/.patternlab.js.swp deleted file mode 100644 index 3cb6b546c5514f45aeb353dd4f210383374d2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 UHT}#P$4n=)jI6PMtk2c>Kj|vCnE(I) diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 038a63e41..6485a0e6e 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -29,12 +29,12 @@ var list_item_hunter = function () { var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { pattern_assembler.combine_listItems(pattern); -console.log('list_item_hunter'); -console.log(patternlab.listitems); +//console.log('list_item_hunter'); +//console.log(patternlab.listitems); //merge global and local listitem data and save it to currentPatterns.listitems pattern.listitems = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); -console.log(pattern.listitems); +//console.log(pattern.listitems); for (var i = 0; i < liMatches.length; i++) { diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index a0f7a0962..a8c54589a 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -411,7 +411,7 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) currentPattern.jsonFileData = fs.readJSONSync(file); addPattern(currentPattern, patternlab); } catch (err) { - // do nothing + console.log(err); } return; } @@ -580,17 +580,39 @@ console.log('PROCESS BEGIN: ' + processBegin); } //look for a listitems.json file for this template - var localListItemsString; +var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); +if (currentPattern.abspath.indexOf('00-comment-thread.mustache') > -1) { +console.log(listJsonFileName); +} + + var hasLocalListItems = false; + var listJsonFileName; try { var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); + hasLocalListItems = fs.statSync(listJsonFileName); + } catch (err) { + //do nothing + } +if (currentPattern.abspath.indexOf('00-atoms/00-global/00-colors') > -1) { + console.log(currentPattern.abspath); + console.log('hasLocalListItems'); + console.log(hasLocalListItems); +} + if (hasLocalListItems) { + try { // localListItemsString = fs.readFileSync(listJsonFileName); - currentPattern.listitems = fs.readJSONsync(listJsonFileName); +//console.log('currentPattern.listitems'); + currentPattern.listitems = fs.readJSONSync(listJsonFileName); + //console.log('guh'); - if (patternlab.config.debug) { - console.log('found pattern-specific listitems.json for ' + currentPattern.key); + if (patternlab.config.debug) { + console.log('found pattern-specific listitems.json for ' + currentPattern.key); + } + } catch (err) { + + //to troubleshoot malformed json + console.log(err); } - } catch (err) { - //do nothing } currentPattern.extendedTemplate = currentPattern.template; From ba595a4cec6e390930c7f052cf4165135ee61dc9 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 08:30:17 -0400 Subject: [PATCH 044/162] eslinting --- builder/.parameter_hunter.js.swp | Bin 0 -> 20480 bytes builder/list_item_hunter.js | 11 +- builder/parameter_hunter.js | 24 +-- builder/pattern_assembler.js | 284 ++++++------------------------- builder/patternlab.js | 14 +- builder/patternlab_grunt.js | 2 - builder/patternlab_gulp.js | 2 - builder/pseudopattern_hunter.js | 17 +- 8 files changed, 61 insertions(+), 293 deletions(-) create mode 100644 builder/.parameter_hunter.js.swp diff --git a/builder/.parameter_hunter.js.swp b/builder/.parameter_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..14824722798b1d978520abbbb3758f51cc752d3b GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 6485a0e6e..582077d21 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -12,11 +12,8 @@ var list_item_hunter = function () { - var extend = require('util')._extend, - pa = require('./pattern_assembler'), - smh = require('./style_modifier_hunter'), + var pa = require('./pattern_assembler'), 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 getListItemIterationKeys() { @@ -29,12 +26,9 @@ var list_item_hunter = function () { var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { pattern_assembler.combine_listItems(pattern); -//console.log('list_item_hunter'); -//console.log(patternlab.listitems); //merge global and local listitem data and save it to currentPatterns.listitems pattern.listitems = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); -//console.log(pattern.listitems); for (var i = 0; i < liMatches.length; i++) { @@ -58,7 +52,6 @@ var list_item_hunter = function () { //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] for (j = 0; j < repeatedBlockTemplate.length; j++) { - var thisBlockTemplate = repeatedBlockTemplate[j]; var thisBlockHTML = ""; var itemData = pattern.listitems['' + items.indexOf(loopNumberString)]; //this is a property like "2" @@ -83,7 +76,7 @@ var list_item_hunter = function () { } return { - get_list_item_iteration_keys: function() { + get_list_item_iteration_keys: function () { return getListItemIterationKeys(); }, process_list_item_partials: function (pattern, patternlab) { diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 4a6a1f02a..97901c03f 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -12,11 +12,8 @@ var parameter_hunter = function () { - var extend = require('util')._extend, - lih = require('./list_item_hunter'), - pa = require('./pattern_assembler'), + var pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), - list_item_hunter = new lih(), pattern_assembler = new pa(), style_modifier_hunter = new smh(); @@ -140,7 +137,7 @@ var parameter_hunter = function () { var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); if (!partialPattern) { - throw 'Could not find pattern with key ' + partialName; + console.log('Could not find pattern with key ' + partialName); continue; } @@ -181,6 +178,7 @@ var parameter_hunter = function () { //apply replacement based on allowable characters from lines 78 and 79 of mustache.js //of the Mustache for JS project. regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + //since ERB is already used for escaping in partialPattern.escapedTemplate, //using <%% %%> as escaping tags. partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); @@ -189,13 +187,6 @@ var parameter_hunter = function () { } } -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('partialPattern.abspath'); - console.log(partialPattern.abspath); - console.log('partialPattern.tmpTemplate BEFORE'); - console.log(partialPattern.tmpTemplate); -} - //then set the new delimiter at the beginning of the extended template partialPattern.tmpTemplate = '{{=<%% %%>=}}' + partialPattern.tmpTemplate; @@ -203,17 +194,8 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) //recursion paths that would remain if irrelevant conditional tags persisted. partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('partialPattern.tmpTemplate AFTER'); - console.log(partialPattern.tmpTemplate); -} partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('parameter_hunter winnow AFTER'); - console.log(partialPattern.tmpTemplate); -} - //replace parameteredPartials with their rendered values. var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); regex = new RegExp(pMatch, 'g'); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index a8c54589a..b6067de4e 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -135,8 +135,6 @@ var pattern_assembler = function () { * @returns {array} keys A flat, one-dimensional array. */ function getDataKeys(data, uniqueKeys) { - var keys; - for (var key in data) { if (data.hasOwnProperty(key)) { if (!(typeof data === 'object' && data instanceof Array)) { @@ -200,10 +198,6 @@ var pattern_assembler = function () { */ function mergeData(obj1, obj2) { obj2 = obj2 || {}; //eslint-disable-line no-param-reassign -if (obj1.hasOwnProperty('1')) { - console.log('listitems mergeData'); - console.log(obj2); -} for (var p in obj1) { //eslint-disable-line guard-for-in try { @@ -230,6 +224,40 @@ if (obj1.hasOwnProperty('1')) { return obj2; } + function parseDataLinksHelper(patternlab, obj, key) { + var linkRE, dataObjAsString, linkMatches, expandedLink; + + linkRE = /link\.[A-z0-9-_]+/g; + dataObjAsString = JSON.stringify(obj); + linkMatches = dataObjAsString.match(linkRE); + + if (linkMatches) { + for (var i = 0; i < linkMatches.length; i++) { + expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; + if (expandedLink) { + if (patternlab.config.debug) { + console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); + } + dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); + } + } + } + return JSON.parse(dataObjAsString); + } + + //look for pattern links included in data files. + //these will be in the form of link.* WITHOUT {{}}, which would still be there from direct pattern inclusion + function parseDataLinks(patternlab) { + //look for link.* such as link.pages-blog as a value + + patternlab.data = parseDataLinksHelper(patternlab, patternlab.data, 'data.json'); + + //loop through all patterns + for (var i = 0; i < patternlab.patterns.length; i++) { + patternlab.patterns[i].jsonFileData = parseDataLinksHelper(patternlab, patternlab.patterns[i].jsonFileData, patternlab.patterns[i].key); + } + } + function outputPatternToFS(pattern, patternlab) { var fs = require('fs-extra'); var he = require('html-entities').AllHtmlEntities; @@ -239,21 +267,8 @@ if (obj1.hasOwnProperty('1')) { pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); -var begin = Date.now() / 1000; -if (pattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log(pattern.abspath); -console.log('RENDER BEGIN: ' + begin); -console.log('pattern.extendedTemplate: ' + pattern.extendedTemplate.length + 'B'); -//console.log(pattern.extendedTemplate); -console.log('pattern.jsonFileData: ' + JSON.stringify(pattern.jsonFileData).length + 'B'); -} //render the extendedTemplate with all data pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); -var processEnd = Date.now() / 1000; -if (pattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('RENDER END: ' + processEnd); -console.log('RENDER TIME: ' + (processEnd - begin)); -} //add footer info before writing patternFooter = renderPattern(patternlab.footer, pattern); @@ -269,6 +284,7 @@ console.log('RENDER TIME: ' + (processEnd - begin)); //since we're done with these pattern properties, free them from memory pattern.extendedTemplate = ''; + pattern.template = ''; pattern.tmpTemplate = ''; pattern.dataKeys = null; pattern.listitems = null; @@ -298,24 +314,14 @@ console.log('RENDER TIME: ' + (processEnd - begin)); var templateEscaped; var templateWinnowed; -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('winnowUnusedTags'); -} if (template === null) { dataKeys = patternlab.dataKeys; templateEscaped = pattern.template; } else { dataKeys = pattern.dataKeys; templateEscaped = template; -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('dataKeys'); - console.log(dataKeys); -} } -var processBegin = Date.now() / 1000; - - //escaped all tags that match keys in the JSON data. //it can be 10% faster to process large dataKeys arrays in one read with a //large regex than to read many timesi and process with small regexes. @@ -330,9 +336,6 @@ var processBegin = Date.now() / 1000; escapedKeys += ')'; regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKeys + '\\s*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log(templateEscaped); -} } //escape partial tags by switching them to ERB syntax. @@ -340,13 +343,8 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache //removing empty lines for some reason reduced rendering time considerably. templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('templateEscaped'); - console.log(templateEscaped); -} if (template === null) { -// if (!template) { pattern.escapedTemplate = templateEscaped; } else { @@ -360,23 +358,6 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) templateWinnowed = templateWinnowed.replace(/<%>([^%]+)%>/g, '{{>$1}}'); } -var processEnd = Date.now() / 1000; -/* -if (pattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { - console.log('WINNOW BEGIN: ' + processBegin); - console.log('WINNOW END: ' + processEnd); - console.log('WINNOW TIME: ' + (processEnd - processBegin)); -} -*/ -if (typeof templateWinnowed === 'undefined') { -// console.log('templateWinnowed UNDEFINED'); -// console.log(pattern.abspath); -} -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('templateWinnowed'); - console.log(templateWinnowed); -} - return templateWinnowed; } @@ -460,9 +441,9 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. * @param {number} recursionLevel Top level === 0. Increments by 1 after that. - * @param {object} currentPattern Only submitted on recursionLevel > 0. + * @param {object} currentPatternAsParam Only submitted on recursionLevel > 0. */ - function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { + function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam) { var fs = require('fs-extra'), glob = require('glob'), path = require('path'); @@ -477,17 +458,11 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); + var currentPattern; var i; // for the for loops var paths = patternlab.config.paths; -var processBegin = Date.now() / 1000; -var processEnd; if (recursionLevel === 0) { -processBegin = Date.now() / 1000; -if (file.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log(file); -console.log('PROCESS BEGIN: ' + processBegin); -} //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -508,9 +483,9 @@ console.log('PROCESS BEGIN: ' + processBegin); //continue with regular mustache templates //look for a json file for this template - var globalData = patternlab.data; var jsonFilename; var localJsonString; + //localData will get overwritten by mergeData, so keep it scoped to this function. var localData = null; @@ -557,7 +532,6 @@ console.log('PROCESS BEGIN: ' + processBegin); var pseudoPattern; if (pseudoPatternFiles.length) { -// mergeData(patternlab.data, localData); for (i = 0; i < pseudoPatternFiles.length; i++) { pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); @@ -569,42 +543,20 @@ console.log('PROCESS BEGIN: ' + processBegin); mergeData(pseudoPattern.jsonFileData, localData); } } - - - //get data keys for patternlab data, currentPattern data, and pseudoPattern data. - //mergeData() overwrites the 2nd param, so we don't need assignment statements - //if this pattern doesn't have pseudoPatterns or a local .json file, save - //CPU steps by just creating a reference to the patternlab.data object. -// } else if (!localJsonString) { -// localData = patternlab.data; } - //look for a listitems.json file for this template -var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); -if (currentPattern.abspath.indexOf('00-comment-thread.mustache') > -1) { -console.log(listJsonFileName); -} - var hasLocalListItems = false; var listJsonFileName; try { var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); hasLocalListItems = fs.statSync(listJsonFileName); } catch (err) { + //do nothing } -if (currentPattern.abspath.indexOf('00-atoms/00-global/00-colors') > -1) { - console.log(currentPattern.abspath); - console.log('hasLocalListItems'); - console.log(hasLocalListItems); -} if (hasLocalListItems) { try { - // localListItemsString = fs.readFileSync(listJsonFileName); -//console.log('currentPattern.listitems'); currentPattern.listitems = fs.readJSONSync(listJsonFileName); - //console.log('guh'); - if (patternlab.config.debug) { console.log('found pattern-specific listitems.json for ' + currentPattern.key); } @@ -615,80 +567,24 @@ if (currentPattern.abspath.indexOf('00-atoms/00-global/00-colors') > -1) { } } - currentPattern.extendedTemplate = currentPattern.template; -/* - for (i = 0; i < patternlab.dataKeys.length; i++) { - escapedKey = patternlab.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - templateEscaped = currentPattern.template.replace(regex, '<%$1%>'); - } - - //escape partial tags by switching them to ERB syntax. - templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - - //removing empty lines for some reason reduces rendering time considerably. - templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); - currentPattern.escapedTemplate = templateEscaped; - */ -if (currentPattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { -// console.log('templateEscaped BEFORE'); -// console.log(templateEscaped); -} + currentPattern.extendedTemplate = currentPattern.template; //add localData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(localData, []); -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER GETDATAKEYS: ' + ((Date.now() / 1000) - alldataBegin)); -} - - //add listitem iteration keys to currentPattern.dataKeys -// currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER FIRST DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); -} //add merged listitem keys to currentPattern.dataKeys if (currentPattern.listitems) { -console.log('dataKeys'); currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); - if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { - console.log('AFTER SECOND DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); - } } -if (currentPattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { -// console.log('templateEscaped BEFORE'); -// console.log(templateEscaped); -// console.log(currentPattern.escapedTemplate); -// console.log(currentPattern.dataKeys); -} - - - - - -// currentPattern.extendedTemplate = currentPattern.template; -processEnd = Date.now() / 1000; -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('DATA PREPARE END: ' + processEnd); -console.log('DATA PREPARE TIME: ' + (processEnd - alldataBegin)); -} + //set currentPattern for recursionLevel > 0 + } else { + currentPattern = currentPatternAsParam; } - -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log('RECURSION LEVEL: ' + recursionLevel); -} - //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); -//parameteredPartials = null; -//if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('parameteredPartials'); - console.log(parameteredPartials); -} //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { if (patternlab.config.debug) { @@ -696,8 +592,6 @@ if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') } if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { -//console.log('RECURSION LEVEL: ' + recursionLevel); -//console.log('WINNOWING parameteredPartials'); currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); } @@ -711,14 +605,8 @@ if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.extendedTemplate); -//foundPatternPartials = null; var uniquePartials = []; -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('foundPatternPartials'); - console.log(foundPatternPartials); -} - //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { if (patternlab.config.debug) { @@ -727,8 +615,6 @@ if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') //copy winnowed template to extendedTemplate if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { -//console.log('RECURSION LEVEL: ' + recursionLevel); -//console.log('WINNOWING foundPatternPartials'); currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); } @@ -757,14 +643,7 @@ if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log(partialPattern.abspath); -console.log('partialPattern.escapedTemplate'); -console.log(partialPattern.escapedTemplate); -} - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); - // var winnowedPartial = partialPattern.tmpTemplate; partialPattern.tmpTemplate = winnowedPartial; } @@ -774,15 +653,8 @@ console.log(partialPattern.escapedTemplate); var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - -// partialPattern.tmpTemplate = ''; - //since these partials do not process parameters, there's no need to - //unset the tmpTemplates until after the currentPattern completes - //processing. this will save some cpu cycles by reducing the number - //of times this tmpTemplate needs to be re-generated for this pattern } } -// currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up @@ -804,30 +676,8 @@ console.log(partialPattern.escapedTemplate); pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); } -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('BEFORE OUTPUT'); - console.log('currentPattern.extendedTemplate'); - console.log(currentPattern.extendedTemplate); -} //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); -processEnd = Date.now() / 1000; -var processTime = processEnd - processBegin; -//if (file.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -if (processTime > 0.1) { -console.log(file); -console.log('PROCESS START: ' + processBegin); -console.log('PROCESS END: ' + processEnd); -console.log('PROCESS TIME: ' + processTime); - -} - -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log('PROCESS START: ' + processBegin); -console.log('PROCESS END: ' + processEnd); -console.log('PROCESS TIME: ' + processTime); - -} //unset all tmpTemplates for (i = 0; i < patternlab.patterns.length; i++) { @@ -836,40 +686,6 @@ console.log('PROCESS TIME: ' + processTime); } } - function parseDataLinksHelper(patternlab, obj, key) { - var linkRE, dataObjAsString, linkMatches, expandedLink; - - linkRE = /link\.[A-z0-9-_]+/g; - dataObjAsString = JSON.stringify(obj); - linkMatches = dataObjAsString.match(linkRE); - - if (linkMatches) { - for (var i = 0; i < linkMatches.length; i++) { - expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; - if (expandedLink) { - if (patternlab.config.debug) { - console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); - } - dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); - } - } - } - return JSON.parse(dataObjAsString); - } - - //look for pattern links included in data files. - //these will be in the form of link.* WITHOUT {{}}, which would still be there from direct pattern inclusion - function parseDataLinks(patternlab) { - //look for link.* such as link.pages-blog as a value - - patternlab.data = parseDataLinksHelper(patternlab, patternlab.data, 'data.json'); - - //loop through all patterns - for (var i = 0; i < patternlab.patterns.length; i++) { - patternlab.patterns[i].jsonFileData = parseDataLinksHelper(patternlab, patternlab.patterns[i].jsonFileData, patternlab.patterns[i].key); - } - } - return { find_pattern_partials: function (pattern) { return findPartials(pattern); @@ -904,6 +720,12 @@ console.log('PROCESS TIME: ' + processTime); merge_data: function (existingData, newData) { return mergeData(existingData, newData); }, + parse_data_links_helper: function (patternlab, obj, key) { + return parseDataLinksHelper(patternlab, obj, key); + }, + parse_data_links: function (patternlab) { + parseDataLinks(patternlab); + }, winnow_unused_tags: function (template, pattern) { return winnowUnusedTags(template, pattern); }, @@ -912,12 +734,6 @@ console.log('PROCESS TIME: ' + processTime); }, process_pattern_recursive: function (file, patternlab, recursionLevel) { processPatternRecursive(file, patternlab, recursionLevel); - }, - parse_data_links_helper: function (patternlab, obj, key) { - return parseDataLinksHelper(patternlab, obj, key); - }, - parse_data_links: function (patternlab) { - parseDataLinks(patternlab); } }; diff --git a/builder/patternlab.js b/builder/patternlab.js index 6adf57ce3..e2fc4a57c 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -19,7 +19,6 @@ var patternlab_engine = function (config) { lih = require('./list_item_hunter'), mh = require('./media_hunter'), pe = require('./pattern_exporter'), - he = require('html-entities').AllHtmlEntities, patternlab = {}; patternlab.package = fs.readJSONSync('./package.json'); @@ -64,7 +63,6 @@ var patternlab_engine = function (config) { patternlab.data.link = {}; var pattern_assembler = new pa(), - entity_encoder = new he(), list_item_hunter = new lih(), pattern_exporter = new pe(), patterns_dir = paths.source.patterns; @@ -75,8 +73,6 @@ var patternlab_engine = function (config) { patternlab.dataKeys = patternlab.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); -var processBegin = Date.now() / 1000; -console.log('BUILD PATTERNS BEGIN: ' + processBegin); //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -113,10 +109,6 @@ console.log('BUILD PATTERNS BEGIN: ' + processBegin); //export patterns if necessary pattern_exporter.export_patterns(patternlab); -var processEnd = Date.now() / 1000; -console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); -console.log('BUILD PATTERNS END: ' + processEnd); -console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); } function addToPatternPaths(bucketName, pattern) { @@ -191,6 +183,10 @@ console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); prevGroup = ''; for (i = 0; i < patternlab.patterns.length; i++) { + + //unset escapedTemplates + patternlab.patterns[i].escapedTemplate = ''; + // skip underscore-prefixed files if (isPatternExcluded(patternlab.patterns[i])) { if (patternlab.config.debug) { @@ -436,7 +432,6 @@ console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); patternlab.viewAllPaths[bucketName][pattern.patternSubGroup] = pattern.flatPatternPath; } -console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); //the patternlab site requires a lot of partials to be rendered. //patternNav @@ -483,7 +478,6 @@ console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); printDebug(); } }; - }; module.exports = patternlab_engine; diff --git a/builder/patternlab_grunt.js b/builder/patternlab_grunt.js index 1c78ac126..69085c291 100644 --- a/builder/patternlab_grunt.js +++ b/builder/patternlab_grunt.js @@ -12,7 +12,6 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (grunt) { grunt.registerTask('patternlab', 'create design systems with atomic design', function (arg) { -console.log(Date.now() / 1000); var patternlab = patternlab_engine(); if (arguments.length === 0) { @@ -34,7 +33,6 @@ console.log(Date.now() / 1000); if (arg && (arg !== "v" && arg !== "only_patterns" && arg !== "help")) { patternlab.help(); } -console.log(Date.now() / 1000); }); }; diff --git a/builder/patternlab_gulp.js b/builder/patternlab_gulp.js index c6364ad09..82cf2a4ce 100644 --- a/builder/patternlab_gulp.js +++ b/builder/patternlab_gulp.js @@ -13,10 +13,8 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (gulp) { gulp.task('patternlab', ['clean'], function (cb) { -console.log(Date.now() / 1000); var patternlab = patternlab_engine(); patternlab.build(false); -console.log(Date.now() / 1000); cb(); }); diff --git a/builder/pseudopattern_hunter.js b/builder/pseudopattern_hunter.js index 7f1963d46..61e9ae65e 100644 --- a/builder/pseudopattern_hunter.js +++ b/builder/pseudopattern_hunter.js @@ -13,16 +13,11 @@ var pseudopattern_hunter = function () { function findpseudopatterns(currentPattern, patternlab, pseudoPatternsArray) { - var glob = require('glob'), - fs = require('fs-extra'), - pa = require('./pattern_assembler'), - lh = require('./lineage_hunter'), - of = require('./object_factory'), - path = require('path'); + var pa = require('./pattern_assembler'), + lh = require('./lineage_hunter'); var pattern_assembler = new pa(); var lineage_hunter = new lh(); - var paths = patternlab.config.paths; for (var i = 0; i < pseudoPatternsArray.length; i++) { if (patternlab.config.debug) { @@ -37,14 +32,6 @@ var pseudopattern_hunter = function () { //use the same template as the non-variant pseudoPatternsArray[i].extendedTemplate = currentPattern.extendedTemplate; -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - /* - console.log('pseudoPatternsArray[i].extendedTemplate'); - console.log(pseudoPatternsArray[i].extendedTemplate); - console.log('pseudoPatternsArray[i].jsonFileData'); - console.log(pseudoPatternsArray[i].jsonFileData); - */ -} //find pattern lineage //TODO: consider repurposing lineage hunter. it currently only works at the From d0034d66dcf70a16e04eee29beff95d5a425bd04 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 10:09:13 -0400 Subject: [PATCH 045/162] updating unit tests --- builder/.parameter_hunter.js.swp | Bin 20480 -> 0 bytes builder/pattern_assembler.js | 20 ++++++--- builder/patternlab.js | 2 +- test/list_item_hunter_tests.js | 1 + test/parameter_hunter_tests.js | 9 ++-- test/pattern_assembler_tests.js | 66 ++++++++++++++++------------ test/pseudopattern_hunter_tests.js | 23 +++++----- test/style_modifier_hunter_tests.js | 20 ++++----- 8 files changed, 81 insertions(+), 60 deletions(-) delete mode 100644 builder/.parameter_hunter.js.swp diff --git a/builder/.parameter_hunter.js.swp b/builder/.parameter_hunter.js.swp deleted file mode 100644 index 14824722798b1d978520abbbb3758f51cc752d3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index b6067de4e..240ae918c 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -440,10 +440,11 @@ var pattern_assembler = function () { * * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. - * @param {number} recursionLevel Top level === 0. Increments by 1 after that. + * @param {number|undefined} recursionLevel Top level === 0. Increments by 1 after that. * @param {object} currentPatternAsParam Only submitted on recursionLevel > 0. + * @param {boolean} test When unit testing, pass in true to not output to file system. */ - function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam) { + function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { var fs = require('fs-extra'), glob = require('glob'), path = require('path'); @@ -462,7 +463,8 @@ var pattern_assembler = function () { var i; // for the for loops var paths = patternlab.config.paths; - if (recursionLevel === 0) { + if (!recursionLevel) { + recursionLevel = 0; //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -477,7 +479,9 @@ var pattern_assembler = function () { //tildes come after periods in ASCII order. as such, their extendedTemplates //should be filled out and renderable. if (path.extname(file) === '.json') { - outputPatternToFS(currentPattern, patternlab); + if (!test) { + outputPatternToFS(currentPattern, patternlab); + } return; } @@ -677,7 +681,9 @@ var pattern_assembler = function () { } //output rendered pattern to the file system - outputPatternToFS(currentPattern, patternlab); + if (!test) { + outputPatternToFS(currentPattern, patternlab); + } //unset all tmpTemplates for (i = 0; i < patternlab.patterns.length; i++) { @@ -732,8 +738,8 @@ var pattern_assembler = function () { process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab, recursionLevel) { - processPatternRecursive(file, patternlab, recursionLevel); + process_pattern_recursive: function (file, patternlab, recursionLevel, currentPatternAsParam, test) { + processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test); } }; diff --git a/builder/patternlab.js b/builder/patternlab.js index e2fc4a57c..0f9e99be4 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -103,7 +103,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); } ); diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index b2895b24d..fb19a456d 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -419,6 +419,7 @@ pl.config = {}; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 3bffe438b..822679a1d 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -269,6 +269,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -284,10 +285,10 @@ pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); //act - pattern_assembler.process_pattern_recursive(atomFile, pl, atomFile); - pattern_assembler.process_pattern_recursive(styleFile, pl, styleFile); - pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, innerParameteredFile); - pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, outerParameteredFile); + pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(styleFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, 0, null, true); var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); //assert. diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 1a829c4aa..211550d47 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -2,8 +2,8 @@ "use strict"; var pa = require('../builder/pattern_assembler'); - var object_factory = require('../builder/object_factory'); - var path = require('path'); + var object_factory = require('../builder/object_factory'); + var path = require('path'); exports['pattern_assembler'] = { 'find_pattern_partials finds partials' : function(test){ @@ -251,7 +251,7 @@ return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0, null, true); } ); @@ -292,6 +292,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -304,7 +305,7 @@ pattern_assembler.process_pattern_iterative(groupFile, pl); //act - pattern_assembler.process_pattern_recursive(groupFile, pl, groupFile); + pattern_assembler.process_pattern_recursive(groupFile, pl, 0, null, true); var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert @@ -328,6 +329,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -339,7 +341,7 @@ pattern_assembler.process_pattern_iterative(groupFile, pl); //act - pattern_assembler.process_pattern_recursive(groupFile, pl, groupFile); + pattern_assembler.process_pattern_recursive(groupFile, pl, 0, null, true); var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert @@ -363,6 +365,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -374,7 +377,7 @@ pattern_assembler.process_pattern_iterative(mixedFile, pl); //act - pattern_assembler.process_pattern_recursive(mixedFile, pl, mixedFile); + pattern_assembler.process_pattern_recursive(mixedFile, pl, 0, null, true); var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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) @@ -382,7 +385,7 @@ 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){ + '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(); @@ -398,6 +401,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -409,7 +413,7 @@ pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - pattern_assembler.process_pattern_recursive(bookendFile, pl, bookendFile); + pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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) @@ -433,6 +437,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -444,7 +449,7 @@ pattern_assembler.process_pattern_iterative(mixedFile, pl); //act - pattern_assembler.process_pattern_recursive(mixedFile, pl, mixedFile); + pattern_assembler.process_pattern_recursive(mixedFile, pl, 0, null, true); var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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) @@ -468,6 +473,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -479,7 +485,7 @@ pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - pattern_assembler.process_pattern_recursive(bookendFile, pl, bookendFile); + pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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) @@ -592,6 +598,7 @@ patternlab.config = fs.readJSONSync('./config.json'); patternlab.config.paths.source.patterns = patterns_dir; patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []) patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/header.html'), 'utf8'); patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/footer.html'), 'utf8'); @@ -599,24 +606,29 @@ patternlab.data.link = {}; patternlab.partials = {}; - diveSync(patterns_dir, - { - filter: function(path, dir){ - if(dir){ - var remainingPath = path.replace(patterns_dir, ''); - var isValidPath = remainingPath.indexOf('/_') === -1; - return isValidPath; - } - return true; + diveSync( + patterns_dir, + function (err, file) { + //log any errors + if (err) { + console.log(err); + return; } - }, - function(err, file){ + pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); + } + ); + + //diveSync again to recursively include partials, filling out the + //extendedTemplate property of the patternlab.patterns elements + diveSync( + patterns_dir, + function (err, file) { //log any errors - if(err){ + if (err) { console.log(err); return; } - pattern_assembler.process_pattern_iterative(file, patternlab); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0, null, true); } ); @@ -712,8 +724,8 @@ //assert test.equals(patternlab.patterns.length, 1); - test.equals(patternlab.partials['test-bar'] != undefined, true); - test.equals(patternlab.partials['test-bar'], 'barExtended'); + test.equals(patternlab.patterns[0] != undefined, true); + test.equals(patternlab.patterns[0].extendedTemplate, 'barExtended'); test.done(); }, 'addPattern - adds pattern template to patternlab partial object if extendedtemplate does not exist yet' : function(test){ @@ -733,8 +745,8 @@ //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[0] != undefined, true); + test.equals(patternlab.patterns[0].template, 'bar'); test.done(); } }; diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 9a0269482..85089d1d6 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -1,12 +1,13 @@ (function () { "use strict"; + var path = require('path'); var pha = require('../builder/pseudopattern_hunter'); var pa = require('../builder/pattern_assembler'); var object_factory = require('../builder/object_factory'); exports['pseudopattern_hunter'] = { - 'pseudpattern found and added as a pattern' : function(test){ + 'pseudopattern found and added as a pattern' : function(test){ //arrange var fs = require('fs-extra'); var pattern_assembler = new pa(); @@ -23,27 +24,27 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; pl.config.patternStates = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '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 atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var atomVariantFile = path.resolve('test/files/_patterns/00-test/03-styled-atom~alt.json'); - pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(atomVariantFile, pl); //act - var patternCountBefore = pl.patterns.length; - pseudopattern_hunter.find_pseudopatterns(atomPattern, pl); + pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); + var atomPattern = pattern_assembler.get_pattern_by_key(atomFile, pl); + var atomVariantPattern = pattern_assembler.get_pattern_by_key(atomVariantFile, pl); //assert - test.equals(patternCountBefore + 1, pl.patterns.length); - test.equals(pl.patterns[1].key, 'test-styled-atom-alt'); + test.equals(pl.patterns[1].key, 'test-styled-atom~alt'); test.equals(pl.patterns[1].extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), ' {{message}} '); - test.equals(JSON.stringify(pl.patterns[1].jsonFileData), JSON.stringify({"message": "alternateMessage"})); + test.equals(JSON.stringify(pl.patterns[1].jsonFileData), JSON.stringify({"message":"alternateMessage","link":{"test-styled-atom":"/patterns/00-test-03-styled-atom/00-test-03-styled-atom.html","test-styled-atom-alt":"/patterns/00-test-03-styled-atom~alt/00-test-03-styled-atom~alt.html"}})); test.done(); } diff --git a/test/style_modifier_hunter_tests.js b/test/style_modifier_hunter_tests.js index 9a13a75e4..24bf5e567 100644 --- a/test/style_modifier_hunter_tests.js +++ b/test/style_modifier_hunter_tests.js @@ -4,7 +4,7 @@ var smh = require('../builder/style_modifier_hunter'); exports['consume_style_modifier'] = { - 'uses the partial stylemodifer to modify the patterns extendedTemplate' : function(test){ + 'uses the partial stylemodifer to modify the patterns tmpTemplate' : function(test){ //arrange var pl = {}; pl.partials = {}; @@ -12,7 +12,7 @@ pl.config.debug = false; var pattern = { - extendedTemplate: '
' + tmpTemplate: '
' }; var style_modifier_hunter = new smh(); @@ -21,7 +21,7 @@ style_modifier_hunter.consume_style_modifier(pattern, '{{> partial:bar}}', pl); //assert - test.equals(pattern.extendedTemplate, '
'); + test.equals(pattern.tmpTemplate, '
'); test.done(); }, 'replaces style modifiers with spaces in the syntax' : function(test){ @@ -32,7 +32,7 @@ pl.config.debug = false; var pattern = { - extendedTemplate: '
' + tmpTemplate: '
' }; var style_modifier_hunter = new smh(); @@ -41,7 +41,7 @@ style_modifier_hunter.consume_style_modifier(pattern, '{{> partial:bar}}', pl); //assert - test.equals(pattern.extendedTemplate, '
'); + test.equals(pattern.tmpTemplate, '
'); test.done(); }, 'replaces multiple style modifiers' : function(test){ @@ -52,7 +52,7 @@ pl.config.debug = false; var pattern = { - extendedTemplate: '
' + tmpTemplate: '
' }; var style_modifier_hunter = new smh(); @@ -61,10 +61,10 @@ style_modifier_hunter.consume_style_modifier(pattern, '{{> partial:bar|baz|dum}}', pl); //assert - test.equals(pattern.extendedTemplate, '
'); + test.equals(pattern.tmpTemplate, '
'); test.done(); }, - 'does not alter pattern extendedTemplate if styleModifier not found in partial' : function(test){ + 'does not alter pattern tmpTemplate if styleModifier not found in partial' : function(test){ //arrange var pl = {}; pl.partials = {}; @@ -72,7 +72,7 @@ pl.config.debug = false; var pattern = { - extendedTemplate: '
' + tmpTemplate: '
' }; var style_modifier_hunter = new smh(); @@ -81,7 +81,7 @@ style_modifier_hunter.consume_style_modifier(pattern, '{{> partial}}', pl); //assert - test.equals(pattern.extendedTemplate, '
'); + test.equals(pattern.tmpTemplate, '
'); test.done(); } }; From 082117ac70aa2a20b60f3f5516b955bc8552e8e0 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 00:20:43 -0400 Subject: [PATCH 046/162] updating unit tests --- builder/parameter_hunter.js | 2 +- builder/pattern_assembler.js | 19 ++--- test/list_item_hunter_tests.js | 115 +++++++++++++--------------- test/parameter_hunter_tests.js | 89 +++++++++++++-------- test/pattern_assembler_tests.js | 72 ++++++++--------- test/pseudopattern_hunter_tests.js | 3 +- test/style_modifier_hunter_tests.js | 4 - 7 files changed, 155 insertions(+), 149 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 97901c03f..118e4300a 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -201,7 +201,7 @@ var parameter_hunter = function () { regex = new RegExp(pMatch, 'g'); pattern.extendedTemplate = pattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - // Free tmpTemplate from memory. + //free tmpTemplate from memory. partialPattern.tmpTemplate = ''; } } diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 240ae918c..5602449a3 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -639,24 +639,25 @@ var pattern_assembler = function () { if (!partialPattern) { throw 'Could not find pattern with key ' + partialKey; } else { - if (!partialPattern.tmpTemplate) { - partialPattern.tmpTemplate = partialPattern.escapedTemplate; + partialPattern.tmpTemplate = partialPattern.escapedTemplate; - //if the current tag has styleModifier data, replace the styleModifier value in the partial - if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { - style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); - } + //if the current tag has styleModifier data, replace the styleModifier value in the partial + if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); + } - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); + var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); - partialPattern.tmpTemplate = winnowedPartial; - } + partialPattern.tmpTemplate = winnowedPartial; //replace each partial tag with the partial's template. //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); + + //free tmpTemplate from memory. + partialPattern.tmpTemplate = ''; } } diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index fb19a456d..c69a88bef 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -3,6 +3,7 @@ var lih = require('../builder/list_item_hunter'); var pa = require('../builder/pattern_assembler'); + var path = require('path'); var object_factory = require('../builder/object_factory'); exports['list_item_hunter'] = { @@ -223,20 +224,18 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = { - "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", - "extendedTemplate" : "{{#listItems.two}}{{> test-simple }}{{/listItems.two}}", - "key": "test-patternName", - "jsonFileData" : {}, - "listitems" : { - "2": [ - { - "title": "One" - }, - { - "title": "Two" - }, - ] + "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", + "extendedTemplate" : "{{#listItems.two}}{{ title }}{{/listItems.two}}", + "key": "test-patternName", + "jsonFileData" : {}, + "listitems" : { + "1": { + "title": "One" + }, + "2": { + "title": "Two" } + } }; var patternlab = { @@ -277,7 +276,7 @@ list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "OneTwo" ); + test.ok(currentPattern.extendedTemplate.match(/OneTwo|TwoOne/)); test.done(); }, @@ -286,20 +285,18 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = { - "template": "{{#listItems.one}}{{ title }}{{/listItems.one}}", - "extendedTemplate" : "{{#listItems.one}}{{> test-simple }}{{/listItems.one}}", - "key": "test-patternName", - "jsonFileData" : {}, - "listitems" : { - "2": [ - { - "title": "One" - }, - { - "title": "Two" - }, - ] + "template": "{{#listItems.one}}{{ title }}{{/listItems.one}}", + "extendedTemplate" : "{{#listItems.one}}{{ title }}{{/listItems.one}}", + "key": "test-patternName", + "jsonFileData" : {}, + "listitems" : { + "1": { + "number": "One" + }, + "2": { + "number": "Two" } + } }; var patternlab = { @@ -349,29 +346,24 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = { - "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" - }, - ] + "template": "{{#listItems.one}}{{ number }}{{/listItems.one}}", + "extendedTemplate" : "{{#listItems.one}}{{ number }}{{/listItems.one}}", + "key": "test-patternName", + "jsonFileData" : {}, + "listitems" : { + "1": { + "number": "One" } + } }; var patternlab = { "listitems": { + "1": [ + { + "title": "Foo" + } + ], "2": [ { "title": "Foo" @@ -403,7 +395,7 @@ list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "One" ); + test.equals(currentPattern.extendedTemplate, "One"); test.done(); }, @@ -416,13 +408,18 @@ var patterns_dir = './test/files/_patterns'; var pl = {}; - pl.config = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, ['two', 'message']); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; pl.config.patterns = { source: patterns_dir}; pl.listitems = { "1": [ @@ -440,24 +437,18 @@ ] }; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '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 object_factory.oPattern('test/files/_patterns/00-test/11-bookend-listitem.mustache', '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); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var bookendFile = path.resolve('test/files/_patterns/00-test/11-bookend-listitem.mustache'); - pl.patterns.push(atomPattern); - pl.patterns.push(bookendPattern); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - list_item_hunter.process_list_item_partials(bookendPattern, pl); + pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); + var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, pl); //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(); } diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 822679a1d..8bf1c3a15 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -16,7 +16,9 @@ "flatPatternPath": "02-organisms-02-comments", "key": "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.') }}", + "escapedTemplate": "{{> 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.') }}", + "dataKeys": [], "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.') }}" @@ -38,6 +40,7 @@ "flatPatternPath": "01-molecules-06-components", "key": "molecules-single-comment", "template": "

{{description}}

", + "escapedTemplate": "

{{description}}

", "extendedTemplate": "

{{description}}

" } ], @@ -57,7 +60,7 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); test.equals(currentPattern.extendedTemplate, '

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

'); test.done(); @@ -67,14 +70,15 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var pa = require('../builder/pattern_assembler'); + var pattern_assembler = new pa(); - patternlab.patterns[0].template = "

{{foo}}

{{description}}

"; - patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + currentPattern.escapedTemplate = '

{{foo}}

' + currentPattern.template; + currentPattern.extendedTemplate = currentPattern.escapedTemplate; patternlab.data.foo = 'Bar'; - patternlab.data.description = 'Baz'; - patternlab.patterns[0].jsonFileData = patternlab.data; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); + currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern.extendedTemplate, patternlab.data); test.equals(currentPattern.extendedTemplate, '

Bar

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

'); test.done(); @@ -84,13 +88,15 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; 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; + currentPattern.dataKeys = []; + 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.') }}"; + parameteredPartials[1] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

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

'); test.done(); @@ -100,13 +106,15 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; 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; + currentPattern.dataKeys = []; + 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.') }}"; + parameteredPartials[1] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

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

'); test.done(); @@ -118,12 +126,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(description: true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -133,12 +143,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(description: \"true\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -148,12 +160,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment('description': true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -163,12 +177,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment('description': 'true not,\\'true\\'') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true not,'true'

'); test.done(); @@ -178,12 +194,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment('description': \"true not:'true'\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true not:'true'

'); test.done(); @@ -193,12 +211,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(\"description\": true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -208,12 +228,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not \",true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true not ",true"

'); test.done(); @@ -223,12 +245,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not \\\":true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true not ":true"

'); test.done(); @@ -238,12 +262,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; 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; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -269,10 +295,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 211550d47..21ed4eb52 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -201,12 +201,12 @@ patternlab.config.paths.source.patterns = patterns_dir; patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/header.html'), 'utf8'); patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/footer.html'), 'utf8'); patternlab.patterns = []; patternlab.data.link = {}; - patternlab.partials = {}; //diveSync once to perform iterative populating of patternlab object diveSync(patterns_dir, @@ -259,20 +259,23 @@ 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; + var fooFile = path.resolve(patterns_dir + '/00-test/00-foo.mustache'); + var barFile = path.resolve(patterns_dir + '/00-test/01-bar.mustache'); - //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; - } - } + pattern_assembler.process_pattern_iterative(fooFile, patternlab); + pattern_assembler.process_pattern_iterative(barFile, patternlab); + + //act + pattern_assembler.process_pattern_recursive(fooFile, patternlab, 0, null, true); + pattern_assembler.process_pattern_recursive(barFile, patternlab, 0, null, true); + var fooPattern = pattern_assembler.get_pattern_by_key(fooFile, patternlab); + var barPattern = pattern_assembler.get_pattern_by_key(barFile, patternlab); //check initial values - test.equals(foo, '{{> test-bar }}'); - test.equals(bar, 'bar'); + test.equals(fooPattern.template.trim(), '{{> test-bar }}'); + test.equals(barPattern.template.trim(), 'bar'); //test that 00-foo.mustache included partial 01-bar.mustache - test.equals(fooExtended, 'bar'); + test.equals(fooPattern.extendedTemplate.trim(), 'bar'); test.done(); }, @@ -292,11 +295,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; - var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var groupFile = path.resolve('test/files/_patterns/00-test/04-group.mustache'); @@ -309,7 +310,7 @@ var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert - var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; + var expectedValue = '
'; test.equals(groupPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -329,10 +330,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var groupFile = path.resolve('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache'); @@ -345,7 +345,7 @@ var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert - var expectedValue = '
{{message}} {{message}} bar
'; + var expectedValue = '
bar
'; test.equals(groupPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -365,10 +365,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var mixedFile = path.resolve('test/files/_patterns/00-test/06-mixed.mustache'); @@ -380,8 +379,9 @@ pattern_assembler.process_pattern_recursive(mixedFile, pl, 0, null, true); var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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}}
'; + //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first group, + //and {{message}} to be rendered as an empty strings in the second, third, and last groups, since they did not receive any value submissions. + var expectedValue = '
'; test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -401,10 +401,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var bookendFile = path.resolve('test/files/_patterns/00-test/09-bookend.mustache'); @@ -416,8 +415,9 @@ pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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}}
'; + //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first and last group, + //and {{message}} to be rendered as an empty strings in the second and third groups, since they did not receive any value submissions. + var expectedValue = '
'; test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -437,10 +437,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var mixedFile = path.resolve('test/files/_patterns/00-test/07-mixed-params.mustache'); @@ -452,8 +451,8 @@ pattern_assembler.process_pattern_recursive(mixedFile, pl, 0, null, true); var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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
'; + //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first span, since they did not receive any value submissions. + var expectedValue = '
2 3 4
'; test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -473,10 +472,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var bookendFile = path.resolve('test/files/_patterns/00-test/08-bookend-params.mustache'); @@ -488,8 +486,8 @@ pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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}}
'; + //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first and last span, since they did not receive any value submissions. + var expectedValue = '
2 3
'; test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -511,7 +509,6 @@ patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/footer.html'), 'utf8'); patternlab.patterns = []; patternlab.data.link = {}; - patternlab.partials = {}; //act diveSync(patterns_dir, @@ -598,13 +595,12 @@ patternlab.config = fs.readJSONSync('./config.json'); patternlab.config.paths.source.patterns = patterns_dir; patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); - patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []) + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/header.html'), 'utf8'); patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/footer.html'), 'utf8'); patternlab.patterns = []; patternlab.data.link = {}; - patternlab.partials = {}; diveSync( patterns_dir, @@ -712,7 +708,6 @@ var pattern_assembler = new pa(); var patternlab = {}; patternlab.patterns = []; - patternlab.partials = {}; patternlab.data = {link: {}}; var pattern = new object_factory.oPattern('test/files/_patterns/00-test/01-bar.mustache', '00-test', '01-bar.mustache'); @@ -733,7 +728,6 @@ var pattern_assembler = new pa(); var patternlab = {}; patternlab.patterns = []; - patternlab.partials = {}; patternlab.data = {link: {}}; var pattern = new object_factory.oPattern('test/files/_patterns/00-test/01-bar.mustache', '00-test', '01-bar.mustache'); diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 85089d1d6..152d5d270 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -24,10 +24,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; pl.config.patternStates = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); diff --git a/test/style_modifier_hunter_tests.js b/test/style_modifier_hunter_tests.js index 24bf5e567..4dfb83a61 100644 --- a/test/style_modifier_hunter_tests.js +++ b/test/style_modifier_hunter_tests.js @@ -7,7 +7,6 @@ 'uses the partial stylemodifer to modify the patterns tmpTemplate' : function(test){ //arrange var pl = {}; - pl.partials = {}; pl.config = {}; pl.config.debug = false; @@ -27,7 +26,6 @@ 'replaces style modifiers with spaces in the syntax' : function(test){ //arrange var pl = {}; - pl.partials = {}; pl.config = {}; pl.config.debug = false; @@ -47,7 +45,6 @@ 'replaces multiple style modifiers' : function(test){ //arrange var pl = {}; - pl.partials = {}; pl.config = {}; pl.config.debug = false; @@ -67,7 +64,6 @@ 'does not alter pattern tmpTemplate if styleModifier not found in partial' : function(test){ //arrange var pl = {}; - pl.partials = {}; pl.config = {}; pl.config.debug = false; From 9e35acfffb99703e3d3270ae65fdda9a2ba44ada Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 16:58:45 -0400 Subject: [PATCH 047/162] working unit tests --- builder/list_item_hunter.js | 21 +- builder/parameter_hunter.js | 3 +- builder/pattern_assembler.js | 17 +- builder/patternlab.js | 2 - test/files/_patterns/00-test/01-bar.mustache | 2 +- .../_patterns/00-test/02-listitems.mustache | 2 + test/list_item_hunter_tests.js | 327 ++++++------------ test/parameter_hunter_tests.js | 5 +- test/pattern_assembler_tests.js | 45 ++- test/pseudopattern_hunter_tests.js | 2 +- 10 files changed, 164 insertions(+), 262 deletions(-) create mode 100644 test/files/_patterns/00-test/02-listitems.mustache diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 582077d21..2bcdb9aee 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -25,10 +25,23 @@ var list_item_hunter = function () { //find any listitem blocks var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { - pattern_assembler.combine_listItems(pattern); - //merge global and local listitem data and save it to currentPatterns.listitems - pattern.listitems = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); + if (pattern.listitemsRaw) { + + //copy, don't reference + pattern.listitems = JSON.parse(JSON.stringify(pattern.listitemsRaw)); + + //if no local listitems.json file, use global listitems data + } else { + + //copy, don't reference + pattern.listitems = JSON.parse(JSON.stringify(patternlab.listitems)); + pattern.listitemsRaw = JSON.parse(JSON.stringify(patternlab.listitems)); + } + + //this shuffles listitemsRaw, and builds it into an object of array of + //objects and saves that in listitems + pattern_assembler.combine_listItems(pattern); for (var i = 0; i < liMatches.length; i++) { @@ -53,11 +66,11 @@ var list_item_hunter = function () { //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] for (j = 0; j < repeatedBlockTemplate.length; j++) { var thisBlockHTML = ""; - var itemData = pattern.listitems['' + items.indexOf(loopNumberString)]; //this is a property like "2" var patternData = pattern.jsonFileData; var allData = pattern_assembler.merge_data(patternData, itemData !== undefined ? itemData[j] : {}); //itemData could be undefined if the listblock contains no partial, just markup + thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); //add the rendered HTML to our string diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 118e4300a..f2344d571 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -137,8 +137,7 @@ var parameter_hunter = function () { var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); if (!partialPattern) { - console.log('Could not find pattern with key ' + partialName); - continue; + throw('Could not find pattern with key ' + partialName); } //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 5602449a3..31cc445cc 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -137,7 +137,7 @@ var pattern_assembler = function () { function getDataKeys(data, uniqueKeys) { for (var key in data) { if (data.hasOwnProperty(key)) { - if (!(typeof data === 'object' && data instanceof Array)) { + if (data.constructor !== Array) { if (uniqueKeys.indexOf(key) === -1) { uniqueKeys.push(key); } else { @@ -288,6 +288,7 @@ var pattern_assembler = function () { pattern.tmpTemplate = ''; pattern.dataKeys = null; pattern.listitems = null; + pattern.listitemsRaw = null; if (pattern.jsonFileData !== patternlab.data) { pattern.jsonFileData = null; @@ -408,9 +409,14 @@ var pattern_assembler = function () { //define tmpTemplate and listitems to avoid undefined type errors //trying to keep memory footprint small, so set it empty at first currentPattern.tmpTemplate = ''; - currentPattern.listitems = null; - //needs to be initialized as {} in order to run winnowUnusedTags + //needs to be empty object so buildListItems can work + currentPattern.listitems = {}; + + //needs to be null so list_item_hunter.process_list_item_partials can work + currentPattern.listitemsRaw = null; + + //needs to be initialized as {} so winnowUnusedTags can work currentPattern.jsonFileData = {}; //this writes currentPattern.escapedTemplate which needs to be initialized @@ -560,7 +566,10 @@ var pattern_assembler = function () { } if (hasLocalListItems) { try { - currentPattern.listitems = fs.readJSONSync(listJsonFileName); + currentPattern.listitems = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); + currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); + buildListItems(currentPattern); + if (patternlab.config.debug) { console.log('found pattern-specific listitems.json for ' + currentPattern.key); } diff --git a/builder/patternlab.js b/builder/patternlab.js index 0f9e99be4..dc5534c7b 100644 --- a/builder/patternlab.js +++ b/builder/patternlab.js @@ -67,8 +67,6 @@ var patternlab_engine = function (config) { pattern_exporter = new pe(), patterns_dir = paths.source.patterns; - pattern_assembler.combine_listItems(patternlab); - patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); patternlab.dataKeys = patternlab.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); diff --git a/test/files/_patterns/00-test/01-bar.mustache b/test/files/_patterns/00-test/01-bar.mustache index 5716ca598..08573a42b 100644 --- a/test/files/_patterns/00-test/01-bar.mustache +++ b/test/files/_patterns/00-test/01-bar.mustache @@ -1 +1 @@ -bar +{{message}}bar diff --git a/test/files/_patterns/00-test/02-listitems.mustache b/test/files/_patterns/00-test/02-listitems.mustache new file mode 100644 index 000000000..89ced8929 --- /dev/null +++ b/test/files/_patterns/00-test/02-listitems.mustache @@ -0,0 +1,2 @@ +{{#listItems.one}}{{> 00-test/00-foo }}{{/listItems.one}} +{{#listItems.one}}{{> 00-test/01-bar.mustache }}{{/listItems.one}} diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index c69a88bef..d1989add1 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -19,26 +19,17 @@ var patternlab = { "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "1": { + "title": "Foo" + }, + "2": { + "title": "Bar" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, - "config": {"debug": false}, - "partials" : {} + "config": {"debug": false} }; var list_item_hunter = new lih(); @@ -47,7 +38,7 @@ list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "FooBar" ); + test.ok(currentPattern.extendedTemplate.match(/(FooBar|BarFoo)/)); test.done(); }, @@ -64,26 +55,17 @@ var patternlab = { "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "1": { + "title": "Foo" + }, + "2": { + "title": "Bar" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, - "config": {"debug": false}, - "partials" : {} + "config": {"debug": false} }; var list_item_hunter = new lih(); @@ -92,130 +74,63 @@ list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "FooBar" ); + test.ok(currentPattern.extendedTemplate.match(/(FooBar|BarFoo)/)); test.done(); }, '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 = { - "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", - "extendedTemplate" : "{{#listItems.two}}{{> test-simple }}{{/listItems.two}}", - "key": "test-patternName", - "jsonFileData" : {} - }; + //will test recursion and verbose partial inclusion syntax + var fs = require('fs-extra'); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; - var patternlab = { - "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] - }, - "data": { - "link": {}, - "partials": [] - }, - "config": {"debug": false}, - "patterns": [ - { - "template": "{{ title }}", - "extendedTemplate" : "{{ title }}", - "key": "test-simple", - "jsonFileData" : {} + var pl = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir } - ], - "partials" : {} + } }; - - var list_item_hunter = new lih(); - - //act - list_item_hunter.process_list_item_partials(currentPattern, patternlab); - - //assert - test.equals(currentPattern.extendedTemplate, "FooBar" ); - - test.done(); - }, - - 'process_list_item_partials finds verbose partials and outputs repeated renders' : function(test){ - var pattern1 = { - "template": "{{#listItems.one}}{{> 00-test/00-foo }}{{/listItems.one}}", - "extendedTemplate" : "{{#listItems.one}}{{> 00-test/00-foo }}{{/listItems.one}}", - "key": "test-foo", - "jsonFileData" : {} + pl.data = {}; + pl.data.link = {}; + pl.dataKeys = ['one', 'message']; + pl.config.debug = false; + pl.patterns = []; + pl.config.patterns = { source: patterns_dir}; + pl.listitems = { + "1": { + "message": "Foo" + }, + "2": { + "message": "Bar" + } }; - var pattern2 = { - "template": "{{#listItems.two}}{{> 00-test/01-bar.mustache }}{{/listItems.two}}", - "extendedTemplate" : "{{#listItems.two}}{{> 00-test/01-bar.mustache }}{{/listItems.two}}", - "key": "test-bar", - "jsonFileData" : {} - }; + var fooFile = path.resolve('test/files/_patterns/00-test/00-foo.mustache'); + var barFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); + var listitemsFile = path.resolve('test/files/_patterns/00-test/02-listitems.mustache'); - var patternlab = { - "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] - }, - "data": { - "link": {}, - "partials": [] - }, - "config": {"debug": false}, - "patterns": [ - { - "template": "{{ title }}", - "extendedTemplate" : "{{ title }}", - "subdir": "00-test", - "fileName": "00-foo", - "jsonFileData" : {}, - "key": "test-foo", - }, - { - "template": "{{ title }}", - "extendedTemplate" : "{{ title }}", - "subdir": "00-test", - "fileName": "01-bar", - "jsonFileData" : {}, - "key": "test-bar", - } - ], - "partials" : {} - }; + //the contents of these files: + //00-foo.mustache: + // {{> test-bar }} + //01-bar.mustache: + // {{message}}bar + //02-listitems.mustache + // {{#listItems.one}}{{> 00-test/00-foo }}{{/listItems.one}} + // {{#listItems.one}}{{> 00-test/01-bar.mustache }}{{/listItems.one}} - var list_item_hunter = new lih(); + pattern_assembler.process_pattern_iterative(fooFile, pl); + pattern_assembler.process_pattern_iterative(barFile, pl); + pattern_assembler.process_pattern_iterative(listitemsFile, pl); //act - list_item_hunter.process_list_item_partials(pattern1, patternlab); - list_item_hunter.process_list_item_partials(pattern2, patternlab); + pattern_assembler.process_pattern_recursive(listitemsFile, pl, 0, null, true); + var listitemsPattern = pattern_assembler.get_pattern_by_key(listitemsFile, pl); //assert - test.equals(pattern1.extendedTemplate, "Foo" ); - test.equals(pattern2.extendedTemplate, "FooBar" ); + test.ok(listitemsPattern.extendedTemplate.replace(/\n/g, '').match(/(FoobarFoobar|BarbarBarbar)/)); test.done(); }, @@ -226,9 +141,10 @@ var currentPattern = { "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", "extendedTemplate" : "{{#listItems.two}}{{ title }}{{/listItems.two}}", - "key": "test-patternName", + "key": "test-patternName1", "jsonFileData" : {}, - "listitems" : { + "listitems": {}, + "listitemsRaw": { "1": { "title": "One" }, @@ -239,24 +155,16 @@ }; var patternlab = { - "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "listitems" : { + "1": { + "title": "Foo" + }, + "2": { + "title": "Bar" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, "config": {"debug": false}, "patterns": [ @@ -266,8 +174,7 @@ "key": "test-simple", "jsonFileData" : {} } - ], - "partials" : {} + ] }; var list_item_hunter = new lih(); @@ -289,35 +196,22 @@ "extendedTemplate" : "{{#listItems.one}}{{ title }}{{/listItems.one}}", "key": "test-patternName", "jsonFileData" : {}, - "listitems" : { + "listitems": {}, + "listitemsRaw": { "1": { "number": "One" - }, - "2": { - "number": "Two" } } }; var patternlab = { "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "1": { + "title": "Foo" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, "config": {"debug": false}, "patterns": [ @@ -327,13 +221,14 @@ "key": "test-simple", "jsonFileData" : {} } - ], - "partials" : {} + ] }; var list_item_hunter = new lih(); + var pattern_assembler = new pa(); //act + currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, currentPattern.listitemsRaw); list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert @@ -346,36 +241,32 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = { - "template": "{{#listItems.one}}{{ number }}{{/listItems.one}}", - "extendedTemplate" : "{{#listItems.one}}{{ number }}{{/listItems.one}}", + "template": "{{#listItems.two}}{{ number }}{{/listItems.two}}", + "extendedTemplate" : "{{#listItems.two}}{{ number }}{{/listItems.two}}", "key": "test-patternName", "jsonFileData" : {}, - "listitems" : { + "listitems": {}, + "listitemsRaw" : { "1": { "number": "One" + }, + "2": { + "number": "Two" } } }; var patternlab = { "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "1": { + "title": "Foo" + }, + "2": { + "title": "Bar" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, "config": {"debug": false}, "patterns": [ @@ -385,17 +276,18 @@ "key": "test-simple", "jsonFileData" : {} } - ], - "partials" : {} + ] }; var list_item_hunter = new lih(); + var pattern_assembler = new pa(); //act + currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, currentPattern.listitemsRaw); list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "One"); + test.ok(currentPattern.extendedTemplate.match(/(OneTwo|TwoOne)/)); test.done(); }, @@ -417,24 +309,17 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, ['two', 'message']); + pl.dataKeys = ['two', 'message']; pl.config.debug = false; pl.patterns = []; pl.config.patterns = { source: patterns_dir}; pl.listitems = { - "1": [ - { - "message": "Foo" - } - ], - "2": [ - { - "message": "Foo" - }, - { - "message": "Bar" - } - ] + "1": { + "message": "Foo" + }, + "2": { + "message": "Bar" + } }; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); @@ -448,8 +333,8 @@ var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, pl); //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
'; - test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + var expectedValue = /
(Foo|Bar) <\/span> (Foo|Bar) <\/span> (Foo|Bar) <\/span> (Foo|Bar) <\/span> (Foo|Bar) <\/span> (Foo|Bar) <\/span> <\/div>/; + test.ok(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim().match(expectedValue)); test.done(); } diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 8bf1c3a15..c62b3f246 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -49,8 +49,7 @@ }, data: { description: 'Not a quote from a smart man' - }, - partials: {} + } } }; @@ -295,7 +294,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 21ed4eb52..7d9a3c96c 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -273,7 +273,7 @@ //check initial values test.equals(fooPattern.template.trim(), '{{> test-bar }}'); - test.equals(barPattern.template.trim(), 'bar'); + test.equals(barPattern.template.trim(), '{{message}}bar'); //test that 00-foo.mustache included partial 01-bar.mustache test.equals(fooPattern.extendedTemplate.trim(), 'bar'); @@ -295,7 +295,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -330,7 +330,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -365,7 +365,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -380,7 +380,7 @@ var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, pl); //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first group, - //and {{message}} to be rendered as an empty strings in the second, third, and last groups, since they did not receive any value submissions. + //and {{message}} to be rendered as an empty strings in the second, third, and last groups, since they did not receive any value submissions. var expectedValue = '
'; test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); @@ -401,7 +401,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -416,7 +416,7 @@ var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, pl); //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first and last group, - //and {{message}} to be rendered as an empty strings in the second and third groups, since they did not receive any value submissions. + //and {{message}} to be rendered as an empty strings in the second and third groups, since they did not receive any value submissions. var expectedValue = '
'; test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); @@ -437,7 +437,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -472,7 +472,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -504,6 +504,7 @@ patternlab.config.paths.source.patterns = patterns_dir; patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); patternlab.listitems = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'listitems.json')); patternlab.header = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/header.html'), 'utf8'); patternlab.footer = fs.readFileSync(path.resolve(patternlab.config.paths.source.patternlabFiles, 'pattern-header-footer/footer.html'), 'utf8'); @@ -511,36 +512,32 @@ patternlab.data.link = {}; //act - diveSync(patterns_dir, - { - filter: function(path, dir){ - if(dir){ - var remainingPath = path.replace(patterns_dir, ''); - var isValidPath = remainingPath.indexOf('/_') === -1; - return isValidPath; - } - return true; - } - }, - function(err, file){ + diveSync( + patterns_dir, + function (err, file) { //log any errors - if(err){ + if (err) { console.log(err); return; } - pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); } ); //assert var foundVariant = false; + var variantIgnored = false; for(var i = 0; i < patternlab.patterns.length; i++){ if(patternlab.patterns[i].fileName.indexOf('~') > -1){ foundVariant = true; + if(typeof patternlab.patterns[i].extendedTemplate === 'undefined'){ + variantIgnored = true; + } } } - test.equals(foundVariant, false); + + test.equals(foundVariant, true); + test.equals(variantIgnored, true); test.done(); }, 'setState - applies any patternState matching the pattern' : function(test){ diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 152d5d270..2101c0b7d 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -24,7 +24,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; pl.config.patternStates = {}; From 4fa911bcc99def6af4ac3afea6ee19da7c2ba833 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 17:12:23 -0400 Subject: [PATCH 048/162] eslinting --- builder/.pattern_assembler.js.swp | Bin 0 -> 40960 bytes builder/parameter_hunter.js | 2 +- builder/pattern_assembler.js | 11 +++++------ 3 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..7323cbae352a06f42326a03c94c5f640e4d54f5c GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index f2344d571..b6fd150fb 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -137,7 +137,7 @@ var parameter_hunter = function () { var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); if (!partialPattern) { - throw('Could not find pattern with key ' + partialName); + throw ('Could not find pattern with key ' + partialName); } //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 31cc445cc..fbc5f7373 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -470,7 +470,6 @@ var pattern_assembler = function () { var paths = patternlab.config.paths; if (!recursionLevel) { - recursionLevel = 0; //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -604,7 +603,7 @@ var pattern_assembler = function () { console.log('found parametered partials for ' + currentPattern.key); } - if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { + if (!recursionLevel && currentPattern.extendedTemplate === currentPattern.template) { currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); } @@ -613,7 +612,7 @@ var pattern_assembler = function () { //recurse, going a level deeper, with each render eliminating nested parameteredPartials //when there are no more nested parameteredPartials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel ? recursionLevel + 1 : 1, currentPattern); } //find non-parametered partials. @@ -627,7 +626,7 @@ var pattern_assembler = function () { } //copy winnowed template to extendedTemplate - if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { + if (!recursionLevel && currentPattern.extendedTemplate === currentPattern.template) { currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); } @@ -672,11 +671,11 @@ var pattern_assembler = function () { //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel ? recursionLevel + 1 : 1, currentPattern); } //do only when popped back to the top level of recursion - if (recursionLevel === 0) { + if (!recursionLevel) { if (currentPattern.extendedTemplate !== currentPattern.template) { //switch ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); From baa0f83802f69d5888645aa5303ba9f4e1f05287 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 20:05:02 -0400 Subject: [PATCH 049/162] deleting .swp file --- builder/.pattern_assembler.js.swp | Bin 40960 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index 7323cbae352a06f42326a03c94c5f640e4d54f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 literal 0 HcmV?d00001 diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index eaab61b76..011399478 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -137,7 +137,7 @@ var parameter_hunter = function () { var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); if (!partialPattern) { - throw('Could not find pattern with key ' + partialName); + throw ('Could not find pattern with key ' + partialName); } //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 18c61bb9b..78ed3bde5 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -465,7 +465,6 @@ var paths = patternlab.config.paths; if (!recursionLevel) { - recursionLevel = 0; //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -599,7 +598,7 @@ console.log('found parametered partials for ' + currentPattern.key); } - if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { + if (!recursionLevel && currentPattern.extendedTemplate === currentPattern.template) { currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); } @@ -608,7 +607,7 @@ //recurse, going a level deeper, with each render eliminating nested parameteredPartials //when there are no more nested parameteredPartials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel ? recursionLevel + 1 : 1, currentPattern); } //find non-parametered partials. @@ -622,7 +621,7 @@ } //copy winnowed template to extendedTemplate - if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { + if (!recursionLevel && currentPattern.extendedTemplate === currentPattern.template) { currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); } @@ -667,11 +666,11 @@ //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel ? recursionLevel + 1 : 1, currentPattern); } //do only when popped back to the top level of recursion - if (recursionLevel === 0) { + if (!recursionLevel) { if (currentPattern.extendedTemplate !== currentPattern.template) { //switch ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); From 0e09555bfe52f91fb650060b4d9bb3e21a1adc54 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 20:05:02 -0400 Subject: [PATCH 129/162] deleting .swp file --- builder/.pattern_assembler.js.swp | Bin 40960 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index 7323cbae352a06f42326a03c94c5f640e4d54f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 From 3a9420836193781ae59e4a2a6c1955973f7404a2 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 16 Mar 2016 08:26:18 -0400 Subject: [PATCH 130/162] docblock and comment update --- builder/pattern_assembler.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 78ed3bde5..f701b782e 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -441,8 +441,8 @@ * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. * @param {number|undefined} recursionLevel Top level === 0. Increments by 1 after that. - * @param {object} currentPatternAsParam Only submitted on recursionLevel > 0. - * @param {boolean} test When unit testing, pass in true to not output to file system. + * @param {object|undefined} currentPatternAsParam Only submitted on recursionLevel > 0. + * @param {boolean|undefined} test When unit testing, pass in true to not output to file system. */ function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { var fs = require('fs-extra'), @@ -742,6 +742,9 @@ process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, + + //only submit all 5 params within the function itself and in unit tests. + //when calling outside of these circumstances, only submit file and patternlab. process_pattern_recursive: function (file, patternlab, recursionLevel, currentPatternAsParam, test) { processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test); } From e34939afb8d2bdbe18ee913f617628b16d9b8d2b Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 10:37:32 -0400 Subject: [PATCH 131/162] new paramToJson --- builder/parameter_hunter.js | 266 +++++++++++++------ test/files/_patterns/00-test/01-bar.mustache | 2 +- test/parameter_hunter_tests.js | 251 +---------------- 3 files changed, 204 insertions(+), 315 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 011399478..e015d29e0 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -12,110 +12,227 @@ var parameter_hunter = function () { - var pa = require('./pattern_assembler'), + var JSON = require('json5'), + pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), style_modifier_hunter = new smh(); + /** + * 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, commas, 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; - var delimitPos; - var paramKey; - var paramString = pString; - var paramStringWellFormed = ''; - var paramStringTmp; - var quotePos; + var colonPos = -1; + var keys = []; + var paramString = pString; // to not reassign param + var paramStringWellFormed; + var quotePos = -1; + var regex; + var values = []; + var wrapper; - do { + //replace all escaped double-quotes with escaped unicode + paramString = paramString.replace(/\\"/g, '\\u0022'); - //move param key to paramStringWellFormed var. - colonPos = paramString.indexOf(':'); + //replace all escaped single-quotes with escaped unicode + paramString = paramString.replace(/\\'/g, '\\u0027'); - //except to prevent infinite loops. - if (colonPos === -1) { - colonPos = paramString.length - 1; - } else { - colonPos += 1; - } + //replace all escaped commas with escaped unicode + paramString = paramString.replace(/\\,/g, '\\u0044'); - paramKey = paramString.substring(0, colonPos); + //replace all escaped colons with escaped unicode + paramString = paramString.replace(/\\:/g, '\\u0058'); - //if param key is wrapped in single quotes, replace with double quotes. - paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); - - //if params key is not wrapped in any quotes, wrap in double quotes. - paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); + //with escaped chars out of the way, crawl through paramString looking for + //keys and values + do { - //this is just here to match the escaping scheme in Pattern Lab PHP. - paramKey = paramKey.replace(/\\/g, ''); + //check if searching for a key + if (paramString[0] === '{' || paramString[0] === ',') { + paramString = paramString.substring([1], paramString.length).trim(); - paramStringWellFormed += paramKey; - paramString = paramString.substring(colonPos, 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]) { - //if param value is wrapped in single quotes, replace with double quotes. - if (paramString[0] === '\'') { - quotePos = paramString.search(/[^\\]'/); + //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; - //except for unclosed quotes to prevent infinite loops. - if (quotePos === -1) { - quotePos = paramString.length - 1; - } else { - quotePos += 2; + default: + colonPos = paramString.indexOf(':'); } - //prepare param value for move to paramStringWellFormed var. - paramStringTmp = paramString.substring(0, quotePos); + if (quotePos > -1) { + keys.push(paramString.substring(0, quotePos + 1).trim()); - //unescape any escaped single quotes. - paramStringTmp = paramStringTmp.replace(/\\'/g, '\''); + //truncate the beginning from paramString and look for a value + paramString = paramString.substring(quotePos + 1, paramString.length).trim(); - //escape any double quotes. - paramStringTmp = paramStringTmp.replace(/"/g, '\\"'); + //unset quotePos + quotePos = -1; - //replace the delimiting single quotes with double quotes. - paramStringTmp = paramStringTmp.replace(/^'/, '"'); - paramStringTmp = paramStringTmp.replace(/'$/, '"'); + } else if (colonPos > -1) { + keys.push(paramString.substring(0, colonPos).trim()); - //move param key to paramStringWellFormed var. - paramStringWellFormed += paramStringTmp; - paramString = paramString.substring(quotePos, paramString.length).trim(); + //truncate the beginning from paramString and look for a value + paramString = paramString.substring(colonPos, paramString.length); - //if param value is wrapped in double quotes, just move to paramStringWellFormed var. - } else if (paramString[0] === '"') { - quotePos = paramString.search(/[^\\]"/); + //unset colonPos + colonPos = -1; - //except for unclosed quotes to prevent infinite loops. - if (quotePos === -1) { - quotePos = paramString.length - 1; + //if there are no more colons, and we're looking for a key, there is + //probably a problem. stop any further processing. } else { - quotePos += 2; + paramString = ''; + break; + } + } + + //now, search for a value + if (paramString[0] === ':') { + paramString = paramString.substring([1], paramString.length).trim(); + + //since a quote of same type as its wrappers would be escaped, and we + //escaped those even further with their unicode, it is safe to look for + //wrapper pairs and conclude that their contents are values + switch (paramString[0]) { + 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++) { - //move param key to paramStringWellFormed var. - paramStringWellFormed += paramString.substring(0, quotePos); - paramString = paramString.substring(quotePos, paramString.length).trim(); + //keys + //replace single-quote wrappers with double-quotes + if (keys[i][0] === '\'' && keys[i][keys[i].length - 1] === '\'') { + paramStringWellFormed += '"'; - //if param value is not wrapped in quotes, move everthing up to the delimiting comma to paramStringWellFormed var. + //any enclosed double-quotes must be escaped + paramStringWellFormed += keys[i].substring(1, keys[i].length - 1).replace(/"/g, '\\"'); + paramStringWellFormed += '"'; } else { - delimitPos = paramString.indexOf(','); - //except to prevent infinite loops. - if (delimitPos === -1) { - delimitPos = paramString.length - 1; + //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 += paramString.substring(0, delimitPos); - paramString = paramString.substring(delimitPos, paramString.length).trim(); + 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 += '"'; + } } - //break at the end. - if (paramString.length <= 1) { - paramStringWellFormed += paramString.trim(); - paramString = ''; - break; + //colon delimiter. + paramStringWellFormed += ':'; + values[i]; + + //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]; } - } while (paramString); + //comma delimiter + if (i < keys.length - 1) { + paramStringWellFormed += ','; + } + } + paramStringWellFormed += '}'; + + //unescape escaped unicode except for double-quotes + paramStringWellFormed = paramStringWellFormed.replace(/\\u0027/g, '\''); + paramStringWellFormed = paramStringWellFormed.replace(/\\u0044/g, ','); + paramStringWellFormed = paramStringWellFormed.replace(/\\u0058/g, ':'); return paramStringWellFormed; } @@ -153,14 +270,13 @@ var parameter_hunter = function () { style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); } - //strip out the additional data, convert string to JSON. + //strip out the additional data, convert string to JSON var leftParen = parameteredPartials[i].indexOf('('); - var rightParen = parameteredPartials[i].indexOf(')'); - var paramData = {}; + var rightParen = parameteredPartials[i].lastIndexOf(')'); var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = '{}'; - paramStringWellFormed = paramToJson(paramString); + var paramStringWellFormed = paramToJson(paramString); + var paramData = {}; try { paramData = JSON.parse(paramStringWellFormed); } catch (e) { diff --git a/test/files/_patterns/00-test/01-bar.mustache b/test/files/_patterns/00-test/01-bar.mustache index 08573a42b..5716ca598 100644 --- a/test/files/_patterns/00-test/01-bar.mustache +++ b/test/files/_patterns/00-test/01-bar.mustache @@ -1 +1 @@ -{{message}}bar +bar diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 906a363ad..a4239857e 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -54,270 +54,43 @@ }; exports['parameter_hunter'] = { - 'parameter hunter finds and extends templates' : function(test){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - - parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var pa = require('../builder/pattern_assembler'); - var pattern_assembler = new pa(); - - currentPattern.escapedTemplate = '

{{foo}}

' + currentPattern.template; - currentPattern.extendedTemplate = currentPattern.escapedTemplate; - patternlab.data.foo = 'Bar'; - - parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); - currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern.extendedTemplate, patternlab.data); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; - - 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.dataKeys = []; - 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.') }}"; - parameteredPartials[1] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; - - 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.dataKeys = []; - 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.') }}"; - parameteredPartials[1] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

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

'); - - test.done(); - }, - - //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){ + 'parameter 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 parameteredPartials = []; - currentPattern.template = "{{> molecules-single-comment(description: true) }}"; - currentPattern.extendedTemplate = currentPattern.template; - currentPattern.dataKeys = []; - parameteredPartials[0] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true

'); - - test.done(); - }, - - 'parameter hunter parses parameters with unquoted keys and double-quoted values' : function(test){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; + patternlab.patterns[0].template = "

{{foo}}

{{bar}}

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

true

'); + test.equals(currentPattern.extendedTemplate, '

true

Hello World

'); test.done(); }, - 'parameter hunter parses parameters with single-quoted keys and unquoted values' : function(test){ + 'parameter 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 parameteredPartials = []; - currentPattern.template = "{{> molecules-single-comment('description': true) }}"; - currentPattern.extendedTemplate = currentPattern.template; - currentPattern.dataKeys = []; - parameteredPartials[0] = currentPattern.template; + patternlab.patterns[0].template = "

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; + patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; - - currentPattern.template = "{{> molecules-single-comment('description': 'true not,\\'true\\'') }}"; + currentPattern.template = "{{> molecules-single-comment('silly\\\'key': true, bar: \"Hello World\", \"another\\\"silly-key\": 42 ) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.dataKeys = []; parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; - - currentPattern.template = "{{> molecules-single-comment('description': \"true not:'true'\") }}"; - currentPattern.extendedTemplate = currentPattern.template; - currentPattern.dataKeys = []; - parameteredPartials[0] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true not:'true'

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

true not ":true"

'); - - test.done(); - }, - - 'parameter 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 parameteredPartials = []; - - 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.dataKeys = []; - parameteredPartials[0] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true

'); - - test.done(); - }, - - 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ - // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js - //arrange - var fs = require('fs-extra'); - var path = require('path'); - var object_factory = require('../builder/object_factory'); - var pa = require('../builder/pattern_assembler'); - 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.dataKeys = []; - pl.config.debug = false; - pl.patterns = []; - - var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); - var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); - var innerParameteredFile = path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'); - var outerParameteredFile = path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'); - - pattern_assembler.process_pattern_iterative(atomFile, pl); - pattern_assembler.process_pattern_iterative(styleFile, pl); - pattern_assembler.process_pattern_iterative(innerParameteredFile, pl); - pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); - - //act - pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); - pattern_assembler.process_pattern_recursive(styleFile, pl, 0, null, true); - pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, 0, null, true); - pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, 0, null, true); - var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); + test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); - //assert. - var expectedValue = 'bar foo bar bar'; - test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); } }; From f341a8fdef6eec5a61ccab41b17a1f64b6994a42 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 11:29:45 -0400 Subject: [PATCH 132/162] working unit tests --- package.gulp.json | 3 +- package.json | 1 + test/files/_patterns/00-test/01-bar.mustache | 2 +- test/parameter_hunter_tests.js | 251 ++++++++++++++++++- 4 files changed, 243 insertions(+), 14 deletions(-) diff --git a/package.gulp.json b/package.gulp.json index be9f8ddc4..8ed639d61 100644 --- a/package.gulp.json +++ b/package.gulp.json @@ -8,8 +8,9 @@ "diveSync": "^0.3.0", "fs-extra": "^0.26.5", "glob": "^7.0.0", + "hogan": "^1.0.2", "html-entities": "^1.2.0", - "mustache": "^2.2.1" + "json5": "^0.5.0" }, "devDependencies": { "browser-sync": "^2.11.1", diff --git a/package.json b/package.json index 7241bd087..a3fd9558b 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "glob": "^7.0.0", "hogan": "^1.0.2", "html-entities": "^1.2.0", + "json5": "^0.5.0", "matchdep": "^1.0.0" }, "devDependencies": { diff --git a/test/files/_patterns/00-test/01-bar.mustache b/test/files/_patterns/00-test/01-bar.mustache index 5716ca598..08573a42b 100644 --- a/test/files/_patterns/00-test/01-bar.mustache +++ b/test/files/_patterns/00-test/01-bar.mustache @@ -1 +1 @@ -bar +{{message}}bar diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index a4239857e..906a363ad 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -54,43 +54,270 @@ }; exports['parameter_hunter'] = { - 'parameter hunter parses parameters that follow a non-quoted value' : function(test){ - // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 + 'parameter hunter finds and extends templates' : function(test){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + + parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var pa = require('../builder/pattern_assembler'); + var pattern_assembler = new pa(); + + currentPattern.escapedTemplate = '

{{foo}}

' + currentPattern.template; + currentPattern.extendedTemplate = currentPattern.escapedTemplate; + patternlab.data.foo = 'Bar'; + + parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); + currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern.extendedTemplate, patternlab.data); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var parameteredPartials = []; + + 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.dataKeys = []; + 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.') }}"; + parameteredPartials[1] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var parameteredPartials = []; + + 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.dataKeys = []; + 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.') }}"; + parameteredPartials[1] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

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

'); + + test.done(); + }, + + //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){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); var parameteredPartials = []; - patternlab.patterns[0].template = "

{{foo}}

{{bar}}

"; - patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + currentPattern.template = "{{> molecules-single-comment(description: true) }}"; + currentPattern.extendedTemplate = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

true

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

true

Hello World

'); + test.equals(currentPattern.extendedTemplate, '

true

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

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; - patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + currentPattern.template = "{{> molecules-single-comment('description': true) }}"; + currentPattern.extendedTemplate = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - currentPattern.template = "{{> molecules-single-comment('silly\\\'key': true, bar: \"Hello World\", \"another\\\"silly-key\": 42 ) }}"; + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var parameteredPartials = []; + + currentPattern.template = "{{> molecules-single-comment('description': 'true not,\\'true\\'') }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.dataKeys = []; parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var parameteredPartials = []; + + currentPattern.template = "{{> molecules-single-comment('description': \"true not:'true'\") }}"; + currentPattern.extendedTemplate = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

true not:'true'

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

true not ":true"

'); + + test.done(); + }, + + 'parameter 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 parameteredPartials = []; + + 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.dataKeys = []; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

true

'); + + test.done(); + }, + + 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + //arrange + var fs = require('fs-extra'); + var path = require('path'); + var object_factory = require('../builder/object_factory'); + var pa = require('../builder/pattern_assembler'); + 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.dataKeys = []; + pl.config.debug = false; + pl.patterns = []; + + var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); + var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var innerParameteredFile = path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'); + var outerParameteredFile = path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'); + + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(styleFile, pl); + pattern_assembler.process_pattern_iterative(innerParameteredFile, pl); + pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); + + //act + pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(styleFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, 0, null, true); + var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); + //assert. + var expectedValue = 'bar foo bar bar'; + test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); } }; From b5e9c229ff4e6191ad0900bfc5de8ca6b04a8a46 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 12:09:17 -0400 Subject: [PATCH 133/162] updated unit tests --- test/.parameter_hunter_tests.js.swp | Bin 0 -> 40960 bytes test/parameter_hunter_tests.js | 89 ++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 test/.parameter_hunter_tests.js.swp diff --git a/test/.parameter_hunter_tests.js.swp b/test/.parameter_hunter_tests.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..256bc3dfe79f1988fb1bbdf4dfdd7163f23962f3 GIT binary patch literal 40960 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 MN|rS{8o%iO0f$*`>;M1& literal 0 HcmV?d00001 diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 906a363ad..4741dd5c1 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -229,13 +229,13 @@ var parameter_hunter = new ph(); var parameteredPartials = []; - currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not \",true\"') }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not{\",true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.dataKeys = []; parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true not ",true"

'); + test.equals(currentPattern.extendedTemplate, '

true not{",true"

'); test.done(); }, @@ -246,13 +246,13 @@ var parameter_hunter = new ph(); var parameteredPartials = []; - currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not \\\":true\\\"\") }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not}\\\":true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.dataKeys = []; parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true not ":true"

'); + test.equals(currentPattern.extendedTemplate, '

true not}":true"

'); test.done(); }, @@ -274,6 +274,87 @@ test.done(); }, + 'parameter 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 parameteredPartials = []; + + currentPattern.template = "{{> molecules-single-comment(description: 'Hello ) World') }}"; + currentPattern.extendedTemplate = currentPattern.template; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

Hello ) World

'); + + test.done(); + }, + + 'parameter 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 parameteredPartials = []; + + patternlab.patterns[0].template = "

{{foo}}

{{bar}}

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

true

Hello World

'); + + test.done(); + }, + + 'parameter 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 parameteredPartials = []; + + patternlab.patterns[0].template = "

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; + patternlab.patterns[0].escapedTemplate = patternlab.patterns[0].template; + 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; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); + + test.done(); + }, + + 'parameter 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 parameteredPartials = []; + + patternlab.patterns[0].template = "

{{foo}}

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

'); + + test.done(); + }, + 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js //arrange From db83ce1c6ded906237159fe5fe57b7c88f8d5d8b Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 12:09:32 -0400 Subject: [PATCH 134/162] deleting swap file --- test/.parameter_hunter_tests.js.swp | Bin 40960 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/.parameter_hunter_tests.js.swp diff --git a/test/.parameter_hunter_tests.js.swp b/test/.parameter_hunter_tests.js.swp deleted file mode 100644 index 256bc3dfe79f1988fb1bbdf4dfdd7163f23962f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 MN|rS{8o%iO0f$*`>;M1& From 40ef5412cca84f1bd117903dde6d5ef2a235452f Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 12:20:12 -0400 Subject: [PATCH 135/162] using JSON5 --- builder/pattern_assembler.js | 16 +++++++++++++--- core/lib/list_item_hunter.js | 19 +++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index f701b782e..9ccaec7f3 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -219,6 +219,7 @@ } function parseDataLinksHelper(patternlab, obj, key) { + var JSON = require('json5'); var linkRE, dataObjAsString, linkMatches, expandedLink; linkRE = /link\.[A-z0-9-_]+/g; @@ -236,7 +237,16 @@ } } } - return JSON.parse(dataObjAsString); + + var dataObj; + try { + dataObj = JSON.parse(dataObjAsString); + } catch (err) { + console.log('There was an error parsing JSON for ' + key); + console.log(err); + } + + return dataObj; } //look for pattern links included in data files. @@ -447,6 +457,7 @@ function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { var fs = require('fs-extra'), glob = require('glob'), + JSON = require('json5'), path = require('path'); var ph = require('./parameter_hunter'), @@ -515,8 +526,7 @@ localData = JSON.parse(localJsonString); currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); } catch (err) { - - //since we're parsing json, output errors for debugging + console.log('There was an error parsing JSON for ' + file); console.log(err); } diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 7593840be..8f23a0782 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -12,7 +12,8 @@ var list_item_hunter = function () { - var pa = require('./pattern_assembler'), + var JSON = require('json5'), + pa = require('./pattern_assembler'), pattern_assembler = new pa(), items = [ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty']; @@ -29,14 +30,24 @@ var list_item_hunter = function () { if (pattern.listitemsRaw) { //copy, don't reference - pattern.listitems = JSON.parse(JSON.stringify(pattern.listitemsRaw)); + try { + pattern.listitems = JSON.parse(JSON.stringify(pattern.listitemsRaw)); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); + } //if no local listitems.json file, use global listitems data } else { //copy, don't reference - pattern.listitems = JSON.parse(JSON.stringify(patternlab.listitems)); - pattern.listitemsRaw = JSON.parse(JSON.stringify(patternlab.listitems)); + try { + pattern.listitems = JSON.parse(JSON.stringify(patternlab.listitems)); + pattern.listitemsRaw = JSON.parse(JSON.stringify(patternlab.listitems)); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); + } } //this shuffles listitemsRaw, and builds it into an object of array of From 63590520da37a277269f455be0131dc9509ea98c Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 15:21:10 -0400 Subject: [PATCH 136/162] fixing typo and updating comments --- builder/parameter_hunter.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index e015d29e0..e394d4097 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -133,12 +133,19 @@ var parameter_hunter = function () { //now, search for a value if (paramString[0] === ':') { - paramString = paramString.substring([1], paramString.length).trim(); - - //since a quote of same type as its wrappers would be escaped, and we - //escaped those even further with their unicode, it is safe to look for - //wrapper pairs and conclude that their contents are values + 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; From 2c47e34561abe39d4665f40fb45891997577e7a8 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 20:25:24 -0400 Subject: [PATCH 137/162] removing unnecessary escape --- builder/parameter_hunter.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index e394d4097..be76b3e18 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -76,9 +76,6 @@ var parameter_hunter = function () { //replace all escaped single-quotes with escaped unicode paramString = paramString.replace(/\\'/g, '\\u0027'); - //replace all escaped commas with escaped unicode - paramString = paramString.replace(/\\,/g, '\\u0044'); - //replace all escaped colons with escaped unicode paramString = paramString.replace(/\\:/g, '\\u0058'); @@ -238,7 +235,6 @@ var parameter_hunter = function () { //unescape escaped unicode except for double-quotes paramStringWellFormed = paramStringWellFormed.replace(/\\u0027/g, '\''); - paramStringWellFormed = paramStringWellFormed.replace(/\\u0044/g, ','); paramStringWellFormed = paramStringWellFormed.replace(/\\u0058/g, ':'); return paramStringWellFormed; From 3699fa02943c918343c95bb05caf9111eff04c90 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 26 Mar 2016 11:41:56 -0400 Subject: [PATCH 138/162] pattern_exporter.js and pseudopattern_hunter.js ready --- core/lib/pattern_exporter.js | 1 - 1 file changed, 1 deletion(-) diff --git a/core/lib/pattern_exporter.js b/core/lib/pattern_exporter.js index a63d14111..ff53cac6c 100644 --- a/core/lib/pattern_exporter.js +++ b/core/lib/pattern_exporter.js @@ -18,7 +18,6 @@ var pattern_exporter = function () { //read the config export options var exportKeys = patternlab.config.patternExportKeys; - //find the chosen patterns to export for (var i = 0; i < exportKeys.length; i++) { for (var j = 0; j < patternlab.patterns.length; j++) { From 2de305e4778053c9fd8d0bab2328493befdb3ca4 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 28 Mar 2016 22:19:43 -0400 Subject: [PATCH 139/162] patternlab.js updated, builder/pattern_assembler.js set up to be moved to core/lib --- builder/pattern_assembler.js | 132 ++++++++++++----------------------- core/lib/patternlab.js | 23 ++++++ 2 files changed, 68 insertions(+), 87 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 9ccaec7f3..a35890bdd 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -1,5 +1,5 @@ /* - * patternlab-node - v1.1.1 - 2016 + * patternlab-node - v1.2.0 - 2016 * * Brian Muenzenmeyer, and the web community. * Licensed under the MIT license. @@ -8,8 +8,9 @@ * */ -(function () { - "use strict"; +"use strict"; + +var pattern_assembler = function () { // find regex matches within both pattern strings and pattern objects. function patternMatcher(pattern, regex) { @@ -26,7 +27,7 @@ // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithStyleModifiers(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g; + var regex = /{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g; var matches = patternMatcher(pattern, regex); return matches; @@ -34,7 +35,7 @@ // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithPatternParameters(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g; + var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g; var matches = patternMatcher(pattern, regex); return matches; @@ -42,7 +43,7 @@ //find and return any {{> template-name* }} within pattern function findPartials(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g; + var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g; var matches = patternMatcher(pattern, regex); return matches; @@ -61,6 +62,7 @@ } else { pattern.patternState = ""; } + } function addPattern(pattern, patternlab) { //add the link to the global object @@ -76,13 +78,13 @@ isNew = false; break; } - return matches; } //if the pattern is new, just push to the array if (isNew) { patternlab.patterns.push(pattern); } + } function renderPattern(template, data, partials) { var hogan = require('hogan'); @@ -93,29 +95,33 @@ } else { return compiled.render(data); } + } - function setState(pattern, patternlab){ - if(patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]){ - pattern.patternState = patternlab.config.patternStates[pattern.patternName]; - } else{ - pattern.patternState = ""; + //http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript + function shuffle(o) { + for (var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); //eslint-disable-line curly + return o; + } + + function buildListItems(container) { + //combine all list items into one structure + var list = []; + for (var item in container.listitems) { + if (container.listitems.hasOwnProperty(item)) { + list.push(container.listitems[item]); } } + container.listItemArray = shuffle(list); - function addPattern(pattern, patternlab){ - //add the link to the global object - patternlab.data.link[pattern.patternGroup + '-' + pattern.patternName] = '/patterns/' + pattern.patternLink; - - //only push to array if the array doesn't contain this pattern - var isNew = true; - for(var i = 0; i < patternlab.patterns.length; i++){ - //so we need the identifier to be unique, which patterns[i].abspath is - if(pattern.abspath === patternlab.patterns[i].abspath){ - //if abspath already exists, overwrite that element - patternlab.patterns[i] = pattern; - patternlab.partials[pattern.key] = pattern.extendedTemplate || pattern.template; - isNew = false; - break; + for (var i = 1; i <= container.listItemArray.length; i++) { + var tempItems = []; + if (i === 1) { + tempItems.push(container.listItemArray[0]); + container.listitems['' + i] = tempItems; + } else { + for (var c = 1; c <= i; c++) { + tempItems.push(container.listItemArray[c - 1]); + container.listitems['' + i] = tempItems; } } } @@ -164,16 +170,14 @@ case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': return patternlab.patterns[i]; } - } - function renderPattern(template, data, partials) { + //return the fuzzy match if all else fails + var keyParts = key.split('-'), + keyType = keyParts[0], + keyName = keyParts.slice(1).join('-'); - var mustache = require('mustache'); - - if(partials) { - return mustache.render(template, data, partials); - } else{ - return mustache.render(template, data); + if (patternlab.patterns[i].key.split('-')[0] === keyType && patternlab.patterns[i].key.indexOf(keyName) > -1) { + return patternlab.patterns[i]; } } @@ -402,10 +406,10 @@ return; } - //can ignore all non-mustache files at this point - if(ext !== '.mustache'){ - return; - } + //can ignore all non-mustache files at this point + if(ext !== '.mustache'){ + return; + } //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); @@ -463,8 +467,7 @@ var ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), lih = require('./list_item_hunter'), - smh = require('./style_modifier_hunter'), - path = require('path'); + smh = require('./style_modifier_hunter'); var parameter_hunter = new ph(), list_item_hunter = new lih(), @@ -758,53 +761,8 @@ process_pattern_recursive: function (file, patternlab, recursionLevel, currentPatternAsParam, test) { processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test); } + }; - return { - find_pattern_partials: function(pattern){ - return findPartials(pattern); - }, - find_pattern_partials_with_style_modifiers: function(pattern){ - return findPartialsWithStyleModifiers(pattern); - }, - find_pattern_partials_with_parameters: function(pattern){ - return findPartialsWithPatternParameters(pattern); - }, - find_list_items: function(pattern){ - return findListItems(pattern) - }, - setPatternState: function(pattern, patternlab){ - setState(pattern, patternlab); - }, - addPattern: function(pattern, patternlab){ - addPattern(pattern, patternlab); - }, - renderPattern: function(template, data, partials){ - return renderPattern(template, data, partials); - }, - process_pattern_iterative: function(file, patternlab){ - processPatternIterative(file, patternlab); - }, - process_pattern_recursive: function(file, patternlab, startFile){ - processPatternRecursive(file, patternlab, startFile); - }, - get_pattern_by_key: function(key, patternlab){ - return getpatternbykey(key, patternlab); - }, - merge_data: function(existingData, newData){ - return mergeData(existingData, newData); - }, - traverse_data: function(dataObj, callback){ - return traverseData(dataObj, callback); - }, - combine_listItems: function(patternlab){ - buildListItems(patternlab); - }, - is_object_empty: function(obj){ - return isObjectEmpty(obj); - }, - parse_data_links: function(patternlab){ - parseDataLinks(patternlab); - } - }; +}; module.exports = pattern_assembler; diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 2c18bc93a..6b0e1315d 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -86,6 +86,26 @@ var patternlab_engine = function (config) { patternlab.dataKeys = patternlab.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); + //set user defined head and foot if they exist + try { + patternlab.userHead = pattern_assembler.get_pattern_by_key('atoms-head', patternlab); + } + catch (ex) { + if (patternlab.config.debug) { + console.log(ex); + console.log('Could not find optional user-defined header, atoms-head pattern. It was likely deleted.'); + } + } + try { + patternlab.userFoot = pattern_assembler.get_pattern_by_key('atoms-foot', patternlab); + } + catch (ex) { + if (patternlab.config.debug) { + console.log(ex); + console.log('Could not find optional user-defined footer, atoms-foot pattern. It was likely deleted.'); + } + } + //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -101,6 +121,9 @@ var patternlab_engine = function (config) { patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); + //cascade any patternStates + lineage_hunter.cascade_pattern_states(patternlab); + //delete the contents of config.patterns.public before writing if (deletePatternDir) { fs.emptyDirSync(paths.public.patterns); From fbdb9b6ea3082561ef9e9fd4e3ad86eadc14970f Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 29 Mar 2016 06:55:58 -0400 Subject: [PATCH 140/162] updating pattern_assembler.js --- builder/pattern_assembler.js | 768 ---------------------------------- core/lib/pattern_assembler.js | 699 +++++++++++++++++++++++-------- 2 files changed, 536 insertions(+), 931 deletions(-) delete mode 100644 builder/pattern_assembler.js diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js deleted file mode 100644 index a35890bdd..000000000 --- a/builder/pattern_assembler.js +++ /dev/null @@ -1,768 +0,0 @@ -/* - * patternlab-node - v1.2.0 - 2016 - * - * Brian Muenzenmeyer, and the web community. - * Licensed under the MIT license. - * - * Many thanks to Brad Frost and Dave Olsen for inspiration, encouragement, and advice. - * - */ - -"use strict"; - -var pattern_assembler = function () { - - // find regex matches within both pattern strings and pattern objects. - function patternMatcher(pattern, regex) { - var matches; - - if (typeof pattern === 'string') { - matches = pattern.match(regex); - } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(regex); - } - - return matches; - } - - // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern - function findPartialsWithStyleModifiers(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g; - var matches = patternMatcher(pattern, regex); - - return matches; - } - - // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern - function findPartialsWithPatternParameters(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g; - var matches = patternMatcher(pattern, regex); - - return matches; - } - - //find and return any {{> template-name* }} within pattern - function findPartials(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g; - var matches = patternMatcher(pattern, regex); - - return matches; - } - - function findListItems(pattern) { - var regex = /({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g; - var matches = patternMatcher(pattern, regex); - - return matches; - } - - function setState(pattern, patternlab) { - if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]) { - pattern.patternState = patternlab.config.patternStates[pattern.patternName]; - } else { - pattern.patternState = ""; - } - } - - function addPattern(pattern, patternlab) { - //add the link to the global object - patternlab.data.link[pattern.patternGroup + '-' + pattern.patternName] = '/patterns/' + pattern.patternLink; - - //only push to array if the array doesn't contain this pattern - var isNew = true, i; - for (i = 0; i < patternlab.patterns.length; i++) { - //so we need the identifier to be unique, which patterns[i].abspath is - if (pattern.abspath === patternlab.patterns[i].abspath) { - //if abspath already exists, overwrite that element - patternlab.patterns[i] = pattern; - isNew = false; - break; - } - } - - //if the pattern is new, just push to the array - if (isNew) { - patternlab.patterns.push(pattern); - } - } - - function renderPattern(template, data, partials) { - var hogan = require('hogan'); - var compiled = hogan.compile(template); - - if (partials) { - return compiled.render(data, partials); - } else { - return compiled.render(data); - } - } - - //http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript - function shuffle(o) { - for (var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); //eslint-disable-line curly - return o; - } - - function buildListItems(container) { - //combine all list items into one structure - var list = []; - for (var item in container.listitems) { - if (container.listitems.hasOwnProperty(item)) { - list.push(container.listitems[item]); - } - } - container.listItemArray = shuffle(list); - - for (var i = 1; i <= container.listItemArray.length; i++) { - var tempItems = []; - if (i === 1) { - tempItems.push(container.listItemArray[0]); - container.listitems['' + i] = tempItems; - } else { - for (var c = 1; c <= i; c++) { - tempItems.push(container.listItemArray[c - 1]); - container.listitems['' + i] = tempItems; - } - } - } - } - - /** - * 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 getpatternbykey(key, patternlab) { - var i; // for the for loops - - for (i = 0; i < patternlab.patterns.length; i++) { - switch (key) { - - //look for exact key matches - case patternlab.patterns[i].key: - - //look for abspath matches - case patternlab.patterns[i].abspath: - - //else look by verbose syntax - case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName: - case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': - return patternlab.patterns[i]; - } - - //return the fuzzy match if all else fails - var keyParts = key.split('-'), - keyType = keyParts[0], - keyName = keyParts.slice(1).join('-'); - - if (patternlab.patterns[i].key.split('-')[0] === keyType && patternlab.patterns[i].key.indexOf(keyName) > -1) { - return patternlab.patterns[i]; - } - } - - return null; - } - - /** - * Merge the properties of two JSON objects, with the 2nd taking priority over - * the 1st when the same property key exists for both. - * - * @param {object} obj1 - * @param {object} obj2 If obj2 is null or undefined, be sure to make an - * assignment to the output of this function. In other cases, obj2 get - * mutated, and no assignment is necessary. - * @returns {object} obj2 The mutated obj2 object. - */ - function mergeData(obj1, obj2) { - obj2 = obj2 || {}; //eslint-disable-line no-param-reassign - - for (var p in obj1) { //eslint-disable-line guard-for-in - try { - // Only recurse if obj1[p] is an object. - if (obj1[p].constructor === Object) { - // Requires 2 objects as params; create obj2[p] if undefined. - if (typeof obj2[p] === 'undefined') { - obj2[p] = {}; - } - obj2[p] = mergeData(obj1[p], obj2[p]); - - // Pop when recursion meets a non-object. If obj1[p] is a non-object, - // only copy to undefined obj2[p]. This way, obj2 maintains priority. - } else if (typeof obj2[p] === 'undefined') { - obj2[p] = obj1[p]; - } - } catch (e) { - // Property in destination object not set; create it and set its value. - if (typeof obj2[p] === 'undefined') { - obj2[p] = obj1[p]; - } - } - } - return obj2; - } - - function parseDataLinksHelper(patternlab, obj, key) { - var JSON = require('json5'); - var linkRE, dataObjAsString, linkMatches, expandedLink; - - linkRE = /link\.[A-z0-9-_]+/g; - dataObjAsString = JSON.stringify(obj); - linkMatches = dataObjAsString.match(linkRE); - - if (linkMatches) { - for (var i = 0; i < linkMatches.length; i++) { - expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; - if (expandedLink) { - if (patternlab.config.debug) { - console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); - } - dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); - } - } - } - - var dataObj; - try { - dataObj = JSON.parse(dataObjAsString); - } catch (err) { - console.log('There was an error parsing JSON for ' + key); - console.log(err); - } - - return dataObj; - } - - //look for pattern links included in data files. - //these will be in the form of link.* WITHOUT {{}}, which would still be there from direct pattern inclusion - function parseDataLinks(patternlab) { - //look for link.* such as link.pages-blog as a value - - patternlab.data = parseDataLinksHelper(patternlab, patternlab.data, 'data.json'); - - //loop through all patterns - for (var i = 0; i < patternlab.patterns.length; i++) { - patternlab.patterns[i].jsonFileData = parseDataLinksHelper(patternlab, patternlab.patterns[i].jsonFileData, patternlab.patterns[i].key); - } - } - - function outputPatternToFS(pattern, patternlab) { - var fs = require('fs-extra'); - var he = require('html-entities').AllHtmlEntities; - var entity_encoder = new he(); - var paths = patternlab.config.paths; - var patternFooter; - - pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); - - //render the extendedTemplate with all data - pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); - - //add footer info before writing - patternFooter = renderPattern(patternlab.footer, pattern); - - //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.patternPartial + patternFooter); - - //write the mustache file too - fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); - - //write the encoded version too - fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); - - //since we're done with these pattern properties, free them from memory - pattern.extendedTemplate = ''; - pattern.template = ''; - pattern.tmpTemplate = ''; - pattern.dataKeys = null; - pattern.listitems = null; - pattern.listitemsRaw = null; - - if (pattern.jsonFileData !== patternlab.data) { - pattern.jsonFileData = null; - } - } - - /** - * Render the template excluding partials. The reason for this is to eliminate - * the unwanted recursion paths that would remain if irrelevant conditional - * tags persisted. Targeting non-partial tags that are not keyed in the JSON - * data for this pattern. Those will be deleted after this runs. - * - * @param {string|null} template The template to winnow and render or null if - * setting up the pattern.escapedTemplate property. - * @param {object} data The data to render with. - * @param {object} dataKeys The data to render with. - * @returns {string} templateWinnowed - */ - function winnowUnusedTags(template, pattern, patternlab) { - var dataKeys; - var escapedKeys; - var i; - var regex; - var templateEscaped; - var templateWinnowed; - - if (template === null) { - dataKeys = patternlab.dataKeys; - templateEscaped = pattern.template; - } else { - dataKeys = pattern.dataKeys; - templateEscaped = template; - } - - //escaped all tags that match keys in the JSON data. - //it can be 10% faster to process large dataKeys arrays in one read with a - //large regex than to read many timesi and process with small regexes. - if (dataKeys.length) { - escapedKeys = '('; - for (i = 0; i < dataKeys.length; i++) { - escapedKeys += dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - if (i < dataKeys.length - 1) { - escapedKeys += '|'; - } - } - escapedKeys += ')'; - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKeys + '\\s*\\}?)\\}\\}', 'g'); - templateEscaped = templateEscaped.replace(regex, '<%$1%>'); - } - - //escape partial tags by switching them to ERB syntax. - templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - - //removing empty lines for some reason reduced rendering time considerably. - templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); - - if (template === null) { - pattern.escapedTemplate = templateEscaped; - - } else { - - //render to winnow unused tags. - templateWinnowed = renderPattern(templateEscaped, pattern.jsonFileData); - } - - //after that's done, switch only partial tags back to standard Mustache tags and return. - if (templateWinnowed) { - templateWinnowed = templateWinnowed.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - } - - return templateWinnowed; - } - - function processPatternIterative(file, patternlab) { - var fs = require('fs-extra'), - lh = require('./lineage_hunter'), - lineage_hunter = new lh(), - of = require('./object_factory'), - path = require('path'); - - //extract some information - var subdir = path.dirname(path.relative(patternlab.config.paths.source.patterns, file)).replace('\\', '/'); - var filename = path.basename(file); - var ext = path.extname(filename); - - //ignore dotfiles, underscored files, and non-variant .json files - if(filename.charAt(0) === '.' || (ext === '.json' && filename.indexOf('~') === -1)){ - return; - } - - //make a new Pattern Object - var currentPattern = new of.oPattern(file, subdir, filename); - - //see if this file has a state - setState(currentPattern, patternlab); - - //if file is named in the syntax for variants, add the variant data to memory. - //processPatternRecursive() will run find_pseudopatterns() to render with the variant data. - if (ext === '.json' && filename.indexOf('~') > -1) { - try { - currentPattern.patternName = currentPattern.patternName.replace('~', '-'); - currentPattern.jsonFileData = fs.readJSONSync(file); - addPattern(currentPattern, patternlab); - } catch (err) { - console.log(err); - } - return; - } - - //can ignore all non-mustache files at this point - if(ext !== '.mustache'){ - return; - } - - //add the raw template to memory - currentPattern.template = fs.readFileSync(file, 'utf8'); - - //define tmpTemplate and listitems to avoid undefined type errors - //trying to keep memory footprint small, so set it empty at first - currentPattern.tmpTemplate = ''; - - //needs to be empty object so buildListItems can work - currentPattern.listitems = {}; - - //needs to be null so list_item_hunter.process_list_item_partials can work - currentPattern.listitemsRaw = null; - - //needs to be initialized as {} so winnowUnusedTags can work - currentPattern.jsonFileData = {}; - - //this writes currentPattern.escapedTemplate which needs to be initialized - winnowUnusedTags(null, currentPattern, patternlab); - - //do the same with extendedTemplate - //skip this on underscore prefixed files, as they don't use extendedTemplate - //and since it will need to skip in processPatternRecursive - if (filename.charAt(0) !== '_') { - currentPattern.extendedTemplate = ''; - } - - //find pattern lineage - //TODO: consider repurposing lineage hunter. it currently only works at the - //iterative level, and isn't called upon any further. however, it could be - //repurposed to target and render only those files affected by a template edit. - //this could bring an enormous performance improvement on large projects. - lineage_hunter.find_lineage(currentPattern, patternlab); - - //add currentPattern to patternlab.patterns array - addPattern(currentPattern, patternlab); - } - - /** - * Recurse through patternlab object as necessitated by partial inclusions. - * Build out the final output for writing to the public/patterns directory. - * - * @param {string} file The abspath of pattern being processed. - * @param {object} patternlab The patternlab object. - * @param {number|undefined} recursionLevel Top level === 0. Increments by 1 after that. - * @param {object|undefined} currentPatternAsParam Only submitted on recursionLevel > 0. - * @param {boolean|undefined} test When unit testing, pass in true to not output to file system. - */ - function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { - var fs = require('fs-extra'), - glob = require('glob'), - JSON = require('json5'), - path = require('path'); - - var ph = require('./parameter_hunter'), - pph = require('./pseudopattern_hunter'), - lih = require('./list_item_hunter'), - smh = require('./style_modifier_hunter'); - - var parameter_hunter = new ph(), - list_item_hunter = new lih(), - style_modifier_hunter = new smh(), - pseudopattern_hunter = new pph(); - - var currentPattern; - var i; // for the for loops - var paths = patternlab.config.paths; - - if (!recursionLevel) { - - //find current pattern in patternlab object using var file as a key - currentPattern = getpatternbykey(file, patternlab); - - //return if processing an ignored file - if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { - return; - } - - //output .json pseudoPattern variants to the file system and return. - //diveSync should process these variants after their originals, given that - //tildes come after periods in ASCII order. as such, their extendedTemplates - //should be filled out and renderable. - if (path.extname(file) === '.json') { - if (!test) { - outputPatternToFS(currentPattern, patternlab); - } - return; - } - - //continue with regular mustache templates - //look for a json file for this template - var jsonFilename; - var localJsonString; - - //localData will get overwritten by mergeData, so keep it scoped to this function. - var localData = null; - - try { - - //check if there is json data local to this pattern - jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; - - //if so, load it into memory as a string (to create 2 non-referencing objects). - localJsonString = fs.readFileSync(jsonFilename); - - if (patternlab.config.debug) { - console.log('found pattern-specific data.json for ' + currentPattern.key); - } - } catch (err) { - - //do nothing - } - - //set currentPattern.jsonFileData - if (localJsonString) { - try { - localData = JSON.parse(localJsonString); - currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); - } catch (err) { - console.log('There was an error parsing JSON for ' + file); - console.log(err); - } - - //if this pattern doesn't have a local .json file, save - //CPU steps by just creating a reference to the patternlab.data object. - } else { - currentPattern.jsonFileData = patternlab.data; - } - - var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; - var pseudoPatternFiles = glob.sync(needle, { - cwd: paths.source.patterns, - debug: false, - nodir: true - }); - var pseudoPatternsArray = []; - var pseudoPattern; - - if (pseudoPatternFiles.length) { - - for (i = 0; i < pseudoPatternFiles.length; i++) { - pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); - if (pseudoPattern) { - pseudoPatternsArray.push(pseudoPattern); - - //update the localData object. - //pseudoPattern.jsonFileData set in processPatternIterative. - mergeData(pseudoPattern.jsonFileData, localData); - } - } - } - - var hasLocalListItems = false; - var listJsonFileName; - try { - var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); - hasLocalListItems = fs.statSync(listJsonFileName); - } catch (err) { - - //do nothing - } - if (hasLocalListItems) { - try { - currentPattern.listitems = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); - currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); - buildListItems(currentPattern); - - if (patternlab.config.debug) { - console.log('found pattern-specific listitems.json for ' + currentPattern.key); - } - } catch (err) { - - //to troubleshoot malformed json - console.log(err); - } - } - - currentPattern.extendedTemplate = currentPattern.template; - - //add localData keys to currentPattern.dataKeys - currentPattern.dataKeys = getDataKeys(localData, []); - - //add merged listitem keys to currentPattern.dataKeys - if (currentPattern.listitems) { - currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); - } - - //set currentPattern for recursionLevel > 0 - } else { - currentPattern = currentPatternAsParam; - } - - //find parametered partials - var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); - - //if the template contains any pattern parameters, recurse through them - if (parameteredPartials && parameteredPartials.length) { - if (patternlab.config.debug) { - console.log('found parametered partials for ' + currentPattern.key); - } - - if (!recursionLevel && currentPattern.extendedTemplate === currentPattern.template) { - currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); - } - - //recursively render currentPattern.extendedTemplate via parameter_hunter.find_parameters() - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - - //recurse, going a level deeper, with each render eliminating nested parameteredPartials - //when there are no more nested parameteredPartials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel ? recursionLevel + 1 : 1, currentPattern); - } - - //find non-parametered partials. - var foundPatternPartials = findPartials(currentPattern.extendedTemplate); - var uniquePartials = []; - - //recurse through non-parametered partials - if (foundPatternPartials && foundPatternPartials.length) { - if (patternlab.config.debug) { - console.log('found partials for ' + currentPattern.key); - } - - //copy winnowed template to extendedTemplate - if (!recursionLevel && currentPattern.extendedTemplate === currentPattern.template) { - currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); - } - - for (i = 0; i < foundPatternPartials.length; i++) { - - //limit iteration to one time per partial. eliminate duplicates. - if (uniquePartials.indexOf(foundPatternPartials[i]) === -1) { - uniquePartials.push(foundPatternPartials[i]); - } else { - continue; - } - - var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); - - //identify which pattern this partial corresponds to - var partialPattern = getpatternbykey(partialKey, patternlab); - - if (!partialPattern) { - throw 'Could not find pattern with key ' + partialKey; - } else { - partialPattern.tmpTemplate = partialPattern.escapedTemplate; - - //if the current tag has styleModifier data, replace the styleModifier value in the partial - if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { - style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); - } - - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); - - partialPattern.tmpTemplate = winnowedPartial; - - //replace each partial tag with the partial's template. - //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters - var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - var regex = new RegExp(escapedPartial, 'g'); - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - - //free tmpTemplate from memory. - partialPattern.tmpTemplate = ''; - } - } - - //recurse, going a level deeper, with each render eliminating nested partials - //when there are no more nested partials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel ? recursionLevel + 1 : 1, currentPattern); - } - - //do only when popped back to the top level of recursion - if (!recursionLevel) { - if (currentPattern.extendedTemplate !== currentPattern.template) { - //switch ERB escaped tags back to standard Mustache tags - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); - } - - //find and process any listItem blocks within the pattern - list_item_hunter.process_list_item_partials(currentPattern, patternlab); - - //look through pseudoPatternsArray again, and update their patternlab objects - if (pseudoPatternsArray.length) { - pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); - } - - //output rendered pattern to the file system - if (!test) { - outputPatternToFS(currentPattern, patternlab); - } - - //unset all tmpTemplates - for (i = 0; i < patternlab.patterns.length; i++) { - patternlab.patterns[i].tmpTemplate = ''; - } - } - } - - return { - find_pattern_partials: function (pattern) { - return findPartials(pattern); - }, - find_pattern_partials_with_style_modifiers: function (pattern) { - return findPartialsWithStyleModifiers(pattern); - }, - find_pattern_partials_with_parameters: function (pattern) { - return findPartialsWithPatternParameters(pattern); - }, - find_list_items: function (pattern) { - return findListItems(pattern); - }, - setPatternState: function (pattern, patternlab) { - setState(pattern, patternlab); - }, - addPattern: function (pattern, patternlab) { - addPattern(pattern, patternlab); - }, - renderPattern: function (template, data, partials) { - return renderPattern(template, data, partials); - }, - combine_listItems: function (patternlab) { - buildListItems(patternlab); - }, - get_data_keys: function (data, uniqueKeys) { - return getDataKeys(data, uniqueKeys); - }, - get_pattern_by_key: function (key, patternlab) { - return getpatternbykey(key, patternlab); - }, - merge_data: function (existingData, newData) { - return mergeData(existingData, newData); - }, - parse_data_links_helper: function (patternlab, obj, key) { - return parseDataLinksHelper(patternlab, obj, key); - }, - parse_data_links: function (patternlab) { - parseDataLinks(patternlab); - }, - winnow_unused_tags: function (template, pattern) { - return winnowUnusedTags(template, pattern); - }, - process_pattern_iterative: function (file, patternlab) { - processPatternIterative(file, patternlab); - }, - - //only submit all 5 params within the function itself and in unit tests. - //when calling outside of these circumstances, only submit file and patternlab. - process_pattern_recursive: function (file, patternlab, recursionLevel, currentPatternAsParam, test) { - processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test); - } - }; - -}; - -module.exports = pattern_assembler; diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 869b1986c..6a4f919ac 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -12,32 +12,53 @@ var pattern_assembler = function () { + // find regex matches within both pattern strings and pattern objects. + function patternMatcher(pattern, regex) { + var matches; + + if (typeof pattern === 'string') { + matches = pattern.match(regex); + } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { + matches = pattern.template.match(regex); + } + + return matches; + } + // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithStyleModifiers(pattern) { - var matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + var regex = /{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithPatternParameters(pattern) { - var matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); + var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } //find and return any {{> template-name* }} within pattern function findPartials(pattern) { - var matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); + var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } function findListItems(pattern) { - var matches = pattern.template.match(/({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g); + var regex = /({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } function setState(pattern, patternlab) { - if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.key]) { - pattern.patternState = patternlab.config.patternStates[pattern.key]; + if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]) { + pattern.patternState = patternlab.config.patternStates[pattern.patternName]; } else { pattern.patternState = ""; } @@ -54,7 +75,6 @@ var pattern_assembler = function () { if (pattern.abspath === patternlab.patterns[i].abspath) { //if abspath already exists, overwrite that element patternlab.patterns[i] = pattern; - patternlab.partials[pattern.key] = pattern.extendedTemplate || pattern.template; isNew = false; break; } @@ -63,17 +83,17 @@ var pattern_assembler = function () { //if the pattern is new, just push to the array if (isNew) { patternlab.patterns.push(pattern); - patternlab.partials[pattern.key] = pattern.extendedTemplate || pattern.template; } } function renderPattern(template, data, partials) { - var mustache = require('mustache'); + var hogan = require('hogan'); + var compiled = hogan.compile(template); if (partials) { - return mustache.render(template, data, partials); + return compiled.render(data, partials); } else { - return mustache.render(template, data); + return compiled.render(data); } } @@ -107,19 +127,45 @@ var pattern_assembler = function () { } } - function getpatternbykey(key, patternlab) { - var i; // for the for loops - - //look for exact key matches - for (i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].key === key) { - return patternlab.patterns[i]; + /** + * 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); + } } } - //else look by verbose syntax + return uniqueKeys; + } + + function getpatternbykey(key, patternlab) { + var i; // for the for loops + for (i = 0; i < patternlab.patterns.length; i++) { switch (key) { + + //look for exact key matches + case patternlab.patterns[i].key: + + //look for abspath matches + case patternlab.patterns[i].abspath: + + //else look by verbose syntax case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName: case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': return patternlab.patterns[i]; @@ -136,11 +182,217 @@ var pattern_assembler = function () { return patternlab.patterns[i]; } } - throw 'Could not find pattern with key ' + key; + + return null; + } + + /** + * Merge the properties of two JSON objects, with the 2nd taking priority over + * the 1st when the same property key exists for both. + * + * @param {object} obj1 + * @param {object} obj2 If obj2 is null or undefined, be sure to make an + * assignment to the output of this function. In other cases, obj2 get + * mutated, and no assignment is necessary. + * @returns {object} obj2 The mutated obj2 object. + */ + function mergeData(obj1, obj2) { + obj2 = obj2 || {}; //eslint-disable-line no-param-reassign + + for (var p in obj1) { //eslint-disable-line guard-for-in + try { + // Only recurse if obj1[p] is an object. + if (obj1[p].constructor === Object) { + // Requires 2 objects as params; create obj2[p] if undefined. + if (typeof obj2[p] === 'undefined') { + obj2[p] = {}; + } + obj2[p] = mergeData(obj1[p], obj2[p]); + + // Pop when recursion meets a non-object. If obj1[p] is a non-object, + // only copy to undefined obj2[p]. This way, obj2 maintains priority. + } else if (typeof obj2[p] === 'undefined') { + obj2[p] = obj1[p]; + } + } catch (e) { + // Property in destination object not set; create it and set its value. + if (typeof obj2[p] === 'undefined') { + obj2[p] = obj1[p]; + } + } + } + return obj2; + } + + function parseDataLinksHelper(patternlab, obj, key) { + var JSON = require('json5'); + var linkRE, dataObjAsString, linkMatches, expandedLink; + + linkRE = /link\.[A-z0-9-_]+/g; + dataObjAsString = JSON.stringify(obj); + linkMatches = dataObjAsString.match(linkRE); + + if (linkMatches) { + for (var i = 0; i < linkMatches.length; i++) { + expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; + if (expandedLink) { + if (patternlab.config.debug) { + console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); + } + dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); + } + } + } + + var dataObj; + try { + dataObj = JSON.parse(dataObjAsString); + } catch (err) { + console.log('There was an error parsing JSON for ' + key); + console.log(err); + } + + return dataObj; + } + + //look for pattern links included in data files. + //these will be in the form of link.* WITHOUT {{}}, which would still be there from direct pattern inclusion + function parseDataLinks(patternlab) { + //look for link.* such as link.pages-blog as a value + + patternlab.data = parseDataLinksHelper(patternlab, patternlab.data, 'data.json'); + + //loop through all patterns + for (var i = 0; i < patternlab.patterns.length; i++) { + patternlab.patterns[i].jsonFileData = parseDataLinksHelper(patternlab, patternlab.patterns[i].jsonFileData, patternlab.patterns[i].key); + } + } + + function outputPatternToFS(pattern, patternlab) { + var fs = require('fs-extra'); + var he = require('html-entities').AllHtmlEntities; + var entity_encoder = new he(); + var paths = patternlab.config.paths; + var patternFooter; + + pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); + + //render the extendedTemplate with all data + pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); + + //add footer info before writing + patternFooter = renderPattern(patternlab.footer, pattern); + + //write the compiled template to the public patterns directory + fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.patternPartial + patternFooter); + + //write the mustache file too + fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); + + //write the encoded version too + fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); + + //since we're done with these pattern properties, free them from memory + pattern.extendedTemplate = ''; + pattern.template = ''; + pattern.tmpTemplate = ''; + pattern.dataKeys = null; + pattern.listitems = null; + pattern.listitemsRaw = null; + + if (pattern.jsonFileData !== patternlab.data) { + pattern.jsonFileData = null; + } + } + + /** + * Render the template excluding partials. The reason for this is to eliminate + * the unwanted recursion paths that would remain if irrelevant conditional + * tags persisted. Targeting non-partial tags that are not keyed in the JSON + * data for this pattern. Those will be deleted after this runs. + * + * @param {string|null} template The template to winnow and render or null if + * setting up the pattern.escapedTemplate property. + * @param {object} data The data to render with. + * @param {object} dataKeys The data to render with. + * @returns {string} templateWinnowed + */ + function winnowUnusedTags(template, pattern, patternlab) { + var dataKeys; + var escapedKeys; + var i; + var regex; + var templateEscaped; + var templateWinnowed; + + if (template === null) { + dataKeys = patternlab.dataKeys; + templateEscaped = pattern.template; + } else { + dataKeys = pattern.dataKeys; + templateEscaped = template; + } + + //escaped all tags that match keys in the JSON data. + //it can be 10% faster to process large dataKeys arrays in one read with a + //large regex than to read many times and process with small regexes. + if (dataKeys.length) { + escapedKeys = '('; + for (i = 0; i < dataKeys.length; i++) { + escapedKeys += dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + if (i < dataKeys.length - 1) { + escapedKeys += '|'; + } + } + escapedKeys += ')'; + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKeys + '\\s*\\}?)\\}\\}', 'g'); + templateEscaped = templateEscaped.replace(regex, '<%$1%>'); + } + + //escape partial tags by switching them to ERB syntax. + //first, escape anything in the template that looks like closing ERB tags. + //the Pattern Lab docs do not forbid them, so it shouldn't be on users to + //avoid them, however extreme an edge case it may be. + templateEscaped = templateEscaped.replace(/%>/g, '\\u0025\\u003E'); + + //next, account for the fact that curly braces might be submitted as param values. + //however, ')}}' or any spaced variant should NEVER be submitted as param values + //enclosed in quotes or otherwise. It is not valid JSON, and if it's to be rendered + //as HTML, it should be via HTML entities. while this is not explicitly forbidden + //in the Pattern Lab docs, it can be inferred that it is forbidden after users see + //resulting rendering errors. + templateEscaped = templateEscaped.replace(/\{\{>([^\}]+(?:\((.|\s)*?\))\s*)\}\}/g, '<%>$1%>'); + + //in all other cases, curly braces should not be part of filenames or non-string param values. + templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + + //removing empty lines for some reason reduces rendering time considerably. + templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); + + if (template === null) { + pattern.escapedTemplate = templateEscaped; + + } else { + + //render to winnow unused tags. + templateWinnowed = renderPattern(templateEscaped, pattern.jsonFileData); + } + + //after that's done, switch only partial tags back to standard Mustache tags and return. + if (templateWinnowed) { + templateWinnowed = templateWinnowed.replace(/<%>((.|\s)*?)%>/g, '{{>$1}}'); + + //also unescape escaped closing ERB tags + templateWinnowed = templateWinnowed.replace(/\\u0025\\u003E/g, '%>'); + } + + return templateWinnowed; } function processPatternIterative(file, patternlab) { var fs = require('fs-extra'), + lh = require('./lineage_hunter'), + lineage_hunter = new lh(), of = require('./object_factory'), path = require('path'); @@ -157,9 +409,19 @@ var pattern_assembler = function () { //make a new Pattern Object var currentPattern = new of.oPattern(file, subdir, filename); - //if file is named in the syntax for variants, no need to process further - //processPatternRecursive() will run find_pseudopatterns() and look at each pattern for a variant + //see if this file has a state + setState(currentPattern, patternlab); + + //if file is named in the syntax for variants, add the variant data to memory. + //processPatternRecursive() will run find_pseudopatterns() to render with the variant data. if (ext === '.json' && filename.indexOf('~') > -1) { + try { + currentPattern.patternName = currentPattern.patternName.replace('~', '-'); + currentPattern.jsonFileData = fs.readJSONSync(file); + addPattern(currentPattern, patternlab); + } catch (err) { + console.log(err); + } return; } @@ -168,200 +430,301 @@ var pattern_assembler = function () { return; } - //see if this file has a state - setState(currentPattern, patternlab); + //add the raw template to memory + currentPattern.template = fs.readFileSync(file, 'utf8'); - //look for a json file for this template - try { - var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); - currentPattern.jsonFileData = fs.readJSONSync(jsonFilename); - if (patternlab.config.debug) { - console.log('found pattern-specific data.json for ' + currentPattern.key); - } - } - catch (error) { - // do nothing - } + //define tmpTemplate and listitems to avoid undefined type errors + //trying to keep memory footprint small, so set it empty at first + currentPattern.tmpTemplate = ''; - //look for a listitems.json file for this template - try { - var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".listitems.json"); - currentPattern.listitems = fs.readJSONSync(listJsonFileName); - buildListItems(currentPattern); - if (patternlab.config.debug) { - console.log('found pattern-specific listitems.json for ' + currentPattern.key); - } - } - catch (err) { - // do nothing - } + //needs to be empty object so buildListItems can work + currentPattern.listitems = {}; - //add the raw template to memory - currentPattern.template = fs.readFileSync(file, 'utf8'); + //needs to be null so list_item_hunter.process_list_item_partials can work + currentPattern.listitemsRaw = null; + + //needs to be initialized as {} so winnowUnusedTags can work + currentPattern.jsonFileData = {}; - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + //this writes currentPattern.escapedTemplate which needs to be initialized + winnowUnusedTags(null, currentPattern, patternlab); + + //do the same with extendedTemplate + //skip this on underscore prefixed files, as they don't use extendedTemplate + //and since it will need to skip in processPatternRecursive + if (filename.charAt(0) !== '_') { + currentPattern.extendedTemplate = ''; + } - //find any pattern parameters that may be in the current pattern - currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); + //find pattern lineage + //TODO: consider repurposing lineage hunter. it currently only works at the + //iterative level, and isn't called upon any further. however, it could be + //repurposed to target and render only those files affected by a template edit. + //this could bring an enormous performance improvement on large projects. + lineage_hunter.find_lineage(currentPattern, patternlab); //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } - function processPatternRecursive(file, patternlab) { - var lh = require('./lineage_hunter'), - ph = require('./parameter_hunter'), + /** + * Recurse through patternlab object as necessitated by partial inclusions. + * Build out the final output for writing to the public/patterns directory. + * + * @param {string} file The abspath of pattern being processed. + * @param {object} patternlab The patternlab object. + * @param {number|undefined} recursionLevel Top level === 0. Increments by 1 after that. + * @param {object|undefined} currentPatternAsParam Only submitted on recursionLevel > 0. + * @param {boolean|undefined} test When unit testing, pass in true to not output to file system. + */ + function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { + var fs = require('fs-extra'), + glob = require('glob'), + JSON = require('json5'), + path = require('path'); + + var ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), lih = require('./list_item_hunter'), smh = require('./style_modifier_hunter'); var parameter_hunter = new ph(), - lineage_hunter = new lh(), list_item_hunter = new lih(), style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); - //find current pattern in patternlab object using var file as a key - var currentPattern, - i; + var currentPattern; + var i; // for the for loops + var paths = patternlab.config.paths; - for (i = 0; i < patternlab.patterns.length; i++) { - if (patternlab.patterns[i].abspath === file) { - currentPattern = patternlab.patterns[i]; - break; + if (!recursionLevel) { + + //find current pattern in patternlab object using var file as a key + currentPattern = getpatternbykey(file, patternlab); + + //return if processing an ignored file + if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { + return; } - } - //return if processing an ignored file - if (typeof currentPattern === 'undefined') { - return; - } + //output .json pseudoPattern variants to the file system and return. + //diveSync should process these variants after their originals, given that + //tildes come after periods in ASCII order. as such, their extendedTemplates + //should be filled out and renderable. + if (path.extname(file) === '.json') { + if (!test) { + outputPatternToFS(currentPattern, patternlab); + } + return; + } - currentPattern.extendedTemplate = currentPattern.template; + //continue with regular mustache templates + //look for a json file for this template + var jsonFilename; + var localJsonString; - //find how many partials there may be for the given pattern - var foundPatternPartials = findPartials(currentPattern); + //localData will get overwritten by mergeData, so keep it scoped to this function. + var localData = null; - if (foundPatternPartials !== null && foundPatternPartials.length > 0) { + try { - if (patternlab.config.debug) { - console.log('found partials for ' + currentPattern.key); - } + //check if there is json data local to this pattern + jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; - //find any listItem blocks - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + //if so, load it into memory as a string (to create 2 non-referencing objects). + localJsonString = fs.readFileSync(jsonFilename); - //determine if the template contains any pattern parameters. if so they must be immediately consumed - parameter_hunter.find_parameters(currentPattern, patternlab); + if (patternlab.config.debug) { + console.log('found pattern-specific data.json for ' + currentPattern.key); + } + } catch (err) { - //do something with the regular old partials - for (i = 0; i < foundPatternPartials.length; i++) { - var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); + //do nothing + } - var partialPath; + //set currentPattern.jsonFileData + if (localJsonString) { + try { + localData = JSON.parse(localJsonString); + currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); + } catch (err) { + console.log('There was an error parsing JSON for ' + file); + console.log(err); + } - //identify which pattern this partial corresponds tou - for (var j = 0; j < patternlab.patterns.length; j++) { - if (patternlab.patterns[j].key === partialKey || - patternlab.patterns[j].abspath.indexOf(partialKey) > -1) { - partialPath = patternlab.patterns[j].abspath; + //if this pattern doesn't have a local .json file, save + //CPU steps by just creating a reference to the patternlab.data object. + } else { + currentPattern.jsonFileData = patternlab.data; + } + + var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; + var pseudoPatternFiles = glob.sync(needle, { + cwd: paths.source.patterns, + debug: false, + nodir: true + }); + var pseudoPatternsArray = []; + var pseudoPattern; + + if (pseudoPatternFiles.length) { + + for (i = 0; i < pseudoPatternFiles.length; i++) { + pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); + if (pseudoPattern) { + pseudoPatternsArray.push(pseudoPattern); + + //update the localData object. + //pseudoPattern.jsonFileData set in processPatternIterative. + mergeData(pseudoPattern.jsonFileData, localData); } } + } - //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPath, patternlab); + var hasLocalListItems = false; + var listJsonFileName; + try { + var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); + hasLocalListItems = fs.statSync(listJsonFileName); + } catch (err) { - //complete assembly of extended template - var partialPattern = getpatternbykey(partialKey, patternlab); + //do nothing + } + if (hasLocalListItems) { + try { + currentPattern.listitems = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); + currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); + buildListItems(currentPattern); - //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); + if (patternlab.config.debug) { + console.log('found pattern-specific listitems.json for ' + currentPattern.key); + } + } catch (err) { + + //to troubleshoot malformed json + console.log(err); } + } - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); + currentPattern.extendedTemplate = currentPattern.template; - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; + //add localData keys to currentPattern.dataKeys + currentPattern.dataKeys = getDataKeys(localData, []); + + //add merged listitem keys to currentPattern.dataKeys + if (currentPattern.listitems) { + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); } + //set currentPattern for recursionLevel > 0 } else { - //find any listItem blocks that within the pattern, even if there are no partials - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + currentPattern = currentPatternAsParam; } - //find pattern lineage - lineage_hunter.find_lineage(currentPattern, patternlab); + //find parametered partials + var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); - //add to patternlab object so we can look these up later. - addPattern(currentPattern, patternlab); + //if the template contains any pattern parameters, recurse through them + if (parameteredPartials && parameteredPartials.length) { + if (patternlab.config.debug) { + console.log('found parametered partials for ' + currentPattern.key); + } - //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); - } + if (!recursionLevel && currentPattern.extendedTemplate === currentPattern.template) { + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); + } - function mergeData(obj1, obj2) { - if (typeof obj2 === 'undefined') { - obj2 = {}; //eslint-disable-line no-param-reassign + //recursively render currentPattern.extendedTemplate via parameter_hunter.find_parameters() + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + + //recurse, going a level deeper, with each render eliminating nested parameteredPartials + //when there are no more nested parameteredPartials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel ? recursionLevel + 1 : 1, currentPattern); } - for (var p in obj1) { //eslint-disable-line guard-for-in - try { - // Only recurse if obj1[p] is an object. - if (obj1[p].constructor === Object) { - // Requires 2 objects as params; create obj2[p] if undefined. - if (typeof obj2[p] === 'undefined') { - obj2[p] = {}; - } - obj2[p] = mergeData(obj1[p], obj2[p]); + //find non-parametered partials. + var foundPatternPartials = findPartials(currentPattern.extendedTemplate); + var uniquePartials = []; - // Pop when recursion meets a non-object. If obj1[p] is a non-object, - // only copy to undefined obj2[p]. This way, obj2 maintains priority. - } else if (typeof obj2[p] === 'undefined') { - obj2[p] = obj1[p]; - } - } catch (e) { - // Property in destination object not set; create it and set its value. - if (typeof obj2[p] === 'undefined') { - obj2[p] = obj1[p]; - } + //recurse through non-parametered partials + if (foundPatternPartials && foundPatternPartials.length) { + if (patternlab.config.debug) { + console.log('found partials for ' + currentPattern.key); } - } - return obj2; - } - function parseDataLinksHelper(patternlab, obj, key) { - var linkRE, dataObjAsString, linkMatches, expandedLink; + //copy winnowed template to extendedTemplate + if (!recursionLevel && currentPattern.extendedTemplate === currentPattern.template) { + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); + } - linkRE = /link\.[A-z0-9-_]+/g; - dataObjAsString = JSON.stringify(obj); - linkMatches = dataObjAsString.match(linkRE); + for (i = 0; i < foundPatternPartials.length; i++) { - if (linkMatches) { - for (var i = 0; i < linkMatches.length; i++) { - expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; - if (expandedLink) { - if (patternlab.config.debug) { - console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); + //limit iteration to one time per partial. eliminate duplicates. + if (uniquePartials.indexOf(foundPatternPartials[i]) === -1) { + uniquePartials.push(foundPatternPartials[i]); + } else { + continue; + } + + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); + + //identify which pattern this partial corresponds to + var partialPattern = getpatternbykey(partialKey, patternlab); + + if (!partialPattern) { + throw 'Could not find pattern with key ' + partialKey; + } else { + partialPattern.tmpTemplate = partialPattern.escapedTemplate; + + //if the current tag has styleModifier data, replace the styleModifier value in the partial + if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } - dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); + + var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); + + partialPattern.tmpTemplate = winnowedPartial; + + //replace each partial tag with the partial's template. + //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters + var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + var regex = new RegExp(escapedPartial, 'g'); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); + + //free tmpTemplate from memory. + partialPattern.tmpTemplate = ''; } } + + //recurse, going a level deeper, with each render eliminating nested partials + //when there are no more nested partials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel ? recursionLevel + 1 : 1, currentPattern); } - return JSON.parse(dataObjAsString); - } - //look for pattern links included in data files. - //these will be in the form of link.* WITHOUT {{}}, which would still be there from direct pattern inclusion - function parseDataLinks(patternlab) { - //look for link.* such as link.pages-blog as a value + //do only when popped back to the top level of recursion + if (!recursionLevel) { + if (currentPattern.extendedTemplate !== currentPattern.template) { + //switch ERB escaped tags back to standard Mustache tags + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); + } - patternlab.data = parseDataLinksHelper(patternlab, patternlab.data, 'data.json'); + //find and process any listItem blocks within the pattern + list_item_hunter.process_list_item_partials(currentPattern, patternlab); - //loop through all patterns - for (var i = 0; i < patternlab.patterns.length; i++) { - patternlab.patterns[i].jsonFileData = parseDataLinksHelper(patternlab, patternlab.patterns[i].jsonFileData, patternlab.patterns[i].key); + //look through pseudoPatternsArray again, and update their patternlab objects + if (pseudoPatternsArray.length) { + pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); + } + + //output rendered pattern to the file system + if (!test) { + outputPatternToFS(currentPattern, patternlab); + } + + //unset all tmpTemplates + for (i = 0; i < patternlab.patterns.length; i++) { + patternlab.patterns[i].tmpTemplate = ''; + } } } @@ -387,11 +750,11 @@ var pattern_assembler = function () { renderPattern: function (template, data, partials) { return renderPattern(template, data, partials); }, - process_pattern_iterative: function (file, patternlab) { - processPatternIterative(file, patternlab); + combine_listItems: function (patternlab) { + buildListItems(patternlab); }, - process_pattern_recursive: function (file, patternlab, additionalData) { - processPatternRecursive(file, patternlab, additionalData); + get_data_keys: function (data, uniqueKeys) { + return getDataKeys(data, uniqueKeys); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); @@ -399,16 +762,26 @@ var pattern_assembler = function () { merge_data: function (existingData, newData) { return mergeData(existingData, newData); }, - combine_listItems: function (patternlab) { - buildListItems(patternlab); + parse_data_links_helper: function (patternlab, obj, key) { + return parseDataLinksHelper(patternlab, obj, key); }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); + }, + winnow_unused_tags: function (template, pattern) { + return winnowUnusedTags(template, pattern); + }, + process_pattern_iterative: function (file, patternlab) { + processPatternIterative(file, patternlab); + }, + + //only submit all 5 params within the function itself and in unit tests. + //when calling outside of these circumstances, only submit file and patternlab. + process_pattern_recursive: function (file, patternlab, recursionLevel, currentPatternAsParam, test) { + processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test); } }; }; module.exports = pattern_assembler; - - From 3f5373f2f828d3bd42658828a428cd595e961926 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 29 Mar 2016 07:11:42 -0400 Subject: [PATCH 141/162] builder/parameter_hunter.js set up to be moved to core/lib --- builder/parameter_hunter.js | 335 ------------------------------ core/lib/parameter_hunter.js | 388 ++++++++++++++++++++++++----------- 2 files changed, 267 insertions(+), 456 deletions(-) delete mode 100644 builder/parameter_hunter.js diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js deleted file mode 100644 index be76b3e18..000000000 --- a/builder/parameter_hunter.js +++ /dev/null @@ -1,335 +0,0 @@ -/* - * patternlab-node - v1.1.1 - 2016 - * - * Brian Muenzenmeyer, and the web community. - * Licensed under the MIT license. - * - * Many thanks to Brad Frost and Dave Olsen for inspiration, encouragement, and advice. - * - */ - -"use strict"; - -var parameter_hunter = function () { - - var JSON = require('json5'), - pa = require('./pattern_assembler'), - smh = require('./style_modifier_hunter'), - pattern_assembler = new pa(), - style_modifier_hunter = new smh(); - - /** - * 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, commas, 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[i]; - - //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, parameteredPartials) { - var uniquePartials = []; - - for (var i = 0; i < parameteredPartials.length; i++) { - - //limit iteration to one time per partial. eliminate duplicates. - if (uniquePartials.indexOf(parameteredPartials[i]) === -1) { - uniquePartials.push(parameteredPartials[i]); - } else { - continue; - } - - //find the partial's name and retrieve it - var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); - - if (!partialPattern) { - throw ('Could not find pattern with key ' + partialName); - } - - //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 - partialPattern.tmpTemplate = partialPattern.escapedTemplate; - - if (patternlab.config.debug) { - console.log('found patternParameters for ' + partialName); - } - - //if the current tag has styleModifier data, replace the styleModifier value in the partial - //do this before rendering parametered tags - if (pattern_assembler.find_pattern_partials_with_style_modifiers(parameteredPartials[i])) { - style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); - } - - //strip out the additional data, convert string to JSON - var leftParen = parameteredPartials[i].indexOf('('); - var rightParen = parameteredPartials[i].lastIndexOf(')'); - var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = paramToJson(paramString); - - var paramData = {}; - try { - paramData = JSON.parse(paramStringWellFormed); - } catch (e) { - console.log(e); - } - - var regex; - var escapedKey; - for (var j in paramData) { - if (paramData.hasOwnProperty(j) && (typeof paramData[j] === 'boolean' || typeof paramData[j] === 'number' || typeof paramData[j] === 'string')) { - //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters - escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - - //apply replacement based on allowable characters from lines 78 and 79 of mustache.js - //of the Mustache for JS project. - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - - //since ERB is already used for escaping in partialPattern.escapedTemplate, - //using <%% %%> as escaping tags. - partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); - regex = new RegExp('<%([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)%>', 'g'); - partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); - } - } - - //then set the new delimiter at the beginning of the extended template - partialPattern.tmpTemplate = '{{=<%% %%>=}}' + partialPattern.tmpTemplate; - - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); - - partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); - - //replace parameteredPartials with their rendered values. - var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp(pMatch, 'g'); - pattern.extendedTemplate = pattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - - //free tmpTemplate from memory. - partialPattern.tmpTemplate = ''; - } - } - - return { - find_parameters: function (pattern, patternlab, parameteredPartials, tmpTemplate) { - findparameters(pattern, patternlab, parameteredPartials, tmpTemplate); - } - }; - - module.exports = parameter_hunter; - -}()); diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 9567f2a46..f86b45c7b 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -12,175 +12,321 @@ var parameter_hunter = function () { - var extend = require('util')._extend, + var JSON = require('json5'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), - style_modifier_hunter = new smh(), - pattern_assembler = new pa(); - + pattern_assembler = new pa(), + style_modifier_hunter = new smh(); + + /** + * 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, commas, 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 paramStringWellFormed = ''; - var paramStringTmp; - var colonPos; - var delimitPos; - var quotePos; - var paramString = 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 { - //if param key is wrapped in single quotes, replace with double quotes. - paramString = paramString.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); + //check if searching for a key + if (paramString[0] === '{' || paramString[0] === ',') { + paramString = paramString.substring([1], paramString.length).trim(); - //if params key is not wrapped in any quotes, wrap in double quotes. - paramString = paramString.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); + //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]) { - //move param key to paramStringWellFormed var. - colonPos = paramString.indexOf(':'); + //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; - //except to prevent infinite loops. - if (colonPos === -1) { - colonPos = paramString.length - 1; - } - else { - colonPos += 1; - } - paramStringWellFormed += paramString.substring(0, colonPos); - paramString = paramString.substring(colonPos, paramString.length).trim(); + default: + colonPos = paramString.indexOf(':'); + } - //if param value is wrapped in single quotes, replace with double quotes. - if (paramString[0] === '\'') { - quotePos = paramString.search(/[^\\]'/); + if (quotePos > -1) { + keys.push(paramString.substring(0, quotePos + 1).trim()); - //except for unclosed quotes to prevent infinite loops. - if (quotePos === -1) { - quotePos = paramString.length - 1; - } - else { - quotePos += 2; - } + //truncate the beginning from paramString and look for a value + paramString = paramString.substring(quotePos + 1, paramString.length).trim(); - //prepare param value for move to paramStringWellFormed var. - paramStringTmp = paramString.substring(0, quotePos); + //unset quotePos + quotePos = -1; - //unescape any escaped single quotes. - paramStringTmp = paramStringTmp.replace(/\\'/g, '\''); + } else if (colonPos > -1) { + keys.push(paramString.substring(0, colonPos).trim()); - //escape any double quotes. - paramStringTmp = paramStringTmp.replace(/"/g, '\\"'); + //truncate the beginning from paramString and look for a value + paramString = paramString.substring(colonPos, paramString.length); - //replace the delimiting single quotes with double quotes. - paramStringTmp = paramStringTmp.replace(/^'/, '"'); - paramStringTmp = paramStringTmp.replace(/'$/, '"'); + //unset colonPos + colonPos = -1; - //move param key to paramStringWellFormed var. - paramStringWellFormed += paramStringTmp; - paramString = paramString.substring(quotePos, paramString.length).trim(); + //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; + } } - //if param value is wrapped in double quotes, just move to paramStringWellFormed var. - else if (paramString[0] === '"') { - quotePos = paramString.search(/[^\\]"/); - - //except for unclosed quotes to prevent infinite loops. - if (quotePos === -1) { - quotePos = paramString.length - 1; + //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\-\.]*/; } - else { - quotePos += 2; + 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; } - //move param key to paramStringWellFormed var. - paramStringWellFormed += paramString.substring(0, quotePos); - paramString = paramString.substring(quotePos, paramString.length).trim(); + //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); - //if param value is not wrapped in quotes, move everthing up to the delimiting comma to paramStringWellFormed var. - else { - delimitPos = paramString.indexOf(','); - - //except to prevent infinite loops. - if (delimitPos === -1) { - delimitPos = paramString.length - 1; + //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, ''); } - else { - delimitPos += 1; + + 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 += '"'; } - paramStringWellFormed += paramString.substring(0, delimitPos); - paramString = paramString.substring(delimitPos, paramString.length).trim(); } - //break at the end. - if (paramString.length === 1) { - paramStringWellFormed += paramString.trim(); - paramString = ''; - break; + //colon delimiter. + paramStringWellFormed += ':'; + values[i]; + + //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]; } - } while (paramString); + //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) { + function findparameters(pattern, patternlab, parameteredPartials) { + var uniquePartials = []; - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + for (var i = 0; i < parameteredPartials.length; i++) { - //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.get_pattern_by_key(partialName, patternlab); + //limit iteration to one time per partial. eliminate duplicates. + if (uniquePartials.indexOf(parameteredPartials[i]) === -1) { + uniquePartials.push(parameteredPartials[i]); + } else { + continue; + } - //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190 - partialPattern.extendedTemplate = partialPattern.template; + //find the partial's name and retrieve it + var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); - if (patternlab.config.debug) { - console.log('found patternParameters for ' + partialName); - } + if (!partialPattern) { + throw ('Could not find pattern with key ' + partialName); + } - //strip out the additional data, convert string to JSON. - var leftParen = pMatch.indexOf('('); - var rightParen = pMatch.indexOf(')'); - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = paramToJson(paramString); - - var paramData = {}; - var globalData = {}; - var localData = {}; - - try { - paramData = JSON.parse(paramStringWellFormed); - globalData = JSON.parse(JSON.stringify(patternlab.data)); - localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); - } catch (e) { - console.log(e); - } + //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 + partialPattern.tmpTemplate = partialPattern.escapedTemplate; - var allData = pattern_assembler.merge_data(globalData, localData); - allData = pattern_assembler.merge_data(allData, paramData); + if (patternlab.config.debug) { + console.log('found patternParameters for ' + partialName); + } + + //if the current tag has styleModifier data, replace the styleModifier value in the partial + //do this before rendering parametered tags + if (pattern_assembler.find_pattern_partials_with_style_modifiers(parameteredPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); + } - //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); + //strip out the additional data, convert string to JSON + var leftParen = parameteredPartials[i].indexOf('('); + var rightParen = parameteredPartials[i].lastIndexOf(')'); + var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; + var paramStringWellFormed = paramToJson(paramString); + + var paramData = {}; + try { + paramData = JSON.parse(paramStringWellFormed); + } catch (e) { + console.log(e); + } + + var regex; + var escapedKey; + for (var j in paramData) { + if (paramData.hasOwnProperty(j) && (typeof paramData[j] === 'boolean' || typeof paramData[j] === 'number' || typeof paramData[j] === 'string')) { + //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters + escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + + //apply replacement based on allowable characters from lines 78 and 79 of mustache.js + //of the Mustache for JS project. + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + + //since ERB is already used for escaping in partialPattern.escapedTemplate, + //using <%% %%> as escaping tags. + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); + regex = new RegExp('<%([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)%>', 'g'); + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); } + } + + //then set the new delimiter at the beginning of the extended template + partialPattern.tmpTemplate = '{{=<%% %%>=}}' + partialPattern.tmpTemplate; - //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally - allData.link = extend({}, patternlab.data.link); + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); - var renderedPartial = pattern_assembler.renderPattern(partialPattern.extendedTemplate, allData, patternlab.partials); + partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); - //remove the parameter from the partial and replace it with the rendered partial + paramData - pattern.extendedTemplate = pattern.extendedTemplate.replace(pMatch, renderedPartial); + //replace parameteredPartials with their rendered values. + var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp(pMatch, 'g'); + pattern.extendedTemplate = pattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.key] = pattern.extendedTemplate; - }); + //free tmpTemplate from memory. + partialPattern.tmpTemplate = ''; } } return { - find_parameters: function (pattern, patternlab) { - findparameters(pattern, patternlab); + find_parameters: function (pattern, patternlab, parameteredPartials, tmpTemplate) { + findparameters(pattern, patternlab, parameteredPartials, tmpTemplate); } }; From 4690f792d9a7d9908aa052f41ae6cb670bd695c4 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 29 Mar 2016 07:14:26 -0400 Subject: [PATCH 142/162] fixing substring param typo --- core/lib/parameter_hunter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 98cc0651e..a6d130d0a 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -86,7 +86,7 @@ var parameter_hunter = function () { //check if searching for a key if (paramString[0] === '{' || paramString[0] === ',') { - paramString = paramString.substring([1], paramString.length).trim(); + 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. From eedaecc874bb9632ab924d80f1569ba10497d22b Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 29 Mar 2016 07:22:36 -0400 Subject: [PATCH 143/162] renaming json5 instances --- core/lib/list_item_hunter.js | 10 +++++----- core/lib/parameter_hunter.js | 8 ++++---- core/lib/pattern_assembler.js | 6 +++--- core/lib/patternlab.js | 12 ++++++------ 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index ab6b7585d..2f361f2ec 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -13,7 +13,7 @@ var list_item_hunter = function () { var extend = require('util')._extend, - JSON = require('json5'), + JSON5 = require('json5'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), @@ -47,7 +47,7 @@ var list_item_hunter = function () { //check for a local listitems.json file var listData; try { - listData = JSON.parse(JSON.stringify(patternlab.listitems)); + listData = JSON5.parse(JSON5.stringify(patternlab.listitems)); } catch (err) { console.log('There was an error parsing JSON for ' + pattern.abspath); console.log(err); @@ -64,8 +64,8 @@ var list_item_hunter = function () { var globalData; var localData; try { - globalData = JSON.parse(JSON.stringify(patternlab.data)); - localData = JSON.parse(JSON.stringify(pattern.jsonFileData)); + 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.abspath); console.log(err); @@ -87,7 +87,7 @@ var list_item_hunter = function () { //create a copy of the partial so as to not pollute it after the get_pattern_by_key call. var cleanPartialPattern; try { - cleanPartialPattern = JSON.parse(JSON.stringify(partialPattern)); + cleanPartialPattern = JSON5.parse(JSON5.stringify(partialPattern)); } catch (err) { console.log('There was an error parsing JSON for ' + pattern.abspath); console.log(err); diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index a6d130d0a..55bff52a2 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -13,7 +13,7 @@ var parameter_hunter = function () { var extend = require('util')._extend, - JSON = require('json5'), + JSON5 = require('json5'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), @@ -269,9 +269,9 @@ var parameter_hunter = function () { var localData = {}; try { - paramData = JSON.parse(paramStringWellFormed); - globalData = JSON.parse(JSON.stringify(patternlab.data)); - localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); + 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.abspath); console.log(err); diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 9c1b4ed78..c83dda364 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -332,11 +332,11 @@ var pattern_assembler = function () { } function parseDataLinksHelper(patternlab, obj, key) { - var JSON = require('json5'); + var JSON5 = require('json5'); var linkRE, dataObjAsString, linkMatches, expandedLink; linkRE = /link\.[A-z0-9-_]+/g; - dataObjAsString = JSON.stringify(obj); + dataObjAsString = JSON5.stringify(obj); linkMatches = dataObjAsString.match(linkRE); if (linkMatches) { @@ -353,7 +353,7 @@ var pattern_assembler = function () { var dataObj; try { - dataObj = JSON.parse(dataObjAsString); + dataObj = JSON5.parse(dataObjAsString); } catch (err) { console.log('There was an error parsing JSON for ' + key); console.log(err); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 1fea221d2..5a7591725 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -12,7 +12,7 @@ var patternlab_engine = function (config) { 'use strict'; var path = require('path'), - JSON = require('json5'), + JSON5 = require('json5'), fs = require('fs-extra'), diveSync = require('diveSync'), of = require('./object_factory'), @@ -181,20 +181,20 @@ var patternlab_engine = function (config) { //json stringify lineage and lineageR var lineageArray = []; for (var i = 0; i < pattern.lineage.length; i++) { - lineageArray.push(JSON.stringify(pattern.lineage[i])); + lineageArray.push(JSON5.stringify(pattern.lineage[i])); } pattern.lineage = lineageArray; var lineageRArray = []; for (var i = 0; i < pattern.lineageR.length; i++) { - lineageRArray.push(JSON.stringify(pattern.lineageR[i])); + lineageRArray.push(JSON5.stringify(pattern.lineageR[i])); } pattern.lineageR = lineageRArray; //render the pattern, but first consolidate any data we may have var allData; try { - allData = JSON.parse(JSON.stringify(patternlab.data)); + allData = JSON5.parse(JSON5.stringify(patternlab.data)); } catch (err) { console.log('There was an error parsing JSON for ' + pattern.abspath); console.log(err); @@ -561,11 +561,11 @@ var patternlab_engine = function (config) { //patternPaths var patternPathsTemplate = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'templates/partials/patternPaths.mustache'), 'utf8'); - var patternPathsPartialHtml = pattern_assembler.renderPattern(patternPathsTemplate, {'patternPaths': JSON.stringify(patternlab.patternPaths)}); + var patternPathsPartialHtml = pattern_assembler.renderPattern(patternPathsTemplate, {'patternPaths': JSON5.stringify(patternlab.patternPaths)}); //viewAllPaths var viewAllPathsTemplate = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'templates/partials/viewAllPaths.mustache'), 'utf8'); - var viewAllPathsPartialHtml = pattern_assembler.renderPattern(viewAllPathsTemplate, {'viewallpaths': JSON.stringify(patternlab.viewAllPaths)}); + var viewAllPathsPartialHtml = pattern_assembler.renderPattern(viewAllPathsTemplate, {'viewallpaths': JSON5.stringify(patternlab.viewAllPaths)}); //render the patternlab template, with all partials var patternlabSiteHtml = pattern_assembler.renderPattern(patternlabSiteTemplate, { From 4c909484d5a38973c8c6af99341bd0aea2f7423b Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 29 Mar 2016 07:34:53 -0400 Subject: [PATCH 144/162] fixing typo and renaming to JSON5 where necessary --- core/lib/list_item_hunter.js | 8 ++++---- core/lib/parameter_hunter.js | 6 +++--- core/lib/pattern_assembler.js | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 8f23a0782..8fdf242bb 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -12,7 +12,7 @@ var list_item_hunter = function () { - var JSON = require('json5'), + var JSON5 = require('json5'), pa = require('./pattern_assembler'), pattern_assembler = new pa(), items = [ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty']; @@ -31,7 +31,7 @@ var list_item_hunter = function () { //copy, don't reference try { - pattern.listitems = JSON.parse(JSON.stringify(pattern.listitemsRaw)); + pattern.listitems = JSON5.parse(JSON5.stringify(pattern.listitemsRaw)); } catch (err) { console.log('There was an error parsing JSON for ' + pattern.abspath); console.log(err); @@ -42,8 +42,8 @@ var list_item_hunter = function () { //copy, don't reference try { - pattern.listitems = JSON.parse(JSON.stringify(patternlab.listitems)); - pattern.listitemsRaw = JSON.parse(JSON.stringify(patternlab.listitems)); + pattern.listitems = JSON5.parse(JSON5.stringify(patternlab.listitems)); + pattern.listitemsRaw = JSON5.parse(JSON5.stringify(patternlab.listitems)); } catch (err) { console.log('There was an error parsing JSON for ' + pattern.abspath); console.log(err); diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index f86b45c7b..8e7086afc 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -12,7 +12,7 @@ var parameter_hunter = function () { - var JSON = require('json5'), + var JSON5 = require('json5'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), @@ -85,7 +85,7 @@ var parameter_hunter = function () { //check if searching for a key if (paramString[0] === '{' || paramString[0] === ',') { - paramString = paramString.substring([1], paramString.length).trim(); + 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. @@ -281,7 +281,7 @@ var parameter_hunter = function () { var paramData = {}; try { - paramData = JSON.parse(paramStringWellFormed); + paramData = JSON5.parse(paramStringWellFormed); } catch (e) { console.log(e); } diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 6a4f919ac..bce31ec43 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -225,11 +225,11 @@ var pattern_assembler = function () { } function parseDataLinksHelper(patternlab, obj, key) { - var JSON = require('json5'); + var JSON5 = require('json5'); var linkRE, dataObjAsString, linkMatches, expandedLink; linkRE = /link\.[A-z0-9-_]+/g; - dataObjAsString = JSON.stringify(obj); + dataObjAsString = JSON5.stringify(obj); linkMatches = dataObjAsString.match(linkRE); if (linkMatches) { @@ -246,7 +246,7 @@ var pattern_assembler = function () { var dataObj; try { - dataObj = JSON.parse(dataObjAsString); + dataObj = JSON5.parse(dataObjAsString); } catch (err) { console.log('There was an error parsing JSON for ' + key); console.log(err); @@ -480,7 +480,7 @@ var pattern_assembler = function () { function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { var fs = require('fs-extra'), glob = require('glob'), - JSON = require('json5'), + JSON5 = require('json5'), path = require('path'); var ph = require('./parameter_hunter'), @@ -545,8 +545,8 @@ var pattern_assembler = function () { //set currentPattern.jsonFileData if (localJsonString) { try { - localData = JSON.parse(localJsonString); - currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); + localData = JSON5.parse(localJsonString); + currentPattern.jsonFileData = mergeData(patternlab.data, JSON5.parse(localJsonString)); } catch (err) { console.log('There was an error parsing JSON for ' + file); console.log(err); From 7fa7f6b14c6db1de4190290ba7368170487325eb Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 29 Mar 2016 07:38:16 -0400 Subject: [PATCH 145/162] comment update --- core/lib/parameter_hunter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 55bff52a2..13d8f280e 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -26,7 +26,7 @@ var parameter_hunter = function () { * 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, commas, and colons. Use the string + * * 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. From 176dd4f5f64bc8f2de900b66547d22064afcd787 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 30 Mar 2016 05:04:13 -0400 Subject: [PATCH 146/162] unit tests passing --- core/lib/pattern_assembler.js | 31 ++++++++++++++++-------------- test/parameter_hunter_tests.js | 6 +++--- test/pseudopattern_hunter_tests.js | 14 +++++++------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index a24a520a5..bc3d83c41 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -57,8 +57,8 @@ var pattern_assembler = function () { } function setState(pattern, patternlab) { - if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]) { - pattern.patternState = patternlab.config.patternStates[pattern.patternName]; + if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.key]) { + pattern.patternState = patternlab.config.patternStates[pattern.key]; } else { pattern.patternState = ""; } @@ -275,6 +275,10 @@ var pattern_assembler = function () { var paths = patternlab.config.paths; var patternFooter; + //unescape escaped closing ERB tags + pattern.extendedTemplate = pattern.extendedTemplate.replace(/\\u0025\\u003E/g, '%>'); + + //parse data links in this pattern's json pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); //render the extendedTemplate with all data @@ -333,7 +337,7 @@ var pattern_assembler = function () { templateEscaped = template; } - //escaped all tags that match keys in the JSON data. + //escape all tags that match keys in the JSON data. //it can be 10% faster to process large dataKeys arrays in one read with a //large regex than to read many times and process with small regexes. if (dataKeys.length) { @@ -350,20 +354,15 @@ var pattern_assembler = function () { } //escape partial tags by switching them to ERB syntax. - //first, escape anything in the template that looks like closing ERB tags. - //the Pattern Lab docs do not forbid them, so it shouldn't be on users to - //avoid them, however extreme an edge case it may be. - templateEscaped = templateEscaped.replace(/%>/g, '\\u0025\\u003E'); - - //next, account for the fact that curly braces might be submitted as param values. - //however, ')}}' or any spaced variant should NEVER be submitted as param values + //first, account for the fact that curly braces might be submitted as part of params. + //however, ')}}' or any spaced variant should NEVER be submitted as part of params //enclosed in quotes or otherwise. It is not valid JSON, and if it's to be rendered //as HTML, it should be via HTML entities. while this is not explicitly forbidden //in the Pattern Lab docs, it can be inferred that it is forbidden after users see //resulting rendering errors. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+(?:\((.|\s)*?\))\s*)\}\}/g, '<%>$1%>'); - //in all other cases, curly braces should not be part of filenames or non-string param values. + //in all other cases, curly braces should not be part of filenames or styleModifiers. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); //removing empty lines for some reason reduces rendering time considerably. @@ -381,9 +380,6 @@ var pattern_assembler = function () { //after that's done, switch only partial tags back to standard Mustache tags and return. if (templateWinnowed) { templateWinnowed = templateWinnowed.replace(/<%>((.|\s)*?)%>/g, '{{>$1}}'); - - //also unescape escaped closing ERB tags - templateWinnowed = templateWinnowed.replace(/\\u0025\\u003E/g, '%>'); } return templateWinnowed; @@ -433,6 +429,13 @@ var pattern_assembler = function () { //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); + //since we'll need to recognize ERB syntax tags, escape anything in the + //template that looks like closing ERB tags. + //the Pattern Lab docs do not forbid them, so it shouldn't be on users to + //avoid them, however extreme an edge case it may be. + //we'll unescape them later. + currentPattern.template = currentPattern.template.replace(/%>/g, '\\u0025\\u003E'); + //define tmpTemplate and listitems to avoid undefined type errors //trying to keep memory footprint small, so set it empty at first currentPattern.tmpTemplate = ''; diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 4741dd5c1..8f9cf5df9 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -69,7 +69,7 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - var pa = require('../builder/pattern_assembler'); + var pa = require('../core/lib/pattern_assembler'); var pattern_assembler = new pa(); currentPattern.escapedTemplate = '

{{foo}}

' + currentPattern.template; @@ -360,8 +360,8 @@ //arrange var fs = require('fs-extra'); var path = require('path'); - var object_factory = require('../builder/object_factory'); - var pa = require('../builder/pattern_assembler'); + var object_factory = require('../core/lib/object_factory'); + var pa = require('../core/lib/pattern_assembler'); var pattern_assembler = new pa(); var patterns_dir = './test/files/_patterns'; diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 2101c0b7d..7d803cb2b 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -1,13 +1,13 @@ (function () { - "use strict"; + "use strict"; - var path = require('path'); - var pha = require('../builder/pseudopattern_hunter'); - var pa = require('../builder/pattern_assembler'); - var object_factory = require('../builder/object_factory'); + var path = require('path'); + var pha = require('../core/lib/pseudopattern_hunter'); + var pa = require('../core/lib/pattern_assembler'); + var object_factory = require('../core/lib/object_factory'); - exports['pseudopattern_hunter'] = { - 'pseudopattern found and added as a pattern' : function(test){ + exports['pseudopattern_hunter'] = { + 'pseudopattern found and added as a pattern' : function(test){ //arrange var fs = require('fs-extra'); var pattern_assembler = new pa(); From a50abd1bd984ef8a8e905de4757d638c31ba5d6d Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 30 Mar 2016 05:59:37 -0400 Subject: [PATCH 147/162] nodeunit and eslint passing --- core/lib/pattern_assembler.js | 19 +++---- core/lib/patternlab.js | 1 + .../00-test/14-template-with-erb-tag.mustache | 2 + test/parameter_hunter_tests.js | 53 ++++++++++++++++++- 4 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 test/files/_patterns/00-test/14-template-with-erb-tag.mustache diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index bc3d83c41..ba067df4f 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -275,10 +275,6 @@ var pattern_assembler = function () { var paths = patternlab.config.paths; var patternFooter; - //unescape escaped closing ERB tags - pattern.extendedTemplate = pattern.extendedTemplate.replace(/\\u0025\\u003E/g, '%>'); - - //parse data links in this pattern's json pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); //render the extendedTemplate with all data @@ -430,10 +426,10 @@ var pattern_assembler = function () { currentPattern.template = fs.readFileSync(file, 'utf8'); //since we'll need to recognize ERB syntax tags, escape anything in the - //template that looks like closing ERB tags. - //the Pattern Lab docs do not forbid them, so it shouldn't be on users to - //avoid them, however extreme an edge case it may be. - //we'll unescape them later. + //template that looks like ERB tags. the Pattern Lab docs do not forbid them, + //so it shouldn't be on users to avoid them, however extreme an edge case it + //may be. we'll unescape them later. + currentPattern.template = currentPattern.template.replace(/<%/g, '\\u003C\\u0025'); currentPattern.template = currentPattern.template.replace(/%>/g, '\\u0025\\u003E'); //define tmpTemplate and listitems to avoid undefined type errors @@ -706,11 +702,16 @@ var pattern_assembler = function () { //do only when popped back to the top level of recursion if (!recursionLevel) { + + //switch Mustache escaped as ERB back to Mustache if (currentPattern.extendedTemplate !== currentPattern.template) { - //switch ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); } + //switch escaped unicodes for ERB back to ERB + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/\\u003C\\u0025/g, '<%'); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/\\u0025\\u003E/g, '%>'); + //find and process any listItem blocks within the pattern list_item_hunter.process_list_item_partials(currentPattern, patternlab); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 394262a5e..af1b3fdb0 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -16,6 +16,7 @@ var patternlab_engine = function (config) { diveSync = require('diveSync'), of = require('./object_factory'), pa = require('./pattern_assembler'), + lh = require('./lineage_hunter'), lih = require('./list_item_hunter'), mh = require('./media_hunter'), pe = require('./pattern_exporter'), diff --git a/test/files/_patterns/00-test/14-template-with-erb-tag.mustache b/test/files/_patterns/00-test/14-template-with-erb-tag.mustache new file mode 100644 index 000000000..a36df1e4f --- /dev/null +++ b/test/files/_patterns/00-test/14-template-with-erb-tag.mustache @@ -0,0 +1,2 @@ +{{> test-parameter-partial(flag: true) }} +<% erb %> diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 8f9cf5df9..daffd6fe2 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -355,8 +355,8 @@ test.done(); }, - 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ - // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + 'pattern assembler recursively includes and processes a partial that has parameters itself' : function(test){ + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside parameter_hunter.js //arrange var fs = require('fs-extra'); var path = require('path'); @@ -400,6 +400,55 @@ var expectedValue = 'bar foo bar bar'; test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); + }, + + 'pattern assembler escapes closing ERB tags written by end-users in templates' : function(test){ + //in order for pattern assembler to recursively include and process partials that have parameters, + //it must temporarily switch standard Mustache syntax to ERB syntax. this presents a problem if end- + //users write "%>" in user-facing templates. therefore, such instances must escaped and unescaped. + //arrange + var fs = require('fs-extra'); + var path = require('path'); + var object_factory = require('../core/lib/object_factory'); + var pa = require('../core/lib/pattern_assembler'); + 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.dataKeys = []; + pl.config.debug = false; + pl.patterns = []; + + var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); + var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var innerParameteredFile = path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'); + var outerParameteredFile = path.resolve('test/files/_patterns/00-test/14-template-with-erb-tag.mustache'); + + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(styleFile, pl); + pattern_assembler.process_pattern_iterative(innerParameteredFile, pl); + pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); + + //act + pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(styleFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, 0, null, true); + var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); + + //assert. + var expectedValue = 'bar foo bar bar <% erb %>'; + test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + test.done(); } }; From 456273fbf6b856806248c250e9877b8be2e8c93c Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 31 Mar 2016 08:31:37 -0400 Subject: [PATCH 148/162] stopping point --- core/lib/pattern_assembler.js | 16 +++-- core/lib/patternlab.js | 65 +++++++++++++------ .../pattern-header-footer/header.html | 2 + 3 files changed, 58 insertions(+), 25 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index ba067df4f..dfe1a869d 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -273,18 +273,26 @@ var pattern_assembler = function () { var he = require('html-entities').AllHtmlEntities; var entity_encoder = new he(); var paths = patternlab.config.paths; - var patternFooter; pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); + pattern.jsonFileData.baseurl = patternlab.config.baseurl; + pattern.jsonFileData.lineage = pattern.lineage; + pattern.jsonFileData.lineageR = pattern.lineageR; + pattern.jsonFileData.patternGroup = pattern.patternGroup; + pattern.jsonFileData.patternName = pattern.patternName; + pattern.jsonFileData.patternState = pattern.patternState; + + //render the header + var userHeader = renderPattern(patternlab.userHead.extendedTemplate, pattern); //render the extendedTemplate with all data pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); - //add footer info before writing - patternFooter = renderPattern(patternlab.footer, pattern); + //render the footer + var userFooter = renderPattern(patternlab.userFoot.extendedTemplate, pattern); //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.patternPartial + patternFooter); + fs.outputFileSync(paths.public.patterns + pattern.patternLink, userHeader + pattern.patternPartial + userFooter); //write the mustache file too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index af1b3fdb0..255ef32cf 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -77,6 +77,9 @@ var patternlab_engine = function (config) { setCacheBust(); + //also add the cachebuster value. slight chance this could collide with a user that has defined cacheBuster as a value + patternlab.data.cacheBuster = patternlab.cacheBuster; + var pattern_assembler = new pa(), list_item_hunter = new lih(), pattern_exporter = new pe(), @@ -87,9 +90,26 @@ var patternlab_engine = function (config) { patternlab.dataKeys = patternlab.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); + //diveSync once to perform iterative populating of patternlab object + diveSync( + patterns_dir, + function (err, file) { + //log any errors + if (err) { + console.log(err); + return; + } + pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); + } + ); + + patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); + //set user defined head and foot if they exist + var userHeader; try { - patternlab.userHead = pattern_assembler.get_pattern_by_key('atoms-head', patternlab); + userHeader = pattern_assembler.get_pattern_by_key('atoms-head', patternlab); + patternlab.userHead = JSON.parse(JSON.stringify(userHeader)); } catch (ex) { if (patternlab.config.debug) { @@ -97,8 +117,20 @@ var patternlab_engine = function (config) { console.log('Could not find optional user-defined header, atoms-head pattern. It was likely deleted.'); } } + + if (patternlab.userHead) { + patternlab.userHead.extendedTemplate = patternlab.userHead.template.replace('{% pattern-lab-head %}', patternlab.header); + } else { + patternlab.userHead = { + template: patternlab.header, + extendedTemplate: patternlab.header + }; + } + + var userFooter; try { - patternlab.userFoot = pattern_assembler.get_pattern_by_key('atoms-foot', patternlab); + userFooter = pattern_assembler.get_pattern_by_key('atoms-foot', patternlab); + patternlab.userFoot = JSON.parse(JSON.stringify(userFooter)); } catch (ex) { if (patternlab.config.debug) { @@ -107,20 +139,14 @@ var patternlab_engine = function (config) { } } - //diveSync once to perform iterative populating of patternlab object - diveSync( - patterns_dir, - function (err, file) { - //log any errors - if (err) { - console.log(err); - return; - } - pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); - } - ); - - patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); + if (patternlab.userFoot) { + patternlab.userFoot.extendedTemplate = patternlab.userFoot.template.replace('{% pattern-lab-foot %}', patternlab.footerPattern + patternlab.footer); + } else { + patternlab.userFoot = { + template: patternlab.footerPattern, + extendedTemplate: patternlab.footerPattern + }; + } //cascade any patternStates lineage_hunter.cascade_pattern_states(patternlab); @@ -206,13 +232,10 @@ var patternlab_engine = function (config) { styleguidePatterns = patternlab.patterns; } - //also add the cachebuster value. slight chance this could collide with a user that has defined cacheBuster as a value - patternlab.data.cacheBuster = patternlab.cacheBuster; - //get the main page head and foot - var mainPageHead = patternlab.userHead.extendedTemplate.replace('{% pattern-lab-head %}', patternlab.header); + var mainPageHead = patternlab.userHead.template.replace('{% pattern-lab-head %}', patternlab.header); var mainPageHeadHtml = pattern_assembler.renderPattern(mainPageHead, patternlab.data); - var mainPageFoot = patternlab.userFoot.extendedTemplate.replace('{% pattern-lab-foot %}', patternlab.footer); + var mainPageFoot = patternlab.userFoot.template.replace('{% pattern-lab-foot %}', patternlab.footer); var mainPageFootHtml = pattern_assembler.renderPattern(mainPageFoot, patternlab.data); //build the styleguide diff --git a/core/templates/pattern-header-footer/header.html b/core/templates/pattern-header-footer/header.html index ebe81993e..c607380ef 100644 --- a/core/templates/pattern-header-footer/header.html +++ b/core/templates/pattern-header-footer/header.html @@ -1,9 +1,11 @@ + From 374dfb95f897d91c6d58e9e1deab29fe12d7cd3b Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 31 Mar 2016 08:48:26 -0400 Subject: [PATCH 149/162] looks like it's working --- core/lib/pattern_assembler.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index dfe1a869d..139c17006 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -276,12 +276,34 @@ var pattern_assembler = function () { pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); pattern.jsonFileData.baseurl = patternlab.config.baseurl; - pattern.jsonFileData.lineage = pattern.lineage; - pattern.jsonFileData.lineageR = pattern.lineageR; pattern.jsonFileData.patternGroup = pattern.patternGroup; pattern.jsonFileData.patternName = pattern.patternName; pattern.jsonFileData.patternState = pattern.patternState; + try { + pattern.jsonFileData.lineage = JSON.stringify(pattern.lineage[0]); + } catch (err) { + + // Do nothing + } + if (!pattern.jsonFileData.lineage) { + pattern.jsonFileData.lineage = ''; + } + + try { + pattern.jsonFileData.lineageR = JSON.stringify(pattern.lineageR[0]); + } catch (err) { + + // Do nothing + } + if (!pattern.jsonFileData.lineageR) { + pattern.jsonFileData.lineageR = ''; + } +if (pattern.abspath.indexOf('00-homepage') > -1) { + console.log(pattern.jsonFileData.lineage); + console.log(pattern.jsonFileData.lineageR); +} + //render the header var userHeader = renderPattern(patternlab.userHead.extendedTemplate, pattern); From 26cc55424820a192f0cf40a068a08e1619eecff8 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 31 Mar 2016 08:54:16 -0400 Subject: [PATCH 150/162] appears to work --- core/lib/pattern_assembler.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 139c17006..b85ba054f 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -299,19 +299,15 @@ var pattern_assembler = function () { if (!pattern.jsonFileData.lineageR) { pattern.jsonFileData.lineageR = ''; } -if (pattern.abspath.indexOf('00-homepage') > -1) { - console.log(pattern.jsonFileData.lineage); - console.log(pattern.jsonFileData.lineageR); -} //render the header - var userHeader = renderPattern(patternlab.userHead.extendedTemplate, pattern); + var userHeader = renderPattern(patternlab.userHead.extendedTemplate, pattern.jsonFileData); //render the extendedTemplate with all data pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); //render the footer - var userFooter = renderPattern(patternlab.userFoot.extendedTemplate, pattern); + var userFooter = renderPattern(patternlab.userFoot.extendedTemplate, pattern.jsonFileData); //write the compiled template to the public patterns directory fs.outputFileSync(paths.public.patterns + pattern.patternLink, userHeader + pattern.patternPartial + userFooter); From 2cbafcd8c33c13a15a83041e0774db15aadb8c18 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 31 Mar 2016 09:46:57 -0400 Subject: [PATCH 151/162] working lineage --- core/lib/pattern_assembler.js | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index b85ba054f..fab9fb479 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -280,25 +280,19 @@ var pattern_assembler = function () { pattern.jsonFileData.patternName = pattern.patternName; pattern.jsonFileData.patternState = pattern.patternState; - try { - pattern.jsonFileData.lineage = JSON.stringify(pattern.lineage[0]); - } catch (err) { - - // Do nothing - } - if (!pattern.jsonFileData.lineage) { - pattern.jsonFileData.lineage = ''; + //json stringify lineage and lineageR + var i; + var lineageArray = []; + for (i = 0; i < pattern.lineage.length; i++) { + lineageArray.push(JSON.stringify(pattern.lineage[i])); } + pattern.jsonFileData.lineage = lineageArray; - try { - pattern.jsonFileData.lineageR = JSON.stringify(pattern.lineageR[0]); - } catch (err) { - - // Do nothing - } - if (!pattern.jsonFileData.lineageR) { - pattern.jsonFileData.lineageR = ''; + var lineageRArray = []; + for (i = 0; i < pattern.lineageR.length; i++) { + lineageRArray.push(JSON.stringify(pattern.lineageR[i])); } + pattern.jsonFileData.lineageR = lineageRArray; //render the header var userHeader = renderPattern(patternlab.userHead.extendedTemplate, pattern.jsonFileData); From 0e04e07d817483819bc07ef364a307fe16c8878f Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 1 Apr 2016 04:18:29 -0400 Subject: [PATCH 152/162] working lineage_hunter --- core/lib/pattern_assembler.js | 5 +++++ core/lib/pseudopattern_hunter.js | 1 + 2 files changed, 6 insertions(+) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index fab9fb479..840073dc7 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -504,10 +504,12 @@ var pattern_assembler = function () { var ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), + lh = require('./lineage_hunter'), lih = require('./list_item_hunter'), smh = require('./style_modifier_hunter'); var parameter_hunter = new ph(), + lineage_hunter = new lh(), list_item_hunter = new lih(), style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); @@ -532,6 +534,9 @@ var pattern_assembler = function () { //should be filled out and renderable. if (path.extname(file) === '.json') { if (!test) { + + //pseudoPatterns skipped lineage hunt earlier so do it now + lineage_hunter.find_lineage(currentPattern, patternlab); outputPatternToFS(currentPattern, patternlab); } return; diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index d771235b4..29cc3a16e 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -31,6 +31,7 @@ var pseudopattern_hunter = function () { pattern_assembler.setPatternState(pseudoPatternsArray[i], patternlab); //use the same template as the non-variant + pseudoPatternsArray[i].template = currentPattern.template; pseudoPatternsArray[i].extendedTemplate = currentPattern.extendedTemplate; //find pattern lineage From 388326221c1be8888dfd6246d4a025524532021d Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 1 Apr 2016 05:26:19 -0400 Subject: [PATCH 153/162] fixing unit test --- test/parameter_hunter_tests.js | 93 ---------------------------------- 1 file changed, 93 deletions(-) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 43c3d8077..6db4c46fe 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -448,100 +448,7 @@ //assert. var expectedValue = 'bar foo bar bar <% erb %>'; test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); - test.done(); - }, - - 'parameter 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(); - - 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); - test.equals(currentPattern.extendedTemplate, '

true

'); - - test.done(); - }, - - 'parameter 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(); - - currentPattern.template = "{{> molecules-single-comment(description: 'Hello ) World') }}"; - currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

Hello ) World

'); - - test.done(); - }, - - 'parameter 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(); - - 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); - test.equals(currentPattern.extendedTemplate, '

true

Hello World

'); - - test.done(); - }, - - 'parameter 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(); - - 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); - test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); - - test.done(); - }, - - 'parameter 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(); - - patternlab.patterns[0].template = "

{{foo}}

"; - patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; - - 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); - test.equals(currentPattern.extendedTemplate, '

'); - test.done(); } - - }; - }()); From 92f78067c2c17407086452493aa4beebfbe866f7 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 1 Apr 2016 22:33:13 -0400 Subject: [PATCH 154/162] improved partial and listitem finding regexes --- core/lib/pattern_assembler.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 840073dc7..7d9e8a407 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -27,7 +27,7 @@ var pattern_assembler = function () { // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithStyleModifiers(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g; + var regex = /{{>\s*([\w\-\.\/~]+)(?!\()(\:[\w\-\|]+)(\s*\((.|\s)*?\))?\s*}}/g; var matches = patternMatcher(pattern, regex); return matches; @@ -35,7 +35,7 @@ var pattern_assembler = function () { // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithPatternParameters(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g; + var regex = /{{>\s*([\w\-\.\/~]+)(\:[\w\-\|]+)?(\s*\((.|\s)*?\))\s*}}/g; var matches = patternMatcher(pattern, regex); return matches; @@ -43,14 +43,14 @@ var pattern_assembler = function () { //find and return any {{> template-name* }} within pattern function findPartials(pattern) { - var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g; + var regex = /{{>\s*([\w\-\.\/~]+)(\:[\w\-|]+)?(\s*\((.|\s)*?\))?\s*}}/g; var matches = patternMatcher(pattern, regex); return matches; } function findListItems(pattern) { - var regex = /({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g; + var regex = /{{#\s*(list(I|i)tems\.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)\s*}}/g; var matches = patternMatcher(pattern, regex); return matches; From 8d449f44fd38739d1161060d30ccac63c1aa95e8 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 1 Apr 2016 23:35:15 -0400 Subject: [PATCH 155/162] right hogan.js npm --- core/lib/pattern_assembler.js | 2 +- package.gulp.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 7d9e8a407..82a4dcdbc 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -87,7 +87,7 @@ var pattern_assembler = function () { } function renderPattern(template, data, partials) { - var hogan = require('hogan'); + var hogan = require('hogan.js'); var compiled = hogan.compile(template); if (partials) { diff --git a/package.gulp.json b/package.gulp.json index 98d5bb81f..fbd4bd0ef 100644 --- a/package.gulp.json +++ b/package.gulp.json @@ -8,7 +8,7 @@ "diveSync": "^0.3.0", "fs-extra": "^0.26.5", "glob": "^7.0.0", - "hogan": "^1.0.2", + "hogan.js": "^3.0.2", "html-entities": "^1.2.0", "json5": "^0.5.0" }, diff --git a/package.json b/package.json index 217a5d13c..49451f9fd 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "diveSync": "^0.3.0", "fs-extra": "^0.26.2", "glob": "^7.0.0", - "hogan": "^1.0.2", + "hogan.js": "^3.0.2", "html-entities": "^1.2.0", "json5": "^0.5.0", "matchdep": "^1.0.0" From d06737877dcfdb6c98c2353cc230c91e104b1009 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 2 Apr 2016 06:55:03 -0400 Subject: [PATCH 156/162] improved regex --- core/lib/pattern_assembler.js | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 82a4dcdbc..ac19cb2d2 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -370,16 +370,11 @@ var pattern_assembler = function () { } //escape partial tags by switching them to ERB syntax. - //first, account for the fact that curly braces might be submitted as part of params. - //however, ')}}' or any spaced variant should NEVER be submitted as part of params - //enclosed in quotes or otherwise. It is not valid JSON, and if it's to be rendered - //as HTML, it should be via HTML entities. while this is not explicitly forbidden - //in the Pattern Lab docs, it can be inferred that it is forbidden after users see - //resulting rendering errors. - templateEscaped = templateEscaped.replace(/\{\{>([^\}]+(?:\((.|\s)*?\))\s*)\}\}/g, '<%>$1%>'); - - //in all other cases, curly braces should not be part of filenames or styleModifiers. - templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + //the regex is mostly copied from function findPartials(). however, we need + //to specify a capture group for the replace() method and not capture other + //parenthetical groups for the nominal performance gain. + regex = /{{>(\s*(?:[\w\-\.\/~]+)(?:\:[\w\-|]+)?(?:\s*\((?:.|\s)*?\))?\s*)}}/g; + templateEscaped = templateEscaped.replace(regex, '<%>$1%>'); //removing empty lines for some reason reduces rendering time considerably. templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); @@ -395,7 +390,7 @@ var pattern_assembler = function () { //after that's done, switch only partial tags back to standard Mustache tags and return. if (templateWinnowed) { - templateWinnowed = templateWinnowed.replace(/<%>((.|\s)*?)%>/g, '{{>$1}}'); + templateWinnowed = templateWinnowed.replace(/<%>((?:.|\s)*?)%>/g, '{{>$1}}'); } return templateWinnowed; @@ -730,7 +725,7 @@ var pattern_assembler = function () { //switch Mustache escaped as ERB back to Mustache if (currentPattern.extendedTemplate !== currentPattern.template) { - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%((?:.|\s)*?)%>/g, '{{$1}}'); } //switch escaped unicodes for ERB back to ERB From 93f665aad37315501fd583af381e1dded6baed80 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 2 Apr 2016 20:06:03 -0400 Subject: [PATCH 157/162] allow triple-mustache with alternate delimiters --- core/lib/parameter_hunter.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index d6315d6f0..3f9c48e80 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -302,6 +302,11 @@ var parameter_hunter = function () { partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); regex = new RegExp('<%([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)%>', 'g'); partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); + + //when using alternate delimiters, triple-Mustache syntax won't work. + //<%{ must be replaced with <%# and }%> with %>. + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(/<%%\{/g, '<%%&'); + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(/\}%%>/g, '%%>'); } } @@ -311,7 +316,6 @@ var parameter_hunter = function () { //the reason for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant conditional tags persisted. partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); - partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); //replace parameteredPartials with their rendered values. From 00a63cd8abea7b5882a22c4fb267c9aeb0c0a8ba Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 14 Apr 2016 08:36:37 -0400 Subject: [PATCH 158/162] fixing inclusion of local listitem files --- core/lib/pattern_assembler.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 576f61b8f..6fbf62c50 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -611,8 +611,8 @@ var pattern_assembler = function () { } if (hasLocalListItems) { try { - currentPattern.listitems = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); - currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); + currentPattern.listitems = mergeData(patternlab.listitems, fs.readJSONSync(listJsonFileName)); + currentPattern.listitemsRaw = mergeData(patternlab.listitems, fs.readJSONSync(listJsonFileName)); buildListItems(currentPattern); if (patternlab.config.debug) { From 107aa272bef606fee5f85661eadb2aa264c3a2e2 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 14 Apr 2016 08:51:00 -0400 Subject: [PATCH 159/162] more DRY styleguide exclusion --- core/lib/patternlab.js | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index ddd478356..af1abdff6 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -210,34 +210,25 @@ var patternlab_engine = function (config) { //find mediaQueries media_hunter.find_media_queries('./source/css', patternlab); - // check if patterns are excluded, if not add them to styleguidePatterns - if (styleGuideExcludes && styleGuideExcludes.length) { - for (i = 0; i < patternlab.patterns.length; i++) { - - // skip underscore-prefixed files - if (isPatternExcluded(patternlab.patterns[i])) { - if (patternlab.config.debug) { - console.log('Omitting ' + patternlab.patterns[i].key + " from styleguide pattern exclusion."); - } - continue; + for (i = 0; i < patternlab.patterns.length; i++) { + + // skip underscore-prefixed files + if (isPatternExcluded(patternlab.patterns[i])) { + if (patternlab.config.debug) { + console.log('Omitting ' + patternlab.patterns[i].key + " from styleguide pattern exclusion."); } + continue; + } + // check if patterns are excluded, if not add them to styleguidePatterns + var isExcluded = false; + if (styleGuideExcludes && styleGuideExcludes.length) { var key = patternlab.patterns[i].key; var typeKey = key.substring(0, key.indexOf('-')); - var isExcluded = (styleGuideExcludes.indexOf(typeKey) > -1); - if (!isExcluded) { - styleguidePatterns.push(patternlab.patterns[i]); - } + isExcluded = (styleGuideExcludes.indexOf(typeKey) > -1); } - } else { - for (i = 0; i < patternlab.patterns.length; i++) { - // skip underscore-prefixed files - if (isPatternExcluded(patternlab.patterns[i])) { - if (patternlab.config.debug) { - console.log('Omitting ' + patternlab.patterns[i].key + " from styleguide pattern exclusion."); - } - continue; - } + + if (!isExcluded) { styleguidePatterns.push(patternlab.patterns[i]); } } From 780be51aa1a2787e46fa078b2ee9e4af6d042f14 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 14 Apr 2016 09:34:32 -0400 Subject: [PATCH 160/162] deleting .swp files --- core/lib/.parameter_hunter.js.swp | Bin 16384 -> 0 bytes test/.parameter_hunter_tests.js.swp | Bin 40960 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 core/lib/.parameter_hunter.js.swp delete mode 100644 test/.parameter_hunter_tests.js.swp diff --git a/core/lib/.parameter_hunter.js.swp b/core/lib/.parameter_hunter.js.swp deleted file mode 100644 index 227df9e73fa6ed59c6e62484721d5eeae736c138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 K(d~8&rua81JlN;} diff --git a/test/.parameter_hunter_tests.js.swp b/test/.parameter_hunter_tests.js.swp deleted file mode 100644 index d3e5004d192273b31ae25e3643d1360f3360557e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 From fee0d676aee48afe2e31a02987252bd57039193b Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 14 Apr 2016 09:38:23 -0400 Subject: [PATCH 161/162] removing unused dependency --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 9bdc5025d..f578a0ffc 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,7 @@ "glob": "^7.0.0", "hogan.js": "^3.0.2", "html-entities": "^1.2.0", - "json5": "^0.5.0", - "matchdep": "^1.0.0" + "json5": "^0.5.0" }, "devDependencies": { "bs-html-injector": "^3.0.0", From 85ca7c0a5c0eb560ef8fee7ec9bdaad429596caa Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 14 Apr 2016 09:41:04 -0400 Subject: [PATCH 162/162] Revert "removing unused dependency" This reverts commit fee0d676aee48afe2e31a02987252bd57039193b. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index f578a0ffc..9bdc5025d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "glob": "^7.0.0", "hogan.js": "^3.0.2", "html-entities": "^1.2.0", - "json5": "^0.5.0" + "json5": "^0.5.0", + "matchdep": "^1.0.0" }, "devDependencies": { "bs-html-injector": "^3.0.0",
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 From 0343df1eb80d14705fe4de904ab1ad7a2f8df554 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 20:24:55 -0400 Subject: [PATCH 050/162] more accurate paramToJson in parameter_hunter --- core/lib/parameter_hunter.js | 48 ++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 9567f2a46..49bc8c244 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -19,32 +19,38 @@ var parameter_hunter = function () { pattern_assembler = new pa(); function paramToJson(pString) { - var paramStringWellFormed = ''; - var paramStringTmp; var colonPos; var delimitPos; - var quotePos; + var paramKey; var paramString = pString; + var paramStringWellFormed = ''; + var paramStringTmp; + var quotePos; do { - //if param key is wrapped in single quotes, replace with double quotes. - paramString = paramString.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); - - //if params key is not wrapped in any quotes, wrap in double quotes. - paramString = paramString.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); - //move param key to paramStringWellFormed var. colonPos = paramString.indexOf(':'); //except to prevent infinite loops. if (colonPos === -1) { colonPos = paramString.length - 1; - } - else { + } else { colonPos += 1; } - paramStringWellFormed += paramString.substring(0, colonPos); + + paramKey = paramString.substring(0, colonPos); + + //if param key is wrapped in single quotes, replace with double quotes. + paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); + + //if params key is not wrapped in any quotes, wrap in double quotes. + paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); + + //this is just here to match the escaping scheme in Pattern Lab PHP. + paramKey = paramKey.replace(/\\/g, ''); + + paramStringWellFormed += paramKey; paramString = paramString.substring(colonPos, paramString.length).trim(); //if param value is wrapped in single quotes, replace with double quotes. @@ -54,8 +60,7 @@ var parameter_hunter = function () { //except for unclosed quotes to prevent infinite loops. if (quotePos === -1) { quotePos = paramString.length - 1; - } - else { + } else { quotePos += 2; } @@ -75,42 +80,37 @@ var parameter_hunter = function () { //move param key to paramStringWellFormed var. paramStringWellFormed += paramStringTmp; paramString = paramString.substring(quotePos, paramString.length).trim(); - } //if param value is wrapped in double quotes, just move to paramStringWellFormed var. - else if (paramString[0] === '"') { + } else if (paramString[0] === '"') { quotePos = paramString.search(/[^\\]"/); //except for unclosed quotes to prevent infinite loops. if (quotePos === -1) { quotePos = paramString.length - 1; - } - else { + } else { quotePos += 2; } //move param key to paramStringWellFormed var. paramStringWellFormed += paramString.substring(0, quotePos); paramString = paramString.substring(quotePos, paramString.length).trim(); - } //if param value is not wrapped in quotes, move everthing up to the delimiting comma to paramStringWellFormed var. - else { + } else { delimitPos = paramString.indexOf(','); //except to prevent infinite loops. if (delimitPos === -1) { delimitPos = paramString.length - 1; } - else { - delimitPos += 1; - } + paramStringWellFormed += paramString.substring(0, delimitPos); paramString = paramString.substring(delimitPos, paramString.length).trim(); } //break at the end. - if (paramString.length === 1) { + if (paramString.length <= 1) { paramStringWellFormed += paramString.trim(); paramString = ''; break; From 92e9a00ea906eb3dc890c984226a99d8dda6e8e9 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 20:32:41 -0400 Subject: [PATCH 051/162] updating unit tests for parameter_hunter paramToJson --- test/parameter_hunter_tests.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 96d345792..f87fd0752 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -208,12 +208,12 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not{\"true\"') }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not \"true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

true not{"true"

'); + test.equals(currentPattern.extendedTemplate, '

true not "true"

'); test.done(); }, @@ -223,12 +223,27 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not}\\\"true\\\"\") }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not \\\"true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

true not}"true"

'); + test.equals(currentPattern.extendedTemplate, '

true not "true"

'); + + test.done(); + }, + + 'parameter 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(); + + 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); + test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); } From 695471cff1792d2dddcab996e31ce959734d8fca Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 16 Mar 2016 06:35:17 -0400 Subject: [PATCH 052/162] minor edit --- core/lib/parameter_hunter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 49bc8c244..850a12143 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -15,8 +15,8 @@ var parameter_hunter = function () { var extend = require('util')._extend, pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), - style_modifier_hunter = new smh(), - pattern_assembler = new pa(); + pattern_assembler = new pa(), + style_modifier_hunter = new smh(); function paramToJson(pString) { var colonPos; From 7d40cb772464ae150a9d9ae9fead3d3ed45032e3 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 16 Mar 2016 08:26:18 -0400 Subject: [PATCH 053/162] docblock and comment update --- builder/pattern_assembler.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index fbc5f7373..2a878019f 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -447,8 +447,8 @@ var pattern_assembler = function () { * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. * @param {number|undefined} recursionLevel Top level === 0. Increments by 1 after that. - * @param {object} currentPatternAsParam Only submitted on recursionLevel > 0. - * @param {boolean} test When unit testing, pass in true to not output to file system. + * @param {object|undefined} currentPatternAsParam Only submitted on recursionLevel > 0. + * @param {boolean|undefined} test When unit testing, pass in true to not output to file system. */ function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { var fs = require('fs-extra'), @@ -747,6 +747,9 @@ var pattern_assembler = function () { process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, + + //only submit all 5 params within the function itself and in unit tests. + //when calling outside of these circumstances, only submit file and patternlab. process_pattern_recursive: function (file, patternlab, recursionLevel, currentPatternAsParam, test) { processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test); } From 8b3551fbe8ddaaf120ab4d058142bf41fd915e13 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 17 Mar 2016 18:32:18 -0400 Subject: [PATCH 054/162] another param string parser --- core/lib/parameter_hunter.js | 207 ++++++++++++++++++++--------------- package.gulp.json | 1 + package.json | 1 + 3 files changed, 123 insertions(+), 86 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 850a12143..6496275f4 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -13,6 +13,7 @@ var parameter_hunter = function () { var extend = require('util')._extend, + JSON5 = require('json5'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), @@ -20,105 +21,139 @@ var parameter_hunter = function () { function paramToJson(pString) { var colonPos; - var delimitPos; - var paramKey; - var paramString = pString; - var paramStringWellFormed = ''; - var paramStringTmp; - var quotePos; - + var keyCandidate = ''; + var keys = []; + var paramString; + var paramStringPrepared; + var regex; + var value; + var values = []; + var wrapper; + + //replace all escaped double-quotes with escaped unicode. + paramString = pString.replace(/\\"/g, '\\u0022'); + + //replace all escaped single-quotes with escaped unicode. + paramString = paramString.replace(/\\'/g, '\\u0027'); + + //with escaped quotes out of the way, crawl through paramString looking for + //keys and values. do { - //move param key to paramStringWellFormed var. - colonPos = paramString.indexOf(':'); - - //except to prevent infinite loops. - if (colonPos === -1) { - colonPos = paramString.length - 1; - } else { - colonPos += 1; - } - - paramKey = paramString.substring(0, colonPos); - - //if param key is wrapped in single quotes, replace with double quotes. - paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); - - //if params key is not wrapped in any quotes, wrap in double quotes. - paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); - - //this is just here to match the escaping scheme in Pattern Lab PHP. - paramKey = paramKey.replace(/\\/g, ''); - - paramStringWellFormed += paramKey; - paramString = paramString.substring(colonPos, paramString.length).trim(); - - //if param value is wrapped in single quotes, replace with double quotes. - if (paramString[0] === '\'') { - quotePos = paramString.search(/[^\\]'/); - - //except for unclosed quotes to prevent infinite loops. - if (quotePos === -1) { - quotePos = paramString.length - 1; - } else { - quotePos += 2; + //check if searching for a key + if (paramString[0] === '{' || paramString[0] === ',' || keyCandidate) { + paramString = paramString.substring([1], paramString.length).trim(); + + //find what, if any, type of quote wraps the key. + switch (paramString[0]) { + case '"': + wrapper = '"'; + break; + case '\'': + wrapper = '\''; + break; + default: + wrapper = ''; } - //prepare param value for move to paramStringWellFormed var. - paramStringTmp = paramString.substring(0, quotePos); - - //unescape any escaped single quotes. - paramStringTmp = paramStringTmp.replace(/\\'/g, '\''); - - //escape any double quotes. - paramStringTmp = paramStringTmp.replace(/"/g, '\\"'); - - //replace the delimiting single quotes with double quotes. - paramStringTmp = paramStringTmp.replace(/^'/, '"'); - paramStringTmp = paramStringTmp.replace(/'$/, '"'); - - //move param key to paramStringWellFormed var. - paramStringWellFormed += paramStringTmp; - paramString = paramString.substring(quotePos, paramString.length).trim(); - - //if param value is wrapped in double quotes, just move to paramStringWellFormed var. - } else if (paramString[0] === '"') { - quotePos = paramString.search(/[^\\]"/); - - //except for unclosed quotes to prevent infinite loops. - if (quotePos === -1) { - quotePos = paramString.length - 1; + //find index of next colon. try to determine if that delimits a key. + colonPos = paramString.indexOf(':'); + + if (colonPos) { + if (keyCandidate) { + keyCandidate += ':' + paramString.substring(0, colonPos).trim(); + } else { + keyCandidate = paramString.substring(0, colonPos).trim(); + } + + if (keyCandidate[keyCandidate.length - 1] === wrapper) { + keys.push(keyCandidate); + keyCandidate = ''; + } else if (wrapper === '' && keyCandidate[keyCandidate.length - 1] !== '"' && keyCandidate[keyCandidate.length - 1] !== '\'') { + keys.push(keyCandidate); + keyCandidate = ''; + } + + //if we have a persistent keyCandidate, continue looking for a key + if (keyCandidate) { + continue; + + //truncate the beginning from paramString and continue looking + //for a value + } else { + paramString = paramString.substring(colonPos, paramString.length); + } + + //if there are no more colons, and we're looking for a key, there is + //probably a problem. stop any further processing. } else { - quotePos += 2; + paramString = ''; + break; } + } - //move param key to paramStringWellFormed var. - paramStringWellFormed += paramString.substring(0, quotePos); - paramString = paramString.substring(quotePos, paramString.length).trim(); + //now, search for a value. + if (paramString[0] === ':' && !keyCandidate) { + paramString = paramString.substring([1], paramString.length).trim(); + + //since a quote of same type as its wrappers would be escaped, and we + //escaped those even further with their unicode, it is safe to look for + //wrapper pairs and conclude that their contents are values. + switch (paramString[0]) { + case '"': + regex = /^"(.|\s)*?"/; + break; + case '\'': + regex = /^'(.|\s)*?'/; + break; + //if there is no value wrapper, regex for alphanumerics. + default: + regex = /^\w*/; + } + values.push(paramString.match(regex)[0].trim()); - //if param value is not wrapped in quotes, move everthing up to the delimiting comma to paramStringWellFormed var. - } else { - delimitPos = paramString.indexOf(','); + //truncate the beginning from paramString and continue either + //looking for a key, or returning + paramString = paramString.replace(regex, '').trim(); - //except to prevent infinite loops. - if (delimitPos === -1) { - delimitPos = paramString.length - 1; + //exit do while if the final char is '}' + if (paramString === '}') { + paramString = ''; + break; } - paramStringWellFormed += paramString.substring(0, delimitPos); - paramString = paramString.substring(delimitPos, paramString.length).trim(); - } - - //break at the end. - if (paramString.length <= 1) { - paramStringWellFormed += paramString.trim(); + //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); - return paramStringWellFormed; + //build paramStringPrepared string for JSON5 parsing. + paramStringPrepared = '{'; + for (var i = 0; i < keys.length; i++) { + if (keys[i][0] !== '"' && keys[i][0] !== '\'') { + paramStringPrepared += '"'; + } + paramStringPrepared += keys[i]; + if (keys[i][keys[i].length - 1] !== '"' && keys[i][keys[i].length - 1] !== '\'') { + paramStringPrepared += '"'; + } + paramStringPrepared += ':' + values[i]; + if (i < keys.length - 1) { + paramStringPrepared += ','; + } + } + paramStringPrepared += '}'; + + //unescape unicodes for double quotes. + paramString = pString.replace(/\\u0022/g, '\u0022'); + + //unescape unicodes for single quotes. + paramString = paramString.replace(/\\u0027/g, '\u0027'); + + return paramStringPrepared; } function findparameters(pattern, patternlab) { @@ -140,16 +175,16 @@ var parameter_hunter = function () { //strip out the additional data, convert string to JSON. var leftParen = pMatch.indexOf('('); - var rightParen = pMatch.indexOf(')'); + var rightParen = pMatch.lastIndexOf(')'); var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = paramToJson(paramString); + var paramStringPrepared = paramToJson(paramString); var paramData = {}; var globalData = {}; var localData = {}; try { - paramData = JSON.parse(paramStringWellFormed); + paramData = JSON5.parse(paramStringPrepared); globalData = JSON.parse(JSON.stringify(patternlab.data)); localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); } catch (e) { diff --git a/package.gulp.json b/package.gulp.json index be9f8ddc4..2fbb4fb9e 100644 --- a/package.gulp.json +++ b/package.gulp.json @@ -9,6 +9,7 @@ "fs-extra": "^0.26.5", "glob": "^7.0.0", "html-entities": "^1.2.0", + "json5": "^0.5.0", "mustache": "^2.2.1" }, "devDependencies": { diff --git a/package.json b/package.json index 588f19d60..0a8d07103 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "fs-extra": "^0.26.2", "glob": "^7.0.0", "html-entities": "^1.2.0", + "json5": "^0.5.0", "matchdep": "^1.0.0", "mustache": "^2.2.0" }, From 77a2089e0b1524af35d9c9df92b0a6e58aeed143 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 17 Mar 2016 21:40:35 -0400 Subject: [PATCH 055/162] bugs fixed, unit tests working --- core/lib/parameter_hunter.js | 72 +++++++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 6496275f4..88d1added 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -13,7 +13,6 @@ var parameter_hunter = function () { var extend = require('util')._extend, - JSON5 = require('json5'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), @@ -26,25 +25,24 @@ var parameter_hunter = function () { var paramString; var paramStringPrepared; var regex; - var value; var values = []; var wrapper; - //replace all escaped double-quotes with escaped unicode. + //replace all escaped double-quotes with escaped unicode paramString = pString.replace(/\\"/g, '\\u0022'); - //replace all escaped single-quotes with escaped unicode. + //replace all escaped single-quotes with escaped unicode paramString = paramString.replace(/\\'/g, '\\u0027'); //with escaped quotes out of the way, crawl through paramString looking for - //keys and values. + //keys and values do { //check if searching for a key if (paramString[0] === '{' || paramString[0] === ',' || keyCandidate) { paramString = paramString.substring([1], paramString.length).trim(); - //find what, if any, type of quote wraps the key. + //find what, if any, type of quote wraps the key switch (paramString[0]) { case '"': wrapper = '"'; @@ -56,7 +54,7 @@ var parameter_hunter = function () { wrapper = ''; } - //find index of next colon. try to determine if that delimits a key. + //find index of next colon. try to determine if that delimits a key colonPos = paramString.indexOf(':'); if (colonPos) { @@ -92,13 +90,13 @@ var parameter_hunter = function () { } } - //now, search for a value. + //now, search for a value if (paramString[0] === ':' && !keyCandidate) { paramString = paramString.substring([1], paramString.length).trim(); //since a quote of same type as its wrappers would be escaped, and we //escaped those even further with their unicode, it is safe to look for - //wrapper pairs and conclude that their contents are values. + //wrapper pairs and conclude that their contents are values switch (paramString[0]) { case '"': regex = /^"(.|\s)*?"/; @@ -106,7 +104,8 @@ var parameter_hunter = function () { case '\'': regex = /^'(.|\s)*?'/; break; - //if there is no value wrapper, regex for alphanumerics. + + //if there is no value wrapper, regex for alphanumerics default: regex = /^\w*/; } @@ -130,27 +129,64 @@ var parameter_hunter = function () { } } while (paramString); - //build paramStringPrepared string for JSON5 parsing. + //build paramStringPrepared string for JSON parsing paramStringPrepared = '{'; for (var i = 0; i < keys.length; i++) { - if (keys[i][0] !== '"' && keys[i][0] !== '\'') { + + //keys + //replace single-quote wrappers with double-quotes + if (keys[i][0] === '\'' && keys[i][keys[i].length - 1] === '\'') { paramStringPrepared += '"'; + + //any enclosed double-quotes must be escaped + paramStringPrepared += keys[i].substring(1, keys[i].length - 1).replace(/"/g, '\\"'); + paramStringPrepared += '"'; + } else { + + //open wrap with double-quotes if no wrapper + if (keys[i][0] !== '"' && keys[i][0] !== '\'') { + paramStringPrepared += '"'; + + //this is to clean up vestiges from Pattern Lab PHP's escaping scheme + keys[i] = keys[i].replace(/\\/g, ''); + } + + paramStringPrepared += keys[i]; + + //close wrap with double-quotes if no wrapper + if (keys[i][keys[i].length - 1] !== '"' && keys[i][keys[i].length - 1] !== '\'') { + paramStringPrepared += '"'; + } } - paramStringPrepared += keys[i]; - if (keys[i][keys[i].length - 1] !== '"' && keys[i][keys[i].length - 1] !== '\'') { + + //colon delimiter. + paramStringPrepared += ':'; + values[i]; + + //values + //replace single-quote wrappers with double-quotes + if (values[i][0] === '\'' && values[i][values[i].length - 1] === '\'') { paramStringPrepared += '"'; + + //any enclosed double-quotes must be escaped + paramStringPrepared += values[i].substring(1, values[i].length - 1).replace(/"/g, '\\"'); + paramStringPrepared += '"'; + + //for everything else, just add the colon and the value however it's wrapped + } else { + paramStringPrepared += values[i]; } - paramStringPrepared += ':' + values[i]; + + //comma delimiter if (i < keys.length - 1) { paramStringPrepared += ','; } } paramStringPrepared += '}'; - //unescape unicodes for double quotes. + //unescape unicodes for double-quotes paramString = pString.replace(/\\u0022/g, '\u0022'); - //unescape unicodes for single quotes. + //unescape unicodes for single-quotes paramString = paramString.replace(/\\u0027/g, '\u0027'); return paramStringPrepared; @@ -184,7 +220,7 @@ var parameter_hunter = function () { var localData = {}; try { - paramData = JSON5.parse(paramStringPrepared); + paramData = JSON.parse(paramStringPrepared); globalData = JSON.parse(JSON.stringify(patternlab.data)); localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); } catch (e) { From e3bb31e87f4f180a4fbbd70257a927d1da3397df Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 17 Mar 2016 21:43:36 -0400 Subject: [PATCH 056/162] variable name change --- core/lib/parameter_hunter.js | 38 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 88d1added..86b8e07b6 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -23,7 +23,7 @@ var parameter_hunter = function () { var keyCandidate = ''; var keys = []; var paramString; - var paramStringPrepared; + var paramStringWellFormed; var regex; var values = []; var wrapper; @@ -129,59 +129,59 @@ var parameter_hunter = function () { } } while (paramString); - //build paramStringPrepared string for JSON parsing - paramStringPrepared = '{'; + //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] === '\'') { - paramStringPrepared += '"'; + paramStringWellFormed += '"'; //any enclosed double-quotes must be escaped - paramStringPrepared += keys[i].substring(1, keys[i].length - 1).replace(/"/g, '\\"'); - paramStringPrepared += '"'; + 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] !== '\'') { - paramStringPrepared += '"'; + paramStringWellFormed += '"'; //this is to clean up vestiges from Pattern Lab PHP's escaping scheme keys[i] = keys[i].replace(/\\/g, ''); } - paramStringPrepared += keys[i]; + paramStringWellFormed += keys[i]; //close wrap with double-quotes if no wrapper if (keys[i][keys[i].length - 1] !== '"' && keys[i][keys[i].length - 1] !== '\'') { - paramStringPrepared += '"'; + paramStringWellFormed += '"'; } } //colon delimiter. - paramStringPrepared += ':'; + values[i]; + paramStringWellFormed += ':'; + values[i]; //values //replace single-quote wrappers with double-quotes if (values[i][0] === '\'' && values[i][values[i].length - 1] === '\'') { - paramStringPrepared += '"'; + paramStringWellFormed += '"'; //any enclosed double-quotes must be escaped - paramStringPrepared += values[i].substring(1, values[i].length - 1).replace(/"/g, '\\"'); - paramStringPrepared += '"'; + paramStringWellFormed += values[i].substring(1, values[i].length - 1).replace(/"/g, '\\"'); + paramStringWellFormed += '"'; //for everything else, just add the colon and the value however it's wrapped } else { - paramStringPrepared += values[i]; + paramStringWellFormed += values[i]; } //comma delimiter if (i < keys.length - 1) { - paramStringPrepared += ','; + paramStringWellFormed += ','; } } - paramStringPrepared += '}'; + paramStringWellFormed += '}'; //unescape unicodes for double-quotes paramString = pString.replace(/\\u0022/g, '\u0022'); @@ -189,7 +189,7 @@ var parameter_hunter = function () { //unescape unicodes for single-quotes paramString = paramString.replace(/\\u0027/g, '\u0027'); - return paramStringPrepared; + return paramStringWellFormed; } function findparameters(pattern, patternlab) { @@ -213,14 +213,14 @@ var parameter_hunter = function () { var leftParen = pMatch.indexOf('('); var rightParen = pMatch.lastIndexOf(')'); var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringPrepared = paramToJson(paramString); + var paramStringWellFormed = paramToJson(paramString); var paramData = {}; var globalData = {}; var localData = {}; try { - paramData = JSON.parse(paramStringPrepared); + paramData = JSON.parse(paramStringWellFormed); globalData = JSON.parse(JSON.stringify(patternlab.data)); localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); } catch (e) { From df0e80459c378a19008d56a227479e8be093c796 Mon Sep 17 00:00:00 2001 From: James Nash Date: Fri, 11 Mar 2016 17:20:14 +0000 Subject: [PATCH 057/162] Added (failing for now) test to highlight the bug. --- .gitignore | 1 + test/parameter_hunter_tests.js | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/.gitignore b/.gitignore index 74ab03195..a1c22e42c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules/ +npm-debug.log .DS_Store latest-change.txt patternlab.json diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index f87fd0752..f1e813f3c 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -245,8 +245,29 @@ parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true

'); + test.done(); + }, + + 'parameter hunter finds and extends templates with multiple parameters' : function(test){ + + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + + patternlab.patterns[0].template = "

{{foo}}

{{bar}}

{{baz}}

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

true

Hello World

42

'); + test.done(); } + + }; }()); From 695a936d514f0f88d75d6c707bb0adc07da0b396 Mon Sep 17 00:00:00 2001 From: James Nash Date: Fri, 11 Mar 2016 17:42:57 +0000 Subject: [PATCH 058/162] Added another test for another bug (parenthesis in value confuses patternhunter) --- test/parameter_hunter_tests.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index f1e813f3c..68057c93c 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -248,6 +248,21 @@ test.done(); }, + 'parameter hunter parses parameters with values containing a closing parenthesis' : function(test){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_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); + test.equals(currentPattern.extendedTemplate, '

Hello ) World

'); + + test.done(); + }, + 'parameter hunter finds and extends templates with multiple parameters' : function(test){ var currentPattern = currentPatternClosure(); From 2a297f4a3e56e0ed129748201db1f7c45f4051f6 Mon Sep 17 00:00:00 2001 From: James Nash Date: Mon, 14 Mar 2016 16:46:25 +0000 Subject: [PATCH 059/162] Added additional parameter hunter tests. --- test/parameter_hunter_tests.js | 45 +++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 68057c93c..24b88be1c 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -249,6 +249,7 @@ }, 'parameter 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(); @@ -263,22 +264,60 @@ test.done(); }, - 'parameter hunter finds and extends templates with multiple parameters' : function(test){ + 'parameter 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(); + + 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); + test.equals(currentPattern.extendedTemplate, '

true

Hello World

'); + test.done(); + }, + + 'parameter 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(); - patternlab.patterns[0].template = "

{{foo}}

{{bar}}

{{baz}}

"; + patternlab.patterns[0].template = "

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; - currentPattern.template = "{{> molecules-single-comment(foo: true, bar: \"Hello World\", baz: 42) }}"; + 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); test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); + test.done(); + }, + + 'parameter 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(); + + patternlab.patterns[0].template = "

{{foo}}

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

Hello World

'); + test.done(); } From c8acb5ad9aebc9051ab5a2906b14b4fadcd7a55e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 06:32:11 -0400 Subject: [PATCH 060/162] replacing JSON with JSON5 for better error messaging --- core/lib/list_item_hunter.js | 28 ++++++++++++++++++++++++---- core/lib/parameter_hunter.js | 6 ++++-- core/lib/pattern_assembler.js | 12 +++++++++++- core/lib/patternlab.js | 9 ++++++++- test/parameter_hunter_tests.js | 4 +++- 5 files changed, 50 insertions(+), 9 deletions(-) diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 2b08ef2f1..ab6b7585d 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -13,6 +13,7 @@ var list_item_hunter = function () { var extend = require('util')._extend, + JSON = require('json5'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), @@ -44,7 +45,13 @@ var list_item_hunter = function () { } //check for a local listitems.json file - var listData = JSON.parse(JSON.stringify(patternlab.listitems)); + var listData; + try { + listData = JSON.parse(JSON.stringify(patternlab.listitems)); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); + } listData = pattern_assembler.merge_data(listData, pattern.listitems); //iterate over each copied block, rendering its contents along with pattenlab.listitems[i] @@ -54,8 +61,15 @@ 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 = JSON.parse(JSON.stringify(patternlab.data)); - var localData = JSON.parse(JSON.stringify(pattern.jsonFileData)); + var globalData; + var localData; + try { + globalData = JSON.parse(JSON.stringify(patternlab.data)); + localData = JSON.parse(JSON.stringify(pattern.jsonFileData)); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); + } var allData = pattern_assembler.merge_data(globalData, localData); allData = pattern_assembler.merge_data(allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup @@ -71,7 +85,13 @@ var list_item_hunter = function () { var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); //create a copy of the partial so as to not pollute it after the get_pattern_by_key call. - var cleanPartialPattern = JSON.parse(JSON.stringify(partialPattern)); + var cleanPartialPattern; + try { + cleanPartialPattern = JSON.parse(JSON.stringify(partialPattern)); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); + } //if partial has style modifier data, replace the styleModifier value if (foundPartials[j].indexOf(':') > -1) { diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 86b8e07b6..b8df4e960 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -13,6 +13,7 @@ var parameter_hunter = function () { var extend = require('util')._extend, + JSON = require('json5'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), @@ -223,8 +224,9 @@ var parameter_hunter = function () { paramData = JSON.parse(paramStringWellFormed); globalData = JSON.parse(JSON.stringify(patternlab.data)); localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); - } catch (e) { - console.log(e); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); } var allData = pattern_assembler.merge_data(globalData, localData); diff --git a/core/lib/pattern_assembler.js b/core/lib/pattern_assembler.js index 869b1986c..9c1b4ed78 100644 --- a/core/lib/pattern_assembler.js +++ b/core/lib/pattern_assembler.js @@ -332,6 +332,7 @@ var pattern_assembler = function () { } function parseDataLinksHelper(patternlab, obj, key) { + var JSON = require('json5'); var linkRE, dataObjAsString, linkMatches, expandedLink; linkRE = /link\.[A-z0-9-_]+/g; @@ -349,7 +350,16 @@ var pattern_assembler = function () { } } } - return JSON.parse(dataObjAsString); + + var dataObj; + try { + dataObj = JSON.parse(dataObjAsString); + } catch (err) { + console.log('There was an error parsing JSON for ' + key); + console.log(err); + } + + return dataObj; } //look for pattern links included in data files. diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index cc910a5bc..1fea221d2 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -12,6 +12,7 @@ var patternlab_engine = function (config) { 'use strict'; var path = require('path'), + JSON = require('json5'), fs = require('fs-extra'), diveSync = require('diveSync'), of = require('./object_factory'), @@ -191,7 +192,13 @@ var patternlab_engine = function (config) { pattern.lineageR = lineageRArray; //render the pattern, but first consolidate any data we may have - var allData = JSON.parse(JSON.stringify(patternlab.data)); + var allData; + try { + allData = JSON.parse(JSON.stringify(patternlab.data)); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); + } allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); //also add the cachebuster value. slight chance this could collide with a user that has defined cacheBuster as a value diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 24b88be1c..a96636652 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -311,12 +311,14 @@ patternlab.patterns[0].template = "

{{foo}}

"; patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + 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); - test.equals(currentPattern.extendedTemplate, '

Hello World

'); + test.equals(currentPattern.extendedTemplate, '

'); test.done(); } From 934844195b381bb34d23cf1d979aa5d6e0d988ef Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 08:07:15 -0400 Subject: [PATCH 061/162] working paramToJson --- core/lib/parameter_hunter.js | 67 +++++++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index b8df4e960..722217b73 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -19,22 +19,70 @@ var parameter_hunter = function () { pattern_assembler = new pa(), style_modifier_hunter = new smh(); + /** + * This function is really to accommodate the lax JSON-like syntax allowed by + * Pattern Lab PHP for paramater 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, commas, and colons. Use the string + * representation of their unicodes for this. This has the added bonus + * of being interpreted correctly by JSON5.parse() without 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 of text + * wrapped in quotes, or a string of alphanumerics. + * * 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 safely wrapped in double-quotes. + * * Return paramStringWellFormed. + * + * @param {string} pString + * @returns {string} paramStringWellFormed + */ function paramToJson(pString) { var colonPos; var keyCandidate = ''; var keys = []; - var paramString; + var paramString = pString; // to not reassign param var paramStringWellFormed; var regex; var values = []; var wrapper; //replace all escaped double-quotes with escaped unicode - paramString = pString.replace(/\\"/g, '\\u0022'); + paramString = paramString.replace(/\\"/g, '\\u0022'); //replace all escaped single-quotes with escaped unicode paramString = paramString.replace(/\\'/g, '\\u0027'); + //replace all escaped commas with escaped unicode + paramString = paramString.replace(/\\,/g, '\\u0044'); + + //replace all escaped colons with escaped unicode + paramString = paramString.replace(/\\:/g, '\\u0058'); + //with escaped quotes out of the way, crawl through paramString looking for //keys and values do { @@ -148,7 +196,11 @@ var parameter_hunter = function () { if (keys[i][0] !== '"' && keys[i][0] !== '\'') { paramStringWellFormed += '"'; - //this is to clean up vestiges from Pattern Lab PHP's escaping scheme + //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, ''); } @@ -184,11 +236,10 @@ var parameter_hunter = function () { } paramStringWellFormed += '}'; - //unescape unicodes for double-quotes - paramString = pString.replace(/\\u0022/g, '\u0022'); - - //unescape unicodes for single-quotes - paramString = paramString.replace(/\\u0027/g, '\u0027'); + //unescape escaped unicode except for double-quotes + paramStringWellFormed = paramStringWellFormed.replace(/\\u0027/g, '\''); + paramStringWellFormed = paramStringWellFormed.replace(/\\u0044/g, ','); + paramStringWellFormed = paramStringWellFormed.replace(/\\u0058/g, ':'); return paramStringWellFormed; } From cf080af15fdc72985bd19657d6be0f2e2895dcd9 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 08:08:28 -0400 Subject: [PATCH 062/162] stricter unit tests --- test/parameter_hunter_tests.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index a96636652..3a9abb25a 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -208,12 +208,12 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not \"true\"') }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not{\"true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

true not "true"

'); + test.equals(currentPattern.extendedTemplate, '

true not{"true"

'); test.done(); }, @@ -223,12 +223,12 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not \\\"true\\\"\") }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not}\\\"true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

true not "true"

'); + test.equals(currentPattern.extendedTemplate, '

true not}"true"

'); test.done(); }, From 68a6c35894c5f1fa1d023a4d392fdd88245b6dc7 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 08:16:24 -0400 Subject: [PATCH 063/162] comment updates --- core/lib/parameter_hunter.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 722217b73..7b3b802dc 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -21,20 +21,20 @@ var parameter_hunter = function () { /** * This function is really to accommodate the lax JSON-like syntax allowed by - * Pattern Lab PHP for paramater submissions to partials. Unfortunately, no + * 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, commas, and colons. Use the string * representation of their unicodes for this. This has the added bonus - * of being interpreted correctly by JSON5.parse() without modification. - * This will be useful later in the function. + * 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 + * * 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. @@ -46,7 +46,7 @@ var parameter_hunter = function () { * * Next, search for a value. It will either be the next block of text * wrapped in quotes, or a string of alphanumerics. * * Save the value to the values array. - * * The do/while loop truncates the paramString value while parsing. Its + * * 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 @@ -55,7 +55,7 @@ var parameter_hunter = function () { * 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 safely wrapped in double-quotes. + * double-quotes will be wrapped in double-quotes without need for escape. * * Return paramStringWellFormed. * * @param {string} pString From 37ad825dbef5c62b45a6f49ab653c9a018d0fe44 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 08:21:32 -0400 Subject: [PATCH 064/162] simplfying paramToJson further --- core/lib/parameter_hunter.js | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 7b3b802dc..0a1cc604b 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -63,7 +63,6 @@ var parameter_hunter = function () { */ function paramToJson(pString) { var colonPos; - var keyCandidate = ''; var keys = []; var paramString = pString; // to not reassign param var paramStringWellFormed; @@ -88,7 +87,7 @@ var parameter_hunter = function () { do { //check if searching for a key - if (paramString[0] === '{' || paramString[0] === ',' || keyCandidate) { + if (paramString[0] === '{' || paramString[0] === ',') { paramString = paramString.substring([1], paramString.length).trim(); //find what, if any, type of quote wraps the key @@ -107,29 +106,10 @@ var parameter_hunter = function () { colonPos = paramString.indexOf(':'); if (colonPos) { - if (keyCandidate) { - keyCandidate += ':' + paramString.substring(0, colonPos).trim(); - } else { - keyCandidate = paramString.substring(0, colonPos).trim(); - } - - if (keyCandidate[keyCandidate.length - 1] === wrapper) { - keys.push(keyCandidate); - keyCandidate = ''; - } else if (wrapper === '' && keyCandidate[keyCandidate.length - 1] !== '"' && keyCandidate[keyCandidate.length - 1] !== '\'') { - keys.push(keyCandidate); - keyCandidate = ''; - } - - //if we have a persistent keyCandidate, continue looking for a key - if (keyCandidate) { - continue; - - //truncate the beginning from paramString and continue looking - //for a value - } else { - paramString = paramString.substring(colonPos, paramString.length); - } + keys.push(paramString.substring(0, colonPos).trim()); + + //truncate the beginning from paramString and look for a value + paramString = paramString.substring(colonPos, paramString.length); //if there are no more colons, and we're looking for a key, there is //probably a problem. stop any further processing. @@ -140,7 +120,7 @@ var parameter_hunter = function () { } //now, search for a value - if (paramString[0] === ':' && !keyCandidate) { + if (paramString[0] === ':') { paramString = paramString.substring([1], paramString.length).trim(); //since a quote of same type as its wrappers would be escaped, and we From a7e52cd58d154008084b1d751f5a73b9e2331c6f Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 08:26:07 -0400 Subject: [PATCH 065/162] simplfying paramToJson further --- core/lib/.parameter_hunter.js.swp | Bin 0 -> 24576 bytes core/lib/parameter_hunter.js | 15 +-------------- 2 files changed, 1 insertion(+), 14 deletions(-) create mode 100644 core/lib/.parameter_hunter.js.swp diff --git a/core/lib/.parameter_hunter.js.swp b/core/lib/.parameter_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..c8f5955ab581f632b38bc5142bf28bda293fa006 GIT binary patch literal 24576 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 O2Nq Date: Fri, 18 Mar 2016 08:27:59 -0400 Subject: [PATCH 066/162] comment update --- core/lib/.parameter_hunter.js.swp | Bin 24576 -> 0 bytes core/lib/parameter_hunter.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 core/lib/.parameter_hunter.js.swp diff --git a/core/lib/.parameter_hunter.js.swp b/core/lib/.parameter_hunter.js.swp deleted file mode 100644 index c8f5955ab581f632b38bc5142bf28bda293fa006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 zcmeI4TZ|;vS;s4}6DM}OHsrxP06y8^^vt-YYj#;*;$;bO*6T~W7rbj*W@o)rcc1Pq zPjywhs(NR~>j_E_!U{Km5JU47WWF!uiQ zF3;0iF23^XWH1hN)QOT_5M8Xbe}AUa%s)8_Qr-7YhPlrCNs#9{jiaEu8Yg`{|9w^O z&qu+k_IpXH{V43xAPvTvXU>kMF>jqmvWtz`+-o?{Z~zWW^TFz^S9{;Sf8Uz$26xCZP2 zU)o(7MBd%+6047?t^e6{EODtH)N3qJK0&-)SZFt`T%-c_Er1#SUfywdYN z1nvdbffwEk9pFK51bp>Pp7&AkyL?{U8Nrz&f}d{38LAe*nJ-#vlSWgO}ms*T5fu z9|FSHEpQ&pz7#K0%y2SK!+5B?`3r~Yw>znxL_tq4`RnVq`NOtqt*=kl)^57BwS3S# z>HDsQ3Zh8qtQSmlU-gnGi8Hks=A-i3G!A=|T6mW}V7nUdz=2m9a6ArP^MI{t!2P#e ze83FeMSAtoX+k;4Yn|xc+PM2KK5jpmb}wbzb3v-k1<@4Z4yn^;tgz%_s)zb~^|hu7 z59%m7lB8qZUwE5-CRS$-D&JRmqT(c{yCBQLVQiJg$W}(#&|C8Z8=W|jWYYOy8u#)r zaZjB}?#YsP$@RXhE=V^kzWHB$SE}=AiZWfujKXf$)w3emH8#_!HMInro3;fVtNTok zi~H#m&6JvFHTvDvYBLQcqT*q^qd`7Orn!nWcLz!86u<0nMcp4;`gFhnwBeA-Q;ftBHQSdF1H(vD#t>HoKl7~W?PPFH8xm|&!+AZ! ziIQikuF=+=wH0#;+@w`9KxZbSAfAqO8uqgCNo23j!^cbqX>Vkh8Q3v|8hoNG2&@1I z1l1IV#I#pk3idXn*PL$)NJem0Rdk`J2(BE|Xo%|TC>)E>=sDjMJ(H(OY1dkxq+JxG z(Ne6jBaHh6^OQ_2h$|+oV6Z_7tG5dM zFx?EoG~-FV)lr9~lyMwln=*X9HGzhKr9fyhW7VwE8NTT3VlBe*=G3>B2AfefV*@TwXp zG6}3w_5`98Za-pNp4G@wgEFJ-PLdS?wWiSMJCifMKh4BG3fVhK@%@#cvyOVu>QvF; ziaH+m@V9P%I1h0zVsEf$n(4tb zQW35rl~qavT&%Y>W-(@03!6eIXPvOh!c)p!;cy;piR#>Q^7yfvI^tmT(z4m&2(5!@ zN{?wp3j4oQXFAReF>Wqlih-H^US=GFIDSXx2$={?LBG$4-6WpY9M=)syJOVMp3<_Q z?Zk@vF6G)$RQQ@c?RsEoJH;4Tt|v$6>07MLuC`vZ7+iY{IiPd_s zV}0j|Sod_61!-YvR+|IWn`U`3R#`6%S;f&-qx?{078666SqsGIoLjZ@ixSCgO9ES| z5Y}6N8nDe%R34`chh}7|A7;IT-2hCJHOF%FK~Z^BM%G)#?PFnqW9JE5;;ilsy6VJT zC(J`NDyH3W$j(i+={(4dJY+)wD`R@kr!ndyPBTslZlYp^8j1g8;}=0J&jvlQw4~1y zW~xze-ssM16mB4bEi~i2NHW9bau%hGB#nz7zg*?6?%4jHam z`z%{cJ%%r-YcdIzmW`K^##~GFqth_eORbK-u;-R*JqczT@94j1C?-&E`Uv~fo9s>5 z<+6ZjG^RE%yPv4F+&OFSv^`Inm0WkV<2+Du63e>4(H5gMiqXsW9)vZr`CZ|kI*MC| zsX@G9#B_U#oR6dlZd}y=uq^Y(BaF{TH;l7M$UX+4w%OYCl4%+Y^%&E%+7|TBg+1Nj z$hTr}FW=$}p-kgGJQbrndiN=m&Rn+bZcoD?R!65geoV(>y`@>7WN2x;sk_D+vGiO_ z!uC2>TCY~sxqY4eoi#q}U)y)H@_gFK`TxC~&E?E4=YNj!=Jhjtcn}-~cY^nT+rcg1 zb>OdP|5@-E@FMsl@P|P9c?vYIh64=;8V)oZXgJVtpy5EnfrbMO2O17E9B4T3Dmg$@ zVjAg=K0hHIBFU`zV>}1-Z8@wf{#U%V&Hp5~2+fvlvn6*PZu5Ncn{yY|kcMZgmbcZS z0*f9pc`=&}lbAss3gphLZT5iR_$q*E$5c&Y0O4YM7tIFm(SEnGT5=+PO$4 zzCWFmL7n+#MP#w)UM1Z}h#bo0USOhe#E9IG5-uWPl952@+qk4T|36G_`YYtF<@{gN z_dmxO|HI%Xz>k9nbim(nw*Oo3lVAu2;278gt_GhbufGY-fo1R&^7?-RB-j5ecn16| z_z2hr4}rIUtHAT*{l{P#TmfDp@BdlwJoqK>10V&D0v~)c@W8)Q5AZzr9dHi37wiF7 zgTJOO;N##U;D^Bn!27`g@HJ`#z6|~h{66??@Fe&-puu7AP2f6kCHNdQ1W$l22tXVB z3AF^zfS(3G1p=@HJn&!C5_}Xq488$;@-pfH!1sU?;5fJed>at{{|oqg@B;V^@HF^A zkb<+|Fjxb7z+WP>Ki^SPU@c2@#=LyLN_*JU_)Jn$vK6tU0wj@|iXs=U-5*@o!d+bO z)Pm*B@p6Wt?r ztjhakn#0t81gabKHnJ$lMkecfj3N+|<}itJ;>V&0p6iV_-ya7l;Z8hB=^Jgvh;%n) zB}2*lNca&tO<=stLz(rWR*bxUIdd$`_*< zOHPWX*UqT79Xh1Auio*FLbm1A^;XMOP#Bi_ewkamWK-N$nwYX#ZcHCm4vQ3UhQ?P? z(~hYSkfNideeHtoPNd@@RYI$3-*Tm&MM2Eox`z6`1jC7IOHNg?=ylT>lY)`#m&>qK z9Nv|x8trr3JtW+Pk9GDICRCA&VYzk{zpHAfdVNsg>Rg@B4B<|3Aa;)OQjW-rUE}k9aUvSFf`%>-D-$jHrUuKdACe=ZALb#=4+m#rwgW+%A zSn-#8jLOk;$pmdwnp$fN`K?li=akC#Cu!0p$wlIq`jCXI&bUJggklVlvdc2c9Z9)C zlSy5oj=qnyFn>~~l0Ic28S^)K*k4G+nair_7FQ_jAW1$nlXF??wtFyioEGh_CZg2b zRA!8GW-=z@UgwL|h3z@h)91t7+g-p-#;!bhWqW zYVU%s_SSmJSScx?sdEv=6-F*3`@Y*Rp%#>J6oTnR)4pU~ZJ`KRcM%o|KU?Tz1?0)| z^78$n{=hEiB*RG@x{SM7tFfypb5F$#`+2G?f&oLw+M8^MHF>5p(;tRORYTw^z$hum z_#;`ioPgbYVDAIySVdFaAaE6LRLZdUuNh2!+TGjfnB{gLyD^VT2^z1B(=N8_w- zs~M>8Q}eT^da0nO@(k6d1p=>)Gv_1bT%HKv>vVeZ=-1`;j1#clvhMWeJzH%KwN={q zR4O(Xa=dP*ug;$odW7B>1ugh3Y9*`SPKQ#-e@*H?@bpks$h_uPMC|2ldq%dpT3np- zs+_;|`QwA77J5<5$M@x6&i<2|QqE$k)=Uo_it4{0ev)NF3k-cnsVQ{*810FM~5+9oz

1y6wx+yFk$S^jrH4DJJWfjhy=oauiPd<=v@flpuNdA|id4(Q~ay`-&$B1bJ`J5GHSm#)>Lk5CP!t4+ zN{Znqe=-{uqgAGu%4}HVFvukda~YK_ev!cPRjg`d&t=0Kt;HM;@}RO-*>%s+P?2Ai zA3?X!=?;3b(#Y8E>kbC6(nXPsQx5@_aXIE_OitM7+I6BZ-e6oCb6dKwJ@X(TxxloT z;f`&~oD8RxG~y5|Wkb~Wv35(3vMVYYmBnhCCTFvSH;M!0 zcdE77{S#dkN+KnQrZ-ndN%4~~O!UwE+QlfDX>iokS#p1FrE-#5s2r3@5A|8;aH%GE zwk(IaRGXV9+a>m6*)Pwx*@p4=PF+`}=G3Jjd{2m6N6BzWr)h0OQ@38;Yn?KuD5)(Z zj6qAI9_9dO>i3Mkw3HZ%HQ%6{@o`k^aGPMS*|^F$wSa-DsDwpwv~+c(=A%7zhJ&qA zv{F}hgmQM7mMmr$wwG(8D5rkr?j>}G3U&Iz>zO_fz7@eNMdtE+Y@_y|toSC{E(WU5 zgLGzY7hLeaxK~MvVdihvNsxPXG4AYi(X2yvR!t?6w``)=$QS6kXMw21ZSafYg z8|s`?l)c*BI?I-@aMZ%7`T|trTCHzsRjJ9?L;(Dy)9ah-tLvS0|9xj}T=s_&4XAX? z?XzpEH=)v4`jHicu~Vf@O|{JPU*2g*ayYw7F20n-;J5i9uD(%1f5 z?C&Ire%a2*P!=hQBC_Frb+GF%>Z~9aQ$a?hbb^I{Dc)yJ%oXP(3)5{8d|J(R~Nl|%vb{T-`M)|3* zWRe#D!&v}3M8W-Cxk|v|AWL>hP~lWXy@-xf>g60)J>*(x+QoFbE?m)S3Cy5+r``Ju O2Nq Date: Fri, 18 Mar 2016 09:01:14 -0400 Subject: [PATCH 067/162] tightened parameter key search --- core/lib/parameter_hunter.js | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 893048ab5..b39466681 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -62,12 +62,14 @@ var parameter_hunter = function () { * @returns {string} paramStringWellFormed */ function paramToJson(pString) { - var colonPos; + 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'); @@ -89,15 +91,37 @@ var parameter_hunter = function () { if (paramString[0] === '{' || paramString[0] === ',') { paramString = paramString.substring([1], paramString.length).trim(); - //find index of next colon. try to determine if that delimits a key - colonPos = paramString.indexOf(':'); + //search for end quote if wrapped in quotes. else search for colon. + 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; - if (colonPos) { + } 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 { From 83f6a4f7d23419fff19022fc736617a37705e945 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 09:06:53 -0400 Subject: [PATCH 068/162] comment update --- core/lib/parameter_hunter.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index b39466681..3012a17e8 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -92,7 +92,9 @@ var parameter_hunter = function () { 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 '\'': From ed1312889ea12ae24871b64e290a6a2b39357f78 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 09:41:54 -0400 Subject: [PATCH 069/162] accommodating decimals and exponentials as valid numeric values --- core/lib/parameter_hunter.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 3012a17e8..0d88a0670 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -43,8 +43,8 @@ var parameter_hunter = function () { * 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 of text - * wrapped in quotes, or a string of alphanumerics. + * * Next, search for a value. It will either be the next block wrapped in + * quotes, or a string of alphanumerics, decimal points, or hyphens. * * 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 @@ -147,9 +147,10 @@ var parameter_hunter = function () { regex = /^'(.|\s)*?'/; break; - //if there is no value wrapper, regex for alphanumerics + //if there is no value wrapper, regex for alphanumerics. also regex + //for points for decimals and hyphens for exponentials. default: - regex = /^\w*/; + regex = /^[\w\-\.]*/; } values.push(paramString.match(regex)[0].trim()); From 7bcea0afe7b193510c83a42773c1fbc10497ad29 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 09:46:21 -0400 Subject: [PATCH 070/162] comment update --- core/lib/parameter_hunter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 0d88a0670..ce5342d23 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -44,7 +44,7 @@ var parameter_hunter = function () { * 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 hyphens. + * 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 @@ -147,8 +147,8 @@ var parameter_hunter = function () { regex = /^'(.|\s)*?'/; break; - //if there is no value wrapper, regex for alphanumerics. also regex - //for points for decimals and hyphens for exponentials. + //if there is no value wrapper, regex for alphanumerics, decimal + //points, and minus signs for exponential notation. default: regex = /^[\w\-\.]*/; } From 227de6a873d765d0ccd55a32dc4ec9ca140d2be8 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 10:37:32 -0400 Subject: [PATCH 071/162] new paramToJson --- builder/parameter_hunter.js | 266 +++++++++++++------ test/files/_patterns/00-test/01-bar.mustache | 2 +- test/parameter_hunter_tests.js | 251 +---------------- 3 files changed, 204 insertions(+), 315 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index b6fd150fb..bd4ef7594 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -12,110 +12,227 @@ var parameter_hunter = function () { - var pa = require('./pattern_assembler'), + var JSON = require('json5'), + pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), pattern_assembler = new pa(), style_modifier_hunter = new smh(); + /** + * 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, commas, 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; - var delimitPos; - var paramKey; - var paramString = pString; - var paramStringWellFormed = ''; - var paramStringTmp; - var quotePos; + var colonPos = -1; + var keys = []; + var paramString = pString; // to not reassign param + var paramStringWellFormed; + var quotePos = -1; + var regex; + var values = []; + var wrapper; - do { + //replace all escaped double-quotes with escaped unicode + paramString = paramString.replace(/\\"/g, '\\u0022'); - //move param key to paramStringWellFormed var. - colonPos = paramString.indexOf(':'); + //replace all escaped single-quotes with escaped unicode + paramString = paramString.replace(/\\'/g, '\\u0027'); - //except to prevent infinite loops. - if (colonPos === -1) { - colonPos = paramString.length - 1; - } else { - colonPos += 1; - } + //replace all escaped commas with escaped unicode + paramString = paramString.replace(/\\,/g, '\\u0044'); - paramKey = paramString.substring(0, colonPos); + //replace all escaped colons with escaped unicode + paramString = paramString.replace(/\\:/g, '\\u0058'); - //if param key is wrapped in single quotes, replace with double quotes. - paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); - - //if params key is not wrapped in any quotes, wrap in double quotes. - paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); + //with escaped chars out of the way, crawl through paramString looking for + //keys and values + do { - //this is just here to match the escaping scheme in Pattern Lab PHP. - paramKey = paramKey.replace(/\\/g, ''); + //check if searching for a key + if (paramString[0] === '{' || paramString[0] === ',') { + paramString = paramString.substring([1], paramString.length).trim(); - paramStringWellFormed += paramKey; - paramString = paramString.substring(colonPos, 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]) { - //if param value is wrapped in single quotes, replace with double quotes. - if (paramString[0] === '\'') { - quotePos = paramString.search(/[^\\]'/); + //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; - //except for unclosed quotes to prevent infinite loops. - if (quotePos === -1) { - quotePos = paramString.length - 1; - } else { - quotePos += 2; + default: + colonPos = paramString.indexOf(':'); } - //prepare param value for move to paramStringWellFormed var. - paramStringTmp = paramString.substring(0, quotePos); + if (quotePos > -1) { + keys.push(paramString.substring(0, quotePos + 1).trim()); - //unescape any escaped single quotes. - paramStringTmp = paramStringTmp.replace(/\\'/g, '\''); + //truncate the beginning from paramString and look for a value + paramString = paramString.substring(quotePos + 1, paramString.length).trim(); - //escape any double quotes. - paramStringTmp = paramStringTmp.replace(/"/g, '\\"'); + //unset quotePos + quotePos = -1; - //replace the delimiting single quotes with double quotes. - paramStringTmp = paramStringTmp.replace(/^'/, '"'); - paramStringTmp = paramStringTmp.replace(/'$/, '"'); + } else if (colonPos > -1) { + keys.push(paramString.substring(0, colonPos).trim()); - //move param key to paramStringWellFormed var. - paramStringWellFormed += paramStringTmp; - paramString = paramString.substring(quotePos, paramString.length).trim(); + //truncate the beginning from paramString and look for a value + paramString = paramString.substring(colonPos, paramString.length); - //if param value is wrapped in double quotes, just move to paramStringWellFormed var. - } else if (paramString[0] === '"') { - quotePos = paramString.search(/[^\\]"/); + //unset colonPos + colonPos = -1; - //except for unclosed quotes to prevent infinite loops. - if (quotePos === -1) { - quotePos = paramString.length - 1; + //if there are no more colons, and we're looking for a key, there is + //probably a problem. stop any further processing. } else { - quotePos += 2; + paramString = ''; + break; + } + } + + //now, search for a value + if (paramString[0] === ':') { + paramString = paramString.substring([1], paramString.length).trim(); + + //since a quote of same type as its wrappers would be escaped, and we + //escaped those even further with their unicode, it is safe to look for + //wrapper pairs and conclude that their contents are values + switch (paramString[0]) { + 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++) { - //move param key to paramStringWellFormed var. - paramStringWellFormed += paramString.substring(0, quotePos); - paramString = paramString.substring(quotePos, paramString.length).trim(); + //keys + //replace single-quote wrappers with double-quotes + if (keys[i][0] === '\'' && keys[i][keys[i].length - 1] === '\'') { + paramStringWellFormed += '"'; - //if param value is not wrapped in quotes, move everthing up to the delimiting comma to paramStringWellFormed var. + //any enclosed double-quotes must be escaped + paramStringWellFormed += keys[i].substring(1, keys[i].length - 1).replace(/"/g, '\\"'); + paramStringWellFormed += '"'; } else { - delimitPos = paramString.indexOf(','); - //except to prevent infinite loops. - if (delimitPos === -1) { - delimitPos = paramString.length - 1; + //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 += paramString.substring(0, delimitPos); - paramString = paramString.substring(delimitPos, paramString.length).trim(); + 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 += '"'; + } } - //break at the end. - if (paramString.length <= 1) { - paramStringWellFormed += paramString.trim(); - paramString = ''; - break; + //colon delimiter. + paramStringWellFormed += ':'; + values[i]; + + //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]; } - } while (paramString); + //comma delimiter + if (i < keys.length - 1) { + paramStringWellFormed += ','; + } + } + paramStringWellFormed += '}'; + + //unescape escaped unicode except for double-quotes + paramStringWellFormed = paramStringWellFormed.replace(/\\u0027/g, '\''); + paramStringWellFormed = paramStringWellFormed.replace(/\\u0044/g, ','); + paramStringWellFormed = paramStringWellFormed.replace(/\\u0058/g, ':'); return paramStringWellFormed; } @@ -153,14 +270,13 @@ var parameter_hunter = function () { style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); } - //strip out the additional data, convert string to JSON. + //strip out the additional data, convert string to JSON var leftParen = parameteredPartials[i].indexOf('('); - var rightParen = parameteredPartials[i].indexOf(')'); - var paramData = {}; + var rightParen = parameteredPartials[i].lastIndexOf(')'); var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = '{}'; - paramStringWellFormed = paramToJson(paramString); + var paramStringWellFormed = paramToJson(paramString); + var paramData = {}; try { paramData = JSON.parse(paramStringWellFormed); } catch (e) { diff --git a/test/files/_patterns/00-test/01-bar.mustache b/test/files/_patterns/00-test/01-bar.mustache index 08573a42b..5716ca598 100644 --- a/test/files/_patterns/00-test/01-bar.mustache +++ b/test/files/_patterns/00-test/01-bar.mustache @@ -1 +1 @@ -{{message}}bar +bar diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index c62b3f246..1d4dccd11 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -54,270 +54,43 @@ }; exports['parameter_hunter'] = { - 'parameter hunter finds and extends templates' : function(test){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - - parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var pa = require('../builder/pattern_assembler'); - var pattern_assembler = new pa(); - - currentPattern.escapedTemplate = '

{{foo}}

' + currentPattern.template; - currentPattern.extendedTemplate = currentPattern.escapedTemplate; - patternlab.data.foo = 'Bar'; - - parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); - currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern.extendedTemplate, patternlab.data); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; - - 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.dataKeys = []; - 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.') }}"; - parameteredPartials[1] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; - - 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.dataKeys = []; - 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.') }}"; - parameteredPartials[1] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

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

'); - - test.done(); - }, - - //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){ + 'parameter 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 parameteredPartials = []; - currentPattern.template = "{{> molecules-single-comment(description: true) }}"; - currentPattern.extendedTemplate = currentPattern.template; - currentPattern.dataKeys = []; - parameteredPartials[0] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true

'); - - test.done(); - }, - - 'parameter hunter parses parameters with unquoted keys and double-quoted values' : function(test){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; + patternlab.patterns[0].template = "

{{foo}}

{{bar}}

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

true

'); + test.equals(currentPattern.extendedTemplate, '

true

Hello World

'); test.done(); }, - 'parameter hunter parses parameters with single-quoted keys and unquoted values' : function(test){ + 'parameter 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 parameteredPartials = []; - currentPattern.template = "{{> molecules-single-comment('description': true) }}"; - currentPattern.extendedTemplate = currentPattern.template; - currentPattern.dataKeys = []; - parameteredPartials[0] = currentPattern.template; + patternlab.patterns[0].template = "

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; + patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; - - currentPattern.template = "{{> molecules-single-comment('description': 'true not,\\'true\\'') }}"; + currentPattern.template = "{{> molecules-single-comment('silly\\\'key': true, bar: \"Hello World\", \"another\\\"silly-key\": 42 ) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.dataKeys = []; parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - 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){ - var currentPattern = currentPatternClosure(); - var patternlab = patternlabClosure(); - var parameter_hunter = new ph(); - var parameteredPartials = []; - - currentPattern.template = "{{> molecules-single-comment('description': \"true not:'true'\") }}"; - currentPattern.extendedTemplate = currentPattern.template; - currentPattern.dataKeys = []; - parameteredPartials[0] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true not:'true'

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

true not ":true"

'); - - test.done(); - }, - - 'parameter 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 parameteredPartials = []; - - 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.dataKeys = []; - parameteredPartials[0] = currentPattern.template; - - parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true

'); - - test.done(); - }, - - 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ - // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js - //arrange - var fs = require('fs-extra'); - var path = require('path'); - var object_factory = require('../builder/object_factory'); - var pa = require('../builder/pattern_assembler'); - 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.dataKeys = []; - pl.config.debug = false; - pl.patterns = []; - - var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); - var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); - var innerParameteredFile = path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'); - var outerParameteredFile = path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'); - - pattern_assembler.process_pattern_iterative(atomFile, pl); - pattern_assembler.process_pattern_iterative(styleFile, pl); - pattern_assembler.process_pattern_iterative(innerParameteredFile, pl); - pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); - - //act - pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); - pattern_assembler.process_pattern_recursive(styleFile, pl, 0, null, true); - pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, 0, null, true); - pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, 0, null, true); - var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); + test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); - //assert. - var expectedValue = 'bar foo bar bar'; - test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); } }; From 91f6c1e71e3b7a43feadd4129e0614eb0d4fe347 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 11:29:45 -0400 Subject: [PATCH 072/162] working unit tests --- package.gulp.json | 3 +- package.json | 1 + test/files/_patterns/00-test/01-bar.mustache | 2 +- test/parameter_hunter_tests.js | 251 ++++++++++++++++++- 4 files changed, 243 insertions(+), 14 deletions(-) diff --git a/package.gulp.json b/package.gulp.json index 87a4d0044..31cc621bf 100644 --- a/package.gulp.json +++ b/package.gulp.json @@ -8,8 +8,9 @@ "diveSync": "^0.3.0", "fs-extra": "^0.26.5", "glob": "^7.0.0", + "hogan": "^1.0.2", "html-entities": "^1.2.0", - "mustache": "^2.2.1" + "json5": "^0.5.0" }, "devDependencies": { "browser-sync": "^2.11.1", diff --git a/package.json b/package.json index 85b4da916..240743f72 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "glob": "^7.0.0", "hogan": "^1.0.2", "html-entities": "^1.2.0", + "json5": "^0.5.0", "matchdep": "^1.0.0" }, "devDependencies": { diff --git a/test/files/_patterns/00-test/01-bar.mustache b/test/files/_patterns/00-test/01-bar.mustache index 5716ca598..08573a42b 100644 --- a/test/files/_patterns/00-test/01-bar.mustache +++ b/test/files/_patterns/00-test/01-bar.mustache @@ -1 +1 @@ -bar +{{message}}bar diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 1d4dccd11..c62b3f246 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -54,43 +54,270 @@ }; exports['parameter_hunter'] = { - 'parameter hunter parses parameters that follow a non-quoted value' : function(test){ - // From issue #291 https://github.com/pattern-lab/patternlab-node/issues/291 + 'parameter hunter finds and extends templates' : function(test){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + + parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var pa = require('../builder/pattern_assembler'); + var pattern_assembler = new pa(); + + currentPattern.escapedTemplate = '

{{foo}}

' + currentPattern.template; + currentPattern.extendedTemplate = currentPattern.escapedTemplate; + patternlab.data.foo = 'Bar'; + + parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); + currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern.extendedTemplate, patternlab.data); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var parameteredPartials = []; + + 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.dataKeys = []; + 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.') }}"; + parameteredPartials[1] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var parameteredPartials = []; + + 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.dataKeys = []; + 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.') }}"; + parameteredPartials[1] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

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

'); + + test.done(); + }, + + //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){ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); var parameteredPartials = []; - patternlab.patterns[0].template = "

{{foo}}

{{bar}}

"; - patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + currentPattern.template = "{{> molecules-single-comment(description: true) }}"; + currentPattern.extendedTemplate = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

true

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

true

Hello World

'); + test.equals(currentPattern.extendedTemplate, '

true

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

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; - patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + currentPattern.template = "{{> molecules-single-comment('description': true) }}"; + currentPattern.extendedTemplate = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - currentPattern.template = "{{> molecules-single-comment('silly\\\'key': true, bar: \"Hello World\", \"another\\\"silly-key\": 42 ) }}"; + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var parameteredPartials = []; + + currentPattern.template = "{{> molecules-single-comment('description': 'true not,\\'true\\'') }}"; currentPattern.extendedTemplate = currentPattern.template; + currentPattern.dataKeys = []; parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); + 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){ + var currentPattern = currentPatternClosure(); + var patternlab = patternlabClosure(); + var parameter_hunter = new ph(); + var parameteredPartials = []; + + currentPattern.template = "{{> molecules-single-comment('description': \"true not:'true'\") }}"; + currentPattern.extendedTemplate = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

true not:'true'

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

true not ":true"

'); + + test.done(); + }, + + 'parameter 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 parameteredPartials = []; + + 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.dataKeys = []; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

true

'); + + test.done(); + }, + + 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + //arrange + var fs = require('fs-extra'); + var path = require('path'); + var object_factory = require('../builder/object_factory'); + var pa = require('../builder/pattern_assembler'); + 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.dataKeys = []; + pl.config.debug = false; + pl.patterns = []; + + var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); + var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var innerParameteredFile = path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'); + var outerParameteredFile = path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'); + + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(styleFile, pl); + pattern_assembler.process_pattern_iterative(innerParameteredFile, pl); + pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); + + //act + pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(styleFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, 0, null, true); + var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); + //assert. + var expectedValue = 'bar foo bar bar'; + test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); } }; From ad77450ffb0c3e7fb2fe3369e6782d7447d60cab Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 12:09:17 -0400 Subject: [PATCH 073/162] updated unit tests --- test/.parameter_hunter_tests.js.swp | Bin 0 -> 40960 bytes test/parameter_hunter_tests.js | 89 ++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 test/.parameter_hunter_tests.js.swp diff --git a/test/.parameter_hunter_tests.js.swp b/test/.parameter_hunter_tests.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..256bc3dfe79f1988fb1bbdf4dfdd7163f23962f3 GIT binary patch literal 40960 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 MN|rS{8o%iO0f$*`>;M1& literal 0 HcmV?d00001 diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index c62b3f246..7a0a42316 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -229,13 +229,13 @@ var parameter_hunter = new ph(); var parameteredPartials = []; - currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not \",true\"') }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not{\",true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.dataKeys = []; parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true not ",true"

'); + test.equals(currentPattern.extendedTemplate, '

true not{",true"

'); test.done(); }, @@ -246,13 +246,13 @@ var parameter_hunter = new ph(); var parameteredPartials = []; - currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not \\\":true\\\"\") }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not}\\\":true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.dataKeys = []; parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); - test.equals(currentPattern.extendedTemplate, '

true not ":true"

'); + test.equals(currentPattern.extendedTemplate, '

true not}":true"

'); test.done(); }, @@ -274,6 +274,87 @@ test.done(); }, + 'parameter 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 parameteredPartials = []; + + currentPattern.template = "{{> molecules-single-comment(description: 'Hello ) World') }}"; + currentPattern.extendedTemplate = currentPattern.template; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

Hello ) World

'); + + test.done(); + }, + + 'parameter 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 parameteredPartials = []; + + patternlab.patterns[0].template = "

{{foo}}

{{bar}}

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

true

Hello World

'); + + test.done(); + }, + + 'parameter 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 parameteredPartials = []; + + patternlab.patterns[0].template = "

{{ silly'key }}

{{bar}}

{{ another\"silly-key }}

"; + patternlab.patterns[0].escapedTemplate = patternlab.patterns[0].template; + 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; + parameteredPartials[0] = currentPattern.template; + + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); + test.equals(currentPattern.extendedTemplate, '

true

Hello World

42

'); + + test.done(); + }, + + 'parameter 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 parameteredPartials = []; + + patternlab.patterns[0].template = "

{{foo}}

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

'); + + test.done(); + }, + 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js //arrange From 2414d99ab0b995fb2fb2243aff554b16510a558b Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 12:09:32 -0400 Subject: [PATCH 074/162] deleting swap file --- test/.parameter_hunter_tests.js.swp | Bin 40960 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 test/.parameter_hunter_tests.js.swp diff --git a/test/.parameter_hunter_tests.js.swp b/test/.parameter_hunter_tests.js.swp deleted file mode 100644 index 256bc3dfe79f1988fb1bbdf4dfdd7163f23962f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 zcmeI54Uingb$}PyA~-RM3s($rz-d;XJ%!ud(+Lnd{U8Y=DKW@Ou#pp;IM43R-L7tS zXEigcAI@hRr%Z6-vJJSvkg60iB!J^U8H{5aV>>AW!Ij|3PZHeR0XTX{iW-|FnvOD9SGVbjcCQSnSSUpG9@bZVAS$kyzV8UH(L z_IqU`Yi9fNr1seD7*&%TL*+(IzGSPL+wD$ruw+*vfkXmL2{gRn>_w-hR`##xlZ{K$ zXREiL_WtJnaN{SPX}7INSw$U;z3c z1E<3x_yrD&pTJ+ky>K_&0k^|7uog~%AL5vJ0KN>D$v2LO`{6dY1wIEkcohf2<8UX~ zumv{5OE^yMhHK&Da2ALx4~G7Q|9_=X{-@Y*9JA(a4+1B0=6=ttmCVxn%xc{-JX5Vx zVNAu4;kstEV3|&i3?pp0C}@QmeaQo*6)(HFVlO06^$ZFOTMw-(f^ zVn>Z~nWgQ9<5djHv+!_iV~-UbS*nfut@6G=2k#}3Eb)2KLRPbQbk z7aA3d+ofY+ngwKH`PyS)bn)eQ@miK7XolNdV%ctk1GW{}E;7=$Z;0i|ME6hy(Kt%# zgR6{MNd@=ARa!Ex+E?+)s#@7^mN<*>%>ASzmR&F`B{eOh2Gnq)R`e=%tw%z8mX8Hh zV!Su38L}}~vTOc{w{AmzRH0Z6oX|RYxt;a(82h8Zn%bS<9*IrZa37 zJyo@UijF#2w0^ClgsMOf!=s zwja!G6iO8*eu?=>WIbH5Onq(>uDzvjU30^G;|{2uehqX?ui?~`?ADsM(^G;3qzLMI z*anr_<(HuNq{qhAqcuC%tDct1PurX`?VDMy#>boOY9{BjgQtK4mL=NUE1PPhA&<>K z?Yle@V7Ehru7{$}@vyBdfbaf$AEk9okAZILeN zs6CD!!A95CL0cV%XW6P8kHgaob+PS?7`2L9MHhRO;^=`1x;WiQ5BF!A`DpZ^{%&ev zs-NHKi)moLQxoX~ohZ`1QJE8xM0&T&fwO45_VdqkT2XnTXZ1NwOxmt<^;v11)?RG$ z%pzSo?c+4_wrJUw+;YnLESqWD^lSVo!(^RwXqTR|uW0jm7p+^@y=$#+gPzL1GJ0j7 zsrK0ot3=mxuc=B6NA!)kpU1Xza6}dReZDf?qRy5>duLGkq~u9ATvNH8Qz?4sHL0FR z-}fx%w8Z`wyL~10yV(DFeEbgV`weh0I0=mREDsFJm{-1SkVf2tig6&uZNf1cyMbqIyB-4)2bu4z zm@rtwuq8v9MYAVA=nlH)jIkLj?m z3e55@*T=y^w@hHvSF;OuX2~)IdoI?XVrIG>fs99fEfPKZi)F!_J+35}(*U;-Ay;Cu>rYOT~A`BL!z%fG(emlSew? zzZme1e1e$_XFv_6TckFa_JgJf4-otRLSojhB9>k3|4YIedMEb&HndBe2aMhZ^B=~9dJ9Wf#-yOgI7E4s!HXAWmW_&RuO47CylHTz*kB7?S&^kxhs1?=3VPrfZp z80k#{e~!ewO=3_gpI4hDM7-j<4O1=cU%f(=J+JN#MMb{WL4RKLyCI;8CB|kE3Sf#g@2w>02?IplrI8sP{U@O+fc0XKB_>htA=w_Z)TX zc$+Sbbv`>hQDP~yO4rJ`%Wl#5({CLjO$O-c{~gf=twN<{Nc)kw3-Wl8Cgv8)W)(|v*meTrQD*A}ZE~KTI&#ZoCf)clIj1!P@^|p_ z1T*1|uZBoXr`s1!fs-Z>RCHg`gM)1Fn-4#lCf`D>`axsYJu2TtBDK7IbNC$E=NR?6 zG>nR@CtqVCs`jF^CZEs8k=(Jdph5J`W7`n>|6B}JL+n-T|E;0XI*6^m6Sl%ekhuWQ zV()(mJ`Pubo&&HSn|~F&9d={iYn%TNw*3aU7<%DcI0wFit^XM)!8-VLI0Lp}>&smK zA7k6Eg4eO-UxPn~Q{k;3^ZH+gm*60L1kQpVW6M7TH-Q6t;5Xn&Z27OihhZGffg{-Q zPr*OHBk(YYo&Q_#8ut7Xa6jA!AAr;073A|Ed>uqqAB1Urg4P!G5RPV2aFn@eQN5A6 z7jKkDccT^>gOjSRd3;@w#vygT94%Urd=gldeG*sSr{ znxWmr-aRIL`Pq=m9M7gd@qAko4df|Tr5Pp;_COZjcR5&`#$SzSo*u7rcK?p$Gkbnj zMxrUOUz^Lg#KbXY73@THejkN`*lRikiMHS|H-EZ;rN%ZHj=$vCd~_|u{+G9a{f*eO z*#CO{{)e#lzX5l{=iwko9Kgx&B)0$k@M-uITnPV(?f;K(3w#bPhX27A@Zazp9D%3c zGB^XC#}Du@9E96o75oezz(2vQa0_gJ{}6uwd>_6CkHaQd0#D;3co1%en;;J_;v@Jj z+yK|ZMesEKfg|uZJPMD%E?5r#i;v*@a36dLcECH}W&8wRhp)j0;Vd{4-U5r@Bxv9- z*a*J{FXAKkE<6T9@Gf{2nf@(^Y`-n?os*ArkY_DE<(PDcx~?EJ!MW-C_kB+pBLco> zGre&15o#tL>?MomwK^nAlUp}xqFb{y_k6lDk7YmPDB`k?^Lj5;eWCjg!kQXc^pO`V z+S1*PkP;O*yGFf;Tr|zVvZX6mukk(d@*}C&NIK>f(SyoUjv8lL#;T&RU0=w-!0o~x zqiXj_MOD02OY3pj4$8bW_k1dIxkbH6JD4iC_h{Qe)T`+o9Q1$lwcxuot#x_k-5Nbw z+gi$ewut00Fnf=IH$vy8wVt-r_G8zz(G^(i|C6!bH-Xsyn9%-5*8D#J692yp7Qsny zLzs30-}hnT?}638tHo14!mhstJ_=PB1{2PP$Fc8kg&N3v0G2`;p2Nn!8E%46cmca! z*8cavg*U+$I4N2Ce>d!a?eJcB0^5E&Y=AT2RqXk%!8P#vunf+H)8I91`WN6Zdf^GRE8_JQO!O?V zDv>GSic%n>m8gLVwlu9)zV(gQv1Pkm|AsN*;U7;=CY1rv?cwd?9T%2Ge$O?nVJ4ND zOe3uo?S@1{%5eY;3 z)y!G;NKa<4779vTW)zfL_7`O?8eXxie&>q!ZbKvBs%8CT({XGkc=ZWdyUx2pSZkSa z<=|x!BO=L4jhkHc1F~~D){BpZ);pZc@jauI*SNUSkImwT8&JKxv_)^gk0F2d^3R`k z+Ig;NDChPU85sqZ*z%j-(2zXNWP$G%5&0E3K7B17g+tp6t9m@8w#cd98{imAm!bKJ#saPn-?Tmh=1PTxq0&+I+$_ zV&>rx^}@`642?FLjYHpO!VGblaTE3;Wg>x}FH0twWN?1JY9Eg1)&S>xN~-eDOD=}D zfXH3v_P0z;_5b31Q+{W-YomDeyz={RiNB_zYYLi{Z_17@L15yc3?r-ai6+K;r)oW9uJ+hvA#> z5L_z1vGwnPKZY`7;HTL8kHTl+M))XLuoJexIdBFnfyE&61rEWtLFNs70mP!@hY!Jd;L9rXlO$iql?1d_j&-ziiMK_+6f!P}rh}xD-(iL; zkTwhJCNxUtQf75R-iMJ*2p=bw0 z;%$juON@36WP=?pzb9DBQB6v`EmN(q5II*8Z%g8BNxUt7$G(F`Ilf({bL4GlYT0OP MN|rS{8o%iO0f$*`>;M1& From d9ad874cd1e6f2aa228241e3c854c93e03a63860 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 12:20:12 -0400 Subject: [PATCH 075/162] using JSON5 --- builder/list_item_hunter.js | 19 +++++++++++++++---- builder/pattern_assembler.js | 16 +++++++++++++--- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/builder/list_item_hunter.js b/builder/list_item_hunter.js index 2bcdb9aee..5b2aa42bc 100644 --- a/builder/list_item_hunter.js +++ b/builder/list_item_hunter.js @@ -12,7 +12,8 @@ var list_item_hunter = function () { - var pa = require('./pattern_assembler'), + var JSON = require('json5'), + pa = require('./pattern_assembler'), pattern_assembler = new pa(), items = [ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty']; @@ -29,14 +30,24 @@ var list_item_hunter = function () { if (pattern.listitemsRaw) { //copy, don't reference - pattern.listitems = JSON.parse(JSON.stringify(pattern.listitemsRaw)); + try { + pattern.listitems = JSON.parse(JSON.stringify(pattern.listitemsRaw)); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); + } //if no local listitems.json file, use global listitems data } else { //copy, don't reference - pattern.listitems = JSON.parse(JSON.stringify(patternlab.listitems)); - pattern.listitemsRaw = JSON.parse(JSON.stringify(patternlab.listitems)); + try { + pattern.listitems = JSON.parse(JSON.stringify(patternlab.listitems)); + pattern.listitemsRaw = JSON.parse(JSON.stringify(patternlab.listitems)); + } catch (err) { + console.log('There was an error parsing JSON for ' + pattern.abspath); + console.log(err); + } } //this shuffles listitemsRaw, and builds it into an object of array of diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 2a878019f..79436c6a7 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -225,6 +225,7 @@ var pattern_assembler = function () { } function parseDataLinksHelper(patternlab, obj, key) { + var JSON = require('json5'); var linkRE, dataObjAsString, linkMatches, expandedLink; linkRE = /link\.[A-z0-9-_]+/g; @@ -242,7 +243,16 @@ var pattern_assembler = function () { } } } - return JSON.parse(dataObjAsString); + + var dataObj; + try { + dataObj = JSON.parse(dataObjAsString); + } catch (err) { + console.log('There was an error parsing JSON for ' + key); + console.log(err); + } + + return dataObj; } //look for pattern links included in data files. @@ -453,6 +463,7 @@ var pattern_assembler = function () { function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { var fs = require('fs-extra'), glob = require('glob'), + JSON = require('json5'), path = require('path'); var ph = require('./parameter_hunter'), @@ -520,8 +531,7 @@ var pattern_assembler = function () { localData = JSON.parse(localJsonString); currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); } catch (err) { - - //since we're parsing json, output errors for debugging + console.log('There was an error parsing JSON for ' + file); console.log(err); } From 2317cae29be7450f5abea87b43a79696a673aa0e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 13:15:57 -0400 Subject: [PATCH 076/162] fixing array instead of number typo --- core/lib/parameter_hunter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index ce5342d23..38682b686 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -134,7 +134,7 @@ var parameter_hunter = function () { //now, search for a value if (paramString[0] === ':') { - paramString = paramString.substring([1], paramString.length).trim(); + paramString = paramString.substring(1, paramString.length).trim(); //since a quote of same type as its wrappers would be escaped, and we //escaped those even further with their unicode, it is safe to look for From 3583251b7fed4d098e695cdfd8da258c762bc86a Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 15:13:34 -0400 Subject: [PATCH 077/162] more comments --- core/lib/parameter_hunter.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 38682b686..27dc0f51f 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -136,10 +136,16 @@ var parameter_hunter = function () { if (paramString[0] === ':') { paramString = paramString.substring(1, paramString.length).trim(); - //since a quote of same type as its wrappers would be escaped, and we - //escaped those even further with their unicode, it is safe to look for - //wrapper pairs and conclude that their contents are values + //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; From 704346ada3536bb50853f781bc7fbd807270dc0d Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 15:15:29 -0400 Subject: [PATCH 078/162] spacing to pass eslint --- core/lib/parameter_hunter.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 27dc0f51f..7601078ef 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -143,6 +143,7 @@ var parameter_hunter = function () { //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 From 1007237dd6597bb6091cd7011ea24460a28912b5 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 15:21:10 -0400 Subject: [PATCH 079/162] fixing typo and updating comments --- builder/parameter_hunter.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index bd4ef7594..b82161a9c 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -133,12 +133,19 @@ var parameter_hunter = function () { //now, search for a value if (paramString[0] === ':') { - paramString = paramString.substring([1], paramString.length).trim(); - - //since a quote of same type as its wrappers would be escaped, and we - //escaped those even further with their unicode, it is safe to look for - //wrapper pairs and conclude that their contents are values + 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; From a0d33d3fb7903f005056536e7aa5702d5b32d8d1 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 20:21:22 -0400 Subject: [PATCH 080/162] removing unnecessary escape --- core/lib/parameter_hunter.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/lib/parameter_hunter.js b/core/lib/parameter_hunter.js index 7601078ef..98cc0651e 100644 --- a/core/lib/parameter_hunter.js +++ b/core/lib/parameter_hunter.js @@ -77,9 +77,6 @@ var parameter_hunter = function () { //replace all escaped single-quotes with escaped unicode paramString = paramString.replace(/\\'/g, '\\u0027'); - //replace all escaped commas with escaped unicode - paramString = paramString.replace(/\\,/g, '\\u0044'); - //replace all escaped colons with escaped unicode paramString = paramString.replace(/\\:/g, '\\u0058'); @@ -239,7 +236,6 @@ var parameter_hunter = function () { //unescape escaped unicode except for double-quotes paramStringWellFormed = paramStringWellFormed.replace(/\\u0027/g, '\''); - paramStringWellFormed = paramStringWellFormed.replace(/\\u0044/g, ','); paramStringWellFormed = paramStringWellFormed.replace(/\\u0058/g, ':'); return paramStringWellFormed; From 58c459814bc674be32c7bb6ee0d3f24cf17ef9ae Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 18 Mar 2016 20:25:24 -0400 Subject: [PATCH 081/162] removing unnecessary escape --- builder/parameter_hunter.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index b82161a9c..8bb86ff21 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -76,9 +76,6 @@ var parameter_hunter = function () { //replace all escaped single-quotes with escaped unicode paramString = paramString.replace(/\\'/g, '\\u0027'); - //replace all escaped commas with escaped unicode - paramString = paramString.replace(/\\,/g, '\\u0044'); - //replace all escaped colons with escaped unicode paramString = paramString.replace(/\\:/g, '\\u0058'); @@ -238,7 +235,6 @@ var parameter_hunter = function () { //unescape escaped unicode except for double-quotes paramStringWellFormed = paramStringWellFormed.replace(/\\u0027/g, '\''); - paramStringWellFormed = paramStringWellFormed.replace(/\\u0044/g, ','); paramStringWellFormed = paramStringWellFormed.replace(/\\u0058/g, ':'); return paramStringWellFormed; From cc95ac45c08062711b23ac74268526a063beffd8 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 29 Feb 2016 16:54:37 -0500 Subject: [PATCH 082/162] working performant recursive parameter hunter, with debug code --- builder/parameter_hunter.js | 142 +++++ builder/pattern_assembler.js | 497 ++++++++++++++++++ core/lib/patternlab.js | 5 +- .../02-comments/01-sticky-comment.mustache | 3 +- .../03-templates/00-homepage.mustache | 5 +- .../_patterns/04-pages/00-homepage.mustache | 2 +- 6 files changed, 649 insertions(+), 5 deletions(-) create mode 100644 builder/parameter_hunter.js create mode 100644 builder/pattern_assembler.js diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js new file mode 100644 index 000000000..8298c8905 --- /dev/null +++ b/builder/parameter_hunter.js @@ -0,0 +1,142 @@ +/* + * patternlab-node - v1.1.1 - 2016 + * + * Brian Muenzenmeyer, and the web community. + * Licensed under the MIT license. + * + * Many thanks to Brad Frost and Dave Olsen for inspiration, encouragement, and advice. + * + */ + +(function () { + "use strict"; + + var parameter_hunter = function(){ + + var extend = require('util')._extend, + pa = require('./pattern_assembler'), + mustache = require('mustache'), + smh = require('./style_modifier_hunter'), + style_modifier_hunter = new smh(), + pattern_assembler = new pa(); + + function findparameters(pattern, patternlab, startFile){ + var renderedPartial; + var renderedTemplate = pattern.extendedTemplate; + + if(pattern.parameteredPartials && pattern.parameteredPartials.length > 0){ + //compile this partial immeadiately, essentially consuming it. + pattern.parameteredPartials.forEach(function(pMatch, index, matches){ + //find the partial's name and retrieve it + var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(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 and eval + var leftParen = pMatch.indexOf('('); + var rightParen = pMatch.indexOf(')'); + var paramString = '({' + pMatch.substring(leftParen + 1, rightParen) + '})'; + + //do no evil. there is no good way to do this that I can think of without using a split, which then makes commas and colons special characters and unusable within the pattern params + var paramData = eval(paramString); + + var globalData = JSON.parse(JSON.stringify(patternlab.data)); + var localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); + var startPattern = pattern_assembler.get_pattern_by_key(startFile, patternlab); + var startData = JSON.parse(JSON.stringify(startPattern.jsonFileData || {})); + + //in order to token-replace parameterized tags, prepare for rendering Mustache + //replace global, file-specific, and param data. however, since partial inclusion + //is not done here, escape partial tags by switching them to ERB syntax. +var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + //then set the new delimiter at the beginning of the extended template +// extendedTemplateEscaped = '{{=<% %>=}}' + extendedTemplateEscaped; + + + //render the newly delimited partial +// var renderedPartial = pattern_assembler.renderPattern(extendedTemplateEscaped, paramData, patternlab.partials); + + var allData = pattern_assembler.merge_data(globalData, startData); + allData = pattern_assembler.merge_data(allData, localData); + allData = pattern_assembler.merge_data(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); + +/* + //in pre-render, escape all tags which correspond to keys in the allData object + //in order to do so, escape the partials by switching them to ERB + var escapeLoopsAndConditionals = function(dataKey) { + var escapeString = new RegExp('{{([{#\\^\\/&]?\\s*' + dataKey + '\\s*}?)}}', 'g'); + renderedPartial = renderedPartial.replace(escapeString, '<%$1%>'); + }; + pattern_assembler.traverse_data(allData, escapeLoopsAndConditionals); + + //also escape partial includes and listItems loops + renderedPartial = renderedPartial.replace(/{{> ([^\}]+)}}/g, '<%> $1%>'); + renderedPartial = renderedPartial.replace(/{{([#\/]\s*listItems.[a-z]+\s*)}}/g, '<%$1%>'); +*/ + + //the reasoning for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant Mustache conditionals persisted +console.log(typeof extendedTemplateEscaped); + extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); + + //after that's done, switch back to standard Mustache tags + renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + //remove the parameter from the partial and replace it with the rendered partial + paramData + renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); +if (startFile.indexOf('04-pages/00-homepage') > -1) { + console.log('pMatch'); + console.log(pMatch); + console.log('renderedPartial'); + console.log(renderedPartial); + console.log('renderedTemplate'); + console.log(renderedTemplate); +} + + //update the extendedTemplate in the partials object in case this pattern is consumed later + patternlab.partials[pattern.key] = renderedTemplate; + }); + +var parameteredPartialsNew = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); +pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); +pattern.extendedTemplate = renderedTemplate; + +if(pattern.parameteredPartials){ +//pattern.extendedTemplate = findparameters(pattern, patternlab, startFile); +findparameters(pattern, patternlab, startFile); +console.log('doing'); +console.log(pattern); + console.log(renderedPartial); +} +if (startFile.indexOf('04-pages/00-homepage') > -1) { +} + +// return renderedTemplate; + } + } + + return { + find_parameters: function(pattern, patternlab, startFile){ +// return findparameters(pattern, patternlab, startFile); +findparameters(pattern, patternlab, startFile); + } + }; + + }; + + module.exports = parameter_hunter; + +}()); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js new file mode 100644 index 000000000..4100d4152 --- /dev/null +++ b/builder/pattern_assembler.js @@ -0,0 +1,497 @@ +/* + * patternlab-node - v1.1.1 - 2016 + * + * Brian Muenzenmeyer, and the web community. + * Licensed under the MIT license. + * + * Many thanks to Brad Frost and Dave Olsen for inspiration, encouragement, and advice. + * + */ + +(function () { + "use strict"; + + var pattern_assembler = function(){ + + function isObjectEmpty(obj) { + for(var prop in obj) { + if(obj.hasOwnProperty(prop)) + return false; + } + + return true; + } + + // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern + function findPartialsWithStyleModifiers(pattern){ + var matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + return matches; + } + + // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern + function findPartialsWithPatternParameters(pattern){ + var matches; + if(typeof pattern === 'string'){ + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); + } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); + } + return matches; + } + + //find and return any {{> template-name* }} within pattern + function findPartials(pattern){ + var matches; + if(typeof pattern === 'string'){ + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); + } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); + } + return matches; + } + + function findListItems(pattern){ + var matches = pattern.template.match(/({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g); + return matches; + } + + function setState(pattern, patternlab){ + if(patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]){ + pattern.patternState = patternlab.config.patternStates[pattern.patternName]; + } else{ + pattern.patternState = ""; + } + } + + function addPattern(pattern, patternlab){ + //add the link to the global object + patternlab.data.link[pattern.patternGroup + '-' + pattern.patternName] = '/patterns/' + pattern.patternLink; + + //only push to array if the array doesn't contain this pattern + var isNew = true; + for(var i = 0; i < patternlab.patterns.length; i++){ + //so we need the identifier to be unique, which patterns[i].abspath is + if(pattern.abspath === patternlab.patterns[i].abspath){ + //if abspath already exists, overwrite that element + patternlab.patterns[i] = pattern; + patternlab.partials[pattern.key] = pattern.extendedTemplate || pattern.template; + isNew = false; + break; + } + } + //if the pattern is new, just push to the array + if(isNew){ + patternlab.patterns.push(pattern); + patternlab.partials[pattern.key] = pattern.extendedTemplate || pattern.template; + } + } + + function renderPattern(template, data, partials) { + + var mustache = require('mustache'); + + if(partials) { + return mustache.render(template, data, partials); + } else{ + return mustache.render(template, data); + } + } + + function processPatternIterative(file, patternlab){ + var fs = require('fs-extra'), + of = require('./object_factory'), + path = require('path'); + + //extract some information + var subdir = path.dirname(path.relative(patternlab.config.paths.source.patterns, file)).replace('\\', '/'); + var filename = path.basename(file); + var ext = path.extname(filename); + + //ignore dotfiles, underscored files, and non-variant .json files + if(filename.charAt(0) === '.' || (ext === '.json' && filename.indexOf('~') === -1)){ + return; + } + + //make a new Pattern Object + var currentPattern = new of.oPattern(file, subdir, filename); + + //if file is named in the syntax for variants, no need to process further + //processPatternRecursive() will run find_pseudopatterns() and look at each pattern for a variant + if(ext === '.json' && filename.indexOf('~') > -1){ + return; + } + + //can ignore all non-mustache files at this point + if(ext !== '.mustache'){ + return; + } + + //see if this file has a state + setState(currentPattern, patternlab); + + //look for a json file for this template + try { + var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); + currentPattern.jsonFileData = fs.readJSONSync(jsonFilename); + if(patternlab.config.debug){ + console.log('found pattern-specific data.json for ' + currentPattern.key); + } + } + catch(e) { + } + + //look for a listitems.json file for this template + try { + var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir,currentPattern.fileName + ".listitems.json"); + currentPattern.listitems = fs.readJSONSync(listJsonFileName); + buildListItems(currentPattern); + if(patternlab.config.debug){ + console.log('found pattern-specific listitems.json for ' + currentPattern.key); + } + } + catch(e) { + } + + //add the raw template to memory + currentPattern.template = fs.readFileSync(file, 'utf8'); + + //find any stylemodifiers that may be in the current pattern + currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + + //find any pattern parameters that may be in the current pattern + currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); + + //add currentPattern to patternlab.patterns array + addPattern(currentPattern, patternlab); + } + + /** + * Recurse through patternlab object as necessitated by partial inclusions. + * Build out the final output for writing to the public/patterns directory. + * + * @param {string} file The abspath of pattern being processed. + * @param {Object} patternlab The patternlab object. + * @param {string} startFile The abspath of the pattern at the top level of recursion. + */ + function processPatternRecursive(file, patternlab, startFile){ + + var fs = require('fs-extra'), + mustache = require('mustache'), + lh = require('./lineage_hunter'), + ph = require('./parameter_hunter'), + pph = require('./pseudopattern_hunter'), + lih = require('./list_item_hunter'), + smh = require('./style_modifier_hunter'), + path = require('path'); + + var parameter_hunter = new ph(), + lineage_hunter = new lh(), + list_item_hunter = new lih(), + style_modifier_hunter = new smh(), + pseudopattern_hunter = new pph(); + + //find current pattern in patternlab object using var file as a key + var currentPattern, + i; + + for(i = 0; i < patternlab.patterns.length; i++){ + if(patternlab.patterns[i].abspath === file){ + currentPattern = patternlab.patterns[i]; + break; + } + } + + //return if processing an ignored file + if(typeof currentPattern === 'undefined'){ + return; + } + + //determine if the template contains any pattern parameters. if so they must be immediately consumed + //this initial run of find_parameters() resets currentPattern.template with +// parameter_hunter.find_parameters(currentPattern, patternlab); + var extendedTemplate; + + if(currentPattern.parameteredTemplate){ + extendedTemplate = currentPattern.parameteredTemplate; + //for each recursion, unset parameteredTemplate property + currentPattern.parameteredTemplate = null; + + } else{ +// extendedTemplate = currentPattern.template; + //for each recursion, reset extendedTemplate property + currentPattern.extendedTemplate = currentPattern.template; + } + + //find how many partials there may be for the given pattern + var foundPatternPartials = findPartials(currentPattern); + +// var startPattern = getpatternbykey(startFile, patternlab); + + if(foundPatternPartials !== null && foundPatternPartials.length > 0){ + + if(patternlab.config.debug){ + console.log('found partials for ' + currentPattern.key); + } + + //find any listItem blocks + list_item_hunter.process_list_item_partials(currentPattern, patternlab); + +if(currentPattern.abspath.indexOf('07-messaging/00-alert.mustache') > -1){ +} + + //determine if the template contains any pattern parameters + if(currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0){ + //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() + parameter_hunter.find_parameters(currentPattern, patternlab, startFile); +// currentPattern.extendedTemplate = parameter_hunter.find_parameters(currentPattern, patternlab, startFile); +// foundPatternPartials = parameter_hunter.find_parameters(currentPattern, patternlab, startFile); + //re-evaluate foundPatternPartials +if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ +} + foundPatternPartials = findPartials(currentPattern.extendedTemplate); +if(startFile.indexOf('04-pages/00-homepage') > -1){ +} + } + + + + if(foundPatternPartials && foundPatternPartials.length > 0){ + //do something with the regular old partials + for(i = 0; i < foundPatternPartials.length; i++){ + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); + + var partialPath; + + //identify which pattern this partial corresponds to + for(var j = 0; j < patternlab.patterns.length; j++){ + if(patternlab.patterns[j].key === partialKey || + patternlab.patterns[j].abspath.indexOf(partialKey) > -1) + { + partialPath = patternlab.patterns[j].abspath; + } + } + + //recurse through nested partials to fill out this extended template. + processPatternRecursive(partialPath, patternlab, startFile); +if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ +} + + //complete assembly of extended template + var partialPattern = getpatternbykey(partialKey, 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); + + //update the extendedTemplate in the partials object in case this pattern is consumed later + patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; + } + } + } else{ + //find any listItem blocks that within the pattern, even if there are no partials + list_item_hunter.process_list_item_partials(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); + + //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); +if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ +} + } + + function getpatternbykey(key, patternlab){ + + for(var i = 0; i < patternlab.patterns.length; i++){ + switch(key){ + //look for exact key matches + case patternlab.patterns[i].key: + //look for abspath matches + case patternlab.patterns[i].abspath: + //look by verbose syntax + case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName: + case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': + return patternlab.patterns[i]; + } + } + + //return the fuzzy match if all else fails + for(var i = 0; i < patternlab.patterns.length; i++){ + var keyParts = key.split('-'), + keyType = keyParts[0], + keyName = keyParts.slice(1).join('-'); + if(patternlab.patterns[i].key.split('-')[0] === keyType && patternlab.patterns[i].key.indexOf(keyName) > -1){ + return patternlab.patterns[i]; + } + } + throw 'Could not find pattern with key ' + key; + } + + function mergeData(obj1, obj2){ + if(typeof obj2 === 'undefined'){ + obj2 = {}; + } + for(var p in obj1){ + try { + // Only recurse if obj1[p] is an object. + if(obj1[p].constructor === Object){ + // Requires 2 objects as params; create obj2[p] if undefined. + if(typeof obj2[p] === 'undefined'){ + obj2[p] = {}; + } + obj2[p] = mergeData(obj1[p], obj2[p]); + // Pop when recursion meets a non-object. If obj1[p] is a non-object, + // only copy to undefined obj2[p]. This way, obj2 maintains priority. + } else if(typeof obj2[p] === 'undefined'){ + obj2[p] = obj1[p]; + } + } catch(e) { + // Property in destination object not set; create it and set its value. + if(typeof obj2[p] === 'undefined'){ + obj2[p] = obj1[p]; + } + } + } + return obj2; + } + + /** + * Recurse through data object and apply a function at each step. + * + * @param {Object} data JSON object. + * @param {Object} callback The function to be applied on the data at the recursion step. + */ + function traverseData(dataObj, callback){ + for(var i in dataObj){ + if(dataObj.hasOwnProperty(i)){ + callback.apply(this, [i, dataObj[i]]); + if(dataObj[i] !== null && typeof dataObj[i] === 'object'){ + traverseData(dataObj[i], callback); + } + } + } + } + + function buildListItems(container){ + //combine all list items into one structure + var list = []; + for (var item in container.listitems) { + if( container.listitems.hasOwnProperty(item)) { + list.push(container.listitems[item]); + } + } + container.listItemArray = shuffle(list); + + for(var i = 1; i <= container.listItemArray.length; i++){ + var tempItems = []; + if( i === 1){ + tempItems.push(container.listItemArray[0]); + container.listitems['' + i ] = tempItems; + } else{ + for(var c = 1; c <= i; c++){ + tempItems.push(container.listItemArray[c - 1]); + container.listitems['' + i ] = tempItems; + } + } + } + } + + //http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript + function shuffle(o){ + for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); + return o; + } + + function parseDataLinksHelper (patternlab, obj, key) { + var linkRE, dataObjAsString, linkMatches, expandedLink; + + linkRE = /link\.[A-z0-9-_]+/g + dataObjAsString = JSON.stringify(obj); + linkMatches = dataObjAsString.match(linkRE) + + if(linkMatches) { + for (var i = 0; i < linkMatches.length; i++) { + expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; + if (expandedLink) { + if(patternlab.config.debug){ + console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); + } + dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); + } + } + } + return JSON.parse(dataObjAsString) + } + //look for pattern links included in data files. + //these will be in the form of link.* WITHOUT {{}}, which would still be there from direct pattern inclusion + function parseDataLinks(patternlab) { + //look for link.* such as link.pages-blog as a value + + patternlab.data = parseDataLinksHelper(patternlab, patternlab.data, 'data.json') + + //loop through all patterns + for (var i = 0; i < patternlab.patterns.length; i++) { + patternlab.patterns[i].jsonFileData = parseDataLinksHelper(patternlab, patternlab.patterns[i].jsonFileData, patternlab.patterns[i].key) + } + } + + return { + find_pattern_partials: function(pattern){ + return findPartials(pattern); + }, + find_pattern_partials_with_style_modifiers: function(pattern){ + return findPartialsWithStyleModifiers(pattern); + }, + find_pattern_partials_with_parameters: function(pattern){ + return findPartialsWithPatternParameters(pattern); + }, + find_list_items: function(pattern){ + return findListItems(pattern) + }, + setPatternState: function(pattern, patternlab){ + setState(pattern, patternlab); + }, + addPattern: function(pattern, patternlab){ + addPattern(pattern, patternlab); + }, + renderPattern: function(template, data, partials){ + return renderPattern(template, data, partials); + }, + process_pattern_iterative: function(file, patternlab){ + processPatternIterative(file, patternlab); + }, + process_pattern_recursive: function(file, patternlab, startFile){ + processPatternRecursive(file, patternlab, startFile); + }, + get_pattern_by_key: function(key, patternlab){ + return getpatternbykey(key, patternlab); + }, + merge_data: function(existingData, newData){ + return mergeData(existingData, newData); + }, + traverse_data: function(dataObj, callback){ + return traverseData(dataObj, callback); + }, + combine_listItems: function(patternlab){ + buildListItems(patternlab); + }, + is_object_empty: function(obj){ + return isObjectEmpty(obj); + }, + parse_data_links: function(patternlab){ + parseDataLinks(patternlab); + } + }; + + }; + + module.exports = pattern_assembler; + +}()); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index cc910a5bc..eba2a804c 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -129,7 +129,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); }); //set user defined head and foot if they exist @@ -202,6 +202,9 @@ var patternlab_engine = function (config) { var headHtml = pattern_assembler.renderPattern(pattern.header, allData); //render the extendedTemplate with all data +if(typeof pattern.extendedTemplate === 'undefined') { +console.log(pattern); +} pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, allData); //set the pattern-specific footer if necessary diff --git a/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache b/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache index ac0b28dc4..56fe2f96b 100644 --- a/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache +++ b/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache @@ -2,8 +2,7 @@

Selected Comments

    - {{> 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.') }} + {{> molecules-single-comment }}
diff --git a/source/_patterns/03-templates/00-homepage.mustache b/source/_patterns/03-templates/00-homepage.mustache index 40f9b1588..580d3c9ad 100644 --- a/source/_patterns/03-templates/00-homepage.mustache +++ b/source/_patterns/03-templates/00-homepage.mustache @@ -2,8 +2,11 @@ {{> organisms-header }}
{{# emergency }} - {{> molecules-alert }} + {{> molecules-alert(alertClass: 'error') }} {{/ emergency }} + {{# foo }} + {{> molecules-alert(alertClass: 'foo') }} + {{/ foo }} {{# hero }} {{> molecules-block-hero }} {{/ hero}} diff --git a/source/_patterns/04-pages/00-homepage.mustache b/source/_patterns/04-pages/00-homepage.mustache index d9894d4a7..6d918a24d 100644 --- a/source/_patterns/04-pages/00-homepage.mustache +++ b/source/_patterns/04-pages/00-homepage.mustache @@ -1 +1 @@ -{{> templates-homepage }} +{{> templates-homepage(emergency: true) }} From c50d38974e81b50b24391690561879087faec8ce Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 29 Feb 2016 20:25:59 -0500 Subject: [PATCH 083/162] code cleanup: else blocks to standard, removing startFile params, removing console.log --- builder/parameter_hunter.js | 299 +++++++++++++++++++++-------------- builder/pattern_assembler.js | 107 +++++++++---- core/lib/patternlab.js | 2 +- 3 files changed, 253 insertions(+), 155 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 8298c8905..8d057c6aa 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -8,103 +8,174 @@ * */ -(function () { - "use strict"; - - var parameter_hunter = function(){ - - var extend = require('util')._extend, - pa = require('./pattern_assembler'), - mustache = require('mustache'), - smh = require('./style_modifier_hunter'), - style_modifier_hunter = new smh(), - pattern_assembler = new pa(); - - function findparameters(pattern, patternlab, startFile){ - var renderedPartial; - var renderedTemplate = pattern.extendedTemplate; - - if(pattern.parameteredPartials && pattern.parameteredPartials.length > 0){ - //compile this partial immeadiately, essentially consuming it. - pattern.parameteredPartials.forEach(function(pMatch, index, matches){ - //find the partial's name and retrieve it - var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.get_pattern_by_key(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 and eval - var leftParen = pMatch.indexOf('('); - var rightParen = pMatch.indexOf(')'); - var paramString = '({' + pMatch.substring(leftParen + 1, rightParen) + '})'; - - //do no evil. there is no good way to do this that I can think of without using a split, which then makes commas and colons special characters and unusable within the pattern params - var paramData = eval(paramString); - - var globalData = JSON.parse(JSON.stringify(patternlab.data)); - var localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); - var startPattern = pattern_assembler.get_pattern_by_key(startFile, patternlab); - var startData = JSON.parse(JSON.stringify(startPattern.jsonFileData || {})); - - //in order to token-replace parameterized tags, prepare for rendering Mustache - //replace global, file-specific, and param data. however, since partial inclusion - //is not done here, escape partial tags by switching them to ERB syntax. -var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); - //then set the new delimiter at the beginning of the extended template -// extendedTemplateEscaped = '{{=<% %>=}}' + extendedTemplateEscaped; - - - //render the newly delimited partial -// var renderedPartial = pattern_assembler.renderPattern(extendedTemplateEscaped, paramData, patternlab.partials); - - var allData = pattern_assembler.merge_data(globalData, startData); - allData = pattern_assembler.merge_data(allData, localData); - allData = pattern_assembler.merge_data(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); - -/* - //in pre-render, escape all tags which correspond to keys in the allData object - //in order to do so, escape the partials by switching them to ERB - var escapeLoopsAndConditionals = function(dataKey) { - var escapeString = new RegExp('{{([{#\\^\\/&]?\\s*' + dataKey + '\\s*}?)}}', 'g'); - renderedPartial = renderedPartial.replace(escapeString, '<%$1%>'); - }; - pattern_assembler.traverse_data(allData, escapeLoopsAndConditionals); - - //also escape partial includes and listItems loops - renderedPartial = renderedPartial.replace(/{{> ([^\}]+)}}/g, '<%> $1%>'); - renderedPartial = renderedPartial.replace(/{{([#\/]\s*listItems.[a-z]+\s*)}}/g, '<%$1%>'); -*/ - - //the reasoning for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant Mustache conditionals persisted -console.log(typeof extendedTemplateEscaped); - extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); - - //after that's done, switch back to standard Mustache tags - renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - //remove the parameter from the partial and replace it with the rendered partial + paramData - renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); -if (startFile.indexOf('04-pages/00-homepage') > -1) { - console.log('pMatch'); - console.log(pMatch); - console.log('renderedPartial'); - console.log(renderedPartial); - console.log('renderedTemplate'); - console.log(renderedTemplate); -} +"use strict"; + +var parameter_hunter = function () { + + var extend = require('util')._extend, + pa = require('./pattern_assembler'), + smh = require('./style_modifier_hunter'), + style_modifier_hunter = new smh(), + pattern_assembler = new pa(); + + function paramToJson(pString) { + var paramStringWellFormed = ''; + var paramStringTmp; + var colonPos; + var delimitPos; + var quotePos; + var paramString = pString; + + do { + + //if param key is wrapped in single quotes, replace with double quotes. + paramString = paramString.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); + + //if params key is not wrapped in any quotes, wrap in double quotes. + paramString = paramString.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); + + //move param key to paramStringWellFormed var. + colonPos = paramString.indexOf(':'); + + //except to prevent infinite loops. + if (colonPos === -1) { + colonPos = paramString.length - 1; + } else { + colonPos += 1; + } + paramStringWellFormed += paramString.substring(0, colonPos); + paramString = paramString.substring(colonPos, paramString.length).trim(); + + //if param value is wrapped in single quotes, replace with double quotes. + if (paramString[0] === '\'') { + quotePos = paramString.search(/[^\\]'/); + + //except for unclosed quotes to prevent infinite loops. + if (quotePos === -1) { + quotePos = paramString.length - 1; + } else { + quotePos += 2; + } + + //prepare param value for move to paramStringWellFormed var. + paramStringTmp = paramString.substring(0, quotePos); + + //unescape any escaped single quotes. + paramStringTmp = paramStringTmp.replace(/\\'/g, '\''); + + //escape any double quotes. + paramStringTmp = paramStringTmp.replace(/"/g, '\\"'); + + //replace the delimiting single quotes with double quotes. + paramStringTmp = paramStringTmp.replace(/^'/, '"'); + paramStringTmp = paramStringTmp.replace(/'$/, '"'); + + //move param key to paramStringWellFormed var. + paramStringWellFormed += paramStringTmp; + paramString = paramString.substring(quotePos, paramString.length).trim(); + + //if param value is wrapped in double quotes, just move to paramStringWellFormed var. + } else if (paramString[0] === '"') { + quotePos = paramString.search(/[^\\]"/); + + //except for unclosed quotes to prevent infinite loops. + if (quotePos === -1) { + quotePos = paramString.length - 1; + } else { + quotePos += 2; + } + + //move param key to paramStringWellFormed var. + paramStringWellFormed += paramString.substring(0, quotePos); + paramString = paramString.substring(quotePos, paramString.length).trim(); + + //if param value is not wrapped in quotes, move everthing up to the delimiting comma to paramStringWellFormed var. + } else { + delimitPos = paramString.indexOf(','); + + //except to prevent infinite loops. + if (delimitPos === -1) { + delimitPos = paramString.length - 1; + } else { + delimitPos += 1; + } + paramStringWellFormed += paramString.substring(0, delimitPos); + paramString = paramString.substring(delimitPos, paramString.length).trim(); + } + + //break at the end. + if (paramString.length === 1) { + paramStringWellFormed += paramString.trim(); + paramString = ''; + break; + } + + } while (paramString); + + return paramStringWellFormed; + } + + function findparameters(pattern, patternlab) { + var renderedPartial; + var renderedTemplate = pattern.extendedTemplate; + + 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.get_pattern_by_key(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.indexOf(')'); + var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; + var paramStringWellFormed = paramToJson(paramString); + + var globalData = {}; + var localData = {}; + var paramData = {}; + + try { + globalData = JSON.parse(JSON.stringify(patternlab.data)); + localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); + paramData = JSON.parse(paramStringWellFormed); + } catch (e) { + console.log(e); + } + + //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); + } + + //assemble the allData object to render non-partial Mustache tags. + var allData = pattern_assembler.merge_data(globalData, localData); + allData = pattern_assembler.merge_data(allData, paramData); + + //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally + allData.link = extend({}, patternlab.data.link); + + //the reasoning for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant Mustache conditionals persisted + + //in order to token-replace parameterized tags, prepare for rendering Mustache + //replace global, file-specific, and param data. however, since partial inclusion + //is not done here, escape partial tags by switching them to ERB syntax. + var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); + + //after that's done, switch back to standard Mustache tags + renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + //remove the parameter from the partial and replace it with the rendered partial + paramData + renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); //update the extendedTemplate in the partials object in case this pattern is consumed later patternlab.partials[pattern.key] = renderedTemplate; @@ -114,28 +185,18 @@ var parameteredPartialsNew = pattern_assembler.find_pattern_partials_with_parame pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); pattern.extendedTemplate = renderedTemplate; -if(pattern.parameteredPartials){ -//pattern.extendedTemplate = findparameters(pattern, patternlab, startFile); -findparameters(pattern, patternlab, startFile); -console.log('doing'); -console.log(pattern); - console.log(renderedPartial); -} -if (startFile.indexOf('04-pages/00-homepage') > -1) { -} - -// return renderedTemplate; - } - } - - return { - find_parameters: function(pattern, patternlab, startFile){ -// return findparameters(pattern, patternlab, startFile); -findparameters(pattern, patternlab, startFile); - } - }; - - }; + //recurse if renderedTemplate still has parametered partials. + if (pattern.parameteredPartials) { + findparameters(pattern, patternlab); + } + } + } + + return { + find_parameters: function(pattern, patternlab){ + findparameters(pattern, patternlab); + } + }; module.exports = parameter_hunter; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 4100d4152..982888154 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -165,19 +165,28 @@ addPattern(currentPattern, patternlab); } - /** - * Recurse through patternlab object as necessitated by partial inclusions. - * Build out the final output for writing to the public/patterns directory. - * - * @param {string} file The abspath of pattern being processed. - * @param {Object} patternlab The patternlab object. - * @param {string} startFile The abspath of the pattern at the top level of recursion. - */ - function processPatternRecursive(file, patternlab, startFile){ - - var fs = require('fs-extra'), - mustache = require('mustache'), - lh = require('./lineage_hunter'), + //add the raw template to memory + currentPattern.template = fs.readFileSync(file, 'utf8'); + + //find any stylemodifiers that may be in the current pattern + currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + + //find any pattern parameters that may be in the current pattern + currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); + + //add currentPattern to patternlab.patterns array + addPattern(currentPattern, patternlab); + } + + /** + * Recurse through patternlab object as necessitated by partial inclusions. + * Build out the final output for writing to the public/patterns directory. + * + * @param {string} file The abspath of pattern being processed. + * @param {Object} patternlab The patternlab object. + */ + function processPatternRecursive(file, patternlab) { + var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), lih = require('./list_item_hunter'), @@ -225,13 +234,13 @@ //find how many partials there may be for the given pattern var foundPatternPartials = findPartials(currentPattern); -// var startPattern = getpatternbykey(startFile, patternlab); - - if(foundPatternPartials !== null && foundPatternPartials.length > 0){ - - if(patternlab.config.debug){ - console.log('found partials for ' + currentPattern.key); - } + //determine if the template contains any pattern parameters + if(currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0){ + //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() + parameter_hunter.find_parameters(currentPattern, patternlab); + //re-evaluate foundPatternPartials + foundPatternPartials = findPartials(currentPattern.extendedTemplate); + } //find any listItem blocks list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -271,10 +280,8 @@ if(startFile.indexOf('04-pages/00-homepage') > -1){ } } - //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPath, patternlab, startFile); -if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ -} + //recurse through nested partials to fill out this extended template. + processPatternRecursive(partialPath, patternlab); //complete assembly of extended template var partialPattern = getpatternbykey(partialKey, patternlab); @@ -429,17 +436,47 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ } return JSON.parse(dataObjAsString) } - //look for pattern links included in data files. - //these will be in the form of link.* WITHOUT {{}}, which would still be there from direct pattern inclusion - function parseDataLinks(patternlab) { - //look for link.* such as link.pages-blog as a value - - patternlab.data = parseDataLinksHelper(patternlab, patternlab.data, 'data.json') - - //loop through all patterns - for (var i = 0; i < patternlab.patterns.length; i++) { - patternlab.patterns[i].jsonFileData = parseDataLinksHelper(patternlab, patternlab.patterns[i].jsonFileData, patternlab.patterns[i].key) - } + } + + return { + find_pattern_partials: function (pattern) { + return findPartials(pattern); + }, + find_pattern_partials_with_style_modifiers: function (pattern) { + return findPartialsWithStyleModifiers(pattern); + }, + find_pattern_partials_with_parameters: function (pattern) { + return findPartialsWithPatternParameters(pattern); + }, + find_list_items: function (pattern) { + return findListItems(pattern); + }, + setPatternState: function (pattern, patternlab) { + setState(pattern, patternlab); + }, + addPattern: function (pattern, patternlab) { + addPattern(pattern, patternlab); + }, + renderPattern: function (template, data, partials) { + return renderPattern(template, data, partials); + }, + process_pattern_iterative: function (file, patternlab) { + processPatternIterative(file, patternlab); + }, + process_pattern_recursive: function (file, patternlab) { + processPatternRecursive(file, patternlab); + }, + get_pattern_by_key: function (key, patternlab) { + return getpatternbykey(key, patternlab); + }, + merge_data: function (existingData, newData) { + return mergeData(existingData, newData); + }, + combine_listItems: function (patternlab) { + buildListItems(patternlab); + }, + parse_data_links: function (patternlab) { + parseDataLinks(patternlab); } return { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index eba2a804c..810be13a7 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -129,7 +129,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); }); //set user defined head and foot if they exist From 5aabbdf0b81c95adadc842f874aa4df8ca4c5f3b Mon Sep 17 00:00:00 2001 From: BRIAN MUENZENMEYER Date: Wed, 24 Feb 2016 12:31:16 -0600 Subject: [PATCH 084/162] unit test coverage for #250 --- .../00-test/12-parameter-partial.mustache | 6 + .../13-another-parameter-partial.mustache | 1 + test/parameter_hunter_tests.js | 118 ++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 test/files/_patterns/00-test/12-parameter-partial.mustache create mode 100644 test/files/_patterns/00-test/13-another-parameter-partial.mustache diff --git a/test/files/_patterns/00-test/12-parameter-partial.mustache b/test/files/_patterns/00-test/12-parameter-partial.mustache new file mode 100644 index 000000000..e3799746a --- /dev/null +++ b/test/files/_patterns/00-test/12-parameter-partial.mustache @@ -0,0 +1,6 @@ +{{> test-bar }} +{{# flag}} + {{> test-styled-atom:baz(message: 'foo') }} + {{> test-bar }} +{{/ flag}} +{{> test-bar }} diff --git a/test/files/_patterns/00-test/13-another-parameter-partial.mustache b/test/files/_patterns/00-test/13-another-parameter-partial.mustache new file mode 100644 index 000000000..34856e8b1 --- /dev/null +++ b/test/files/_patterns/00-test/13-another-parameter-partial.mustache @@ -0,0 +1 @@ +{{> test-parameter-partial(flag: true) }} \ No newline at end of file diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 96d345792..67284b78f 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -1,4 +1,5 @@ (function () { +<<<<<<< HEAD "use strict"; var ph = require('../core/lib/parameter_hunter'); @@ -56,6 +57,61 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); +======= + "use strict"; + + var ph = require('../builder/parameter_hunter'); + var pa = require('../builder/pattern_assembler'); + var object_factory = require('../builder/object_factory'); + + exports['parameter_hunter'] = { + 'pattern hunter finds and extends templates' : function(test){ + + //setup current pattern from what we would have during execution + var currentPattern = { + "fileName": "01-sticky-comment", + "subdir": "02-organisms/02-comments", + "name": "02-organisms-02-comments-01-sticky-comment", + "patternName": "sticky-comment", + "patternLink": "02-organisms-02-comments-01-sticky-comment/02-organisms-02-comments-01-sticky-comment.html", + "patternGroup": "organisms", + "patternSubGroup": "comments", + "flatPatternPath": "02-organisms-02-comments", + "key": "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.') }}" + ] + }; + var patternlab = { + patterns: [ + { + "fileName": "02-single-comment", + "subdir": "01-molecules/06-components", + "name": "01-molecules-06-components-02-single-comment", + "patternName": "single-comment", + "patternLink": "01-molecules-06-components-02-single-comment/01-molecules-06-components-02-single-comment.html", + "patternGroup": "molecules", + "patternSubGroup": "components", + "flatPatternPath": "01-molecules-06-components", + "key": "molecules-single-comment", + "template": "

{{description}}

", + "extendedTemplate": "

{{description}}

" + } + ], + config: { + debug: false + }, + data: { + description: 'Not a quote from a smart man' + }, + partials: {}, + }; + + var parameter_hunter = new ph(); +>>>>>>> 4af2266... unit test coverage for #250 parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

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

'); @@ -142,6 +198,7 @@ test.done(); }, +<<<<<<< HEAD 'parameter hunter parses parameters with single-quoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); @@ -157,6 +214,67 @@ test.done(); }, +======= + 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ + + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + //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 object_factory.oPattern('test/files/_patterns/00-test/01-bar.mustache', '00-test', '01-bar.mustache'); + atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/01-bar.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 stylePattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); + stylePattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); + stylePattern.extendedTemplate = stylePattern.template; + stylePattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(stylePattern); + stylePattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(stylePattern); + + var innerParameteredPattern = new object_factory.oPattern('test/files/_patterns/00-test/12-parameter-partial.mustache', '00-test', '12-parameter-partial.mustache'); + innerParameteredPattern.template = fs.readFileSync(patterns_dir + '/00-test/12-parameter-partial.mustache', 'utf8'); + innerParameteredPattern.extendedTemplate = innerParameteredPattern.template; + innerParameteredPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(innerParameteredPattern); + innerParameteredPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(innerParameteredPattern); + + var outerParameteredPattern = new object_factory.oPattern('test/files/_patterns/00-test/13-another-parameter-partial.mustache', '00-test', '13-another-parameter-partial.mustache'); + outerParameteredPattern.template = fs.readFileSync(patterns_dir + '/00-test/13-another-parameter-partial.mustache', 'utf8'); + outerParameteredPattern.extendedTemplate = outerParameteredPattern.template; + outerParameteredPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(outerParameteredPattern); + outerParameteredPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(outerParameteredPattern); + + pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.addPattern(stylePattern, pl); + pattern_assembler.addPattern(innerParameteredPattern, pl); + pattern_assembler.addPattern(outerParameteredPattern, pl); + + //act + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/13-another-parameter-partial.mustache', pl, {}); + + //assert. + var expectedValue = 'bar foo bar bar'; + test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + test.done(); + } +>>>>>>> 4af2266... unit test coverage for #250 'parameter hunter parses parameters with single-quoted keys and single-quoted values wrapping internal escaped single-quotes' : function(test){ var currentPattern = currentPatternClosure(); From 543b6694beec855da3ffa4b8883fbb0d0b4dd40c Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 29 Feb 2016 22:31:10 -0500 Subject: [PATCH 085/162] working unit test for parameter hunter --- builder/parameter_hunter.js | 9 +- builder/pattern_assembler.js | 65 +++++-------- test/parameter_hunter_tests.js | 157 ++++++++------------------------ test/pattern_assembler_tests.js | 12 +-- 4 files changed, 75 insertions(+), 168 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 8d057c6aa..4e33947b2 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -181,9 +181,12 @@ var parameter_hunter = function () { patternlab.partials[pattern.key] = renderedTemplate; }); -var parameteredPartialsNew = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); -pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); -pattern.extendedTemplate = renderedTemplate; + //after iterating through parameteredPartials, reassign the current pattern's + //stylePartials, parameteredPartials, and extendedTemplate properties based on + //the most recent evaluation of renderedTemplate. + pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(renderedTemplate); + pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); + pattern.extendedTemplate = renderedTemplate; //recurse if renderedTemplate still has parametered partials. if (pattern.parameteredPartials) { diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 982888154..8dc8f1377 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -11,7 +11,16 @@ (function () { "use strict"; - var pattern_assembler = function(){ + // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern + function findPartialsWithStyleModifiers(pattern) { + var matches; + if (typeof pattern === 'string') { + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + } + return matches; + } function isObjectEmpty(obj) { for(var prop in obj) { @@ -235,49 +244,23 @@ var foundPatternPartials = findPartials(currentPattern); //determine if the template contains any pattern parameters - if(currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0){ + if (currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0) { //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab); //re-evaluate foundPatternPartials foundPatternPartials = findPartials(currentPattern.extendedTemplate); } - //find any listItem blocks - list_item_hunter.process_list_item_partials(currentPattern, patternlab); - -if(currentPattern.abspath.indexOf('07-messaging/00-alert.mustache') > -1){ -} - - //determine if the template contains any pattern parameters - if(currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0){ - //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() - parameter_hunter.find_parameters(currentPattern, patternlab, startFile); -// currentPattern.extendedTemplate = parameter_hunter.find_parameters(currentPattern, patternlab, startFile); -// foundPatternPartials = parameter_hunter.find_parameters(currentPattern, patternlab, startFile); - //re-evaluate foundPatternPartials -if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ -} - foundPatternPartials = findPartials(currentPattern.extendedTemplate); -if(startFile.indexOf('04-pages/00-homepage') > -1){ -} - } - - + if (foundPatternPartials && foundPatternPartials.length > 0) { + //do something with the regular old partials + for (i = 0; i < foundPatternPartials.length; i++) { + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); + var partialPath; - if(foundPatternPartials && foundPatternPartials.length > 0){ - //do something with the regular old partials - for(i = 0; i < foundPatternPartials.length; i++){ - var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); - - var partialPath; - - //identify which pattern this partial corresponds to - for(var j = 0; j < patternlab.patterns.length; j++){ - if(patternlab.patterns[j].key === partialKey || - patternlab.patterns[j].abspath.indexOf(partialKey) > -1) - { - partialPath = patternlab.patterns[j].abspath; - } + //identify which pattern this partial corresponds to + for (var j = 0; j < patternlab.patterns.length; j++) { + if (patternlab.patterns[j].key === partialKey || patternlab.patterns[j].abspath.indexOf(partialKey) > -1) { + partialPath = patternlab.patterns[j].abspath; } //recurse through nested partials to fill out this extended template. @@ -286,10 +269,10 @@ if(startFile.indexOf('04-pages/00-homepage') > -1){ //complete assembly of extended template var partialPattern = getpatternbykey(partialKey, 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); - } + //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); diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 67284b78f..ee05c42f4 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -1,5 +1,4 @@ (function () { -<<<<<<< HEAD "use strict"; var ph = require('../core/lib/parameter_hunter'); @@ -57,61 +56,6 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); -======= - "use strict"; - - var ph = require('../builder/parameter_hunter'); - var pa = require('../builder/pattern_assembler'); - var object_factory = require('../builder/object_factory'); - - exports['parameter_hunter'] = { - 'pattern hunter finds and extends templates' : function(test){ - - //setup current pattern from what we would have during execution - var currentPattern = { - "fileName": "01-sticky-comment", - "subdir": "02-organisms/02-comments", - "name": "02-organisms-02-comments-01-sticky-comment", - "patternName": "sticky-comment", - "patternLink": "02-organisms-02-comments-01-sticky-comment/02-organisms-02-comments-01-sticky-comment.html", - "patternGroup": "organisms", - "patternSubGroup": "comments", - "flatPatternPath": "02-organisms-02-comments", - "key": "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.') }}" - ] - }; - var patternlab = { - patterns: [ - { - "fileName": "02-single-comment", - "subdir": "01-molecules/06-components", - "name": "01-molecules-06-components-02-single-comment", - "patternName": "single-comment", - "patternLink": "01-molecules-06-components-02-single-comment/01-molecules-06-components-02-single-comment.html", - "patternGroup": "molecules", - "patternSubGroup": "components", - "flatPatternPath": "01-molecules-06-components", - "key": "molecules-single-comment", - "template": "

{{description}}

", - "extendedTemplate": "

{{description}}

" - } - ], - config: { - debug: false - }, - data: { - description: 'Not a quote from a smart man' - }, - partials: {}, - }; - - var parameter_hunter = new ph(); ->>>>>>> 4af2266... unit test coverage for #250 parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

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

'); @@ -198,7 +142,6 @@ test.done(); }, -<<<<<<< HEAD 'parameter hunter parses parameters with single-quoted keys and unquoted values' : function(test){ var currentPattern = currentPatternClosure(); @@ -214,67 +157,6 @@ test.done(); }, -======= - 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ - - // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js - //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 object_factory.oPattern('test/files/_patterns/00-test/01-bar.mustache', '00-test', '01-bar.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/01-bar.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 stylePattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - stylePattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - stylePattern.extendedTemplate = stylePattern.template; - stylePattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(stylePattern); - stylePattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(stylePattern); - - var innerParameteredPattern = new object_factory.oPattern('test/files/_patterns/00-test/12-parameter-partial.mustache', '00-test', '12-parameter-partial.mustache'); - innerParameteredPattern.template = fs.readFileSync(patterns_dir + '/00-test/12-parameter-partial.mustache', 'utf8'); - innerParameteredPattern.extendedTemplate = innerParameteredPattern.template; - innerParameteredPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(innerParameteredPattern); - innerParameteredPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(innerParameteredPattern); - - var outerParameteredPattern = new object_factory.oPattern('test/files/_patterns/00-test/13-another-parameter-partial.mustache', '00-test', '13-another-parameter-partial.mustache'); - outerParameteredPattern.template = fs.readFileSync(patterns_dir + '/00-test/13-another-parameter-partial.mustache', 'utf8'); - outerParameteredPattern.extendedTemplate = outerParameteredPattern.template; - outerParameteredPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(outerParameteredPattern); - outerParameteredPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(outerParameteredPattern); - - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(stylePattern, pl); - pattern_assembler.addPattern(innerParameteredPattern, pl); - pattern_assembler.addPattern(outerParameteredPattern, pl); - - //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/13-another-parameter-partial.mustache', pl, {}); - - //assert. - var expectedValue = 'bar foo bar bar'; - test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); - test.done(); - } ->>>>>>> 4af2266... unit test coverage for #250 'parameter hunter parses parameters with single-quoted keys and single-quoted values wrapping internal escaped single-quotes' : function(test){ var currentPattern = currentPatternClosure(); @@ -348,6 +230,45 @@ parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

true not}"true"

'); + test.done(); + }, + + 'pattern hunter findPatterns calls itself when encountering a partial that has parameters itself' : function(test){ + // this test utilizes pattern_assembler for the heavy lifting, but the actual code being tested resides inside pattern_hunter.js + //arrange + var fs = require('fs-extra'); + var path = require('path'); + var object_factory = require('../builder/object_factory'); + var pa = require('../builder/pattern_assembler'); + 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 = {}; + + pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl); + pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl); + pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl); + pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + + //act + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + var outerParameteredPattern = pattern_assembler.get_pattern_by_key(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + + //assert. + var expectedValue = 'bar foo bar bar'; + test.equals(outerParameteredPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); } }; diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 2b42a95e6..2f77c7204 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -308,7 +308,7 @@ pattern_assembler.addPattern(groupPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/04-group.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/04-group.mustache', pl); //assert var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; @@ -349,7 +349,7 @@ pattern_assembler.addPattern(groupPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache', pl); //assert var expectedValue = '
{{message}} {{message}} bar
'; @@ -388,7 +388,7 @@ pattern_assembler.addPattern(mixedPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/06-mixed.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/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}}
'; @@ -427,7 +427,7 @@ pattern_assembler.addPattern(bookendPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/09-bookend.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/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}}
'; @@ -468,7 +468,7 @@ pattern_assembler.addPattern(mixedPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/07-mixed-params.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/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
'; @@ -509,7 +509,7 @@ pattern_assembler.addPattern(bookendPattern, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/08-bookend-params.mustache', pl, {}); + pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/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}}
'; From b02ec97dc1ff9b7871e2282bc248bc934f98a767 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:14:33 -0500 Subject: [PATCH 086/162] using getpatternbykey to stay DRY --- builder/pattern_assembler.js | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 8dc8f1377..cb0163af7 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -106,6 +106,9 @@ } } + return null; + } + function processPatternIterative(file, patternlab){ var fs = require('fs-extra'), of = require('./object_factory'), @@ -208,16 +211,15 @@ style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); - //find current pattern in patternlab object using var file as a key - var currentPattern, - i; + var i; // for the for loops - for(i = 0; i < patternlab.patterns.length; i++){ - if(patternlab.patterns[i].abspath === file){ - currentPattern = patternlab.patterns[i]; - break; - } - } + //find current pattern in patternlab object using var file as a key + var currentPattern = getpatternbykey(file, patternlab); + + //return if processing an ignored file + if (currentPattern === null) { + return; + } //return if processing an ignored file if(typeof currentPattern === 'undefined'){ @@ -255,26 +257,20 @@ //do something with the regular old partials for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); - var partialPath; //identify which pattern this partial corresponds to - for (var j = 0; j < patternlab.patterns.length; j++) { - if (patternlab.patterns[j].key === partialKey || patternlab.patterns[j].abspath.indexOf(partialKey) > -1) { - partialPath = patternlab.patterns[j].abspath; - } + var partialPattern = getpatternbykey(partialKey, patternlab); //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPath, patternlab); - - //complete assembly of extended template - var partialPattern = getpatternbykey(partialKey, patternlab); + processPatternRecursive(partialPattern.abspath, 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); + //complete assembly of extended template + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); //update the extendedTemplate in the partials object in case this pattern is consumed later patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; From 766e5a38d305d811f9555fce010260bbfe28b8ab Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:22:03 -0500 Subject: [PATCH 087/162] whitespace edits --- builder/parameter_hunter.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 4e33947b2..36b688414 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -120,11 +120,13 @@ var parameter_hunter = function () { var renderedTemplate = pattern.extendedTemplate; 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.get_pattern_by_key(partialName, patternlab); + //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190 partialPattern.extendedTemplate = partialPattern.template; @@ -196,7 +198,7 @@ var parameter_hunter = function () { } return { - find_parameters: function(pattern, patternlab){ + find_parameters: function (pattern, patternlab) { findparameters(pattern, patternlab); } }; From 7e9866ad70422a17136d5e3af344306bc1b4a132 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:23:49 -0500 Subject: [PATCH 088/162] reverting test changes in source dir --- .../02-organisms/02-comments/01-sticky-comment.mustache | 3 ++- source/_patterns/03-templates/00-homepage.mustache | 5 +---- source/_patterns/04-pages/00-homepage.mustache | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache b/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache index 56fe2f96b..ac0b28dc4 100644 --- a/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache +++ b/source/_patterns/02-organisms/02-comments/01-sticky-comment.mustache @@ -2,7 +2,8 @@

Selected Comments

    - {{> molecules-single-comment }} + {{> 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.') }}
diff --git a/source/_patterns/03-templates/00-homepage.mustache b/source/_patterns/03-templates/00-homepage.mustache index 580d3c9ad..40f9b1588 100644 --- a/source/_patterns/03-templates/00-homepage.mustache +++ b/source/_patterns/03-templates/00-homepage.mustache @@ -2,11 +2,8 @@ {{> organisms-header }}
{{# emergency }} - {{> molecules-alert(alertClass: 'error') }} + {{> molecules-alert }} {{/ emergency }} - {{# foo }} - {{> molecules-alert(alertClass: 'foo') }} - {{/ foo }} {{# hero }} {{> molecules-block-hero }} {{/ hero}} diff --git a/source/_patterns/04-pages/00-homepage.mustache b/source/_patterns/04-pages/00-homepage.mustache index 6d918a24d..d9894d4a7 100644 --- a/source/_patterns/04-pages/00-homepage.mustache +++ b/source/_patterns/04-pages/00-homepage.mustache @@ -1 +1 @@ -{{> templates-homepage(emergency: true) }} +{{> templates-homepage }} From afde7520b9b48f69b75464f46407347d7df6d40a Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:36:18 -0500 Subject: [PATCH 089/162] moving data vars in parameter_hunter.js outside for loop --- builder/parameter_hunter.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 36b688414..48694e1e3 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -121,6 +121,20 @@ var parameter_hunter = function () { if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + var globalData = {}; + var localData = {}; + var paramData = {}; + + try { + globalData = JSON.parse(JSON.stringify(patternlab.data)); + localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); + } catch (e) { + console.log(e); + } + + //assemble the allData object to render non-partial Mustache tags. + var allData = pattern_assembler.merge_data(globalData, localData); + //compile this partial immeadiately, essentially consuming it. pattern.parameteredPartials.forEach(function (pMatch) { //find the partial's name and retrieve it @@ -140,13 +154,7 @@ var parameter_hunter = function () { var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; var paramStringWellFormed = paramToJson(paramString); - var globalData = {}; - var localData = {}; - var paramData = {}; - try { - globalData = JSON.parse(JSON.stringify(patternlab.data)); - localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); paramData = JSON.parse(paramStringWellFormed); } catch (e) { console.log(e); @@ -158,7 +166,6 @@ var parameter_hunter = function () { } //assemble the allData object to render non-partial Mustache tags. - var allData = pattern_assembler.merge_data(globalData, localData); allData = pattern_assembler.merge_data(allData, paramData); //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally From 285fb8d74a359affe2f6cf43c13e544699ce66a0 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 06:46:05 -0500 Subject: [PATCH 090/162] lines before comments per eslint --- builder/pattern_assembler.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index cb0163af7..13fd70a4c 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -88,10 +88,25 @@ break; } } - //if the pattern is new, just push to the array - if(isNew){ - patternlab.patterns.push(pattern); - patternlab.partials[pattern.key] = pattern.extendedTemplate || pattern.template; + } + } + + function getpatternbykey(key, patternlab) { + var i; // for the for loops + + for (i = 0; i < patternlab.patterns.length; i++) { + switch (key) { + + //look for exact key matches + case patternlab.patterns[i].key: + + //look for abspath matches + case patternlab.patterns[i].abspath: + + //else look by verbose syntax + case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName: + case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': + return patternlab.patterns[i]; } } @@ -247,13 +262,16 @@ //determine if the template contains any pattern parameters if (currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0) { + //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab); + //re-evaluate foundPatternPartials foundPatternPartials = findPartials(currentPattern.extendedTemplate); } if (foundPatternPartials && foundPatternPartials.length > 0) { + //do something with the regular old partials for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); From 71107075c619b71228e024b5621a80de8ad5e84b Mon Sep 17 00:00:00 2001 From: hee01 Date: Tue, 1 Mar 2016 18:20:46 -0500 Subject: [PATCH 091/162] fixing delimitPos in paramToJson. eliminating more extraneous recursion paths in parameter_hunter.js --- builder/parameter_hunter.js | 127 ++++++++++++++++++++--------------- builder/pattern_assembler.js | 49 +++++++++----- 2 files changed, 104 insertions(+), 72 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 48694e1e3..8cf37fde0 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -96,15 +96,14 @@ var parameter_hunter = function () { //except to prevent infinite loops. if (delimitPos === -1) { delimitPos = paramString.length - 1; - } else { - delimitPos += 1; } + paramStringWellFormed += paramString.substring(0, delimitPos); paramString = paramString.substring(delimitPos, paramString.length).trim(); } //break at the end. - if (paramString.length === 1) { + if (paramString.length <= 1) { paramStringWellFormed += paramString.trim(); paramString = ''; break; @@ -135,60 +134,78 @@ var parameter_hunter = function () { //assemble the allData object to render non-partial Mustache tags. var allData = pattern_assembler.merge_data(globalData, localData); - //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.get_pattern_by_key(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.indexOf(')'); - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = paramToJson(paramString); - - try { - paramData = JSON.parse(paramStringWellFormed); - } catch (e) { - console.log(e); - } - - //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); - } - - //assemble the allData object to render non-partial Mustache tags. - allData = pattern_assembler.merge_data(allData, paramData); - - //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally - allData.link = extend({}, patternlab.data.link); + //compile this partial immediately, essentially consuming it. + //the reasoning for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant Mustache conditionals persisted. + //in order to token-replace parameterized tags, prepare for rendering Mustache + //replace global and file-specific data. however, since partial inclusion + //is not done here, escape partial tags by switching them to ERB syntax. + var templateEscaped = renderedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + templateEscaped = pattern_assembler.renderPattern(templateEscaped, allData); - //the reasoning for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant Mustache conditionals persisted + //after that's done, switch back to standard Mustache tags + renderedTemplate = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - //in order to token-replace parameterized tags, prepare for rendering Mustache - //replace global, file-specific, and param data. however, since partial inclusion - //is not done here, escape partial tags by switching them to ERB syntax. - var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); - extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); - - //after that's done, switch back to standard Mustache tags - renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - //remove the parameter from the partial and replace it with the rendered partial + paramData - renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); + //re-evaluate parameteredPartials after rendering + pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.key] = renderedTemplate; - }); + if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + + //iterate through most recently evaluated parameteredPartials + pattern.parameteredPartials.forEach(function (pMatch) { + //find the partial's name and retrieve it + var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(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.indexOf(')'); + var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; + var paramStringWellFormed = '{}'; + paramStringWellFormed = paramToJson(paramString); + + try { + paramData = JSON.parse(paramStringWellFormed); + } catch (e) { + console.log(e); + } + + //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); + } + + //assemble the allData object to render non-partial Mustache tags. + allData = pattern_assembler.merge_data(allData, paramData); + + //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally + allData.link = extend({}, patternlab.data.link); + + //the reasoning for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant Mustache conditionals persisted. + //in order to token-replace parameterized tags, prepare for rendering Mustache + //replace global, file-specific, and param data. however, since partial inclusion + //is not done here, escape partial tags by switching them to ERB syntax. + var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); + + //after that's done, switch back to standard Mustache tags + renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + //remove the parameter from the partial and replace it with the rendered partial + paramData + renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); + + //update the extendedTemplate in the partials object in case this pattern is consumed later + patternlab.partials[pattern.key] = renderedTemplate; + }); + } //after iterating through parameteredPartials, reassign the current pattern's //stylePartials, parameteredPartials, and extendedTemplate properties based on @@ -198,7 +215,7 @@ var parameter_hunter = function () { pattern.extendedTemplate = renderedTemplate; //recurse if renderedTemplate still has parametered partials. - if (pattern.parameteredPartials) { + if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { findparameters(pattern, patternlab); } } diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 13fd70a4c..b091d9235 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -15,20 +15,31 @@ function findPartialsWithStyleModifiers(pattern) { var matches; if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g); } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g); } return matches; } - function isObjectEmpty(obj) { - for(var prop in obj) { - if(obj.hasOwnProperty(prop)) - return false; - } + // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern + function findPartialsWithPatternParameters(pattern) { + var matches; + if (typeof pattern === 'string') { + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g); + } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g); + } + return matches; + } - return true; + //find and return any {{> template-name* }} within pattern + function findPartials(pattern) { + var matches; + if (typeof pattern === 'string') { + matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g); + } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { + matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g); } // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern @@ -274,21 +285,25 @@ //do something with the regular old partials for (i = 0; i < foundPatternPartials.length; i++) { - var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\(.*)?([ ])?}}/g, '$2'); + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); //identify which pattern this partial corresponds to var partialPattern = getpatternbykey(partialKey, patternlab); - //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPattern.abspath, patternlab); + if (partialPattern === null) { + throw 'Could not find pattern with key ' + partialKey; - //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); - } + } else { + //recurse through nested partials to fill out this extended template. + processPatternRecursive(partialPattern.abspath, 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); + } - //complete assembly of extended template - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); + //complete assembly of extended template + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); //update the extendedTemplate in the partials object in case this pattern is consumed later patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; From e2b2a1354757f857d3314aed5f6f4cbb31308629 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 1 Mar 2016 20:48:31 -0500 Subject: [PATCH 092/162] unit test --- builder/parameter_hunter.js | 4 ++-- test/parameter_hunter_tests.js | 23 +++++++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 8cf37fde0..fbc307354 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -140,7 +140,7 @@ var parameter_hunter = function () { //in order to token-replace parameterized tags, prepare for rendering Mustache //replace global and file-specific data. however, since partial inclusion //is not done here, escape partial tags by switching them to ERB syntax. - var templateEscaped = renderedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + var templateEscaped = renderedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); templateEscaped = pattern_assembler.renderPattern(templateEscaped, allData); //after that's done, switch back to standard Mustache tags @@ -193,7 +193,7 @@ var parameter_hunter = function () { //in order to token-replace parameterized tags, prepare for rendering Mustache //replace global, file-specific, and param data. however, since partial inclusion //is not done here, escape partial tags by switching them to ERB syntax. - var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/{{>([^}]+)}}/g, '<%>$1%>'); + var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); //after that's done, switch back to standard Mustache tags diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index ee05c42f4..849b6caed 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -208,12 +208,12 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not{\"true\"') }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not \",true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

true not{"true"

'); + test.equals(currentPattern.extendedTemplate, '

true not ",true"

'); test.done(); }, @@ -223,12 +223,27 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not}\\\"true\\\"\") }}"; + currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not \\\":true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; currentPattern.parameteredPartials[0] = currentPattern.template; parameter_hunter.find_parameters(currentPattern, patternlab); - test.equals(currentPattern.extendedTemplate, '

true not}"true"

'); + test.equals(currentPattern.extendedTemplate, '

true not ":true"

'); + + test.done(); + }, + + 'parameter 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(); + + 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); + test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); }, From d64d0fec5802a69232f0923f31a6ebf37bbed33d Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 06:07:38 -0500 Subject: [PATCH 093/162] periods in comments --- builder/parameter_hunter.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index fbc307354..e3e05c8b0 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -137,7 +137,7 @@ var parameter_hunter = function () { //compile this partial immediately, essentially consuming it. //the reasoning for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant Mustache conditionals persisted. - //in order to token-replace parameterized tags, prepare for rendering Mustache + //in order to token-replace parameterized tags, prepare for rendering Mustache. //replace global and file-specific data. however, since partial inclusion //is not done here, escape partial tags by switching them to ERB syntax. var templateEscaped = renderedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); @@ -190,7 +190,7 @@ var parameter_hunter = function () { //the reasoning for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant Mustache conditionals persisted. - //in order to token-replace parameterized tags, prepare for rendering Mustache + //in order to token-replace parameterized tags, prepare for rendering Mustache. //replace global, file-specific, and param data. however, since partial inclusion //is not done here, escape partial tags by switching them to ERB syntax. var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); From 7dd23df1014879f7995524fb96591d88cb1530e2 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 09:00:49 -0500 Subject: [PATCH 094/162] avoiding errors and enabling pseudopatterns --- builder/parameter_hunter.js | 2 ++ builder/pattern_assembler.js | 31 +++++++++++++++++++------------ core/lib/patternlab.js | 2 +- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index e3e05c8b0..06439a6e2 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -183,6 +183,8 @@ var parameter_hunter = function () { } //assemble the allData object to render non-partial Mustache tags. + //need a fresh start on the allData object to work with the paramData specific to this iteration. + allData = pattern_assembler.merge_data(globalData, localData); allData = pattern_assembler.merge_data(allData, paramData); //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index b091d9235..9845a7efd 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -206,6 +206,9 @@ //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); + //do the same with extendedTemplate to avoid undefined type errors + currentPattern.extendedTemplate = currentPattern.template; + //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); @@ -222,8 +225,9 @@ * * @param {string} file The abspath of pattern being processed. * @param {Object} patternlab The patternlab object. + * @param {string} startFile The abspath of the pattern at the top level of recursion. */ - function processPatternRecursive(file, patternlab) { + function processPatternRecursive(file, patternlab, startFile) { var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -247,15 +251,18 @@ return; } - //return if processing an ignored file - if(typeof currentPattern === 'undefined'){ - return; - } + //need to start with a fresh extendedTemplate for each recursion step + currentPattern.extendedTemplate = currentPattern.template; + + //if at top level of recursion, make sure to reset stylePartials and parameteredPartials + //in case we are processing a pseudopattern variant + if (file === startFile) { + currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); + } - //determine if the template contains any pattern parameters. if so they must be immediately consumed - //this initial run of find_parameters() resets currentPattern.template with -// parameter_hunter.find_parameters(currentPattern, patternlab); - var extendedTemplate; + //find how many partials there may be for the given pattern + var foundPatternPartials = findPartials(currentPattern); if(currentPattern.parameteredTemplate){ extendedTemplate = currentPattern.parameteredTemplate; @@ -295,7 +302,7 @@ } else { //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPattern.abspath, patternlab); + processPatternRecursive(partialPattern.abspath, patternlab, startFile); //if partial has style modifier data, replace the styleModifier value if (currentPattern.stylePartials && currentPattern.stylePartials.length > 0) { @@ -475,8 +482,8 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab) { - processPatternRecursive(file, patternlab); + process_pattern_recursive: function (file, patternlab, startFile) { + processPatternRecursive(file, patternlab, startFile); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 810be13a7..eba2a804c 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -129,7 +129,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); }); //set user defined head and foot if they exist From ec2cd4ff9bceb15ccb9485853a9254219c57d5fc Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 09:35:03 -0500 Subject: [PATCH 095/162] execution optimization and updated unit test --- builder/pattern_assembler.js | 16 +++++----------- test/parameter_hunter_tests.js | 6 +++++- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 9845a7efd..688c7c14c 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -206,15 +206,6 @@ //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate to avoid undefined type errors - currentPattern.extendedTemplate = currentPattern.template; - - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - - //find any pattern parameters that may be in the current pattern - currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); - //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } @@ -254,10 +245,13 @@ //need to start with a fresh extendedTemplate for each recursion step currentPattern.extendedTemplate = currentPattern.template; - //if at top level of recursion, make sure to reset stylePartials and parameteredPartials - //in case we are processing a pseudopattern variant + //if at top level of recursion, make sure to set stylePartials and parameteredPartials if (file === startFile) { + + //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + + //find any pattern parameters that may be in the current pattern currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); } diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 849b6caed..7ba0791db 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -278,7 +278,11 @@ pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); //act - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl, path.resolve('test/files/_patterns/00-test/01-bar.mustache')); + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl, path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache')); + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache')); + pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache')); var outerParameteredPattern = pattern_assembler.get_pattern_by_key(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); //assert. From 4938a02b733a1c19c85ef4d5d0495b1f72fcc31b Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 09:40:17 -0500 Subject: [PATCH 096/162] avoiding undefined type error --- builder/pattern_assembler.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 688c7c14c..0518efb7c 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -206,6 +206,9 @@ //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); + //do the same with extendedTemplate to avoid undefined type errors + currentPattern.extendedTemplate = currentPattern.template; + //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } From 92550fdbf38f7b9a51c1f63d812110ea2e6bab4f Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 09:54:18 -0500 Subject: [PATCH 097/162] execution optimization --- builder/pattern_assembler.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 0518efb7c..301320743 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -245,9 +245,6 @@ return; } - //need to start with a fresh extendedTemplate for each recursion step - currentPattern.extendedTemplate = currentPattern.template; - //if at top level of recursion, make sure to set stylePartials and parameteredPartials if (file === startFile) { @@ -256,6 +253,10 @@ //find any pattern parameters that may be in the current pattern currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); + + //need to start with a fresh extendedTemplate for each subsequent recursion step + } else { + currentPattern.extendedTemplate = currentPattern.template; } //find how many partials there may be for the given pattern From f0edeb25a066331f3d109c07c753dbfb352fad20 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 10:00:42 -0500 Subject: [PATCH 098/162] deleting extraneous empty line --- test/parameter_hunter_tests.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 7ba0791db..eee48587d 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -278,7 +278,6 @@ pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); //act - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl, path.resolve('test/files/_patterns/00-test/01-bar.mustache')); pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl, path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache')); pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache')); From 1b6aba8e70d1b247713cccfd51bd395dcc8f422e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 2 Mar 2016 10:43:38 -0500 Subject: [PATCH 099/162] updating unit test --- test/parameter_hunter_tests.js | 23 ++++--- test/pattern_assembler_tests.js | 103 ++++++++++++-------------------- 2 files changed, 51 insertions(+), 75 deletions(-) diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index eee48587d..a44210d14 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -272,17 +272,22 @@ pl.patterns = []; pl.partials = {}; - pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl); - pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl); - pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl); - pattern_assembler.process_pattern_iterative(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); + var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var innerParameteredFile = path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'); + var outerParameteredFile = path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'); + + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(styleFile, pl); + pattern_assembler.process_pattern_iterative(innerParameteredFile, pl); + pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); //act - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/01-bar.mustache'), pl, path.resolve('test/files/_patterns/00-test/01-bar.mustache')); - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'), pl, path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache')); - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/12-parameter-partial.mustache')); - pattern_assembler.process_pattern_recursive(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl, path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache')); - var outerParameteredPattern = pattern_assembler.get_pattern_by_key(path.resolve('test/files/_patterns/00-test/13-another-parameter-partial.mustache'), pl); + pattern_assembler.process_pattern_recursive(atomFile, pl, atomFile); + pattern_assembler.process_pattern_recursive(styleFile, pl, styleFile); + pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, innerParameteredFile); + pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, outerParameteredFile); + var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); //assert. var expectedValue = 'bar foo bar bar'; diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 2f77c7204..0228a68ba 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -251,7 +251,7 @@ return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); } ); @@ -296,19 +296,16 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - var groupPattern = new object_factory.oPattern('test/files/_patterns/00-test/04-group.mustache', '00-test', '04-group.mustache'); - groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/04-group.mustache', 'utf8'); - groupPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(groupPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var groupFile = path.resolve('test/files/_patterns/00-test/04-group.mustache'); - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(groupPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(groupFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/04-group.mustache', pl); + pattern_assembler.process_pattern_recursive(groupFile, pl, groupFile); + var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; @@ -335,21 +332,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var groupFile = path.resolve('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache'); - var groupPattern = new object_factory.oPattern('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache', '00-test', '10-multiple-classes-numeric.mustache'); - groupPattern.template = fs.readFileSync(patterns_dir + '/00-test/10-multiple-classes-numeric.mustache', 'utf8'); - 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); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(groupFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache', pl); + pattern_assembler.process_pattern_recursive(groupFile, pl, groupFile); + var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert var expectedValue = '
{{message}} {{message}} bar
'; @@ -376,19 +367,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var mixedPattern = new object_factory.oPattern('test/files/_patterns/00-test/06-mixed.mustache', '00-test', '06-mixed.mustache'); - mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/06-mixed.mustache', 'utf8'); - mixedPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(mixedPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var mixedFile = path.resolve('test/files/_patterns/00-test/06-mixed.mustache'); - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(mixedPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(mixedFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/06-mixed.mustache', pl); + pattern_assembler.process_pattern_recursive(mixedFile, pl, mixedFile); + var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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}}
'; @@ -415,19 +402,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - - var bookendPattern = new object_factory.oPattern('test/files/_patterns/00-test/09-bookend.mustache', '00-test', '09-bookend.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/09-bookend.mustache', 'utf8'); - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var bookendFile = path.resolve('test/files/_patterns/00-test/09-bookend.mustache'); - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(bookendPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/09-bookend.mustache', pl); + pattern_assembler.process_pattern_recursive(bookendFile, pl, bookendFile); + var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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}}
'; @@ -454,21 +437,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var mixedFile = path.resolve('test/files/_patterns/00-test/07-mixed-params.mustache'); - var mixedPattern = new object_factory.oPattern('test/files/_patterns/00-test/07-mixed-params.mustache', '00-test', '07-mixed-params.mustache'); - mixedPattern.template = fs.readFileSync(patterns_dir + '/00-test/07-mixed-params.mustache', 'utf8'); - 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); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(mixedFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/07-mixed-params.mustache', pl); + pattern_assembler.process_pattern_recursive(mixedFile, pl, mixedFile); + var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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
'; @@ -495,21 +472,15 @@ pl.patterns = []; pl.partials = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '00-test', '03-styled-atom.mustache'); - atomPattern.template = fs.readFileSync(patterns_dir + '/00-test/03-styled-atom.mustache', 'utf8'); - atomPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(atomPattern); - atomPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(atomPattern); - - var bookendPattern = new object_factory.oPattern('test/files/_patterns/00-test/08-bookend-params.mustache', '00-test', '08-bookend-params.mustache'); - bookendPattern.template = fs.readFileSync(patterns_dir + '/00-test/08-bookend-params.mustache', 'utf8'); - bookendPattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(bookendPattern); - bookendPattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(bookendPattern); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var bookendFile = path.resolve('test/files/_patterns/00-test/08-bookend-params.mustache'); - pattern_assembler.addPattern(atomPattern, pl); - pattern_assembler.addPattern(bookendPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - pattern_assembler.process_pattern_recursive('test/files/_patterns/00-test/08-bookend-params.mustache', pl); + pattern_assembler.process_pattern_recursive(bookendFile, pl, bookendFile); + var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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}}
'; From 22f62f392d1891dc175063cf6e6ac5ac6709e75c Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 3 Mar 2016 09:55:21 -0500 Subject: [PATCH 100/162] rendering patterns to dismiss excepted partials --- builder/parameter_hunter.js | 77 +++++++-------------- builder/pattern_assembler.js | 128 +++++++++++++++++++++++------------ core/lib/patternlab.js | 20 ------ core/lib/patternlab_grunt.js | 2 + 4 files changed, 113 insertions(+), 114 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 06439a6e2..d9bfa292d 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -19,21 +19,16 @@ var parameter_hunter = function () { pattern_assembler = new pa(); function paramToJson(pString) { - var paramStringWellFormed = ''; - var paramStringTmp; var colonPos; var delimitPos; - var quotePos; + var paramKey; var paramString = pString; + var paramStringWellFormed = ''; + var paramStringTmp; + var quotePos; do { - //if param key is wrapped in single quotes, replace with double quotes. - paramString = paramString.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); - - //if params key is not wrapped in any quotes, wrap in double quotes. - paramString = paramString.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); - //move param key to paramStringWellFormed var. colonPos = paramString.indexOf(':'); @@ -43,7 +38,19 @@ var parameter_hunter = function () { } else { colonPos += 1; } - paramStringWellFormed += paramString.substring(0, colonPos); + + paramKey = paramString.substring(0, colonPos); + + //if param key is wrapped in single quotes, replace with double quotes. + paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)'([^']+)'(\s*\:)/, '$1"$2"$3'); + + //if params key is not wrapped in any quotes, wrap in double quotes. + paramKey = paramKey.replace(/(^\s*[\{|\,]\s*)([^\s"'\:]+)(\s*\:)/, '$1"$2"$3'); + + //this is just here to match the escaping scheme in Pattern Lab PHP. + paramKey = paramKey.replace(/\\/g, ''); + + paramStringWellFormed += paramKey; paramString = paramString.substring(colonPos, paramString.length).trim(); //if param value is wrapped in single quotes, replace with double quotes. @@ -115,36 +122,13 @@ var parameter_hunter = function () { } function findparameters(pattern, patternlab) { - var renderedPartial; - var renderedTemplate = pattern.extendedTemplate; if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { - var globalData = {}; - var localData = {}; - var paramData = {}; - - try { - globalData = JSON.parse(JSON.stringify(patternlab.data)); - localData = JSON.parse(JSON.stringify(pattern.jsonFileData || {})); - } catch (e) { - console.log(e); - } - - //assemble the allData object to render non-partial Mustache tags. - var allData = pattern_assembler.merge_data(globalData, localData); - - //compile this partial immediately, essentially consuming it. - //the reasoning for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant Mustache conditionals persisted. - //in order to token-replace parameterized tags, prepare for rendering Mustache. - //replace global and file-specific data. however, since partial inclusion - //is not done here, escape partial tags by switching them to ERB syntax. - var templateEscaped = renderedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - templateEscaped = pattern_assembler.renderPattern(templateEscaped, allData); - - //after that's done, switch back to standard Mustache tags - renderedTemplate = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + var renderedPartial; + var renderedTemplate = pattern_assembler.escape_render_unescape_partials(pattern.extendedTemplate, pattern.jsonFileData); //re-evaluate parameteredPartials after rendering pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); @@ -167,6 +151,7 @@ var parameter_hunter = function () { //strip out the additional data, convert string to JSON. var leftParen = pMatch.indexOf('('); var rightParen = pMatch.indexOf(')'); + var paramData = {}; var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; var paramStringWellFormed = '{}'; paramStringWellFormed = paramToJson(paramString); @@ -182,24 +167,14 @@ var parameter_hunter = function () { style_modifier_hunter.consume_style_modifier(partialPattern, pMatch, patternlab); } - //assemble the allData object to render non-partial Mustache tags. - //need a fresh start on the allData object to work with the paramData specific to this iteration. - allData = pattern_assembler.merge_data(globalData, localData); - allData = pattern_assembler.merge_data(allData, paramData); + var allData = pattern_assembler.merge_data(partialPattern.jsonFileData, paramData); //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally allData.link = extend({}, patternlab.data.link); - //the reasoning for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant Mustache conditionals persisted. - //in order to token-replace parameterized tags, prepare for rendering Mustache. - //replace global, file-specific, and param data. however, since partial inclusion - //is not done here, escape partial tags by switching them to ERB syntax. - var extendedTemplateEscaped = partialPattern.extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - extendedTemplateEscaped = pattern_assembler.renderPattern(extendedTemplateEscaped, allData); - - //after that's done, switch back to standard Mustache tags - renderedPartial = extendedTemplateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + renderedPartial = pattern_assembler.escape_render_unescape_partials(partialPattern.extendedTemplate, allData); //remove the parameter from the partial and replace it with the rendered partial + paramData renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 301320743..32b1e94aa 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -11,41 +11,76 @@ (function () { "use strict"; - // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern - function findPartialsWithStyleModifiers(pattern) { + // find regex matches within both pattern strings and pattern objects. + function patternMatcher(pattern, regex) { var matches; - if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g); - } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g); + + if(typeof pattern === 'string'){ + matches = pattern.match(regex); + } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ + matches = pattern.template.match(regex); } + + return matches; + } + + // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern + function findPartialsWithStyleModifiers(pattern) { + var regex = /{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\([^\)]*\))?([ ])?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithPatternParameters(pattern) { - var matches; - if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g); - } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g); - } + var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))+([ ])?}}/g; + var matches = patternMatcher(pattern, regex); + return matches; } //find and return any {{> template-name* }} within pattern function findPartials(pattern) { - var matches; - if (typeof pattern === 'string') { - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g); - } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g); - } + var regex = /{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\([^\)]*\))?([ ])?}}/g; + var matches = patternMatcher(pattern, regex); - // returns any patterns that match {{> value:mod }} or {{> value:mod(foo:"bar") }} within the pattern - function findPartialsWithStyleModifiers(pattern){ - var matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?!\()(\:[A-Za-z0-9-_|]+)+(?:(| )\(.*)?([ ])?}}/g); - return matches; + return matches; + } + + function findListItems(pattern) { + var regex = /({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g; + var matches = patternMatcher(pattern, regex); + + return matches; + } + + /** + * Render the extendedTemplate excluding partials. The reason for this is to + * eliminate the unwanted recursion paths that would remain if irrelevant + * conditional tags persisted. + * + * @param {string} extendedTemplate The template to render. + * @param {object} data The data to render with. + * @returns {string} templateRendered + */ + function escapeRenderUnescapePartials(extendedTemplate, data) { + + //escape partial tags by switching them to ERB syntax. + var templateEscaped = extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + templateEscaped = renderPattern(templateEscaped, data); + + //after that's done, switch back to standard Mustache tags and return. + var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + return templateRendered; + } + + function setState(pattern, patternlab) { + if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]) { + pattern.patternState = patternlab.config.patternStates[pattern.patternName]; + } else { + pattern.patternState = ""; } // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern @@ -167,16 +202,19 @@ //see if this file has a state setState(currentPattern, patternlab); - //look for a json file for this template - try { - var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); - currentPattern.jsonFileData = fs.readJSONSync(jsonFilename); - if(patternlab.config.debug){ - console.log('found pattern-specific data.json for ' + currentPattern.key); - } - } - catch(e) { + //look for a json file for this template + var globalData = patternlab.data; + try { + var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); + var localData = fs.readJSONSync(jsonFilename); + currentPattern.jsonFileData = mergeData(globalData, localData); + if (patternlab.config.debug) { + console.log('found pattern-specific data.json for ' + currentPattern.key); } + } + catch (error) { + currentPattern.jsonFileData = globalData; + } //look for a listitems.json file for this template try { @@ -218,7 +256,7 @@ * Build out the final output for writing to the public/patterns directory. * * @param {string} file The abspath of pattern being processed. - * @param {Object} patternlab The patternlab object. + * @param {object} patternlab The patternlab object. * @param {string} startFile The abspath of the pattern at the top level of recursion. */ function processPatternRecursive(file, patternlab, startFile) { @@ -251,9 +289,6 @@ //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - //find any pattern parameters that may be in the current pattern - currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); - //need to start with a fresh extendedTemplate for each subsequent recursion step } else { currentPattern.extendedTemplate = currentPattern.template; @@ -262,20 +297,24 @@ //find how many partials there may be for the given pattern var foundPatternPartials = findPartials(currentPattern); - if(currentPattern.parameteredTemplate){ - extendedTemplate = currentPattern.parameteredTemplate; - //for each recursion, unset parameteredTemplate property - currentPattern.parameteredTemplate = null; + if (foundPatternPartials !== null && foundPatternPartials.length > 0) { + currentPattern.extendedTemplate = escapeRenderUnescapePartials(currentPattern.extendedTemplate, currentPattern.jsonFileData); - } else{ -// extendedTemplate = currentPattern.template; - //for each recursion, reset extendedTemplate property - currentPattern.extendedTemplate = currentPattern.template; + //re-evaluate persistent partials + foundPatternPartials = findPartials(currentPattern.extendedTemplate); + } + + if (foundPatternPartials !== null && foundPatternPartials.length > 0) { + if (patternlab.config.debug) { + console.log('found partials for ' + currentPattern.key); } //find how many partials there may be for the given pattern var foundPatternPartials = findPartials(currentPattern); + //evaluate parameteredPartials after rendering + currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); + //determine if the template contains any pattern parameters if (currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0) { @@ -468,6 +507,9 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ find_list_items: function (pattern) { return findListItems(pattern); }, + escape_render_unescape_partials: function (extendedTemplate, data) { + return escapeRenderUnescapePartials(extendedTemplate, data); + }, setPatternState: function (pattern, patternlab) { setState(pattern, patternlab); }, diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index eba2a804c..c5f324f02 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -89,16 +89,6 @@ var patternlab_engine = function (config) { //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, - { - filter: function (filePath, dir) { - if (dir) { - var remainingPath = filePath.replace(patterns_dir, ''); - var isValidPath = remainingPath.indexOf('/_') === -1; - return isValidPath; - } - return true; - } - }, function (err, file) { //log any errors if (err) { @@ -113,16 +103,6 @@ var patternlab_engine = function (config) { //extendedTemplate property of the patternlab.patterns elements diveSync( patterns_dir, - { - filter: function (filePath, dir) { - if (dir) { - var remainingPath = filePath.replace(patterns_dir, ''); - var isValidPath = remainingPath.indexOf('/_') === -1; - return isValidPath; - } - return true; - } - }, function (err, file) { //log any errors if (err) { diff --git a/core/lib/patternlab_grunt.js b/core/lib/patternlab_grunt.js index d124a7e0e..93a636cfb 100644 --- a/core/lib/patternlab_grunt.js +++ b/core/lib/patternlab_grunt.js @@ -12,6 +12,7 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (grunt) { grunt.registerTask('patternlab', 'create design systems with atomic design', function (arg) { +console.log(Date.now() / 1000); var patternlab = patternlab_engine(); if (arguments.length === 0) { @@ -33,6 +34,7 @@ module.exports = function (grunt) { if (arg && (arg !== "v" && arg !== "only_patterns" && arg !== "help")) { patternlab.help(); } +console.log(Date.now() / 1000); }); }; From bd5ff0ec5f8829aca7104a008fe810410db46897 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 3 Mar 2016 10:06:35 -0500 Subject: [PATCH 101/162] passing nodeunit and eslint --- builder/pattern_assembler.js | 139 ++++++++++++++++----------------- core/lib/patternlab_grunt.js | 2 - test/parameter_hunter_tests.js | 1 + 3 files changed, 67 insertions(+), 75 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 32b1e94aa..3596bfc0a 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -15,9 +15,9 @@ function patternMatcher(pattern, regex) { var matches; - if(typeof pattern === 'string'){ + if (typeof pattern === 'string') { matches = pattern.match(regex); - } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ + } else if (typeof pattern === 'object' && typeof pattern.template === 'string') { matches = pattern.template.match(regex); } @@ -55,27 +55,6 @@ return matches; } - /** - * Render the extendedTemplate excluding partials. The reason for this is to - * eliminate the unwanted recursion paths that would remain if irrelevant - * conditional tags persisted. - * - * @param {string} extendedTemplate The template to render. - * @param {object} data The data to render with. - * @returns {string} templateRendered - */ - function escapeRenderUnescapePartials(extendedTemplate, data) { - - //escape partial tags by switching them to ERB syntax. - var templateEscaped = extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - templateEscaped = renderPattern(templateEscaped, data); - - //after that's done, switch back to standard Mustache tags and return. - var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - return templateRendered; - } - function setState(pattern, patternlab) { if (patternlab.config.patternStates && patternlab.config.patternStates[pattern.patternName]) { pattern.patternState = patternlab.config.patternStates[pattern.patternName]; @@ -137,6 +116,27 @@ } } + /** + * Render the extendedTemplate excluding partials. The reason for this is to + * eliminate the unwanted recursion paths that would remain if irrelevant + * conditional tags persisted. + * + * @param {string} extendedTemplate The template to render. + * @param {object} data The data to render with. + * @returns {string} templateRendered + */ + function escapeRenderUnescapePartials(extendedTemplate, data) { + + //escape partial tags by switching them to ERB syntax. + var templateEscaped = extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + templateEscaped = renderPattern(templateEscaped, data); + + //after that's done, switch back to standard Mustache tags and return. + var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + return templateRendered; + } + function getpatternbykey(key, patternlab) { var i; // for the for loops @@ -170,8 +170,38 @@ return null; } - function processPatternIterative(file, patternlab){ - var fs = require('fs-extra'), + function mergeData(obj1, obj2) { + if (typeof obj2 === 'undefined') { + obj2 = {}; //eslint-disable-line no-param-reassign + } + + for (var p in obj1) { //eslint-disable-line guard-for-in + try { + // Only recurse if obj1[p] is an object. + if (obj1[p].constructor === Object) { + // Requires 2 objects as params; create obj2[p] if undefined. + if (typeof obj2[p] === 'undefined') { + obj2[p] = {}; + } + obj2[p] = mergeData(obj1[p], obj2[p]); + + // Pop when recursion meets a non-object. If obj1[p] is a non-object, + // only copy to undefined obj2[p]. This way, obj2 maintains priority. + } else if (typeof obj2[p] === 'undefined') { + obj2[p] = obj1[p]; + } + } catch (e) { + // Property in destination object not set; create it and set its value. + if (typeof obj2[p] === 'undefined') { + obj2[p] = obj1[p]; + } + } + } + return obj2; + } + + function processPatternIterative(file, patternlab) { + var fs = require('fs-extra'), of = require('./object_factory'), path = require('path'); @@ -385,45 +415,8 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ } } - //return the fuzzy match if all else fails - for(var i = 0; i < patternlab.patterns.length; i++){ - var keyParts = key.split('-'), - keyType = keyParts[0], - keyName = keyParts.slice(1).join('-'); - if(patternlab.patterns[i].key.split('-')[0] === keyType && patternlab.patterns[i].key.indexOf(keyName) > -1){ - return patternlab.patterns[i]; - } - } - throw 'Could not find pattern with key ' + key; - } - - function mergeData(obj1, obj2){ - if(typeof obj2 === 'undefined'){ - obj2 = {}; - } - for(var p in obj1){ - try { - // Only recurse if obj1[p] is an object. - if(obj1[p].constructor === Object){ - // Requires 2 objects as params; create obj2[p] if undefined. - if(typeof obj2[p] === 'undefined'){ - obj2[p] = {}; - } - obj2[p] = mergeData(obj1[p], obj2[p]); - // Pop when recursion meets a non-object. If obj1[p] is a non-object, - // only copy to undefined obj2[p]. This way, obj2 maintains priority. - } else if(typeof obj2[p] === 'undefined'){ - obj2[p] = obj1[p]; - } - } catch(e) { - // Property in destination object not set; create it and set its value. - if(typeof obj2[p] === 'undefined'){ - obj2[p] = obj1[p]; - } - } - } - return obj2; - } + function parseDataLinksHelper(patternlab, obj, key) { + var linkRE, dataObjAsString, linkMatches, expandedLink; /** * Recurse through data object and apply a function at each step. @@ -507,9 +500,6 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ find_list_items: function (pattern) { return findListItems(pattern); }, - escape_render_unescape_partials: function (extendedTemplate, data) { - return escapeRenderUnescapePartials(extendedTemplate, data); - }, setPatternState: function (pattern, patternlab) { setState(pattern, patternlab); }, @@ -519,11 +509,11 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ renderPattern: function (template, data, partials) { return renderPattern(template, data, partials); }, - process_pattern_iterative: function (file, patternlab) { - processPatternIterative(file, patternlab); + combine_listItems: function (patternlab) { + buildListItems(patternlab); }, - process_pattern_recursive: function (file, patternlab, startFile) { - processPatternRecursive(file, patternlab, startFile); + escape_render_unescape_partials: function (extendedTemplate, data) { + return escapeRenderUnescapePartials(extendedTemplate, data); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); @@ -531,8 +521,11 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ merge_data: function (existingData, newData) { return mergeData(existingData, newData); }, - combine_listItems: function (patternlab) { - buildListItems(patternlab); + process_pattern_iterative: function (file, patternlab) { + processPatternIterative(file, patternlab); + }, + process_pattern_recursive: function (file, patternlab, startFile) { + processPatternRecursive(file, patternlab, startFile); }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); diff --git a/core/lib/patternlab_grunt.js b/core/lib/patternlab_grunt.js index 93a636cfb..d124a7e0e 100644 --- a/core/lib/patternlab_grunt.js +++ b/core/lib/patternlab_grunt.js @@ -12,7 +12,6 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (grunt) { grunt.registerTask('patternlab', 'create design systems with atomic design', function (arg) { -console.log(Date.now() / 1000); var patternlab = patternlab_engine(); if (arguments.length === 0) { @@ -34,7 +33,6 @@ console.log(Date.now() / 1000); if (arg && (arg !== "v" && arg !== "only_patterns" && arg !== "help")) { patternlab.help(); } -console.log(Date.now() / 1000); }); }; diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index a44210d14..114b75028 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -72,6 +72,7 @@ patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; patternlab.data.foo = 'Bar'; patternlab.data.description = 'Baz'; + patternlab.patterns[0].jsonFileData = patternlab.data; parameter_hunter.find_parameters(currentPattern, patternlab); test.equals(currentPattern.extendedTemplate, '

Bar

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

'); From 146b730e126b54f69a8d948a942104de87a9302f Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 5 Mar 2016 13:33:06 -0500 Subject: [PATCH 102/162] new recursion scheme - processPatternRecursive stays within pattern while recursing --- builder/parameter_hunter.js | 175 ++++++++++++++++++++---------- builder/pattern_assembler.js | 161 ++++++++++++++++++--------- core/lib/list_item_hunter.js | 7 +- core/lib/patternlab.js | 24 +--- core/lib/patternlab_grunt.js | 2 + core/lib/patternlab_gulp.js | 2 + core/lib/style_modifier_hunter.js | 3 - 7 files changed, 238 insertions(+), 136 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index d9bfa292d..418d1ada0 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -123,77 +123,135 @@ var parameter_hunter = function () { function findparameters(pattern, patternlab) { - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + //however, we only want to render the parameter data, so we need to identify + //those tags, switch them to ERB syntax, and render for ERB syntax. + var tmpTemplate = pattern.tmpTemplate; - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - var renderedPartial; - var renderedTemplate = pattern_assembler.escape_render_unescape_partials(pattern.extendedTemplate, pattern.jsonFileData); + //evaluate parameteredPartials within tmpTemplate + pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); - //re-evaluate parameteredPartials after rendering - pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); + if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + //iterate through most recently evaluated parameteredPartials + pattern.parameteredPartials.forEach(function (pMatch) { + //find the partial's name and retrieve it + var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); - //iterate through most recently evaluated parameteredPartials - pattern.parameteredPartials.forEach(function (pMatch) { - //find the partial's name and retrieve it - var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); + //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 + var renderedPartial = partialPattern.template; - //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); + } - 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.indexOf(')'); + var paramData = {}; + var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; + var paramStringWellFormed = '{}'; + paramStringWellFormed = paramToJson(paramString); + + try { + paramData = JSON.parse(paramStringWellFormed); + } catch (e) { + console.log(e); + } - //strip out the additional data, convert string to JSON. - var leftParen = pMatch.indexOf('('); - var rightParen = pMatch.indexOf(')'); - var paramData = {}; - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = '{}'; - paramStringWellFormed = paramToJson(paramString); - - try { - paramData = JSON.parse(paramStringWellFormed); - } catch (e) { - console.log(e); - } + //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); + } - //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); +/* + var allData = pattern_assembler.merge_data(startPattern.jsonFileData, paramData); + + //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 regex; + var escapedKey; + for (var j in paramData) { + if (paramData.hasOwnProperty(j) && (typeof paramData[j] === 'boolean' || typeof paramData[j] === 'number' || typeof paramData[j] === 'string')) { + //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters + escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log(escapedKey); +// console.log('before'); +// console.log(renderedPartial); +} + //apply replacement based on allowable characters from lines 78 and 79 of mustache.js + //of the Mustache for JS project. + regex = new RegExp('\\{\\{([{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + renderedPartial = renderedPartial.replace(regex, '<%$1%>'); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log('after'); +// console.log(renderedPartial); +} } + } - var allData = pattern_assembler.merge_data(partialPattern.jsonFileData, paramData); - - //extend pattern data links into link for pattern link shortcuts to work. we do this locally and globally - allData.link = extend({}, patternlab.data.link); - - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - renderedPartial = pattern_assembler.escape_render_unescape_partials(partialPattern.extendedTemplate, allData); + //then set the new delimiter at the beginning of the extended template + renderedPartial = '{{=<% %>=}}' + renderedPartial; - //remove the parameter from the partial and replace it with the rendered partial + paramData - renderedTemplate = renderedTemplate.replace(pMatch, renderedPartial); + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + renderedPartial = pattern_assembler.renderPattern(renderedPartial, paramData); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log('render'); +// console.log(renderedPartial); +} - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[pattern.key] = renderedTemplate; - }); - } + tmpTemplate = tmpTemplate.replace(pMatch, renderedPartial); + }); + } - //after iterating through parameteredPartials, reassign the current pattern's - //stylePartials, parameteredPartials, and extendedTemplate properties based on - //the most recent evaluation of renderedTemplate. - pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(renderedTemplate); - pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(renderedTemplate); - pattern.extendedTemplate = renderedTemplate; + //after iterating through parameteredPartials, reassign the current pattern's + //stylePartials, parameteredPartials, and tmpTemplate properties based on + //the most recent evaluation of tmpTemplate. +/* + pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(tmpTemplate); +*/ + pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); + pattern.tmpTemplate = tmpTemplate; +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log(tmpTemplate); +} + + //recurse if tmpTemplate still has parametered partials. + if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { +// findparameters(pattern, patternlab); + } + } - //recurse if renderedTemplate still has parametered partials. - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { - findparameters(pattern, patternlab); + /** + * Reset the tmpTemplate on each pattern corresponding to the parametered + * partial. This is to start fresh in case the pattern had been processed by + * findparameters or processPatternRecursive before. + * + * @param {object} currentPattern + * @param {object} patternlab + */ + function resetTmpTemplates(currentPattern, patternlab) { +if (currentPattern.parameteredPartials === null) { +console.log('currentPattern.parameteredPartials === null'); +} + var parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(currentPattern.tmpTemplate); + + if (parameteredPartials && parameteredPartials.length > 0) { + for (var i = 0; i < parameteredPartials.length; i++) { + + //find the partial's name and retrieve it + var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); + + //reset tmpTemplate for this partialPattern before recursing + partialPattern.tmpTemplate = partialPattern.template; } } } @@ -201,6 +259,9 @@ var parameter_hunter = function () { return { find_parameters: function (pattern, patternlab) { findparameters(pattern, patternlab); + }, + reset_tmp_templates: function(currentPattern, patternlab) { + resetTmpTemplates(currentPattern, patternlab); } }; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 3596bfc0a..898e312a6 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -62,6 +62,7 @@ pattern.patternState = ""; } +<<<<<<< bd5ff0ec5f8829aca7104a008fe810410db46897 // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern function findPartialsWithPatternParameters(pattern){ var matches; @@ -69,10 +70,26 @@ matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); +======= + function addPattern(pattern, patternlab) { + //add the link to the global object + patternlab.data.link[pattern.patternGroup + '-' + pattern.patternName] = '/patterns/' + pattern.patternLink; + + //only push to array if the array doesn't contain this pattern + var isNew = true, i; + for (i = 0; i < patternlab.patterns.length; i++) { + //so we need the identifier to be unique, which patterns[i].abspath is + if (pattern.abspath === patternlab.patterns[i].abspath) { + //if abspath already exists, overwrite that element + patternlab.patterns[i] = pattern; + isNew = false; + break; +>>>>>>> new recursion scheme - processPatternRecursive stays within pattern while recursing } return matches; } +<<<<<<< bd5ff0ec5f8829aca7104a008fe810410db46897 //find and return any {{> template-name* }} within pattern function findPartials(pattern){ var matches; @@ -82,6 +99,11 @@ matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); } return matches; +======= + //if the pattern is new, just push to the array + if (isNew) { + patternlab.patterns.push(pattern); +>>>>>>> new recursion scheme - processPatternRecursive stays within pattern while recursing } function findListItems(pattern){ @@ -121,14 +143,14 @@ * eliminate the unwanted recursion paths that would remain if irrelevant * conditional tags persisted. * - * @param {string} extendedTemplate The template to render. + * @param {string} template The template to render. * @param {object} data The data to render with. * @returns {string} templateRendered */ - function escapeRenderUnescapePartials(extendedTemplate, data) { + function escapeRenderUnescapePartials(template, data) { //escape partial tags by switching them to ERB syntax. - var templateEscaped = extendedTemplate.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + var templateEscaped = template.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); templateEscaped = renderPattern(templateEscaped, data); //after that's done, switch back to standard Mustache tags and return. @@ -277,6 +299,15 @@ //do the same with extendedTemplate to avoid undefined type errors currentPattern.extendedTemplate = currentPattern.template; + //do the same with tmpTemplate to avoid undefined type errors + currentPattern.tmpTemplate = currentPattern.template; + + //find any stylemodifiers that may be in the current pattern + currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + + //save parameteredPartials before render +// currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); + //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } @@ -287,9 +318,9 @@ * * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. - * @param {string} startFile The abspath of the pattern at the top level of recursion. + * @param {boolean} startRecurse True if and only if at top level of recursion. */ - function processPatternRecursive(file, patternlab, startFile) { + function processPatternRecursive(file, patternlab, startRecurse) { var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -307,57 +338,60 @@ //find current pattern in patternlab object using var file as a key var currentPattern = getpatternbykey(file, patternlab); + var startPattern = getpatternbykey(file, patternlab); + var startFile = file; //return if processing an ignored file - if (currentPattern === null) { + if (currentPattern === null || typeof currentPattern.tmpTemplate === 'undefined') { return; } - //if at top level of recursion, make sure to set stylePartials and parameteredPartials - if (file === startFile) { - - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - - //need to start with a fresh extendedTemplate for each subsequent recursion step - } else { - currentPattern.extendedTemplate = currentPattern.template; - } - - //find how many partials there may be for the given pattern - var foundPatternPartials = findPartials(currentPattern); - - if (foundPatternPartials !== null && foundPatternPartials.length > 0) { - currentPattern.extendedTemplate = escapeRenderUnescapePartials(currentPattern.extendedTemplate, currentPattern.jsonFileData); + //render the template, excepting for partial includes, using the startRecurse's data + currentPattern.tmpTemplate = escapeRenderUnescapePartials(currentPattern.tmpTemplate, startPattern.jsonFileData); - //re-evaluate persistent partials - foundPatternPartials = findPartials(currentPattern.extendedTemplate); - } + var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); - if (foundPatternPartials !== null && foundPatternPartials.length > 0) { +/* + if (foundPatternPartials && foundPatternPartials.length > 0) { if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } +*/ //find how many partials there may be for the given pattern var foundPatternPartials = findPartials(currentPattern); - //evaluate parameteredPartials after rendering - currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); +// var foundPatternPartials2 = foundPatternPartials; + + //if the template contains any pattern parameters + if (parameteredPartials && parameteredPartials.length > 0) { + if (patternlab.config.debug) { + console.log('found parametered partials for ' + currentPattern.key); + } - //determine if the template contains any pattern parameters - if (currentPattern.parameteredPartials && currentPattern.parameteredPartials.length > 0) { + //first, iterate through parameteredPartials and reset tmpTemplate for each + parameter_hunter.reset_tmp_templates(currentPattern, patternlab); - //reset currentPattern.extendedTemplate via parameter_hunter.find_parameters() + //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab); - //re-evaluate foundPatternPartials - foundPatternPartials = findPartials(currentPattern.extendedTemplate); + //re-evaluate found pattern partials +// foundPatternPartials2 = findPartials(currentPattern.tmpTemplate); + + //recurse, going a level deeper, with each render eliminating nested parameteredPartials + //when there are no more nested parameteredPartials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, false); } + var foundPatternPartials = findPartials(currentPattern.tmpTemplate); + //do something with re-evaluated partials if (foundPatternPartials && foundPatternPartials.length > 0) { + if (patternlab.config.debug) { + console.log('found partials for ' + currentPattern.key); + } +// var partialKey; +// var partialPattern; - //do something with the regular old partials for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); @@ -366,23 +400,13 @@ if (partialPattern === null) { throw 'Could not find pattern with key ' + partialKey; - } else { - //recurse through nested partials to fill out this extended template. - processPatternRecursive(partialPattern.abspath, patternlab, startFile); - //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); - } - - //complete assembly of extended template - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(foundPatternPartials[i], partialPattern.extendedTemplate); - - //update the extendedTemplate in the partials object in case this pattern is consumed later - patternlab.partials[currentPattern.key] = currentPattern.extendedTemplate; + //replace each partial tag with the partial's template. + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(foundPatternPartials[i], partialPattern.tmpTemplate); } } +<<<<<<< bd5ff0ec5f8829aca7104a008fe810410db46897 } else{ //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -414,6 +438,45 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ return patternlab.patterns[i]; } } +======= +if (startFile.indexOf('04-pages/faq.mustache') > -1) { +//console.log(startRecurse); +//console.log(currentPattern.tmpTemplate); +//console.log('\n'); +//console.log('\n'); +//console.log('\n'); +//console.log('\n'); +} + + //recurse, going a level deeper, with each render eliminating nested partials + //when there are no more nested partials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, false); + } + + +// } + + //do only at the end of the top level of recursion + if (startRecurse) { + + //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.tmpTemplate; + + //find any listItem blocks that within the pattern, even if there are no partials + list_item_hunter.process_list_item_partials(currentPattern, patternlab); + + //find pattern lineage + lineage_hunter.find_lineage(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); + } + } +>>>>>>> new recursion scheme - processPatternRecursive stays within pattern while recursing function parseDataLinksHelper(patternlab, obj, key) { var linkRE, dataObjAsString, linkMatches, expandedLink; @@ -524,8 +587,8 @@ if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab, startFile) { - processPatternRecursive(file, patternlab, startFile); + process_pattern_recursive: function (file, patternlab, startRecurse) { + processPatternRecursive(file, patternlab, startRecurse); }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 2b08ef2f1..5fa4e4fc6 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -83,10 +83,10 @@ 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 @@ -97,9 +97,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.key] = pattern.extendedTemplate; - }); } } diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index c5f324f02..63d87b2cd 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -73,7 +73,6 @@ var patternlab_engine = function (config) { patternlab.footerPattern = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'templates/pattern-header-footer/footer-pattern.html'), 'utf8'); patternlab.footer = fs.readFileSync(path.resolve(paths.source.patternlabFiles, 'templates/pattern-header-footer/footer.html'), 'utf8'); patternlab.patterns = []; - patternlab.partials = {}; patternlab.data.link = {}; setCacheBust(); @@ -109,28 +108,9 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); - }); - - //set user defined head and foot if they exist - try { - patternlab.userHead = pattern_assembler.get_pattern_by_key('atoms-head', patternlab); - } - catch (ex) { - if (patternlab.config.debug) { - console.log(ex); - console.log('Could not find optional user-defined header, atoms-head pattern. It was likely deleted.'); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, true); } - } - try { - patternlab.userFoot = pattern_assembler.get_pattern_by_key('atoms-foot', patternlab); - } - catch (ex) { - if (patternlab.config.debug) { - console.log(ex); - console.log('Could not find optional user-defined footer, atoms-foot pattern. It was likely deleted.'); - } - } + ); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference diff --git a/core/lib/patternlab_grunt.js b/core/lib/patternlab_grunt.js index d124a7e0e..93a636cfb 100644 --- a/core/lib/patternlab_grunt.js +++ b/core/lib/patternlab_grunt.js @@ -12,6 +12,7 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (grunt) { grunt.registerTask('patternlab', 'create design systems with atomic design', function (arg) { +console.log(Date.now() / 1000); var patternlab = patternlab_engine(); if (arguments.length === 0) { @@ -33,6 +34,7 @@ module.exports = function (grunt) { if (arg && (arg !== "v" && arg !== "only_patterns" && arg !== "help")) { patternlab.help(); } +console.log(Date.now() / 1000); }); }; diff --git a/core/lib/patternlab_gulp.js b/core/lib/patternlab_gulp.js index be02179cf..03ed47b8d 100644 --- a/core/lib/patternlab_gulp.js +++ b/core/lib/patternlab_gulp.js @@ -13,8 +13,10 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (gulp) { gulp.task('patternlab', ['clean'], function (cb) { +console.log(Date.now() / 1000); var patternlab = patternlab_engine(); patternlab.build(false); +console.log(Date.now() / 1000); cb(); }); diff --git a/core/lib/style_modifier_hunter.js b/core/lib/style_modifier_hunter.js index b6f870074..b6d6b68d4 100644 --- a/core/lib/style_modifier_hunter.js +++ b/core/lib/style_modifier_hunter.js @@ -26,9 +26,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.key] = pattern.extendedTemplate; } } From 859cb86f98907293cc7b7431b1bdf33d8a380260 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 7 Mar 2016 09:55:31 -0500 Subject: [PATCH 103/162] working recursion limiter --- builder/parameter_hunter.js | 98 +++++----- builder/pattern_assembler.js | 348 ++++++++++++++++++++++------------- core/lib/patternlab.js | 2 +- 3 files changed, 277 insertions(+), 171 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 418d1ada0..104d6e02b 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -121,37 +121,38 @@ var parameter_hunter = function () { return paramStringWellFormed; } - function findparameters(pattern, patternlab) { + function findparameters(pattern, patternlab, parameteredPartials) { //the reason for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant conditional tags persisted. //however, we only want to render the parameter data, so we need to identify //those tags, switch them to ERB syntax, and render for ERB syntax. - var tmpTemplate = pattern.tmpTemplate; +// var tmpTemplate = pattern.tmpTemplate; //evaluate parameteredPartials within tmpTemplate - pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); +// pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { +// if (pattern.parameteredPartials && pattern.parameteredPartials.length) { //iterate through most recently evaluated parameteredPartials - pattern.parameteredPartials.forEach(function (pMatch) { +// pattern.parameteredPartials.forEach(function (pMatch) { + for (var i = 0; i < parameteredPartials.length; i++) { //find the partial's name and retrieve it - var partialName = pMatch.match(/([\w\-\.\/~]+)/g)[0]; + var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 - var renderedPartial = partialPattern.template; + partialPattern.tmpTemplate = 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.indexOf(')'); + var leftParen = parameteredPartials[i].indexOf('('); + var rightParen = parameteredPartials[i].indexOf(')'); var paramData = {}; - var paramString = '{' + pMatch.substring(leftParen + 1, rightParen) + '}'; + var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; var paramStringWellFormed = '{}'; paramStringWellFormed = paramToJson(paramString); @@ -162,8 +163,8 @@ var parameter_hunter = function () { } //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); + if (pattern.stylePartials && pattern.stylePartials.length) { + style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); } /* @@ -180,36 +181,43 @@ var parameter_hunter = function () { //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log(escapedKey); -// console.log('before'); -// console.log(renderedPartial); -} //apply replacement based on allowable characters from lines 78 and 79 of mustache.js //of the Mustache for JS project. - regex = new RegExp('\\{\\{([{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - renderedPartial = renderedPartial.replace(regex, '<%$1%>'); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log('after'); -// console.log(renderedPartial); -} + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%$1%>'); } } //then set the new delimiter at the beginning of the extended template - renderedPartial = '{{=<% %>=}}' + renderedPartial; + partialPattern.tmpTemplate = '{{=<% %>=}}' + partialPattern.tmpTemplate; //the reason for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant conditional tags persisted. - renderedPartial = pattern_assembler.renderPattern(renderedPartial, paramData); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log('render'); -// console.log(renderedPartial); + partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); + + //replace parameteredPartials with their rendered values. + var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp(pMatch, 'g'); + pattern.tmpTemplate = pattern.tmpTemplate.replace(regex, partialPattern.tmpTemplate); +if (pattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { +if(j.indexOf('02_global_header') > -1) { + console.log(escapedKey); + console.log(pattern.tmpTemplate); } - - tmpTemplate = tmpTemplate.replace(pMatch, renderedPartial); - }); - } +} + pattern.tmpTemplate = pattern.tmpTemplate.replace(/^$\n/gm, ''); +// return tmpTemplate; +if (pattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { + if (pMatch === '{{> 03-templates/field/field(title_synopsis\\?: true) }}') { + /* + console.log(pMatch); + console.log('tmpTemplate after'); + console.log(tmpTemplate); + */ + } +} + } +// } //after iterating through parameteredPartials, reassign the current pattern's //stylePartials, parameteredPartials, and tmpTemplate properties based on @@ -217,14 +225,14 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) /* pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(tmpTemplate); */ - pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); - pattern.tmpTemplate = tmpTemplate; +// pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); +// pattern.tmpTemplate = tmpTemplate; if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { // console.log(tmpTemplate); } //recurse if tmpTemplate still has parametered partials. - if (pattern.parameteredPartials && pattern.parameteredPartials.length > 0) { + if (pattern.parameteredPartials && pattern.parameteredPartials.length) { // findparameters(pattern, patternlab); } } @@ -234,16 +242,12 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) * partial. This is to start fresh in case the pattern had been processed by * findparameters or processPatternRecursive before. * - * @param {object} currentPattern + * @param {object} currentPattern + * @param {array} parameteredPartials * @param {object} patternlab */ - function resetTmpTemplates(currentPattern, patternlab) { -if (currentPattern.parameteredPartials === null) { -console.log('currentPattern.parameteredPartials === null'); -} - var parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(currentPattern.tmpTemplate); - - if (parameteredPartials && parameteredPartials.length > 0) { + function resetTmpTemplates(parameteredPartials, patternlab) { + if (parameteredPartials && parameteredPartials.length) { for (var i = 0; i < parameteredPartials.length; i++) { //find the partial's name and retrieve it @@ -257,11 +261,11 @@ console.log('currentPattern.parameteredPartials === null'); } return { - find_parameters: function (pattern, patternlab) { - findparameters(pattern, patternlab); + find_parameters: function (pattern, patternlab, parameteredPartials, tmpTemplate) { + findparameters(pattern, patternlab, parameteredPartials, tmpTemplate); }, - reset_tmp_templates: function(currentPattern, patternlab) { - resetTmpTemplates(currentPattern, patternlab); + reset_tmp_templates: function(parameteredPartials, patternlab) { + resetTmpTemplates(parameteredPartials, patternlab); } }; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 898e312a6..6fd5f077b 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -62,15 +62,6 @@ pattern.patternState = ""; } -<<<<<<< bd5ff0ec5f8829aca7104a008fe810410db46897 - // returns any patterns that match {{> value(foo:"bar") }} or {{> value:mod(foo:"bar") }} within the pattern - function findPartialsWithPatternParameters(pattern){ - var matches; - if(typeof pattern === 'string'){ - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); - } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)+([ ])?}}/g); -======= function addPattern(pattern, patternlab) { //add the link to the global object patternlab.data.link[pattern.patternGroup + '-' + pattern.patternName] = '/patterns/' + pattern.patternLink; @@ -84,26 +75,13 @@ patternlab.patterns[i] = pattern; isNew = false; break; ->>>>>>> new recursion scheme - processPatternRecursive stays within pattern while recursing } return matches; } -<<<<<<< bd5ff0ec5f8829aca7104a008fe810410db46897 - //find and return any {{> template-name* }} within pattern - function findPartials(pattern){ - var matches; - if(typeof pattern === 'string'){ - matches = pattern.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); - } else if(typeof pattern === 'object' && typeof pattern.template === 'string'){ - matches = pattern.template.match(/{{>([ ])?([\w\-\.\/~]+)(?:\:[A-Za-z0-9-_|]+)?(?:(| )\(.*)?([ ])?}}/g); - } - return matches; -======= //if the pattern is new, just push to the array if (isNew) { patternlab.patterns.push(pattern); ->>>>>>> new recursion scheme - processPatternRecursive stays within pattern while recursing } function findListItems(pattern){ @@ -139,9 +117,47 @@ } /** - * Render the extendedTemplate excluding partials. The reason for this is to - * eliminate the unwanted recursion paths that would remain if irrelevant - * conditional tags persisted. + * Render the template excluding partials. The reason for this is to eliminate + * the unwanted recursion paths that would remain if irrelevant conditional + * tags persisted. Targeting non-partial tags that are not keyed in the JSON + * data for this pattern. Those will be deleted after this runs. + * + * @param {string} template The template to render. + * @param {object} data The data to render with. + * @param {object} dataKeys The data to render with. + * @returns {string} templateRendered + */ + function escapeRenderUnescape(pattern) { + + //escape partial tags by switching them to ERB syntax. + var escapedKey; + var regex; + var templateEscaped = pattern.tmpTemplate; + + for (var i = 0; i < pattern.dataKeys.length; i++) { + escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + templateEscaped = templateEscaped.replace(regex, '<%$1%>'); + } + templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log(templateEscaped); +} + + var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); + templateRendered = templateRendered.replace(/<%([^%]+)%>/g, '{{$1}}'); + + //after that's done, switch back to standard Mustache tags and return. +// var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + return templateRendered; + } + + /** + * Render the template excluding partials. The reason for this is to eliminate + * the unwanted recursion paths that would remain if irrelevant conditional + * tags persisted. Escaping partial tags so a full render of non-partial tags + * eliminate irrelevant conditional tags. * * @param {string} template The template to render. * @param {object} data The data to render with. @@ -159,6 +175,30 @@ return templateRendered; } + /** + * Recursively get all the property keys from the JSON data for a pattern. + * + * @param {object} data + * @param {array} keys At top level of recursion, this should be undefined. + * @returns {array} keys A flat, one-dimensional array. + */ + function getDataKeys(data) { + var keys = []; + + for (var key in data) { + if (data.hasOwnProperty(key)) { + if (!(typeof data === 'object' && data instanceof Array)) { + keys.push(key); + } + if (typeof data[key] === 'object') { + keys = keys.concat(getDataKeys(data[key])); + } + } + } + + return keys; + } + function getpatternbykey(key, patternlab) { var i; // for the for loops @@ -267,6 +307,7 @@ catch (error) { currentPattern.jsonFileData = globalData; } + currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); //look for a listitems.json file for this template try { @@ -305,9 +346,6 @@ //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - //save parameteredPartials before render -// currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); - //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); } @@ -318,9 +356,23 @@ * * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. - * @param {boolean} startRecurse True if and only if at top level of recursion. + * @param {number} recursionLevel Top level === 0. Increments by 1 after that. */ - function processPatternRecursive(file, patternlab, startRecurse) { + function processPatternRecursive(file, patternlab, recursionLevel) { +console.log(file); +if (file.indexOf('01-molecules/components/user-menu.mustache') > -1) { + /* +console.log('RECURSION LEVEL: ' + recursionLevel); +// console.log(currentPattern.jsonFileData); +// console.log(getDataKeys(currentPattern.jsonFileData)); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +console.log('currentPattern.extendedTemplate'); +console.log(currentPattern.extendedTemplate); +// console.log('getDataKeys(currentPattern.jsonFileData)'); +// console.log(currentPattern.dataKeys); +*/ +} var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -338,107 +390,123 @@ //find current pattern in patternlab object using var file as a key var currentPattern = getpatternbykey(file, patternlab); - var startPattern = getpatternbykey(file, patternlab); - var startFile = file; +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +// console.log(file); +} //return if processing an ignored file if (currentPattern === null || typeof currentPattern.tmpTemplate === 'undefined') { return; } - //render the template, excepting for partial includes, using the startRecurse's data - currentPattern.tmpTemplate = escapeRenderUnescapePartials(currentPattern.tmpTemplate, startPattern.jsonFileData); - - var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); - -/* - if (foundPatternPartials && foundPatternPartials.length > 0) { - if (patternlab.config.debug) { - console.log('found partials for ' + currentPattern.key); - } -*/ + //find any listItem blocks + list_item_hunter.process_list_item_partials(currentPattern, patternlab); - //find how many partials there may be for the given pattern - var foundPatternPartials = findPartials(currentPattern); + //render the template, excepting for partial includes, using jsonFileData +if (typeof currentPattern.dataKeys === 'undefined') { +console.log(typeof currentPattern.jsonFileData); + console.log('UNDEFINED'); +} +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log('RECURSION LEVEL: ' + recursionLevel); +// console.log(currentPattern.jsonFileData); +// console.log(getDataKeys(currentPattern.jsonFileData)); +console.log('currentPattern.tmpTemplate before: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +// console.log('getDataKeys(currentPattern.jsonFileData)'); +// console.log(currentPattern.dataKeys); +} + currentPattern.tmpTemplate = escapeRenderUnescape(currentPattern); + var tmpTemplate = escapeRenderUnescape(currentPattern); +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +// console.log(currentPattern.jsonFileData); +// console.log(getDataKeys(currentPattern.jsonFileData)); +console.log('currentPattern.tmpTemplate after: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +// console.log('getDataKeys(currentPattern.jsonFileData)'); +// console.log(currentPattern.dataKeys); +} -// var foundPatternPartials2 = foundPatternPartials; + var parameteredPartials = findPartialsWithPatternParameters(tmpTemplate); - //if the template contains any pattern parameters - if (parameteredPartials && parameteredPartials.length > 0) { + //if the template contains any pattern parameters + if (parameteredPartials && parameteredPartials.length) { if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + /* +console.log('RECURSION LEVEL: ' + recursionLevel); +console.log('parameteredPartials before'); +console.log(parameteredPartials); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +//console.log('tmpTemplate'); +//console.log(tmpTemplate); +*/ +} - //first, iterate through parameteredPartials and reset tmpTemplate for each - parameter_hunter.reset_tmp_templates(currentPattern, patternlab); + //first, iterate through parameteredPartials and reset tmpTemplate for each +// parameter_hunter.reset_tmp_templates(parameteredPartials, patternlab); + + //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + /* +console.log('parameteredPartials after'); +console.log(parameteredPartials); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +//console.log('tmpTemplate'); +//console.log(tmpTemplate); +*/ +} - //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() - parameter_hunter.find_parameters(currentPattern, patternlab); + //recurse, going a level deeper, with each render eliminating nested parameteredPartials + //when there are no more nested parameteredPartials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); - //re-evaluate found pattern partials -// foundPatternPartials2 = findPartials(currentPattern.tmpTemplate); + tmpTemplate = escapeRenderUnescapePartials(currentPattern.tmpTemplate, currentPattern.jsonFileData); + } - //recurse, going a level deeper, with each render eliminating nested parameteredPartials - //when there are no more nested parameteredPartials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, false); - } +tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); + var foundPatternPartials = findPartials(tmpTemplate); + + //since we're done with tmpTemplate, free it from memory + tmpTemplate = ''; - var foundPatternPartials = findPartials(currentPattern.tmpTemplate); - //do something with re-evaluated partials - if (foundPatternPartials && foundPatternPartials.length > 0) { + //recurse through non-parametered partials + if (foundPatternPartials && foundPatternPartials.length) { if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } -// var partialKey; -// var partialPattern; - - for (i = 0; i < foundPatternPartials.length; i++) { - var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); - //identify which pattern this partial corresponds to - var partialPattern = getpatternbykey(partialKey, patternlab); - - if (partialPattern === null) { - throw 'Could not find pattern with key ' + partialKey; - } else { +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + /* +console.log('RECURSION LEVEL: ' + recursionLevel); +console.log('foundPatternPartials before'); +console.log(foundPatternPartials); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +//console.log('tmpTemplate size: ' + tmpTemplate.length + 'B'); +//console.log(tmpTemplate); +*/ +} + for (i = 0; i < foundPatternPartials.length; i++) { + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); - //replace each partial tag with the partial's template. - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(foundPatternPartials[i], partialPattern.tmpTemplate); - } - } -<<<<<<< bd5ff0ec5f8829aca7104a008fe810410db46897 - } else{ - //find any listItem blocks that within the pattern, even if there are no partials - list_item_hunter.process_list_item_partials(currentPattern, patternlab); - } + //identify which pattern this partial corresponds to + var partialPattern = getpatternbykey(partialKey, patternlab); - //find pattern lineage - lineage_hunter.find_lineage(currentPattern, patternlab); + if (partialPattern === null) { + throw 'Could not find pattern with key ' + partialKey; + } else { - //add to patternlab object so we can look these up later. - addPattern(currentPattern, patternlab); + //replace each partial tag with the partial's template. + //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters + var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + var regex = new RegExp(escapedPartial, 'g'); - //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); -if(currentPattern.abspath.indexOf('04-pages/00-homepage') > -1){ -} - } - - function getpatternbykey(key, patternlab){ - - for(var i = 0; i < patternlab.patterns.length; i++){ - switch(key){ - //look for exact key matches - case patternlab.patterns[i].key: - //look for abspath matches - case patternlab.patterns[i].abspath: - //look by verbose syntax - case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName: - case patternlab.patterns[i].subdir + '/' + patternlab.patterns[i].fileName + '.mustache': - return patternlab.patterns[i]; - } - } -======= if (startFile.indexOf('04-pages/faq.mustache') > -1) { //console.log(startRecurse); //console.log(currentPattern.tmpTemplate); @@ -446,25 +514,61 @@ if (startFile.indexOf('04-pages/faq.mustache') > -1) { //console.log('\n'); //console.log('\n'); //console.log('\n'); +//console.log(currentPattern.abspath); +if (currentPattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { +// console.log(regex); } - - //recurse, going a level deeper, with each render eliminating nested partials - //when there are no more nested partials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, false); + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, partialPattern.template); +currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^$\n/gm, ''); +//tmpTemplate = tmpTemplate.replace(regex, partialPattern.tmpTemplate); +//tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); + } } +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + + /* +console.log('foundPatternPartials after'); +console.log(foundPatternPartials); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +//console.log('tmpTemplate size: ' + tmpTemplate.length + 'B'); +//console.log(tmpTemplate); +*/ +} + //recurse, going a level deeper, with each render eliminating nested partials + //when there are no more nested partials, we'll pop back up + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); +if (currentPattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { + /* +console.log('currentPattern.tmpTemplate'); +console.log(currentPattern.tmpTemplate); +*/ +} + } -// } - +//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { +//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { //do only at the end of the top level of recursion - if (startRecurse) { + if (recursionLevel === 0) { //if partial has style modifier data, replace the styleModifier value - if (currentPattern.stylePartials && currentPattern.stylePartials.length > 0) { + if (currentPattern.stylePartials && currentPattern.stylePartials.length) { style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } - currentPattern.extendedTemplate = currentPattern.tmpTemplate; + currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); +//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + /* +// console.log(currentPattern.jsonFileData); +// console.log(getDataKeys(currentPattern.jsonFileData)); +console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); +console.log(currentPattern.tmpTemplate); +console.log('currentPattern.extendedTemplate'); +console.log(currentPattern.extendedTemplate); +*/ +} //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -474,9 +578,11 @@ if (startFile.indexOf('04-pages/faq.mustache') > -1) { //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); + + //since we're done with currentPattern.tmpTemplate, free it from memory + currentPattern.tmpTemplate = ''; } } ->>>>>>> new recursion scheme - processPatternRecursive stays within pattern while recursing function parseDataLinksHelper(patternlab, obj, key) { var linkRE, dataObjAsString, linkMatches, expandedLink; @@ -587,8 +693,8 @@ if (startFile.indexOf('04-pages/faq.mustache') > -1) { process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab, startRecurse) { - processPatternRecursive(file, patternlab, startRecurse); + process_pattern_recursive: function (file, patternlab, recursionLevel) { + processPatternRecursive(file, patternlab, recursionLevel); }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); @@ -642,8 +748,4 @@ if (startFile.indexOf('04-pages/faq.mustache') > -1) { } }; - }; - - module.exports = pattern_assembler; - -}()); +module.exports = pattern_assembler; diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 63d87b2cd..f55961e6c 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -108,7 +108,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, true); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0); } ); From 6928c1be5d820a71349ba6750d44fafac5617f03 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 8 Mar 2016 08:45:11 -0500 Subject: [PATCH 104/162] limiting recursion by winnowing tags at partial level --- builder/parameter_hunter.js | 173 +++++++++----------------- builder/pattern_assembler.js | 230 ++++++++++------------------------- 2 files changed, 119 insertions(+), 284 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 104d6e02b..cce5e44c0 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -136,136 +136,77 @@ var parameter_hunter = function () { //iterate through most recently evaluated parameteredPartials // pattern.parameteredPartials.forEach(function (pMatch) { - for (var i = 0; i < parameteredPartials.length; i++) { - //find the partial's name and retrieve it - var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); + for (var i = 0; i < parameteredPartials.length; i++) { + //find the partial's name and retrieve it + var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; + var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); + + if (!partialPattern) { + throw 'Could not find pattern with key ' + partialName; + continue; + } - //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 - partialPattern.tmpTemplate = partialPattern.template; + //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 + partialPattern.tmpTemplate = partialPattern.template; - if (patternlab.config.debug) { - console.log('found patternParameters for ' + partialName); - } + if (patternlab.config.debug) { + console.log('found patternParameters for ' + partialName); + } - //strip out the additional data, convert string to JSON. - var leftParen = parameteredPartials[i].indexOf('('); - var rightParen = parameteredPartials[i].indexOf(')'); - var paramData = {}; - var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; - var paramStringWellFormed = '{}'; - paramStringWellFormed = paramToJson(paramString); - - try { - paramData = JSON.parse(paramStringWellFormed); - } catch (e) { - console.log(e); - } + //strip out the additional data, convert string to JSON. + var leftParen = parameteredPartials[i].indexOf('('); + var rightParen = parameteredPartials[i].indexOf(')'); + var paramData = {}; + var paramString = '{' + parameteredPartials[i].substring(leftParen + 1, rightParen) + '}'; + var paramStringWellFormed = '{}'; + paramStringWellFormed = paramToJson(paramString); + + try { + paramData = JSON.parse(paramStringWellFormed); + } catch (e) { + console.log(e); + } - //if partial has style modifier data, replace the styleModifier value - if (pattern.stylePartials && pattern.stylePartials.length) { - style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); - } + //if partial has style modifier data, replace the styleModifier value + if (pattern.stylePartials && pattern.stylePartials.length) { + style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); + } -/* - var allData = pattern_assembler.merge_data(startPattern.jsonFileData, paramData); - - //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 regex; - var escapedKey; - for (var j in paramData) { - if (paramData.hasOwnProperty(j) && (typeof paramData[j] === 'boolean' || typeof paramData[j] === 'number' || typeof paramData[j] === 'string')) { - //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters - escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - - //apply replacement based on allowable characters from lines 78 and 79 of mustache.js - //of the Mustache for JS project. - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%$1%>'); - } + var regex; + var escapedKey; + for (var j in paramData) { + if (paramData.hasOwnProperty(j) && (typeof paramData[j] === 'boolean' || typeof paramData[j] === 'number' || typeof paramData[j] === 'string')) { + //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters + escapedKey = j.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + + //apply replacement based on allowable characters from lines 78 and 79 of mustache.js + //of the Mustache for JS project. + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%$1%>'); } - - //then set the new delimiter at the beginning of the extended template - partialPattern.tmpTemplate = '{{=<% %>=}}' + partialPattern.tmpTemplate; - - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); - - //replace parameteredPartials with their rendered values. - var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp(pMatch, 'g'); - pattern.tmpTemplate = pattern.tmpTemplate.replace(regex, partialPattern.tmpTemplate); -if (pattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { -if(j.indexOf('02_global_header') > -1) { - console.log(escapedKey); - console.log(pattern.tmpTemplate); -} -} - pattern.tmpTemplate = pattern.tmpTemplate.replace(/^$\n/gm, ''); -// return tmpTemplate; -if (pattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { - if (pMatch === '{{> 03-templates/field/field(title_synopsis\\?: true) }}') { - /* - console.log(pMatch); - console.log('tmpTemplate after'); - console.log(tmpTemplate); - */ - } -} } -// } - - //after iterating through parameteredPartials, reassign the current pattern's - //stylePartials, parameteredPartials, and tmpTemplate properties based on - //the most recent evaluation of tmpTemplate. -/* - pattern.stylePartials = pattern_assembler.find_pattern_partials_with_style_modifiers(tmpTemplate); -*/ -// pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); -// pattern.tmpTemplate = tmpTemplate; -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log(tmpTemplate); -} - - //recurse if tmpTemplate still has parametered partials. - if (pattern.parameteredPartials && pattern.parameteredPartials.length) { -// findparameters(pattern, patternlab); - } - } - /** - * Reset the tmpTemplate on each pattern corresponding to the parametered - * partial. This is to start fresh in case the pattern had been processed by - * findparameters or processPatternRecursive before. - * - * @param {object} currentPattern - * @param {array} parameteredPartials - * @param {object} patternlab - */ - function resetTmpTemplates(parameteredPartials, patternlab) { - if (parameteredPartials && parameteredPartials.length) { - for (var i = 0; i < parameteredPartials.length; i++) { - - //find the partial's name and retrieve it - var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; - var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); - - //reset tmpTemplate for this partialPattern before recursing - partialPattern.tmpTemplate = partialPattern.template; - } + //then set the new delimiter at the beginning of the extended template + partialPattern.tmpTemplate = '{{=<% %>=}}' + partialPattern.tmpTemplate; + + //the reason for rendering at this point is to eliminate the unwanted + //recursion paths that would remain if irrelevant conditional tags persisted. + partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); + partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); + + //replace parameteredPartials with their rendered values. + var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp(pMatch, 'g'); + pattern.tmpTemplate = pattern.tmpTemplate.replace(regex, partialPattern.tmpTemplate); + + // Free tmpTemplate from memory. + partialPattern.tmpTemplate = ''; } } return { find_parameters: function (pattern, patternlab, parameteredPartials, tmpTemplate) { findparameters(pattern, patternlab, parameteredPartials, tmpTemplate); - }, - reset_tmp_templates: function(parameteredPartials, patternlab) { - resetTmpTemplates(parameteredPartials, patternlab); } }; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 6fd5f077b..7c92ceb83 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -127,28 +127,26 @@ * @param {object} dataKeys The data to render with. * @returns {string} templateRendered */ - function escapeRenderUnescape(pattern) { - - //escape partial tags by switching them to ERB syntax. + function winnowUnusedTags(template, pattern) { var escapedKey; var regex; - var templateEscaped = pattern.tmpTemplate; + var templateEscaped = template; + //escaped all tags that match keys in the JSON data. for (var i = 0; i < pattern.dataKeys.length; i++) { escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); } + + //escape partial tags by switching them to ERB syntax. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log(templateEscaped); -} + //render to winnow used tags. var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); - templateRendered = templateRendered.replace(/<%([^%]+)%>/g, '{{$1}}'); - //after that's done, switch back to standard Mustache tags and return. -// var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + //after that's done, switch only partial tags back to standard Mustache tags and return. + templateRendered = templateRendered.replace(/<%>([^%]+)%>/g, '{{>$1}}'); return templateRendered; } @@ -164,7 +162,6 @@ console.log(templateEscaped); * @returns {string} templateRendered */ function escapeRenderUnescapePartials(template, data) { - //escape partial tags by switching them to ERB syntax. var templateEscaped = template.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); templateEscaped = renderPattern(templateEscaped, data); @@ -294,29 +291,13 @@ console.log(templateEscaped); //see if this file has a state setState(currentPattern, patternlab); - //look for a json file for this template - var globalData = patternlab.data; + //look for a listitems.json file for this template try { - var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); - var localData = fs.readJSONSync(jsonFilename); - currentPattern.jsonFileData = mergeData(globalData, localData); + var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".listitems.json"); + currentPattern.listitems = fs.readJSONSync(listJsonFileName); + buildListItems(currentPattern); if (patternlab.config.debug) { - console.log('found pattern-specific data.json for ' + currentPattern.key); - } - } - catch (error) { - currentPattern.jsonFileData = globalData; - } - currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); - - //look for a listitems.json file for this template - try { - var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir,currentPattern.fileName + ".listitems.json"); - currentPattern.listitems = fs.readJSONSync(listJsonFileName); - buildListItems(currentPattern); - if(patternlab.config.debug){ - console.log('found pattern-specific listitems.json for ' + currentPattern.key); - } + console.log('found pattern-specific listitems.json for ' + currentPattern.key); } catch(e) { } @@ -337,11 +318,12 @@ console.log(templateEscaped); //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate to avoid undefined type errors - currentPattern.extendedTemplate = currentPattern.template; + //do the same with extendedTemplate to avoid undefined type errors. + //trying to keep memory footprint small, so set it to empty string at first. + currentPattern.extendedTemplate = ''; //do the same with tmpTemplate to avoid undefined type errors - currentPattern.tmpTemplate = currentPattern.template; + currentPattern.tmpTemplate = ''; //find any stylemodifiers that may be in the current pattern currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); @@ -359,20 +341,6 @@ console.log(templateEscaped); * @param {number} recursionLevel Top level === 0. Increments by 1 after that. */ function processPatternRecursive(file, patternlab, recursionLevel) { -console.log(file); -if (file.indexOf('01-molecules/components/user-menu.mustache') > -1) { - /* -console.log('RECURSION LEVEL: ' + recursionLevel); -// console.log(currentPattern.jsonFileData); -// console.log(getDataKeys(currentPattern.jsonFileData)); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -console.log('currentPattern.extendedTemplate'); -console.log(currentPattern.extendedTemplate); -// console.log('getDataKeys(currentPattern.jsonFileData)'); -// console.log(currentPattern.dataKeys); -*/ -} var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -390,12 +358,9 @@ console.log(currentPattern.extendedTemplate); //find current pattern in patternlab object using var file as a key var currentPattern = getpatternbykey(file, patternlab); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -// console.log(file); -} //return if processing an ignored file - if (currentPattern === null || typeof currentPattern.tmpTemplate === 'undefined') { + if (!currentPattern || typeof currentPattern.tmpTemplate === 'undefined') { return; } @@ -403,77 +368,49 @@ if (file.indexOf('04-pages/00-homepage.mustache') > -1) { list_item_hunter.process_list_item_partials(currentPattern, patternlab); //render the template, excepting for partial includes, using jsonFileData -if (typeof currentPattern.dataKeys === 'undefined') { -console.log(typeof currentPattern.jsonFileData); - console.log('UNDEFINED'); -} -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log('RECURSION LEVEL: ' + recursionLevel); -// console.log(currentPattern.jsonFileData); -// console.log(getDataKeys(currentPattern.jsonFileData)); -console.log('currentPattern.tmpTemplate before: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -// console.log('getDataKeys(currentPattern.jsonFileData)'); -// console.log(currentPattern.dataKeys); -} - currentPattern.tmpTemplate = escapeRenderUnescape(currentPattern); - var tmpTemplate = escapeRenderUnescape(currentPattern); -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -// console.log(currentPattern.jsonFileData); -// console.log(getDataKeys(currentPattern.jsonFileData)); -console.log('currentPattern.tmpTemplate after: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -// console.log('getDataKeys(currentPattern.jsonFileData)'); -// console.log(currentPattern.dataKeys); -} - - var parameteredPartials = findPartialsWithPatternParameters(tmpTemplate); + if (recursionLevel === 0) { +console.log(currentPattern.abspath); +console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); + //look for a json file for this template + var globalData = patternlab.data; + try { + var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); + var localData = fs.readJSONSync(jsonFilename); + currentPattern.jsonFileData = mergeData(globalData, localData); + if (patternlab.config.debug) { + console.log('found pattern-specific data.json for ' + currentPattern.key); + } + } + catch (error) { + currentPattern.jsonFileData = globalData; + } + currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); + + currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.template, currentPattern); +console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); + } + + var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); //if the template contains any pattern parameters if (parameteredPartials && parameteredPartials.length) { if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - /* -console.log('RECURSION LEVEL: ' + recursionLevel); -console.log('parameteredPartials before'); -console.log(parameteredPartials); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -//console.log('tmpTemplate'); -//console.log(tmpTemplate); -*/ -} - - //first, iterate through parameteredPartials and reset tmpTemplate for each -// parameter_hunter.reset_tmp_templates(parameteredPartials, patternlab); //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - /* -console.log('parameteredPartials after'); -console.log(parameteredPartials); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -//console.log('tmpTemplate'); -//console.log(tmpTemplate); -*/ -} //recurse, going a level deeper, with each render eliminating nested parameteredPartials //when there are no more nested parameteredPartials, we'll pop back up processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); - - tmpTemplate = escapeRenderUnescapePartials(currentPattern.tmpTemplate, currentPattern.jsonFileData); } -tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); - var foundPatternPartials = findPartials(tmpTemplate); + //delete empty lines. good for memory management and debugging. + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); - //since we're done with tmpTemplate, free it from memory - tmpTemplate = ''; + //find non-parametered partials. + var foundPatternPartials = findPartials(currentPattern.tmpTemplate); //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { @@ -481,24 +418,13 @@ tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); console.log('found partials for ' + currentPattern.key); } -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - /* -console.log('RECURSION LEVEL: ' + recursionLevel); -console.log('foundPatternPartials before'); -console.log(foundPatternPartials); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -//console.log('tmpTemplate size: ' + tmpTemplate.length + 'B'); -//console.log(tmpTemplate); -*/ -} for (i = 0; i < foundPatternPartials.length; i++) { var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); //identify which pattern this partial corresponds to var partialPattern = getpatternbykey(partialKey, patternlab); - if (partialPattern === null) { + if (!partialPattern) { throw 'Could not find pattern with key ' + partialKey; } else { @@ -507,68 +433,32 @@ console.log(currentPattern.tmpTemplate); var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); -if (startFile.indexOf('04-pages/faq.mustache') > -1) { -//console.log(startRecurse); -//console.log(currentPattern.tmpTemplate); -//console.log('\n'); -//console.log('\n'); -//console.log('\n'); -//console.log('\n'); -//console.log(currentPattern.abspath); -if (currentPattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { -// console.log(regex); -} - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, partialPattern.template); -currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^$\n/gm, ''); -//tmpTemplate = tmpTemplate.replace(regex, partialPattern.tmpTemplate); -//tmpTemplate = tmpTemplate.replace(/^$\n/gm, ''); + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowUnusedTags(partialPattern.template, currentPattern)); + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); } } -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - - /* -console.log('foundPatternPartials after'); -console.log(foundPatternPartials); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -//console.log('tmpTemplate size: ' + tmpTemplate.length + 'B'); -//console.log(tmpTemplate); -*/ -} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); -if (currentPattern.abspath.indexOf('01-molecules/sections/title-synopsis.mustache') > -1) { - /* -console.log('currentPattern.tmpTemplate'); -console.log(currentPattern.tmpTemplate); -*/ -} } -//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { -//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + //delete empty lines again. good for memory management and debugging. + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); + //do only at the end of the top level of recursion if (recursionLevel === 0) { +//if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +//} + // Switched ERB escaped tags back to standard Mustache tags. + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); //if partial has style modifier data, replace the styleModifier value if (currentPattern.stylePartials && currentPattern.stylePartials.length) { - style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); +// style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); -//if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - /* -// console.log(currentPattern.jsonFileData); -// console.log(getDataKeys(currentPattern.jsonFileData)); -console.log('currentPattern.tmpTemplate size: ' + currentPattern.tmpTemplate.length + 'B'); -console.log(currentPattern.tmpTemplate); -console.log('currentPattern.extendedTemplate'); -console.log(currentPattern.extendedTemplate); -*/ -} //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -581,6 +471,10 @@ console.log(currentPattern.extendedTemplate); //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; + currentPattern.jsonFileData = null; + currentPattern.dataKeys = null; + +console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); } } @@ -681,8 +575,8 @@ console.log(currentPattern.extendedTemplate); combine_listItems: function (patternlab) { buildListItems(patternlab); }, - escape_render_unescape_partials: function (extendedTemplate, data) { - return escapeRenderUnescapePartials(extendedTemplate, data); + winnow_unused_tags: function (template, pattern) { + return winnowUnusedTags(template, pattern); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); From 91dc7ea521721f986ab43dc5453048d0eeb6c3a2 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 8 Mar 2016 09:34:31 -0500 Subject: [PATCH 105/162] correct requires and better exception handling --- builder/pattern_assembler.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 7c92ceb83..40acca164 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -230,7 +230,7 @@ } function mergeData(obj1, obj2) { - if (typeof obj2 === 'undefined') { + if (!obj2) { obj2 = {}; //eslint-disable-line no-param-reassign } @@ -341,6 +341,9 @@ * @param {number} recursionLevel Top level === 0. Increments by 1 after that. */ function processPatternRecursive(file, patternlab, recursionLevel) { + var fs = require('fs-extra'), + path = require('path'); + var lh = require('./lineage_hunter'), ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), @@ -373,6 +376,12 @@ console.log(currentPattern.abspath); console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); //look for a json file for this template var globalData = patternlab.data; +// var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); +// var localData = fs.readJSONSync(jsonFilename); +if (!globalData) { +console.log('localData === null'); + console.log(currentPattern.abspath); +} try { var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); var localData = fs.readJSONSync(jsonFilename); From d25389e8337dddeb2000ea98376777a24dcad793 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 9 Mar 2016 07:03:21 -0500 Subject: [PATCH 106/162] unique partials --- builder/.pattern_assembler.js.swp | Bin 0 -> 53248 bytes builder/parameter_hunter.js | 23 +++++ builder/pattern_assembler.js | 158 ++++++++++++++++++++++-------- core/lib/patternlab.js | 5 + 4 files changed, 143 insertions(+), 43 deletions(-) create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..fab4c0386d6ad907f13f9710cdeabecff07cbb91 GIT binary patch literal 53248 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 XOM5fQIY -1) { + console.log('unique parameteredPartials'); + console.log(uniquePartials); +} + //find the partial's name and retrieve it var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 40acca164..32fa5c115 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -230,9 +230,7 @@ } function mergeData(obj1, obj2) { - if (!obj2) { - obj2 = {}; //eslint-disable-line no-param-reassign - } + obj2 = obj2 || {}; //eslint-disable-line no-param-reassign for (var p in obj1) { //eslint-disable-line guard-for-in try { @@ -339,8 +337,9 @@ * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. * @param {number} recursionLevel Top level === 0. Increments by 1 after that. + * @param {object} currentPattern Only submitted on recursionLevel > 0. */ - function processPatternRecursive(file, patternlab, recursionLevel) { + function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { var fs = require('fs-extra'), path = require('path'); @@ -357,52 +356,79 @@ style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); - var i; // for the for loops - - //find current pattern in patternlab object using var file as a key - var currentPattern = getpatternbykey(file, patternlab); - - //return if processing an ignored file - if (!currentPattern || typeof currentPattern.tmpTemplate === 'undefined') { - return; - } - - //find any listItem blocks - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + var i, j; // for the for loops - //render the template, excepting for partial includes, using jsonFileData +var processBegin; +var processEnd; if (recursionLevel === 0) { -console.log(currentPattern.abspath); -console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); + +//console.log(file); +if (file.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +processBegin = Date.now() / 1000; +console.log('PROCESS BEGIN: ' + processBegin); +} + //skip .json files + if (path.extname(file) === '.json') { + return; + } + //look for a json file for this template var globalData = patternlab.data; -// var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); -// var localData = fs.readJSONSync(jsonFilename); -if (!globalData) { -console.log('localData === null'); - console.log(currentPattern.abspath); -} + var jsonFilename; + var localData; + + //first, determine if this is a recursible pattern. no point continuing if it isn't. try { - var jsonFilename = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".json"); - var localData = fs.readJSONSync(jsonFilename); - currentPattern.jsonFileData = mergeData(globalData, localData); - if (patternlab.config.debug) { - console.log('found pattern-specific data.json for ' + currentPattern.key); - } + jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; + localData = fs.readJSONSync(jsonFilename); } catch (error) { - currentPattern.jsonFileData = globalData; + return; + } + + if (patternlab.config.debug) { + console.log('found pattern-specific data.json for ' + currentPattern.key); + } + + //find current pattern in patternlab object using var file as a key + currentPattern = getpatternbykey(file, patternlab); +if (file.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); +} + + //return if processing an ignored file + if (!currentPattern || typeof currentPattern.tmpTemplate === 'undefined') { + return; } - currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); + currentPattern.jsonFileData = mergeData(globalData, localData); + currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.template, currentPattern); -console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); + } +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +console.log('RECURSION LEVEL: ' + recursionLevel); +console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); +console.log('DATA SIZE: ' + JSON.stringify(currentPattern).length + 'B'); +} + + //find current pattern in patternlab object using var file as a key +// var currentPattern = getpatternbykey(file, patternlab); + + //find any listItem blocks + list_item_hunter.process_list_item_partials(currentPattern, patternlab); + + //render the template, excepting for partial includes, using jsonFileData var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); //if the template contains any pattern parameters if (parameteredPartials && parameteredPartials.length) { +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +console.log('parameteredPartials'); +console.log(parameteredPartials); +} + if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } @@ -412,22 +438,43 @@ console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); //recurse, going a level deeper, with each render eliminating nested parameteredPartials //when there are no more nested parameteredPartials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } //delete empty lines. good for memory management and debugging. - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); +// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.tmpTemplate); + var uniquePartials = []; + var uniquePartial; //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('foundPatternPartials'); + console.log(foundPatternPartials); +} if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } for (i = 0; i < foundPatternPartials.length; i++) { + uniquePartial = true; + + for (j = 0; j < uniquePartials.length; j++) { + if (foundPatternPartials[i] === uniquePartials[j]) { + uniquePartial = false; + break; + } + } + + if (uniquePartial) { + uniquePartials.push(foundPatternPartials[i]); + } else { + continue; + } + var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); //identify which pattern this partial corresponds to @@ -443,24 +490,32 @@ console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); var regex = new RegExp(escapedPartial, 'g'); currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowUnusedTags(partialPattern.template, currentPattern)); - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); +// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); } } +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('unique foundPatternPartials'); + console.log(uniquePartials); +} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up - processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1); + processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } //delete empty lines again. good for memory management and debugging. - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); +// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); - //do only at the end of the top level of recursion + //do only when popped to the top level of recursion if (recursionLevel === 0) { -//if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { -//} - // Switched ERB escaped tags back to standard Mustache tags. +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); +} + //switched ERB escaped tags back to standard Mustache tags currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); +} //if partial has style modifier data, replace the styleModifier value if (currentPattern.stylePartials && currentPattern.stylePartials.length) { @@ -468,22 +523,39 @@ console.log('DATA SIZE MIDDLE: ' + JSON.stringify(currentPattern).length + 'B'); } currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); +} //find any listItem blocks that within the pattern, even if there are no partials list_item_hunter.process_list_item_partials(currentPattern, patternlab); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('LIST ITEMS at: ' + (Date.now() / 1000)); +} //find pattern lineage lineage_hunter.find_lineage(currentPattern, patternlab); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('FOUND LINEAGE at: ' + (Date.now() / 1000)); +} //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); +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { + console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); +} //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; currentPattern.jsonFileData = null; currentPattern.dataKeys = null; +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); +processEnd = Date.now() / 1000; +console.log('PROCESS END: ' + processEnd); +console.log('PROCESS TIME: ' + (processEnd - processBegin)); +} } } diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index f55961e6c..2c5cb2899 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -85,6 +85,7 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); +console.log('DIVESYNC ITERATIVE BEGIN: ' + (Date.now() / 1000)); //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -97,7 +98,9 @@ var patternlab_engine = function (config) { pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); } ); +console.log('DIVESYNC ITERATIVE END: ' + (Date.now() / 1000)); +console.log('DIVESYNC RECURSIVE BEGIN: ' + (Date.now() / 1000)); //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements diveSync( @@ -111,6 +114,7 @@ var patternlab_engine = function (config) { pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0); } ); +console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference @@ -187,6 +191,7 @@ console.log(pattern); //export patterns if necessary pattern_exporter.export_patterns(patternlab); +console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); } function addToPatternPaths(bucketName, pattern) { From dd41d04a4036fb171125ab393d4d311a059ccce4 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 9 Mar 2016 08:40:52 -0500 Subject: [PATCH 107/162] working list item hunter --- builder/.parameter_hunter.js.swp | Bin 0 -> 28672 bytes builder/.pattern_assembler.js.swp | Bin 53248 -> 49152 bytes builder/.style_modifier_hunter.js.swp | Bin 0 -> 12288 bytes builder/parameter_hunter.js | 10 ++- builder/pattern_assembler.js | 105 ++++++++++++-------------- core/lib/list_item_hunter.js | 6 +- 6 files changed, 60 insertions(+), 61 deletions(-) create mode 100644 builder/.parameter_hunter.js.swp create mode 100644 builder/.style_modifier_hunter.js.swp diff --git a/builder/.parameter_hunter.js.swp b/builder/.parameter_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..ea39646b7e2ef8696ad099a3802439fb6ab21582 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp index fab4c0386d6ad907f13f9710cdeabecff07cbb91..f8114d92f3c8b284b2015a7b9816ba1cd2d7e3e0 100644 GIT binary patch delta 4841 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 IU4_@xpQtJ20ssI2 literal 0 HcmV?d00001 diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 5bf22601a..f9d8d93e2 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -13,10 +13,12 @@ var parameter_hunter = function () { var extend = require('util')._extend, + lih = require('./list_item_hunter'), pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), - style_modifier_hunter = new smh(), - pattern_assembler = new pa(); + list_item_hunter = new lih(), + pattern_assembler = new pa(), + style_modifier_hunter = new smh(); function paramToJson(pString) { var colonPos; @@ -195,6 +197,10 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); } + //find any listItem blocks that within the partial + //do this before rendering parametered tags + list_item_hunter.process_list_item_partials(partialPattern, patternlab); + var regex; var escapedKey; for (var j in paramData) { diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 32fa5c115..663faa175 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -135,7 +135,7 @@ //escaped all tags that match keys in the JSON data. for (var i = 0; i < pattern.dataKeys.length; i++) { escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?[^\\}]*' + escapedKey + '[^\\}]*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); } @@ -151,27 +151,6 @@ return templateRendered; } - /** - * Render the template excluding partials. The reason for this is to eliminate - * the unwanted recursion paths that would remain if irrelevant conditional - * tags persisted. Escaping partial tags so a full render of non-partial tags - * eliminate irrelevant conditional tags. - * - * @param {string} template The template to render. - * @param {object} data The data to render with. - * @returns {string} templateRendered - */ - function escapeRenderUnescapePartials(template, data) { - //escape partial tags by switching them to ERB syntax. - var templateEscaped = template.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - templateEscaped = renderPattern(templateEscaped, data); - - //after that's done, switch back to standard Mustache tags and return. - var templateRendered = templateEscaped.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - return templateRendered; - } - /** * Recursively get all the property keys from the JSON data for a pattern. * @@ -316,11 +295,11 @@ //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate to avoid undefined type errors. - //trying to keep memory footprint small, so set it to empty string at first. + //do the same with extendedTemplate currentPattern.extendedTemplate = ''; //do the same with tmpTemplate to avoid undefined type errors + //trying to keep memory footprint small, so set it to empty string at first currentPattern.tmpTemplate = ''; //find any stylemodifiers that may be in the current pattern @@ -363,7 +342,7 @@ var processEnd; if (recursionLevel === 0) { //console.log(file); -if (file.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { processBegin = Date.now() / 1000; console.log('PROCESS BEGIN: ' + processBegin); } @@ -375,56 +354,62 @@ console.log('PROCESS BEGIN: ' + processBegin); //look for a json file for this template var globalData = patternlab.data; var jsonFilename; - var localData; + var localData = null; - //first, determine if this is a recursible pattern. no point continuing if it isn't. + //get json data local to this pattern try { jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; localData = fs.readJSONSync(jsonFilename); + + if (patternlab.config.debug) { + console.log('found pattern-specific data.json for ' + currentPattern.key); + } } catch (error) { - return; - } - - if (patternlab.config.debug) { - console.log('found pattern-specific data.json for ' + currentPattern.key); } //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); -if (file.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); } //return if processing an ignored file - if (!currentPattern || typeof currentPattern.tmpTemplate === 'undefined') { + if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { return; } currentPattern.jsonFileData = mergeData(globalData, localData); currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); - currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.template, currentPattern); + currentPattern.tmpTemplate = currentPattern.template; + + //find any listItem blocks that within the pattern + //do this before winnowing unused tags + list_item_hunter.process_list_item_partials(currentPattern, patternlab); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log('LIST ITEMS at: ' + (Date.now() / 1000)); + console.log(currentPattern.tmpTemplate); +} + + currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); } -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('RECURSION LEVEL: ' + recursionLevel); console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); -console.log('DATA SIZE: ' + JSON.stringify(currentPattern).length + 'B'); +console.log(currentPattern.tmpTemplate); } //find current pattern in patternlab object using var file as a key // var currentPattern = getpatternbykey(file, patternlab); - //find any listItem blocks - list_item_hunter.process_list_item_partials(currentPattern, patternlab); - //render the template, excepting for partial includes, using jsonFileData var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); //if the template contains any pattern parameters if (parameteredPartials && parameteredPartials.length) { -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('parameteredPartials'); console.log(parameteredPartials); } @@ -451,7 +436,7 @@ console.log(parameteredPartials); //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('foundPatternPartials'); console.log(foundPatternPartials); } @@ -484,16 +469,30 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m throw 'Could not find pattern with key ' + partialKey; } else { + //find any listItem blocks that within the partial + //do this before winnowing unused tags within that partial + partialPattern.tmpTemplate = partialPattern.template; + list_item_hunter.process_list_item_partials(partialPattern, patternlab); + + var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log('winnowedPartial'); +// console.log(winnowedPartial); + console.log('partialPattern.tmpTemplate'); + console.log(partialPattern.tmpTemplate); +} + //replace each partial tag with the partial's template. //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowUnusedTags(partialPattern.template, currentPattern)); + currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowedPartial); + partialPattern.tmpTemplate = ''; // currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); } } -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('unique foundPatternPartials'); console.log(uniquePartials); } @@ -508,12 +507,12 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m //do only when popped to the top level of recursion if (recursionLevel === 0) { -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); } //switched ERB escaped tags back to standard Mustache tags currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); } @@ -523,25 +522,19 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m } currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); } - //find any listItem blocks that within the pattern, even if there are no partials - list_item_hunter.process_list_item_partials(currentPattern, patternlab); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { - console.log('LIST ITEMS at: ' + (Date.now() / 1000)); -} - //find pattern lineage lineage_hunter.find_lineage(currentPattern, patternlab); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('FOUND LINEAGE at: ' + (Date.now() / 1000)); } //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); -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); } @@ -550,7 +543,7 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m currentPattern.jsonFileData = null; currentPattern.dataKeys = null; -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); processEnd = Date.now() / 1000; console.log('PROCESS END: ' + processEnd); diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 5fa4e4fc6..281b52b69 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -79,7 +79,7 @@ var list_item_hunter = function () { } //replace its reference within the block with the extended template - thisBlockTemplate = thisBlockTemplate.replace(foundPartials[j], cleanPartialPattern.extendedTemplate); + thisBlockTemplate = thisBlockTemplate.replace(foundPartials[j], cleanPartialPattern.template); } //render with data @@ -94,8 +94,8 @@ var list_item_hunter = function () { } //replace the block with our generated HTML - var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); - pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); + var repeatingBlock = pattern.tmpTemplate.substring(pattern.tmpTemplate.indexOf(liMatch), pattern.tmpTemplate.indexOf(end) + end.length); + pattern.tmpTemplate = pattern.tmpTemplate.replace(repeatingBlock, repeatedBlockHtml); }); } From 29ac4ede7464c660472c6229065ca6db5a1bc4fd Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Wed, 9 Mar 2016 18:08:30 -0500 Subject: [PATCH 108/162] partially working pseudopattern hunter --- builder/.parameter_hunter.js.swp | Bin 28672 -> 0 bytes builder/.pattern_assembler.js.swp | Bin 49152 -> 0 bytes builder/.style_modifier_hunter.js.swp | Bin 12288 -> 0 bytes builder/parameter_hunter.js | 50 ++++++---------------- builder/pattern_assembler.js | 59 +++++++++++--------------- core/lib/patternlab.js | 9 ++-- core/lib/pseudopattern_hunter.js | 9 ++++ core/lib/style_modifier_hunter.js | 2 +- 8 files changed, 51 insertions(+), 78 deletions(-) delete mode 100644 builder/.parameter_hunter.js.swp delete mode 100644 builder/.pattern_assembler.js.swp delete mode 100644 builder/.style_modifier_hunter.js.swp diff --git a/builder/.parameter_hunter.js.swp b/builder/.parameter_hunter.js.swp deleted file mode 100644 index ea39646b7e2ef8696ad099a3802439fb6ab21582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 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 diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index f8114d92f3c8b284b2015a7b9816ba1cd2d7e3e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49152 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 IU4_@xpQtJ20ssI2 diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index f9d8d93e2..ca54a6fe5 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -124,38 +124,15 @@ var parameter_hunter = function () { } function findparameters(pattern, patternlab, parameteredPartials) { - - //the reason for rendering at this point is to eliminate the unwanted - //recursion paths that would remain if irrelevant conditional tags persisted. - //however, we only want to render the parameter data, so we need to identify - //those tags, switch them to ERB syntax, and render for ERB syntax. -// var tmpTemplate = pattern.tmpTemplate; - - //evaluate parameteredPartials within tmpTemplate -// pattern.parameteredPartials = pattern_assembler.find_pattern_partials_with_parameters(tmpTemplate); - -// if (pattern.parameteredPartials && pattern.parameteredPartials.length) { - - //iterate through most recently evaluated parameteredPartials -// pattern.parameteredPartials.forEach(function (pMatch) { - var uniquePartials = []; - var uniquePartial; for (var i = 0; i < parameteredPartials.length; i++) { - uniquePartial = true; - for (var j = 0; j < uniquePartials.length; j++) { - if (parameteredPartials[i] === uniquePartials[j]) { - uniquePartial = false; - break; - } - } - - if (uniquePartial) { - uniquePartials.push(parameteredPartials[i]); - } else { + //limit iteration to one time per partial. eliminate duplicates. + if (uniquePartials.indexOf(parameteredPartials[i]) > -1) { continue; + } else { + uniquePartials.push(parameteredPartials[i]); } if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { console.log('unique parameteredPartials'); @@ -178,6 +155,16 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache console.log('found patternParameters for ' + partialName); } + //if the current tag has styleModifier data, replace the styleModifier value in the partial + //do this before rendering parametered tags + if (pattern_assembler.find_pattern_partials_with_style_modifiers(parameteredPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); + } + + //find any listItem blocks within the partial + //do this before rendering parametered tags + list_item_hunter.process_list_item_partials(partialPattern, patternlab); + //strip out the additional data, convert string to JSON. var leftParen = parameteredPartials[i].indexOf('('); var rightParen = parameteredPartials[i].indexOf(')'); @@ -192,15 +179,6 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache console.log(e); } - //if partial has style modifier data, replace the styleModifier value - if (pattern.stylePartials && pattern.stylePartials.length) { - style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); - } - - //find any listItem blocks that within the partial - //do this before rendering parametered tags - list_item_hunter.process_list_item_partials(partialPattern, patternlab); - var regex; var escapedKey; for (var j in paramData) { diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 663faa175..c2319a793 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -238,6 +238,8 @@ function processPatternIterative(file, patternlab) { var fs = require('fs-extra'), + lh = require('./lineage_hunter'), + lineage_hunter = new lh(), of = require('./object_factory'), path = require('path'); @@ -302,8 +304,11 @@ //trying to keep memory footprint small, so set it to empty string at first currentPattern.tmpTemplate = ''; - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); + //find pattern lineage + //TODO: consider removing the lineage hunter. it only works at the + //iterative level, and isn't called upon any further. we need to keep the + //patternlab object as light as possible. + lineage_hunter.find_lineage(currentPattern, patternlab); //add currentPattern to patternlab.patterns array addPattern(currentPattern, patternlab); @@ -322,20 +327,18 @@ var fs = require('fs-extra'), path = require('path'); - var lh = require('./lineage_hunter'), - ph = require('./parameter_hunter'), + var ph = require('./parameter_hunter'), pph = require('./pseudopattern_hunter'), lih = require('./list_item_hunter'), smh = require('./style_modifier_hunter'), path = require('path'); - var parameter_hunter = new ph(), - lineage_hunter = new lh(), + var parameter_hunter = new ph(), list_item_hunter = new lih(), style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); - var i, j; // for the for loops + var i; // for the for loops var processBegin; var processEnd; @@ -383,7 +386,7 @@ console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); currentPattern.tmpTemplate = currentPattern.template; - //find any listItem blocks that within the pattern + //find any listItem blocks within the pattern //do this before winnowing unused tags list_item_hunter.process_list_item_partials(currentPattern, patternlab); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { @@ -432,7 +435,6 @@ console.log(parameteredPartials); //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.tmpTemplate); var uniquePartials = []; - var uniquePartial; //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { @@ -445,19 +447,12 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m } for (i = 0; i < foundPatternPartials.length; i++) { - uniquePartial = true; - - for (j = 0; j < uniquePartials.length; j++) { - if (foundPatternPartials[i] === uniquePartials[j]) { - uniquePartial = false; - break; - } - } - if (uniquePartial) { - uniquePartials.push(foundPatternPartials[i]); - } else { + //limit iteration to one time per partial. eliminate duplicates. + if (uniquePartials.indexOf(foundPatternPartials[i]) > -1) { continue; + } else { + uniquePartials.push(foundPatternPartials[i]); } var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); @@ -468,10 +463,15 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m if (!partialPattern) { throw 'Could not find pattern with key ' + partialKey; } else { + partialPattern.tmpTemplate = partialPattern.template; + + //if the current tag has styleModifier data, replace the styleModifier value in the partial + if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); + } - //find any listItem blocks that within the partial + //find any listItem blocks within the partial //do this before winnowing unused tags within that partial - partialPattern.tmpTemplate = partialPattern.template; list_item_hunter.process_list_item_partials(partialPattern, patternlab); var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); @@ -516,22 +516,11 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); } - //if partial has style modifier data, replace the styleModifier value - if (currentPattern.stylePartials && currentPattern.stylePartials.length) { -// style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); - } - - currentPattern.extendedTemplate = renderPattern(currentPattern.tmpTemplate, currentPattern.jsonFileData); + currentPattern.extendedTemplate = currentPattern.tmpTemplate; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); } - //find pattern lineage - lineage_hunter.find_lineage(currentPattern, patternlab); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('FOUND LINEAGE at: ' + (Date.now() / 1000)); -} - //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); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { @@ -540,7 +529,7 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; - currentPattern.jsonFileData = null; +// currentPattern.jsonFileData = null; currentPattern.dataKeys = null; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 2c5cb2899..455559458 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -155,8 +155,8 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); pattern.lineageR = lineageRArray; //render the pattern, but first consolidate any data we may have - var allData = JSON.parse(JSON.stringify(patternlab.data)); - allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); +// var allData = JSON.parse(JSON.stringify(patternlab.data)); +// allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); //also add the cachebuster value. slight chance this could collide with a user that has defined cacheBuster as a value allData.cacheBuster = patternlab.cacheBuster; @@ -166,10 +166,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); var headHtml = pattern_assembler.renderPattern(pattern.header, allData); //render the extendedTemplate with all data -if(typeof pattern.extendedTemplate === 'undefined') { -console.log(pattern); -} - pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, allData); + pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, pattern.jsonFileData); //set the pattern-specific footer if necessary if (patternlab.userFoot) { diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 053e520c3..54d209e4a 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -33,6 +33,9 @@ var pseudopattern_hunter = function () { }); if (pseudoPatterns.length > 0) { +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + console.log('found pseudoPattern variant of ' + currentPattern.key); +} for (var i = 0; i < pseudoPatterns.length; i++) { if (patternlab.config.debug) { console.log('found pseudoPattern variant of ' + currentPattern.key); @@ -48,6 +51,12 @@ var pseudopattern_hunter = function () { var variantFilePath = path.resolve(paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); var variantFileName = currentPattern.fileName + '-' + variantName + '.'; var patternVariant = new of.oPattern(variantFilePath, currentPattern.subdir, variantFileName, variantFileData); +if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { + console.log(pseudoPatterns[i]); + console.log(variantName); + console.log(variantFilePath); + console.log(variantFileName); +} //see if this file has a state pattern_assembler.setPatternState(patternVariant, patternlab); diff --git a/core/lib/style_modifier_hunter.js b/core/lib/style_modifier_hunter.js index b6d6b68d4..c3659df69 100644 --- a/core/lib/style_modifier_hunter.js +++ b/core/lib/style_modifier_hunter.js @@ -25,7 +25,7 @@ var style_modifier_hunter = function () { } //replace the stylemodifier placeholder with the class name - pattern.extendedTemplate = pattern.extendedTemplate.replace(/{{[ ]?styleModifier[ ]?}}/i, styleModifier); + pattern.tmpTemplate = pattern.tmpTemplate.replace(/{{[ ]?styleModifier[ ]?}}/i, styleModifier); } } From e41874dc0b4682b5b6ebf8392e95a764d38a1505 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 06:32:45 -0500 Subject: [PATCH 109/162] working pseudopattern hunter --- builder/pattern_assembler.js | 149 ++++++++++++++++++++++--------- core/lib/pseudopattern_hunter.js | 78 ++++++++-------- 2 files changed, 145 insertions(+), 82 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index c2319a793..ae585a5d1 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -256,11 +256,18 @@ //make a new Pattern Object var currentPattern = new of.oPattern(file, subdir, filename); - //if file is named in the syntax for variants, no need to process further - //processPatternRecursive() will run find_pseudopatterns() and look at each pattern for a variant - if(ext === '.json' && filename.indexOf('~') > -1){ - return; + //if file is named in the syntax for variants, add the variant data to memory. + //processPatternRecursive() will run find_pseudopatterns() to render with the variant data. + if (ext === '.json' && filename.indexOf('~') > -1) { + try { + currentPattern.jsonFileData = fs.readJSONSync(file); + addPattern(currentPattern, patternlab); } + catch (err) { + // do nothing + } + return; + } //can ignore all non-mustache files at this point if(ext !== '.mustache'){ @@ -325,6 +332,7 @@ */ function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { var fs = require('fs-extra'), + glob = require('glob'), path = require('path'); var ph = require('./parameter_hunter'), @@ -346,61 +354,120 @@ var processEnd; //console.log(file); if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -processBegin = Date.now() / 1000; -console.log('PROCESS BEGIN: ' + processBegin); +//processBegin = Date.now() / 1000; +//console.log('PROCESS BEGIN: ' + processBegin); } //skip .json files if (path.extname(file) === '.json') { return; } + + //find current pattern in patternlab object using var file as a key + currentPattern = getpatternbykey(file, patternlab); +if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +//console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); +} + + //return if processing an ignored file + if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { + return; + } //look for a json file for this template var globalData = patternlab.data; var jsonFilename; - var localData = null; + var jsonString; + //allData will get overwritten by mergeData, so keep it scoped to this function. + var allData = null; //get json data local to this pattern try { jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; - localData = fs.readJSONSync(jsonFilename); + jsonString = fs.readFileSync(jsonFilename); + + //since mergeData will overwrite its 2nd param, we need to keep allData + //and currentPattern.jsonFileData distinct. + allData = JSON.parse(jsonString); + currentPattern.jsonFileData = JSON.parse(jsonString); if (patternlab.config.debug) { console.log('found pattern-specific data.json for ' + currentPattern.key); } } catch (error) { + //do nothing } - //find current pattern in patternlab object using var file as a key - currentPattern = getpatternbykey(file, patternlab); -if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); + //get data keys for globalData, currentPattern data, and pseudoPattern data. + mergeData(globalData, allData); + mergeData(globalData, currentPattern.jsonFileData); + var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; + var paths = patternlab.config.paths; + var pseudoPatternFiles = glob.sync(needle, { + cwd: paths.source.patterns, + debug: false, + nodir: true + }); + var pseudoPatternsArray = []; + + var pseudoPattern; + if (pseudoPatternFiles.length) { +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('pseudoPatternFiless'); +console.log(pseudoPatternFiles); } - - //return if processing an ignored file - if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { - return; +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('allData'); +console.log(allData); +} + for (i = 0; i < pseudoPatternFiles.length; i++) { + pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('pseudoPattern'); +console.log(pseudoPattern); +} + if (pseudoPattern) { + pseudoPatternsArray.push(pseudoPattern); + //mergeData() overwrites the 2nd param, so we don't need an assignment statement + //we also don't care about the priority of similarly named properties + //because we just want to populate the dataKeys array + mergeData(pseudoPattern.jsonFileData, allData); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('pseudoPattern.jsonFileData'); +console.log(pseudoPattern.jsonFileData); +} + } + } } +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('globalData'); +console.log(globalData); +} - currentPattern.jsonFileData = mergeData(globalData, localData); - currentPattern.dataKeys = getDataKeys(currentPattern.jsonFileData); + currentPattern.dataKeys = getDataKeys(allData); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +console.log('currentPattern.dataKeys'); +console.log(currentPattern.dataKeys); +console.log('currentPattern.jsonFileData'); +console.log(currentPattern.jsonFileData); +} currentPattern.tmpTemplate = currentPattern.template; //find any listItem blocks within the pattern //do this before winnowing unused tags list_item_hunter.process_list_item_partials(currentPattern, patternlab); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('LIST ITEMS at: ' + (Date.now() / 1000)); - console.log(currentPattern.tmpTemplate); +// console.log('LIST ITEMS at: ' + (Date.now() / 1000)); +// console.log(currentPattern.tmpTemplate); } currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); } if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -console.log('RECURSION LEVEL: ' + recursionLevel); -console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); -console.log(currentPattern.tmpTemplate); +//console.log('RECURSION LEVEL: ' + recursionLevel); +//console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); +//console.log(currentPattern.tmpTemplate); } //find current pattern in patternlab object using var file as a key @@ -413,8 +480,8 @@ console.log(currentPattern.tmpTemplate); //if the template contains any pattern parameters if (parameteredPartials && parameteredPartials.length) { if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -console.log('parameteredPartials'); -console.log(parameteredPartials); +//console.log('parameteredPartials'); +//console.log(parameteredPartials); } if (patternlab.config.debug) { @@ -439,8 +506,8 @@ console.log(parameteredPartials); //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('foundPatternPartials'); - console.log(foundPatternPartials); +// console.log('foundPatternPartials'); +// console.log(foundPatternPartials); } if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); @@ -478,8 +545,8 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { // console.log('winnowedPartial'); // console.log(winnowedPartial); - console.log('partialPattern.tmpTemplate'); - console.log(partialPattern.tmpTemplate); +// console.log('partialPattern.tmpTemplate'); +// console.log(partialPattern.tmpTemplate); } //replace each partial tag with the partial's template. @@ -493,8 +560,8 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m } } if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('unique foundPatternPartials'); - console.log(uniquePartials); +// console.log('unique foundPatternPartials'); +// console.log(uniquePartials); } //recurse, going a level deeper, with each render eliminating nested partials @@ -508,24 +575,26 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //do only when popped to the top level of recursion if (recursionLevel === 0) { if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); +// console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); } //switched ERB escaped tags back to standard Mustache tags currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); +// console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); } currentPattern.extendedTemplate = currentPattern.tmpTemplate; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); +// console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); } //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); + if (pseudoPatternsArray.length) { + pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); +// console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); } + } //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; @@ -533,10 +602,10 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m currentPattern.dataKeys = null; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); -processEnd = Date.now() / 1000; -console.log('PROCESS END: ' + processEnd); -console.log('PROCESS TIME: ' + (processEnd - processBegin)); +//console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); +//processEnd = Date.now() / 1000; +//console.log('PROCESS END: ' + processEnd); +//console.log('PROCESS TIME: ' + (processEnd - processBegin)); } } } diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 54d209e4a..003086d04 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -12,7 +12,7 @@ var pseudopattern_hunter = function () { - function findpseudopatterns(currentPattern, patternlab) { + function findpseudopatterns(currentPattern, patternlab, pseudoPatternsArray) { var glob = require('glob'), fs = require('fs-extra'), pa = require('./pattern_assembler'), @@ -24,59 +24,53 @@ var pseudopattern_hunter = function () { var lineage_hunter = new lh(); var paths = patternlab.config.paths; - //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json - var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; - var pseudoPatterns = glob.sync(needle, { - cwd: paths.source.patterns, - debug: false, - nodir: true - }); - - if (pseudoPatterns.length > 0) { if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { console.log('found pseudoPattern variant of ' + currentPattern.key); } - for (var i = 0; i < pseudoPatterns.length; i++) { - if (patternlab.config.debug) { - console.log('found pseudoPattern variant of ' + currentPattern.key); - } - - //we want to do everything we normally would here, except instead read the pseudoPattern data - var variantFileData = fs.readJSONSync(path.resolve(paths.source.patterns, pseudoPatterns[i])); - - //extend any existing data with variant data - variantFileData = pattern_assembler.merge_data(currentPattern.jsonFileData, variantFileData); + for (var i = 0; i < pseudoPatternsArray.length; i++) { + if (patternlab.config.debug) { + console.log('found pseudoPattern variant of ' + currentPattern.key); + } - var variantName = pseudoPatterns[i].substring(pseudoPatterns[i].indexOf('~') + 1).split('.')[0]; - var variantFilePath = path.resolve(paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); - var variantFileName = currentPattern.fileName + '-' + variantName + '.'; - var patternVariant = new of.oPattern(variantFilePath, currentPattern.subdir, variantFileName, variantFileData); + //we want to do everything we normally would here, except instead read the pseudoPattern data +// var variantFileData = fs.readJSONSync(path.resolve(paths.source.patterns, pseudoPatterns[i])); + + //extend any existing data with variant data + var variantFileData = pattern_assembler.merge_data(currentPattern.jsonFileData, pseudoPatternsArray[i].jsonFileData); +/* + var variantName = pseudoPatternsArray[i].substring(pseudoPatternsArray[i].indexOf('~') + 1).split('.')[0]; + var variantFilePath = path.resolve(paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); + var variantFileName = currentPattern.fileName + '-' + variantName + '.'; + var patternVariant = new of.oPattern(variantFilePath, currentPattern.subdir, variantFileName, variantFileData); + */ + + //see if this file has a state + pattern_assembler.setPatternState(pseudoPatternsArray[i], patternlab); + + //use the same template as the non-variant +// pseudoPatternsArray.template = currentPattern.template; +// pseudoPatternsArray[i].tmpTemplate = currentPattern.extendedTemplate; + pseudoPatternsArray[i].extendedTemplate = currentPattern.extendedTemplate; if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - console.log(pseudoPatterns[i]); - console.log(variantName); - console.log(variantFilePath); - console.log(variantFileName); + /* + console.log('pseudoPatternsArray[i].extendedTemplate'); + console.log(pseudoPatternsArray[i].extendedTemplate); + console.log('pseudoPatternsArray[i].jsonFileData'); + console.log(pseudoPatternsArray[i].jsonFileData); + */ } - //see if this file has a state - pattern_assembler.setPatternState(patternVariant, patternlab); - - //use the same template as the non-variant - patternVariant.template = currentPattern.template; - patternVariant.extendedTemplate = currentPattern.extendedTemplate; + //find pattern lineage +// lineage_hunter.find_lineage(patternVariant, patternlab); - //find pattern lineage - lineage_hunter.find_lineage(patternVariant, patternlab); - - //add to patternlab object so we can look these up later. - pattern_assembler.addPattern(patternVariant, patternlab); - } + //add to patternlab object so we can look these up later. +// pattern_assembler.addPattern(patternVariant, patternlab); } } return { - find_pseudopatterns: function (pattern, patternlab) { - findpseudopatterns(pattern, patternlab); + find_pseudopatterns: function (pattern, patternlab, pseudoPatternsArray) { + findpseudopatterns(pattern, patternlab, pseudoPatternsArray); } }; From dba57a7db9d77bd2260d4cea66107bce797e0c54 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 07:09:19 -0500 Subject: [PATCH 110/162] stopping point. file writing done in processPatternRecursive so memory can be freed up --- builder/.patternlab.js.swp | Bin 0 -> 36864 bytes builder/pattern_assembler.js | 121 +++++++++-------------------------- core/lib/patternlab.js | 27 +++----- 3 files changed, 40 insertions(+), 108 deletions(-) create mode 100644 builder/.patternlab.js.swp diff --git a/builder/.patternlab.js.swp b/builder/.patternlab.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..36f8319b6be11f70e4b9cf3f4841fad9c6b0e5a9 GIT binary patch literal 36864 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 BTd@ED literal 0 HcmV?d00001 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index ae585a5d1..82707e01a 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -333,6 +333,7 @@ function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { var fs = require('fs-extra'), glob = require('glob'), + he = require('html-entities').AllHtmlEntities, path = require('path'); var ph = require('./parameter_hunter'), @@ -342,6 +343,7 @@ path = require('path'); var parameter_hunter = new ph(), + entity_encoder = new he(), list_item_hunter = new lih(), style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); @@ -352,11 +354,6 @@ var processBegin; var processEnd; if (recursionLevel === 0) { -//console.log(file); -if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//processBegin = Date.now() / 1000; -//console.log('PROCESS BEGIN: ' + processBegin); -} //skip .json files if (path.extname(file) === '.json') { return; @@ -364,9 +361,6 @@ if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); -if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log('DATA SIZE BEGIN: ' + JSON.stringify(currentPattern).length + 'B'); -} //return if processing an ignored file if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { @@ -399,6 +393,7 @@ if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { } //get data keys for globalData, currentPattern data, and pseudoPattern data. + //mergeData() overwrites the 2nd param, so we don't need assignment statements mergeData(globalData, allData); mergeData(globalData, currentPattern.jsonFileData); var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; @@ -409,81 +404,36 @@ if (file.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { nodir: true }); var pseudoPatternsArray = []; - var pseudoPattern; + if (pseudoPatternFiles.length) { -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('pseudoPatternFiless'); -console.log(pseudoPatternFiles); -} -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('allData'); -console.log(allData); -} for (i = 0; i < pseudoPatternFiles.length; i++) { pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('pseudoPattern'); -console.log(pseudoPattern); -} if (pseudoPattern) { pseudoPatternsArray.push(pseudoPattern); - //mergeData() overwrites the 2nd param, so we don't need an assignment statement - //we also don't care about the priority of similarly named properties - //because we just want to populate the dataKeys array + + //update the allData object. mergeData(pseudoPattern.jsonFileData, allData); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('pseudoPattern.jsonFileData'); -console.log(pseudoPattern.jsonFileData); -} } } } -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('globalData'); -console.log(globalData); -} currentPattern.dataKeys = getDataKeys(allData); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -console.log('currentPattern.dataKeys'); -console.log(currentPattern.dataKeys); -console.log('currentPattern.jsonFileData'); -console.log(currentPattern.jsonFileData); -} currentPattern.tmpTemplate = currentPattern.template; //find any listItem blocks within the pattern //do this before winnowing unused tags list_item_hunter.process_list_item_partials(currentPattern, patternlab); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('LIST ITEMS at: ' + (Date.now() / 1000)); -// console.log(currentPattern.tmpTemplate); -} currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); } -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log('RECURSION LEVEL: ' + recursionLevel); -//console.log('RECURSION LEVEL BEGIN: ' + (Date.now() / 1000)); -//console.log(currentPattern.tmpTemplate); -} - - //find current pattern in patternlab object using var file as a key -// var currentPattern = getpatternbykey(file, patternlab); - - //render the template, excepting for partial includes, using jsonFileData + //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); - //if the template contains any pattern parameters + //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log('parameteredPartials'); -//console.log(parameteredPartials); -} - if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } @@ -496,19 +446,12 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } - //delete empty lines. good for memory management and debugging. -// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); - //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.tmpTemplate); var uniquePartials = []; //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('foundPatternPartials'); -// console.log(foundPatternPartials); -} if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } @@ -542,12 +485,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m list_item_hunter.process_list_item_partials(partialPattern, patternlab); var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('winnowedPartial'); -// console.log(winnowedPartial); -// console.log('partialPattern.tmpTemplate'); -// console.log(partialPattern.tmpTemplate); -} //replace each partial tag with the partial's template. //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters @@ -559,43 +496,42 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m // currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); } } -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('unique foundPatternPartials'); -// console.log(uniquePartials); -} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } - //delete empty lines again. good for memory management and debugging. -// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); - //do only when popped to the top level of recursion if (recursionLevel === 0) { -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('POPPED TO RECURSION LEVEL 0 at: ' + (Date.now() / 1000)); -} + //switched ERB escaped tags back to standard Mustache tags currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('SWITCHED ERB TO MUSTACHE at: ' + (Date.now() / 1000)); -} currentPattern.extendedTemplate = currentPattern.tmpTemplate; -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('RENDERED PATTERN at: ' + (Date.now() / 1000)); -} - //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json + //look through pseudoPatternsArray again, and update their patternlab objects if (pseudoPatternsArray.length) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('FOUND PSEUDOPATTERNS at: ' + (Date.now() / 1000)); -} } + currentPattern.jsonFileData = parseDataLinksHelper(patternlab, currentPattern.jsonFileData, currentPattern.key); + + //render the extendedTemplate with all data + currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); + + //add footer info before writing + var patternFooter = renderPattern(patternlab.footer, currentPattern.jsonFileData); + + //write the compiled template to the public patterns directory + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); + + //write the mustache file too + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(currentPattern.template)); + + //write the encoded version too + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); + //since we're done with currentPattern.tmpTemplate, free it from memory currentPattern.tmpTemplate = ''; // currentPattern.jsonFileData = null; @@ -722,6 +658,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m process_pattern_recursive: function (file, patternlab, recursionLevel) { processPatternRecursive(file, patternlab, recursionLevel); }, + parse_data_links_helper: function (patternlab, obj, key) { + return parseDataLinksHelper(patternlab, obj, key); + }, parse_data_links: function (patternlab) { parseDataLinks(patternlab); } diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 455559458..e177f3822 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -100,6 +100,13 @@ console.log('DIVESYNC ITERATIVE BEGIN: ' + (Date.now() / 1000)); ); console.log('DIVESYNC ITERATIVE END: ' + (Date.now() / 1000)); + patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); + + //delete the contents of config.patterns.public before writing + if (deletePatternDir) { + fs.emptyDirSync(paths.public.patterns); + } + console.log('DIVESYNC RECURSIVE BEGIN: ' + (Date.now() / 1000)); //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements @@ -118,15 +125,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference - pattern_assembler.parse_data_links(patternlab); - - //cascade any patternStates - lineage_hunter.cascade_pattern_states(patternlab); - - //delete the contents of config.patterns.public before writing - if (deletePatternDir) { - fs.emptyDirSync(paths.public.patterns); - } +// pattern_assembler.parse_data_links(patternlab); //set pattern-specific header if necessary var head; @@ -157,14 +156,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //render the pattern, but first consolidate any data we may have // var allData = JSON.parse(JSON.stringify(patternlab.data)); // allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); - - //also add the cachebuster value. slight chance this could collide with a user that has defined cacheBuster as a value - allData.cacheBuster = patternlab.cacheBuster; - pattern.cacheBuster = patternlab.cacheBuster; - - //render the pattern-specific header - var headHtml = pattern_assembler.renderPattern(pattern.header, allData); - +/* //render the extendedTemplate with all data pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, pattern.jsonFileData); @@ -184,6 +176,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //write the encoded version too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); + */ }); //export patterns if necessary From cd45965e97652d938b61c165200e99ca32cc9e92 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 08:31:04 -0500 Subject: [PATCH 111/162] fixed frontend render --- builder/.patternlab.js.swp | Bin 36864 -> 0 bytes builder/parameter_hunter.js | 2 +- builder/pattern_assembler.js | 76 ++++++++++++++++++++--------------- core/lib/pattern_exporter.js | 1 + core/lib/patternlab.js | 10 ++--- 5 files changed, 51 insertions(+), 38 deletions(-) delete mode 100644 builder/.patternlab.js.swp diff --git a/builder/.patternlab.js.swp b/builder/.patternlab.js.swp deleted file mode 100644 index 36f8319b6be11f70e4b9cf3f4841fad9c6b0e5a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 BTd@ED diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index ca54a6fe5..1cff5979c 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -204,7 +204,7 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache //replace parameteredPartials with their rendered values. var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); regex = new RegExp(pMatch, 'g'); - pattern.tmpTemplate = pattern.tmpTemplate.replace(regex, partialPattern.tmpTemplate); + pattern.extendedTemplate = pattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); // Free tmpTemplate from memory. partialPattern.tmpTemplate = ''; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 82707e01a..2074c1ee3 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -304,11 +304,11 @@ //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate + //do the same with extendedTemplate to avoid undefined type errors + //trying to keep memory footprint small, so set it to empty string at first currentPattern.extendedTemplate = ''; - //do the same with tmpTemplate to avoid undefined type errors - //trying to keep memory footprint small, so set it to empty string at first + //do the same with tmpTemplate currentPattern.tmpTemplate = ''; //find pattern lineage @@ -349,16 +349,12 @@ pseudopattern_hunter = new pph(); var i; // for the for loops + var paths = patternlab.config.paths; var processBegin; var processEnd; if (recursionLevel === 0) { - //skip .json files - if (path.extname(file) === '.json') { - return; - } - //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -366,6 +362,20 @@ var processEnd; if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { return; } + + //output .json variant files and return + if (path.extname(file) === '.json') { + //write the compiled template to the public patterns directory + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); + + //write the mustache file too + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(currentPattern.template)); + + //write the encoded version too + fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); + + return; + } //look for a json file for this template var globalData = patternlab.data; @@ -397,7 +407,6 @@ var processEnd; mergeData(globalData, allData); mergeData(globalData, currentPattern.jsonFileData); var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; - var paths = patternlab.config.paths; var pseudoPatternFiles = glob.sync(needle, { cwd: paths.source.patterns, debug: false, @@ -419,18 +428,18 @@ var processEnd; } currentPattern.dataKeys = getDataKeys(allData); - currentPattern.tmpTemplate = currentPattern.template; + currentPattern.extendedTemplate = currentPattern.template; //find any listItem blocks within the pattern //do this before winnowing unused tags list_item_hunter.process_list_item_partials(currentPattern, patternlab); - currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.extendedTemplate, currentPattern); } //find parametered partials - var parameteredPartials = findPartialsWithPatternParameters(currentPattern.tmpTemplate); + var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { @@ -438,7 +447,7 @@ var processEnd; console.log('found parametered partials for ' + currentPattern.key); } - //recursively render currentPattern.tmpTemplate via parameter_hunter.find_parameters() + //recursively render currentPattern.extendedTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); //recurse, going a level deeper, with each render eliminating nested parameteredPartials @@ -447,7 +456,7 @@ var processEnd; } //find non-parametered partials. - var foundPatternPartials = findPartials(currentPattern.tmpTemplate); + var foundPatternPartials = findPartials(currentPattern.extendedTemplate); var uniquePartials = []; //recurse through non-parametered partials @@ -491,9 +500,9 @@ var processEnd; var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(regex, winnowedPartial); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, winnowedPartial); partialPattern.tmpTemplate = ''; -// currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/^\s*$\n/gm, ''); +// currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/^\s*$\n/gm, ''); } } @@ -506,9 +515,9 @@ var processEnd; if (recursionLevel === 0) { //switched ERB escaped tags back to standard Mustache tags - currentPattern.tmpTemplate = currentPattern.tmpTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); - currentPattern.extendedTemplate = currentPattern.tmpTemplate; +// currentPattern.extendedTemplate = currentPattern.tmpTemplate; //look through pseudoPatternsArray again, and update their patternlab objects if (pseudoPatternsArray.length) { @@ -521,9 +530,13 @@ var processEnd; currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); //add footer info before writing - var patternFooter = renderPattern(patternlab.footer, currentPattern.jsonFileData); + var patternFooter = renderPattern(patternlab.footer, currentPattern); +if (currentPattern.abspath.indexOf('00-homepage') > -1) { + console.log(patternFooter); +} //write the compiled template to the public patterns directory +// fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate); fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); //write the mustache file too @@ -549,19 +562,18 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m function parseDataLinksHelper(patternlab, obj, key) { var linkRE, dataObjAsString, linkMatches, expandedLink; - /** - * Recurse through data object and apply a function at each step. - * - * @param {Object} data JSON object. - * @param {Object} callback The function to be applied on the data at the recursion step. - */ - function traverseData(dataObj, callback){ - for(var i in dataObj){ - if(dataObj.hasOwnProperty(i)){ - callback.apply(this, [i, dataObj[i]]); - if(dataObj[i] !== null && typeof dataObj[i] === 'object'){ - traverseData(dataObj[i], callback); - } + linkRE = /link\.[A-z0-9-_]+/g; + dataObjAsString = JSON.stringify(obj); + linkMatches = dataObjAsString.match(linkRE); + + if (linkMatches) { + for (var i = 0; i < linkMatches.length; i++) { + expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; + if (expandedLink) { +// if (patternlab.config.debug) { + console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); +// } + dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); } } } diff --git a/core/lib/pattern_exporter.js b/core/lib/pattern_exporter.js index ff53cac6c..a63d14111 100644 --- a/core/lib/pattern_exporter.js +++ b/core/lib/pattern_exporter.js @@ -18,6 +18,7 @@ var pattern_exporter = function () { //read the config export options var exportKeys = patternlab.config.patternExportKeys; + //find the chosen patterns to export for (var i = 0; i < exportKeys.length; i++) { for (var j = 0; j < patternlab.patterns.length; j++) { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index e177f3822..2604f92ae 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -85,7 +85,6 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); -console.log('DIVESYNC ITERATIVE BEGIN: ' + (Date.now() / 1000)); //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -98,16 +97,16 @@ console.log('DIVESYNC ITERATIVE BEGIN: ' + (Date.now() / 1000)); pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); } ); -console.log('DIVESYNC ITERATIVE END: ' + (Date.now() / 1000)); patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); +//console.log('patternlab.data'); +//console.log(patternlab.data); //delete the contents of config.patterns.public before writing if (deletePatternDir) { fs.emptyDirSync(paths.public.patterns); } -console.log('DIVESYNC RECURSIVE BEGIN: ' + (Date.now() / 1000)); //diveSync again to recursively include partials, filling out the //extendedTemplate property of the patternlab.patterns elements diveSync( @@ -121,7 +120,6 @@ console.log('DIVESYNC RECURSIVE BEGIN: ' + (Date.now() / 1000)); pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0); } ); -console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //now that all the main patterns are known, look for any links that might be within data and expand them //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference @@ -159,6 +157,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); /* //render the extendedTemplate with all data pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, pattern.jsonFileData); +*/ //set the pattern-specific footer if necessary if (patternlab.userFoot) { @@ -168,6 +167,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); pattern.footer = pattern_assembler.renderPattern(patternlab.footerPattern, pattern); } +/* //write the compiled template to the public patterns directory fs.outputFileSync(paths.public.patterns + pattern.patternLink, headHtml + pattern.patternPartial + pattern.footer); @@ -176,7 +176,7 @@ console.log('DIVESYNC RECURSIVE END: ' + (Date.now() / 1000)); //write the encoded version too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); - */ +*/ }); //export patterns if necessary From 5fc348a8ecdd12e3849ae25296b9c737f2623d77 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 08:40:37 -0500 Subject: [PATCH 112/162] working pseudopatterns --- builder/.pattern_assembler.js.swp | Bin 0 -> 40960 bytes builder/pattern_assembler.js | 27 ++++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..6d7266a386495985776139e10fa3f937fcf0179b GIT binary patch literal 40960 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 literal 0 HcmV?d00001 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 2074c1ee3..ce2392ab1 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -350,6 +350,7 @@ var i; // for the for loops var paths = patternlab.config.paths; + var patternFooter; var processBegin; var processEnd; @@ -364,7 +365,21 @@ var processEnd; } //output .json variant files and return + //these variants should occur after their primaries, given that tildes come + //after periods in ASCII order. as such, their extendedTemplates should be + //filled out and renderable. if (path.extname(file) === '.json') { + currentPattern.jsonFileData = parseDataLinksHelper(patternlab, currentPattern.jsonFileData, currentPattern.key); + + //render the extendedTemplate with all data + currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); + + //add footer info before writing + patternFooter = renderPattern(patternlab.footer, currentPattern); +if (currentPattern.abspath.indexOf('00-homepage') > -1) { + console.log(patternFooter); +} + //write the compiled template to the public patterns directory fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); @@ -376,7 +391,8 @@ var processEnd; return; } - + + //continue with regular mustache templates //look for a json file for this template var globalData = patternlab.data; var jsonFilename; @@ -502,7 +518,6 @@ var processEnd; currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, winnowedPartial); partialPattern.tmpTemplate = ''; -// currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/^\s*$\n/gm, ''); } } @@ -517,8 +532,6 @@ var processEnd; //switched ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); -// currentPattern.extendedTemplate = currentPattern.tmpTemplate; - //look through pseudoPatternsArray again, and update their patternlab objects if (pseudoPatternsArray.length) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); @@ -530,13 +543,12 @@ var processEnd; currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); //add footer info before writing - var patternFooter = renderPattern(patternlab.footer, currentPattern); + patternFooter = renderPattern(patternlab.footer, currentPattern); if (currentPattern.abspath.indexOf('00-homepage') > -1) { console.log(patternFooter); } //write the compiled template to the public patterns directory -// fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate); fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); //write the mustache file too @@ -546,8 +558,9 @@ if (currentPattern.abspath.indexOf('00-homepage') > -1) { fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); //since we're done with currentPattern.tmpTemplate, free it from memory + currentPattern.extendedTemplate = ''; currentPattern.tmpTemplate = ''; -// currentPattern.jsonFileData = null; + currentPattern.jsonFileData = null; currentPattern.dataKeys = null; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { From 65d6c78e0ffa215c2937d6546ff1c13ba65362cd Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 08:59:55 -0500 Subject: [PATCH 113/162] moved file writing to a function --- builder/.pattern_assembler.js.swp | Bin 40960 -> 0 bytes builder/pattern_assembler.js | 84 +++++++++++++----------------- core/lib/patternlab.js | 60 --------------------- 3 files changed, 35 insertions(+), 109 deletions(-) delete mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index 6d7266a386495985776139e10fa3f937fcf0179b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index ce2392ab1..a6fb2f78d 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -236,6 +236,31 @@ return obj2; } + function outputPatternToFS(pattern, patternlab) { + var fs = require('fs-extra'); + var he = require('html-entities').AllHtmlEntities; + var entity_encoder = new he(); + var paths = patternlab.config.paths; + var patternFooter; + + pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); + + //render the extendedTemplate with all data + pattern.extendedTemplate = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); + + //add footer info before writing + patternFooter = renderPattern(patternlab.footer, pattern); + + //write the compiled template to the public patterns directory + fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.extendedTemplate + patternFooter); + + //write the mustache file too + fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); + + //write the encoded version too + fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.extendedTemplate)); + } + function processPatternIterative(file, patternlab) { var fs = require('fs-extra'), lh = require('./lineage_hunter'), @@ -333,7 +358,6 @@ function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { var fs = require('fs-extra'), glob = require('glob'), - he = require('html-entities').AllHtmlEntities, path = require('path'); var ph = require('./parameter_hunter'), @@ -343,14 +367,12 @@ path = require('path'); var parameter_hunter = new ph(), - entity_encoder = new he(), list_item_hunter = new lih(), style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); var i; // for the for loops var paths = patternlab.config.paths; - var patternFooter; var processBegin; var processEnd; @@ -364,31 +386,12 @@ var processEnd; return; } - //output .json variant files and return - //these variants should occur after their primaries, given that tildes come - //after periods in ASCII order. as such, their extendedTemplates should be - //filled out and renderable. + //output .json pseudoPattern variants to the file system and return. + //diveSync should process these variants after their primaries, given that + //tildes come after periods in ASCII order. as such, their extendedTemplates + //should be filled out and renderable. if (path.extname(file) === '.json') { - currentPattern.jsonFileData = parseDataLinksHelper(patternlab, currentPattern.jsonFileData, currentPattern.key); - - //render the extendedTemplate with all data - currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); - - //add footer info before writing - patternFooter = renderPattern(patternlab.footer, currentPattern); -if (currentPattern.abspath.indexOf('00-homepage') > -1) { - console.log(patternFooter); -} - - //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); - - //write the mustache file too - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(currentPattern.template)); - - //write the encoded version too - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); - + outputPatternToFS(currentPattern, patternlab); return; } @@ -537,27 +540,10 @@ if (currentPattern.abspath.indexOf('00-homepage') > -1) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); } - currentPattern.jsonFileData = parseDataLinksHelper(patternlab, currentPattern.jsonFileData, currentPattern.key); - - //render the extendedTemplate with all data - currentPattern.extendedTemplate = renderPattern(currentPattern.extendedTemplate, currentPattern.jsonFileData); + //output rendered pattern to the file system + outputPatternToFS(currentPattern, patternlab); - //add footer info before writing - patternFooter = renderPattern(patternlab.footer, currentPattern); -if (currentPattern.abspath.indexOf('00-homepage') > -1) { - console.log(patternFooter); -} - - //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink, patternlab.header + currentPattern.extendedTemplate + patternFooter); - - //write the mustache file too - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(currentPattern.template)); - - //write the encoded version too - fs.outputFileSync(paths.public.patterns + currentPattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(currentPattern.extendedTemplate)); - - //since we're done with currentPattern.tmpTemplate, free it from memory + //since we're done with these currentPattern properties, free them from memory currentPattern.extendedTemplate = ''; currentPattern.tmpTemplate = ''; currentPattern.jsonFileData = null; @@ -583,9 +569,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m for (var i = 0; i < linkMatches.length; i++) { expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; if (expandedLink) { -// if (patternlab.config.debug) { + if (patternlab.config.debug) { console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); -// } + } dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); } } diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 2604f92ae..31a5da620 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -99,8 +99,6 @@ var patternlab_engine = function (config) { ); patternlab.data = pattern_assembler.parse_data_links_helper(patternlab, patternlab.data, 'data.json'); -//console.log('patternlab.data'); -//console.log(patternlab.data); //delete the contents of config.patterns.public before writing if (deletePatternDir) { @@ -121,64 +119,6 @@ var patternlab_engine = function (config) { } ); - //now that all the main patterns are known, look for any links that might be within data and expand them - //we need to do this before expanding patterns & partials into extendedTemplates, otherwise we could lose the data -> partial reference -// pattern_assembler.parse_data_links(patternlab); - - //set pattern-specific header if necessary - var head; - if (patternlab.userHead) { - head = patternlab.userHead.extendedTemplate.replace('{% pattern-lab-head %}', patternlab.header); - } else { - head = patternlab.header; - } - - //render all patterns last, so lineageR works - patternlab.patterns.forEach(function (pattern) { - - pattern.header = head; - - //json stringify lineage and lineageR - var lineageArray = []; - for (var i = 0; i < pattern.lineage.length; i++) { - lineageArray.push(JSON.stringify(pattern.lineage[i])); - } - pattern.lineage = lineageArray; - - var lineageRArray = []; - for (var i = 0; i < pattern.lineageR.length; i++) { - lineageRArray.push(JSON.stringify(pattern.lineageR[i])); - } - pattern.lineageR = lineageRArray; - - //render the pattern, but first consolidate any data we may have -// var allData = JSON.parse(JSON.stringify(patternlab.data)); -// allData = pattern_assembler.merge_data(allData, pattern.jsonFileData); -/* - //render the extendedTemplate with all data - pattern.patternPartial = pattern_assembler.renderPattern(pattern.extendedTemplate, pattern.jsonFileData); -*/ - - //set the pattern-specific footer if necessary - if (patternlab.userFoot) { - var userFooter = patternlab.userFoot.extendedTemplate.replace('{% pattern-lab-foot %}', patternlab.footerPattern + patternlab.footer); - pattern.footer = pattern_assembler.renderPattern(userFooter, pattern); - } else { - pattern.footer = pattern_assembler.renderPattern(patternlab.footerPattern, pattern); - } - -/* - //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + pattern.patternLink, headHtml + pattern.patternPartial + pattern.footer); - - //write the mustache file too - fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); - - //write the encoded version too - fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); -*/ - }); - //export patterns if necessary pattern_exporter.export_patterns(patternlab); console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); From 3b24c717d317582b3ddbcc1b6063c526c9076457 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 18:21:58 -0500 Subject: [PATCH 114/162] working listItems --- builder/.list_item_hunter.js.swp | Bin 0 -> 20480 bytes builder/.pattern_assembler.js.swp | Bin 0 -> 45056 bytes builder/parameter_hunter.js | 4 -- builder/pattern_assembler.js | 41 +++++++++++++----- core/lib/list_item_hunter.js | 27 ++++++++++-- core/lib/pseudopattern_hunter.js | 17 -------- .../07-messaging/00-alert.mustache | 2 +- 7 files changed, 54 insertions(+), 37 deletions(-) create mode 100644 builder/.list_item_hunter.js.swp create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.list_item_hunter.js.swp b/builder/.list_item_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..56811ab4e91526e64f1b78dcf775ab8ad0de813d GIT binary patch literal 20480 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 Il}48JFLp2g-T(jq literal 0 HcmV?d00001 diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..cc5cc9543bd01ab23ab38b6a8972ee1226f88841 GIT binary patch literal 45056 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 literal 0 HcmV?d00001 diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 1cff5979c..85f417490 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -161,10 +161,6 @@ if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache style_modifier_hunter.consume_style_modifier(partialPattern, parameteredPartials[i], patternlab); } - //find any listItem blocks within the partial - //do this before rendering parametered tags - list_item_hunter.process_list_item_partials(partialPattern, patternlab); - //strip out the additional data, convert string to JSON. var leftParen = parameteredPartials[i].indexOf('('); var rightParen = parameteredPartials[i].indexOf(')'); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index a6fb2f78d..cbbb737e0 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -446,15 +446,17 @@ var processEnd; } } + //add allData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(allData); - currentPattern.extendedTemplate = currentPattern.template; - //find any listItem blocks within the pattern - //do this before winnowing unused tags - list_item_hunter.process_list_item_partials(currentPattern, patternlab); + //add listItem keys to currentPattern.dataKeys + currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_keys()); - currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.extendedTemplate, currentPattern); + //add listitems.json keys to currentPattern.dataKeys + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(patternlab.listitems)); + //copy winnowed template to extendedTemplate + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); } //find parametered partials @@ -508,10 +510,6 @@ var processEnd; style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } - //find any listItem blocks within the partial - //do this before winnowing unused tags within that partial - list_item_hunter.process_list_item_partials(partialPattern, patternlab); - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); //replace each partial tag with the partial's template. @@ -523,17 +521,33 @@ var processEnd; partialPattern.tmpTemplate = ''; } } +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log('currentPattern.extendedTemplate'); +// console.log(currentPattern.extendedTemplate); +} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up processPatternRecursive(currentPattern.abspath, patternlab, recursionLevel + 1, currentPattern); } - //do only when popped to the top level of recursion + //do only when popped back to the top level of recursion if (recursionLevel === 0) { //switched ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log('currentPattern.extendedTemplate'); +// console.log(currentPattern.extendedTemplate); +} + +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +//console.log(patternlab.listitems); +//console.log(currentPattern.dataKeys); +} + + //find and process any listItem blocks within the pattern + list_item_hunter.process_list_item_partials(currentPattern, patternlab); //look through pseudoPatternsArray again, and update their patternlab objects if (pseudoPatternsArray.length) { @@ -546,14 +560,19 @@ var processEnd; //since we're done with these currentPattern properties, free them from memory currentPattern.extendedTemplate = ''; currentPattern.tmpTemplate = ''; - currentPattern.jsonFileData = null; currentPattern.dataKeys = null; + currentPattern.jsonFileData = null; + currentPattern.listitems = null; if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { //console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); //processEnd = Date.now() / 1000; //console.log('PROCESS END: ' + processEnd); //console.log('PROCESS TIME: ' + (processEnd - processBegin)); +} + +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +//console.log(currentPattern.dataKeys); } } } diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 281b52b69..ce9182f3f 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -19,9 +19,13 @@ 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 getListItemKeys() { + return items; + } + function processListItemPartials(pattern, patternlab) { //find any listitem blocks - var matches = pattern_assembler.find_list_items(pattern, patternlab); + var matches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (matches !== null) { matches.forEach(function (liMatch) { @@ -32,7 +36,12 @@ 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 patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch) + liMatch.length, pattern.extendedTemplate.indexOf(end)).trim(); +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log(pattern.extendedTemplate); + console.log('patternBlock'); + console.log(patternBlock); +} //build arrays that repeat the block, however large we need to var repeatedBlockTemplate = []; @@ -62,6 +71,7 @@ var list_item_hunter = function () { allData.link = extend({}, patternlab.data.link); //check for partials within the repeated block + /* var foundPartials = pattern_assembler.find_pattern_partials({ 'template' : thisBlockTemplate }); if (foundPartials && foundPartials.length > 0) { @@ -88,20 +98,29 @@ var list_item_hunter = function () { //just render with mergedData thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); } + */ + thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); //add the rendered HTML to our string repeatedBlockHtml = repeatedBlockHtml + thisBlockHTML; } //replace the block with our generated HTML - var repeatingBlock = pattern.tmpTemplate.substring(pattern.tmpTemplate.indexOf(liMatch), pattern.tmpTemplate.indexOf(end) + end.length); - pattern.tmpTemplate = pattern.tmpTemplate.replace(repeatingBlock, repeatedBlockHtml); + var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); + pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log('repeatedBlockHtml'); + console.log(repeatedBlockHtml); +} }); } } return { + get_list_item_keys: function() { + return getListItemKeys(); + }, process_list_item_partials: function (pattern, patternlab) { processListItemPartials(pattern, patternlab); } diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 003086d04..c3ad46cf2 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -24,32 +24,18 @@ var pseudopattern_hunter = function () { var lineage_hunter = new lh(); var paths = patternlab.config.paths; -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - console.log('found pseudoPattern variant of ' + currentPattern.key); -} for (var i = 0; i < pseudoPatternsArray.length; i++) { if (patternlab.config.debug) { console.log('found pseudoPattern variant of ' + currentPattern.key); } - //we want to do everything we normally would here, except instead read the pseudoPattern data -// var variantFileData = fs.readJSONSync(path.resolve(paths.source.patterns, pseudoPatterns[i])); - //extend any existing data with variant data var variantFileData = pattern_assembler.merge_data(currentPattern.jsonFileData, pseudoPatternsArray[i].jsonFileData); -/* - var variantName = pseudoPatternsArray[i].substring(pseudoPatternsArray[i].indexOf('~') + 1).split('.')[0]; - var variantFilePath = path.resolve(paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '~' + variantName + '.json'); - var variantFileName = currentPattern.fileName + '-' + variantName + '.'; - var patternVariant = new of.oPattern(variantFilePath, currentPattern.subdir, variantFileName, variantFileData); - */ //see if this file has a state pattern_assembler.setPatternState(pseudoPatternsArray[i], patternlab); //use the same template as the non-variant -// pseudoPatternsArray.template = currentPattern.template; -// pseudoPatternsArray[i].tmpTemplate = currentPattern.extendedTemplate; pseudoPatternsArray[i].extendedTemplate = currentPattern.extendedTemplate; if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { /* @@ -62,9 +48,6 @@ if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { //find pattern lineage // lineage_hunter.find_lineage(patternVariant, patternlab); - - //add to patternlab object so we can look these up later. -// pattern_assembler.addPattern(patternVariant, patternlab); } } diff --git a/source/_patterns/01-molecules/07-messaging/00-alert.mustache b/source/_patterns/01-molecules/07-messaging/00-alert.mustache index b5e479b31..a28ce7ffe 100644 --- a/source/_patterns/01-molecules/07-messaging/00-alert.mustache +++ b/source/_patterns/01-molecules/07-messaging/00-alert.mustache @@ -1,3 +1,3 @@
{{ excerpt.short }} -
\ No newline at end of file +
From f439082bb04509c1cba730b5584c10b3074206aa Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Thu, 10 Mar 2016 20:35:39 -0500 Subject: [PATCH 115/162] unique data keys --- builder/.list_item_hunter.js.swp | Bin 20480 -> 0 bytes builder/.pattern_assembler.js.swp | Bin 45056 -> 0 bytes builder/pattern_assembler.js | 19 +++++++++++++++---- core/lib/list_item_hunter.js | 24 ++++++++++++------------ core/lib/patternlab.js | 5 +++++ 5 files changed, 32 insertions(+), 16 deletions(-) delete mode 100644 builder/.list_item_hunter.js.swp delete mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.list_item_hunter.js.swp b/builder/.list_item_hunter.js.swp deleted file mode 100644 index 56811ab4e91526e64f1b78dcf775ab8ad0de813d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 Il}48JFLp2g-T(jq diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp deleted file mode 100644 index cc5cc9543bd01ab23ab38b6a8972ee1226f88841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45056 zcmeI54V+wMeeXxGty)1U*pFzvpOX;SnPg{XH;KFiLkuLr03k~@fMqwVXJ^jtPIl&; zan8(cHp!y)_0tMgE7%JcQ7oFIrFhf?p?R! za-Js-SN|Dz8?IL`)q{##UnzC@>d zopbtguO5(QK!E`T1{4@jU_gNZ1qKutP+&lT0R{dGQJ~#?X6{w=_axJ2tH3|a{B1vf z-26RnJ{y_$KVkm1CWD7E@1J4*o-&`?O~JPOA2ZL3=JWQ<`=^`dqvrFz%=>4W=VzGD zZ)e^=%RIlze6BYgw)LNEo}X_%ugJVNj|U$E3JfSPpum6v0}2c%FrdJI0s{&RC@`SF zfC2*w{D-7~Tg~Opqva=yzKj3g>i^$+PA>Op@Ja9v@Jrz5!6uLg8^BrMdEgB2^;2`X zuYtS35ikp8zz%RG_>)s|xtqc3z)fHYbU+(C8+`KFx!eNS1ug+)unBAg@Bc~a2Iqip zqR9Uf_&oRw_%wJkI0{|_zKS8>AHXNTUxU8__keF=fVdyr2krsy0C$6B@B;8r3>be1 zZUt`yzXo0hTyO#S7zU7!f?ojhU@Q1CMvJ$Dd9V{~1TO@qgHyn>!9y4>J__yt{~g>6 z-UzM-=Yki5b>J%)AU+Fz2iy(r0>23^2V1~98J|1AZQxeW0vCfakg+=nJi#A_pP8WL zwF{lYJlN;9=Snm6AZX>)uPxWF2912d+33^?WRpA-#bWKy zFrT$U>d(XKkHhlEk-~*ex$K2?8ego|LYFX;B7b;JrPHb}B|8w#b!KMjUOv#YDVOKk z?dG;}Ic&R?`C!3o(Tc?qv?;%`<3Yy256kCnK5y%mEfEO+u)E-fl~%3Ujwzw(;W&mOjgC|^=apKXPiRaY8aC^0+Z%SOZrd$rdM!I%J@m}T ztugDc({x+ynp+P|A+;GNA3f4zqo;vw0#s{xuk6%XUVg|v8&a90vDS?o)8Rguwk9e} zj=b$}93xaRzlNn|C!C{ADtIW-%364(w`eD7xlF^`a~|DM>6}{V_}=2Ma~R4wQi8+m zlmv?GLTEeb;!nq!Zh7v!rlurNRnXxX=;OtYdo)tdE%PEyshZ_ZhrF0$y-<2}$?=Y` z3_>O(lV-8S;-Ot`o5AxMp5M+%#Z;}vLG`6%3)sGWyX_xAR1txw+a|H(aG2F$;4FF& z!KC=HX&Y? zn>N`tC>A4QL{2yYHPtj>%H_bXFGYi*21NQBjgC_dywD$NTh7EAhSLyN4_#siWCg&v z{P_v<&=Tg-R?ulWo1CHI5dUXhUg-f-XNX;bdfc<#x_FC(((XNqSbGXGBDs&}*ya+BMymGM4$dZCGD;p&oge zRt^0G>X`n*`$^J@OKf?w9?TsgYwo4~CVe@7?ATd(r?8`tmwhe2_js)!8&au|XX`rN zUJQ=6=USe3d?x6$j?dH>S=q?tCNg5+G=|| zmYn*R+Kl?70R1V+)o-dGNh@WkClunhmkQFd<>m6MG(4i$OwF&xJE!S!Y6?9SggSQY zqWpw&sIVhHF}XNdoGeY2Z#cB6kl(Rwa@)kt;&pEE=t%K`;?!{-?%-+uxKo(SPh3A) zIJ9xHAlW2y&(4gQEyoU*o*(71bkt!3x4WL}FF7>BvAbQ-XVGqSmY1Ey8szrv=*Mg6 zN01Pk)CTwu4$y{95+@sGsbi=TLLr!^P95s4L#+ozss*>+@$xf4ux7qA{WYlONz_pibnWn2YxZWu`3!|mc z(iVQ%JTiK2uDmfP`u`iyZ*M{e7X9D)zdwRbe=ZmS!$9ZC&ILaK{vO@_Veod)0Y10@JPVu*{u15( zPH-DI1ct%c;30JT-vF-%SApk)p8{W`KcefuAG{ab3;q}QJs^F(5e$9?6c|uoK!E`T z1{4@j;75Q0NYtIWSMrWDgH}6?HThUpLmFFFIzRu5OlgH>tdpU)3!{%1XCk2iv{hg{H(*6K+e0e6f^d<=*9CRd{4BO_%;MuilK!3eHa$|PFw zk_}n4td$#uuk58r`ZDIjV%3#jOqD8?8th~p zy>n!HXN(22UfWP@dWmt(gCxOCMWl*|JH0eTqGW~HJbkKKtoeShc(sqtQ9bC+h6&ra zX@aRuC!Ff2lv8bzCTp|GVbshn8fLsL@$@m}8y5}>#5iP<#V1nt>Bkxk{CeG{5-014 zyCI8JI%7N$*;-dIrs`_qM9Df#Um{8go5&WwqCHXL~AfJt+ydh*C6lI za7?jk8mZwnedua;qSP@%x|Iz{iJDBAOleK?DN(THFJpY_(ZjXY-^b{(YUQCAYo^#2 zw6*35wji>atx#Xzq76kc3)t-@-gK<(-Wt@Er{r)L_3*{;0*Am=<)9WcY`Ic4LlG0AN2SKz+ZqjfY*ad!O7qo z=<*MP-v+mX{{bFHcmF;R{r(s@3MPQ~@t+C)O#JoWkHHO~3{C zs}(O-xkN4nz1d0$88@{&!l4>0uB`((Nw0raY(~y`LM_hO!q-B?6H2Toz9LDUba7FS zpL9u<3Vp|F=#rpQuR4Cv*1i}cwkWr&=)R5)l~AJN<=#>}`r;p2mmWD08>1F$r;N&H z<`+{otALsO6r7ZWjO-(AC#psVvn-{9SD0xkPDGWDi=@@^!e-!C#evha4OBt>IP85J ztubcgVF`n2dBj*%ynMNzD_s2GX(xEvd%3D-eApS%+!MVsOj#?c+npZB@YmHi4!U(nJOWb4< z|JSZHh{M9MWd^cDXcH-YiD#*Hnz*_6OlgPDVG=LaIWI-Y)Q->foy@( z2;`ICN=+?GIon-A*}NfQQky~3nIzeY(+8HZ}``2iva5Rila~&dlS|z2;M^6cNO-;QtQKDpCG;j$jM20*f=1kkt zg<(QXkE*j!b7eAV^7Ly_!M5FwYri#QsT|GEAK-e5S{Zj;$CyQ{V$AU4uGPeH6koWt zA=yyDRCG*C1)?pp%a7cRc&YVjNqRB$Hm$5O7U>n1s3fAMZh{?zRf=PMcbO0~Su8<% zEG*IgUxUspzH`z4i$?IhA6@@Ga2wbSE(BY^i@-BL4m^(D|4wi%7zN)#_rDYP;4-ik zIN+zj|3m-(6nF^y9#{lV2jchtUGOgOOW-na5!ecb!6xu6>;U(H4}sT$4d5*BC~f{l z@C!iNUj^5Jjo>@<=>c#D2*IU5>;qrJ4sbts6F3aEgXe-TV*~gS*bGhqe~c~QZQxGO z0$aeT;6Y;bKLS1seii%*cq#ZUG5U{!PlC6ATfoiW+r;I63;ZEygAg19rvr)Ezn=>T z?gJmP7ZDixul++d2K~cSGGe|KI{WAVD@vrs4yp^(Li#}P8wh?fXDr)=8Uw*^AowX3 z@gpbr8CKZ)Lyjpm3E;Dq5pZpxA=;B~T#`5( zP833A$YGwYwJIx?TW_Eq@c60x9mgp&L$6Z}tlc!}8YFf%(;Pc>I!(r2Yy#>yrL@=_ zCMwyn&?!@8hdbrypg9+ptTgJaWKuSb)Z3K6mnxBw?Y6>kvJwMYz~L5|YI9*JB&?Yz zW@9Kpr%II}eo%3Wa_llTr6gL^b&M?8HkCPR<PIqd!n&wzi^(#rS+eVerXPK_ z_7ui9(NHcYueG+RGiy2B1P4O_rXc*rauCpl?4U6(R<}uKd(g(@?5bNeUdYYKu~N9? zSMqW~PhxzIC9>#e-RmvvOw%?DCqwGAT4tTjFamO-OWxnGQLXqPON4lu>N9IH)v`LG z${`I*t(@LDvlF^pj?)$5qm6Pv#d9{R2z`|LVMm`ztOjztPn}KVcK6yWA?|*gFnrd6 z{HD(x3I}FZsw1v?#mW@w-+Yx&hsmcVrg|Q&r+D?2%hf<^+?*tuHMEDtVgt&1tya*o zmb>KQk2Ci%m#8R#V%YR5L@`u!&5H9%(^oMhcacOP}rSIA?EpZo)fc$i4l&+a-fK(2RUYxIs0k%08y7EpYRc$G{z(m7!qORSh zyU)G08?h9tI|zhr&2)|)UDD^GWH*K7=@a%dZmn+2^p^VeQ-)+se&O@HvRwWN%ojyxnTp&+A*a@8zM3_B z(x0YmV$or$G~piVAqVB!u3wQ;i%N(s#PvuC zlBP80hWi)&u~vXQ)xxr@M(QeW+$bbVO*gBy9#9T2uWFpq*~bt!`zUslzvOJrj9-5?e($p{ zD$nBG#&f=5ba`3d4C|-)kKif8%tG#Apn*T=;*So`t+w`i@B1{QUW?su?pigLWm4*u4b|i9J zRd4FF^_k)l)G<$D;!GZ!lq2=mPcB2B$>m9o`9mQ{wqf+_i((3Ss$q(51K#ZJBhCEKB<-I(#$^DL z$IhCZynb@Be9oaA^oH(i6v0-vyUH39^~1d2?T!Nf@o$KFIBslr_(byP7Kf6oOi7Vhr6Ou~DhL_j}V2y_#g&smoZ@ z{-YNZY(`dDw48d(w%vL%B}QL&Q#h5PW&CH{Z+RARs4lmj9mHsY8b;a8v-C0O<*sF^ znZ`>Ehf4AkA+d9iJ_)^LDw%06UhoxI(HgU4+oQ7C?!>j}igY7YJM{h;U-VKUqlgxZ zHTWFdvdVoM;`z5Mgp{q0PaKIOoLH?B*kFhS3Wn+&bU8jk)C=x=9cLl#GM!2duns9u z(g9^A#@G}Gbvpi{i#K1cqd?&j?k_xa&diWS#l>4*gR8SdI;;^~LQnxY#1~zy$yso| zBTY3<^HepBB0_jaD)mlP8fcb!C>{2w%oR&rL=Czrwrd+fLxCyoZ5O@$v|OEf`JpA* ztGyA9*Vw#~xM?C+z!gws65&hI(5NUHY%M`4K0+_J?+BZ0 zii!~pviwAKs!v*~uosAlIn>b24x0URl)bhW;WcIC|8&RF)u~ij`AHrs0ZR0LMD$!9 zol^9F&*+igLC61B@F;i$d=Y#Iyav1)TmsGmVhecaRCIap3a|%k1J4A{0PjQJp95Qf z!~w`%f8R#mzZ)C{hrl?v9P9>L!3dE1|Nae~|5M;?;8oxnumebZz{A)9J_qgr`@xl< z0Oan!uK+nOumPL}o(2}s`8(h$Aou)xl|75)A}@Bp|6YzNN+az5be z;BK%F>;M;l^TG4MC(z;l2K*dY4@95;9C#~ef;n&yTm;Sqd9WU=17C&q4}cGX_krIB zH-p2V1~vm3pCRz?^&@Pc-QwyUHK7Uf6J1Xh22oSi&!EI5g3an^$x81LHf0HNTRDjZe>6C)b|D`mfa}@XK(8 z2DU|s8WUMrHUg_9t7@nNSzX19Vt`P$@5SshSyTK}WLV_ZzGg#Pc``?QGHr!8ummSf z6D%c|!bWC7L?gE<;>fs|kA+@Q=6KjFanzkKstk1{jHH%Zlp=%8&<$JxlML-Fm-{(- z3wkSN(^XN1Q`*RCY!mo(;=P@O#M6n?1fS(16K%s)J2mv9X=;!eY-vig`)V74nolMh zE(UR8Webvu8XnPr+Z?Hc<#A!fP;7vJM$@l2%(*hE)rs_Gk_^+av)S zsAec;9*GJhv)WQQUX_U`QduHO#GaE-LFuz1MWXXUKHCqQbQu5P8i_TsQIuO1akx{ zJ?s+2&pb<9NGX5Y+zz9kd{-)K8F*@j5}7+g1#3>^n7GGvJ;rBA9+^7zxqO@;RY{4! z=VS(3kRqd4AENs)XTqZDfld(#`{@O?7mc{jvFfB%h;<)y+RaXT4@6TdUlX<2nZ}G7 znR=1!c&_5U%%>cak4apbYd7jb<&x1v^aGrB_+7Y9Xi9D`;#Q)P{fhmZrM15U8UW2Q|i@TTZ(2!KbY1g_qWm>q;0^o7(20Hdy-$-R&Zs z+GAv27ws|KoTTrarl4RYZj9)EEH~ALxMlOo&>3wsDZ*+=L{>hJQ4J$oMwa=-3DfJ0 z9KvnpynKSm(%l3Xkri81xoTcGR4DDN*I&k?-LhVJ5|=#Fhxtf~i1}zHGN$Lj!C=q0 zUE)!PMKVir9%GM&dv4Zs*}c$yCWRfiF6kzk>Z;}G!=wDBGdcW-P-3jkQ7RGMWNTA~ z(8P6gO471MU}fu-Ta`IPB6_&y}>LsBb*fQU^`M;i8?p zc8`@7#a&pj;YM#gvG%JTD6^)HFALNbuKH<-Bq~2*(4vbsKq!Kv0znjT-EFHDu+-#& zx9A7ia}3k6IvEigB^sVbXAxbH1T!qU0lsffT#ol|9PdA8{ zW?t$HNqQwIcFbJTqEkHqIvvn=N{7y7Gq|)`?)=5P9!BG9n@jo8l!@shwVK9@9|SuT z*N~%}h-kH6iE_!2hnD;08e&aHrGJ>rieh$-+2Ui#TJ#-te|l49rR1Sl#M)lBh|hMg zTNlZ}J>Qz{q~FZqRv!q6(5+8aKhURxieeCw5Q$u35vNB>4^^)<>v!sPW5{1t{{R1m zQu$u-A*27>@8_FCua`UizmE?8DexMw1VZ3~ec)0c`u;lb2zvb&!R_D*upX=f-$#$P zasMCSce&#~559vA{{iqvK;r(d1ESww4fcblfp??N{|=~w7lTL8<8K2ugYDpj;Ctxv zp9c>Ex!>>S!OKA&41trt!|3&*>)!-!1a)u;xEPE82jsxx==t}8W8f&*2mS@!{!8Ft z@Hz17K<@hgIy(M+;1(cv`Cke4fZgCU@P(6exjz7Rg4cqr;054J@HO=KF95m6-vd=} z2KZaXK*r%-8H*Kv^onvsgWVv89 zp{Sw0GDb_8mNLk5;s=iwq>6A-Bw;f`Tf@f`)o1r$OLnO+rju>IeJa!v0wtfv!B5b~ zG+!hQ5rJ&Fl)*-IT?pC3Ok?{dHbgldsfT`T=e)^a*InTI-$>f_=;wZR^QXHYf))x(lU%Pmf;dkj)v*7 zgsYTR8y6w)y7WMZeZmN1=@(r>y0&OUJ8o($jBrT#h6>`*i0p3KQehjHu7(-RLNb$B zU%e%r>p4Hn5mi%wo%u3?@ggvC11?%=f~+D%D`iPUgx8G_Iz*C_xqD{DOoG*>nMvA< z3^uuHZ#I4AbgQJb6lG+R?G~;QH&Xa#@~!-xtf-#`C6*$~z3m(s(<;;f8TbqEkdN9zj{~ z(VtY@t!!nZ5#w^TfDjjm)QX8=Il1T#iX}o*f{nM_8>#$zY?rFwmL2SQnHl zR9|CgBVuGsxeL1k3s*cI2Fs$BARNOnMHV*(3BAi&vqJ!b`4Tlf>#SUqhC18b#Y}`f>cVXbgVV{U+_a3;}fyqRW-B zKS^KUk$p*i7GdgGO{Tf>x`(4A(;(}_$~>0gls2Fft&bb6q{{X5P5l2aLf8HkAo~9q zM(>n!|5t&(L%06~_#3bY7Qj~UCUpB38~y%!=<^cG?|}&*{`|)%PxSlOnzHBkycj%= z9)CZ08@Lm^0{k<2{5QdSfCuCp|7qY+boXBb@*RE0!Cr6%kXZf?qObotmX%t?|Xq2SO#wvYRr(8 z0;guj+AP&p=fjU9s-ISX8REEJ?XibN&X+bSwMH|0{%qpv3X9X+lp~K^BxSxbhK#X% zlQNfE^DtFvfd!RH={Yto3n5(C1zT}LJZ`4SYxf>}+5W2!^35~L%l13QbjTE@2OZEw zF8m29URC=pEP0UY%{EK366&m>m#RY4HwmC(AEE(51SRh4YlSqcF{(-8IE*CQKYe&- zIBw6x$T(TXWIy94@-~x)LCQRdd~4G4efmpJ2w=o9b)<e@$#sC$o)F9Wdb_Qbh8(W@(m- z32F3qv85Ypk7r=9nHW73c?2R;Y9eYgkue)!Wt*Q!VvL>=I294U#}KJ-PQLNWpFgnM z3`J%X$)qNV-k57MOJYhkNp(I_h~syDvJ_qWb!d}(RaZ{hC2ERJr@xaiG0ldPjZ04p z(eL`KyB=;TTBNTYPkLvTbIUn7f}FVjYV5%NOLmWsI|ujf+r3Rqf_$vk61QjmP)e=% zMf+smedR8lJI<^U$A3bSU5LmfF1057qwI{1jEr;@w`=FYozD2)>vlU)ff-7tx3Pj5 zcA3Z*i&!EvHl4(N-C-QXGP1cCv}Rqu7B<2%e_-xW3Qc)r#Qt7{5#x_d1`64@7d3*c z#FR7;#SPQTq%km)N~}||`9laX&aRL$eNm&8BD<>XlKEnZQ@EkF({j@lyi)?`qgWeE zPwA$~ILpBRWp$e2OYMYDH#9#<3Ug1;W*3>QwABqpZ22=>N$m(w#h9w}8c8zNUMj!2 zHcOr1HDzT*w4`;2-;>9E^{HO7WDTF|es3n1(Y;x?W`D7}bdMq(cNUMFR)FI3+G5np zDpY1)*I}GVGfc^>nZ#Lmqf)Na!Kg2Zuf{V4DZNX?OOaz8HuDOql6b_;Zfu%n>7Je# zJq&!AsneAr+T_YFIXipABYDC@%~0CGDUGT+pm{PFu)*e)2^N(XDdOFQ+O} z|H)RZ(h0kcPq>(wI;KrM>C-BbPqL-ckiXY0j3<72MYl~{$Z{yjG)^5N$J8Z(g+#0o zQ>Dx_SWo1er$fGax+-@V3X3l_f};r4Zizjx?D@s3$5|wmuzamIUA~NOmmXK&E?vH~ zgHTvLpdCC@yN@)v-a#3&&bnG`=2ND|skp|RZkhZqhoRJcsQR8nYY}5zM>~)ma*lRc zr%@?O_{_*a!mgt){U=VB1vNFU$;sznVd-J6R&fEHhBuXdi;k1LP7PmU?@LgVyHCWN zg*d{r#5QFnPk1eycs%{(lYNSeB0i-Up)y6u=4mFpoLF%r8d^1YpZRhGr5(tXhI&9G zefqu9=|nM-SEh4H|Ce**=cCVx{(qIx{~t&9|DT`+P6FRW=l?hGL2w6nGnfRAVFUOz zFaZic&i9`KK8y|EEkN%1>wq?p*nYY1?-B5NAU1&?1K-02@Llj{;AZefa1nSe_$qdQ zj{v#%zYRhl-|r`P|Gx#az!qT7`F|W6z;A=Qz#ZT=a4T@Z*CKLo4Dz_64bdMXS{qPOE-ZAiHG z3ihJ4TbAs!Sh>7`{V6i_qn#$LOeUCRV1H_1=8COak&5#q>`z%9(x0KFt$X4KMlo|z5oCK diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index cbbb737e0..2d70e2bbd 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -172,7 +172,18 @@ } } - return keys; + var uniqueKeys = []; + + //check keys array against uniqueKeys array to eliminate duplicates. + for (var i = 0; i < keys.length; i++) { + if (uniqueKeys.indexOf(keys[i]) > -1) { + continue; + } else { + uniqueKeys.push(keys[i]); + } + } + + return uniqueKeys; } function getpatternbykey(key, patternlab) { @@ -571,9 +582,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //console.log('PROCESS TIME: ' + (processEnd - processBegin)); } -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log(currentPattern.dataKeys); -} } } @@ -676,6 +684,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m winnow_unused_tags: function (template, pattern) { return winnowUnusedTags(template, pattern); }, + get_data_keys: function (data) { + return getDataKeys(data); + }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); }, diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index ce9182f3f..dc6d612c2 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -38,9 +38,9 @@ var list_item_hunter = function () { var end = liMatch.replace('#', '/'); var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch) + liMatch.length, pattern.extendedTemplate.indexOf(end)).trim(); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log(pattern.extendedTemplate); - console.log('patternBlock'); - console.log(patternBlock); +// console.log(pattern.extendedTemplate); +// console.log('patternBlock'); +// console.log(patternBlock); } //build arrays that repeat the block, however large we need to @@ -53,8 +53,8 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache } //check for a local listitems.json file - var listData = JSON.parse(JSON.stringify(patternlab.listitems)); - listData = pattern_assembler.merge_data(listData, pattern.listitems); +// var listData = JSON.parse(JSON.stringify(patternlab.listitems)); + var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); //iterate over each copied block, rendering its contents along with pattenlab.listitems[i] for (i = 0; i < repeatedBlockTemplate.length; i++) { @@ -63,12 +63,12 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache //combine listItem data with pattern data with global data var itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" - var globalData = JSON.parse(JSON.stringify(patternlab.data)); - var localData = JSON.parse(JSON.stringify(pattern.jsonFileData)); +// var globalData = JSON.parse(JSON.stringify(patternlab.data)); + var patternData = pattern.jsonFileData; - var allData = pattern_assembler.merge_data(globalData, localData); - allData = pattern_assembler.merge_data(allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup - allData.link = extend({}, patternlab.data.link); +// var allData = pattern_assembler.merge_data(globalData, localData); + var allData = pattern_assembler.merge_data(patternData, 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 /* @@ -109,8 +109,8 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log('repeatedBlockHtml'); - console.log(repeatedBlockHtml); +// console.log('repeatedBlockHtml'); +// console.log(repeatedBlockHtml); } }); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 31a5da620..00c3c9c57 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -85,6 +85,11 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data); + patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems)); +//console.log('patternlab.dataKeys'); +//console.log(patternlab.dataKeys); + //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, From f9191e88e060b1f4ff9d148cbf537563aa9ac8f0 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 11 Mar 2016 06:33:03 -0500 Subject: [PATCH 116/162] view all works --- builder/pattern_assembler.js | 6 +-- core/lib/list_item_hunter.js | 64 ++++++++------------------------ core/lib/pseudopattern_hunter.js | 5 ++- 3 files changed, 22 insertions(+), 53 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 2d70e2bbd..d8377aa35 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -257,19 +257,19 @@ pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); //render the extendedTemplate with all data - pattern.extendedTemplate = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); + pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); //add footer info before writing patternFooter = renderPattern(patternlab.footer, pattern); //write the compiled template to the public patterns directory - fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.extendedTemplate + patternFooter); + fs.outputFileSync(paths.public.patterns + pattern.patternLink, patternlab.header + pattern.patternPartial + patternFooter); //write the mustache file too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.mustache'), entity_encoder.encode(pattern.template)); //write the encoded version too - fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.extendedTemplate)); + fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); } function processPatternIterative(file, patternlab) { diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index dc6d612c2..3de42a2c7 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -25,18 +25,18 @@ var list_item_hunter = function () { function processListItemPartials(pattern, patternlab) { //find any listitem blocks - var matches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); - if (matches !== null) { - matches.forEach(function (liMatch) { + var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); + if (liMatches !== null) { + for (var i = 0; i < liMatches.length; i++) { if (patternlab.config.debug) { - console.log('found listItem of size ' + liMatch + ' inside ' + pattern.key); + console.log('found listItem of size ' + liMatches[i] + ' inside ' + pattern.key); } //find the boundaries of the block - var loopNumberString = liMatch.split('.')[1].split('}')[0].trim(); - var end = liMatch.replace('#', '/'); - var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch) + liMatch.length, pattern.extendedTemplate.indexOf(end)).trim(); + var loopNumberString = liMatches[i].split('.')[1].split('}')[0].trim(); + var end = liMatches[i].replace('#', '/'); + var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]) + liMatches[i].length, pattern.extendedTemplate.indexOf(end)).trim(); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { // console.log(pattern.extendedTemplate); // console.log('patternBlock'); @@ -46,74 +46,40 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache //build arrays that repeat the block, however large we need to var repeatedBlockTemplate = []; var repeatedBlockHtml = ''; - var i; // for loops + var j; // for loops - for (i = 0; i < items.indexOf(loopNumberString); i++) { + for (j = 0; j < items.indexOf(loopNumberString); j++) { repeatedBlockTemplate.push(patternBlock); } //check for a local listitems.json file -// var listData = JSON.parse(JSON.stringify(patternlab.listitems)); var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); - //iterate over each copied block, rendering its contents along with pattenlab.listitems[i] - for (i = 0; i < repeatedBlockTemplate.length; i++) { - var thisBlockTemplate = repeatedBlockTemplate[i]; + //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] + for (j = 0; j < repeatedBlockTemplate.length; j++) { + var thisBlockTemplate = repeatedBlockTemplate[j]; var thisBlockHTML = ""; //combine listItem data with pattern data with global data var itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" -// var globalData = JSON.parse(JSON.stringify(patternlab.data)); var patternData = pattern.jsonFileData; - -// var allData = pattern_assembler.merge_data(globalData, localData); var allData = pattern_assembler.merge_data(patternData, 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_assembler.find_pattern_partials({ 'template' : thisBlockTemplate }); - - 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.get_pattern_by_key(partialName, patternlab); - - //create a copy of the partial so as to not pollute it after the get_pattern_by_key call. - var cleanPartialPattern = JSON.parse(JSON.stringify(partialPattern)); - - //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.template); - } - - //render with data - thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); - } else { - //just render with mergedData - thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData); - } - */ thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); + //add the rendered HTML to our string repeatedBlockHtml = repeatedBlockHtml + thisBlockHTML; } //replace the block with our generated HTML - var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatch), pattern.extendedTemplate.indexOf(end) + end.length); + var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]), pattern.extendedTemplate.indexOf(end) + end.length); pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { // console.log('repeatedBlockHtml'); // console.log(repeatedBlockHtml); } - }); + } } } diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index c3ad46cf2..ee57e4b04 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -47,7 +47,10 @@ if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { } //find pattern lineage -// lineage_hunter.find_lineage(patternVariant, patternlab); + //TODO: consider removing the lineage hunter. it only works at the + //iterative level, and isn't called upon any further. we need to keep the + //patternlab object as light as possible. + lineage_hunter.find_lineage(pseudoPatternsArray[i], patternlab); } } From 50e6ee339a72ef806b2a6f10fd57bcaa91add86c Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Fri, 11 Mar 2016 08:25:09 -0500 Subject: [PATCH 117/162] freeing more memory --- builder/pattern_assembler.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index d8377aa35..12a135443 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -270,6 +270,13 @@ //write the encoded version too fs.outputFileSync(paths.public.patterns + pattern.patternLink.replace('.html', '.escaped.html'), entity_encoder.encode(pattern.patternPartial)); + + //since we're done with these pattern properties, free them from memory + pattern.extendedTemplate = ''; + pattern.tmpTemplate = ''; + pattern.dataKeys = null; + pattern.jsonFileData = null; + pattern.listitems = null; } function processPatternIterative(file, patternlab) { @@ -292,10 +299,14 @@ //make a new Pattern Object var currentPattern = new of.oPattern(file, subdir, filename); + //see if this file has a state + setState(currentPattern, patternlab); + //if file is named in the syntax for variants, add the variant data to memory. //processPatternRecursive() will run find_pseudopatterns() to render with the variant data. if (ext === '.json' && filename.indexOf('~') > -1) { try { + currentPattern.patternName = currentPattern.patternName.replace('~', '-'); currentPattern.jsonFileData = fs.readJSONSync(file); addPattern(currentPattern, patternlab); } @@ -310,9 +321,6 @@ return; } - //see if this file has a state - setState(currentPattern, patternlab); - //look for a listitems.json file for this template try { var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".listitems.json"); @@ -398,7 +406,7 @@ var processEnd; } //output .json pseudoPattern variants to the file system and return. - //diveSync should process these variants after their primaries, given that + //diveSync should process these variants after their originals, given that //tildes come after periods in ASCII order. as such, their extendedTemplates //should be filled out and renderable. if (path.extname(file) === '.json') { @@ -568,13 +576,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); - //since we're done with these currentPattern properties, free them from memory - currentPattern.extendedTemplate = ''; - currentPattern.tmpTemplate = ''; - currentPattern.dataKeys = null; - currentPattern.jsonFileData = null; - currentPattern.listitems = null; - if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { //console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); //processEnd = Date.now() / 1000; From 0f20fe93d55a8b6a00e1575300d7106cddc82dfa Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 12 Mar 2016 10:02:55 -0500 Subject: [PATCH 118/162] everything except list items --- builder/parameter_hunter.js | 10 +- builder/pattern_assembler.js | 207 +++++++++++++++++-------------- core/lib/patternlab.js | 24 +++- core/lib/pseudopattern_hunter.js | 7 +- package.json | 4 +- 5 files changed, 145 insertions(+), 107 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 85f417490..2d15da1eb 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -129,15 +129,11 @@ var parameter_hunter = function () { for (var i = 0; i < parameteredPartials.length; i++) { //limit iteration to one time per partial. eliminate duplicates. - if (uniquePartials.indexOf(parameteredPartials[i]) > -1) { - continue; - } else { + if (uniquePartials.indexOf(parameteredPartials[i]) === -1) { uniquePartials.push(parameteredPartials[i]); + } else { + continue; } -if (pattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { - console.log('unique parameteredPartials'); - console.log(uniquePartials); -} //find the partial's name and retrieve it var partialName = parameteredPartials[i].match(/([\w\-\.\/~]+)/g)[0]; diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 12a135443..f6901abc1 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -84,9 +84,14 @@ patternlab.patterns.push(pattern); } - function findListItems(pattern){ - var matches = pattern.template.match(/({{#( )?)(list(I|i)tems.)(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)( )?}}/g); - return matches; + function renderPattern(template, data, partials) { + var hogan = require('hogan'); + var compiled = hogan.compile(template); + + if (partials) { + return compiled.render(data, partials); + } else { + return compiled.render(data); } function setState(pattern, patternlab){ @@ -116,73 +121,47 @@ } } - /** - * Render the template excluding partials. The reason for this is to eliminate - * the unwanted recursion paths that would remain if irrelevant conditional - * tags persisted. Targeting non-partial tags that are not keyed in the JSON - * data for this pattern. Those will be deleted after this runs. - * - * @param {string} template The template to render. - * @param {object} data The data to render with. - * @param {object} dataKeys The data to render with. - * @returns {string} templateRendered - */ - function winnowUnusedTags(template, pattern) { - var escapedKey; - var regex; - var templateEscaped = template; - - //escaped all tags that match keys in the JSON data. - for (var i = 0; i < pattern.dataKeys.length; i++) { - escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?[^\\}]*' + escapedKey + '[^\\}]*\\}?)\\}\\}', 'g'); - templateEscaped = templateEscaped.replace(regex, '<%$1%>'); - } - - //escape partial tags by switching them to ERB syntax. - templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - - //render to winnow used tags. - var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); - - //after that's done, switch only partial tags back to standard Mustache tags and return. - templateRendered = templateRendered.replace(/<%>([^%]+)%>/g, '{{>$1}}'); - - return templateRendered; - } - /** * Recursively get all the property keys from the JSON data for a pattern. * * @param {object} data - * @param {array} keys At top level of recursion, this should be undefined. + * @param {array} uniqueKeys At top level of recursion, this should be an empty array. * @returns {array} keys A flat, one-dimensional array. */ - function getDataKeys(data) { - var keys = []; + function getDataKeys(data, uniqueKeys, file) { + var keys; for (var key in data) { if (data.hasOwnProperty(key)) { if (!(typeof data === 'object' && data instanceof Array)) { - keys.push(key); + if (uniqueKeys.indexOf(key) === -1) { +// keys.push(key); + uniqueKeys.push(key); + } else { + continue; + } } if (typeof data[key] === 'object') { - keys = keys.concat(getDataKeys(data[key])); +if (file) { +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +// console.log(uniqueKeys); +} +} + getDataKeys(data[key], uniqueKeys, file); +// uniqueKeys = uniqueKeys.concat(keys); } } } - - var uniqueKeys = []; - - //check keys array against uniqueKeys array to eliminate duplicates. - for (var i = 0; i < keys.length; i++) { - if (uniqueKeys.indexOf(keys[i]) > -1) { - continue; - } else { - uniqueKeys.push(keys[i]); - } - } - +/* +if (file) { +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { + console.log(key); + if (key === 'headline') { + console.log(uniqueKeys); + } +} +} +*/ return uniqueKeys; } @@ -279,6 +258,41 @@ pattern.listitems = null; } + /** + * Render the template excluding partials. The reason for this is to eliminate + * the unwanted recursion paths that would remain if irrelevant conditional + * tags persisted. Targeting non-partial tags that are not keyed in the JSON + * data for this pattern. Those will be deleted after this runs. + * + * @param {string} template The template to render. + * @param {object} data The data to render with. + * @param {object} dataKeys The data to render with. + * @returns {string} templateRendered + */ + function winnowUnusedTags(template, pattern) { + var escapedKey; + var regex; + var templateEscaped = template; + + //escaped all tags that match keys in the JSON data. + for (var i = 0; i < pattern.dataKeys.length; i++) { + escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + templateEscaped = templateEscaped.replace(regex, '<%$1%>'); + } + + //escape partial tags by switching them to ERB syntax. + templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + + //render to winnow used tags. + var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); + + //after that's done, switch only partial tags back to standard Mustache tags and return. + templateRendered = templateRendered.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + + return templateRendered; + } + function processPatternIterative(file, patternlab) { var fs = require('fs-extra'), lh = require('./lineage_hunter'), @@ -356,9 +370,10 @@ currentPattern.tmpTemplate = ''; //find pattern lineage - //TODO: consider removing the lineage hunter. it only works at the - //iterative level, and isn't called upon any further. we need to keep the - //patternlab object as light as possible. + //TODO: consider repurposing lineage hunter. it currently only works at the + //iterative level, and isn't called upon any further. however, it could be + //repurposed to target and render only those files affected by a template edit. + //this could bring an enormous performance improvement on large projects. lineage_hunter.find_lineage(currentPattern, patternlab); //add currentPattern to patternlab.patterns array @@ -393,9 +408,11 @@ var i; // for the for loops var paths = patternlab.config.paths; -var processBegin; +var processBegin = Date.now() / 1000; var processEnd; if (recursionLevel === 0) { +//console.log('PROCESS START: ' + processBegin); +//console.log(file); //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -465,14 +482,37 @@ var processEnd; } } +//console.log('ALLDATA SIZE: ' + JSON.stringify(allData).length + 'B'); +processBegin = Date.now() / 1000; //add allData keys to currentPattern.dataKeys - currentPattern.dataKeys = getDataKeys(allData); + currentPattern.dataKeys = getDataKeys(allData, [], file); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { +// console.log('currentPattern.dataKeys'); +// console.log(currentPattern.dataKeys); +} +processEnd = Date.now() / 1000; +//console.log('ALLDATA PREPARE END: ' + processEnd); +//console.log('ALLDATA PREPARE TIME: ' + (processEnd - processBegin)); //add listItem keys to currentPattern.dataKeys currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_keys()); +processBegin = Date.now() / 1000; +//console.log('LIST ITEM DATA SIZE: ' + JSON.stringify(patternlab.listitems).length + 'B'); +var listItemKeys = getDataKeys(patternlab.listitems, []); +if (file.indexOf('04-pages/00-homepage.mustache') > -1) { + console.log(listItemKeys); + /* + console.log('currentPattern.dataKeys'); + console.log(currentPattern.dataKeys); + */ +} +processEnd = Date.now() / 1000; +//console.log('LIST ITEM DATA PREPARE END: ' + processEnd); +//console.log('LIST ITEM DATA PREPARE TIME: ' + (processEnd - processBegin)); + //add listitems.json keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(patternlab.listitems)); + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(patternlab.listitems, [])); //copy winnowed template to extendedTemplate currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); @@ -480,6 +520,13 @@ var processEnd; //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); +//parameteredPartials = null; +if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { +// console.log('RECURSION LEVEL: ' + recursionLevel); +// console.log('currentPattern.extendedTemplate: ' + currentPattern.extendedTemplate.length + 'B'); +//console.log('DATA SIZE: ' + JSON.stringify(currentPattern).length + 'B'); +// console.log(currentPattern.extendedTemplate); +} //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { @@ -497,6 +544,7 @@ var processEnd; //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.extendedTemplate); +//foundPatternPartials = null; var uniquePartials = []; //recurse through non-parametered partials @@ -508,10 +556,10 @@ var processEnd; for (i = 0; i < foundPatternPartials.length; i++) { //limit iteration to one time per partial. eliminate duplicates. - if (uniquePartials.indexOf(foundPatternPartials[i]) > -1) { - continue; - } else { + if (uniquePartials.indexOf(foundPatternPartials[i]) === -1) { uniquePartials.push(foundPatternPartials[i]); + } else { + continue; } var partialKey = foundPatternPartials[i].replace(/{{>([ ])?([\w\-\.\/~]+)(:[A-z0-9-_|]+)?(?:\:[A-Za-z0-9-_]+)?(?:(| )\([^\)]*\))?([ ])?}}/g, '$2'); @@ -540,10 +588,6 @@ var processEnd; partialPattern.tmpTemplate = ''; } } -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('currentPattern.extendedTemplate'); -// console.log(currentPattern.extendedTemplate); -} //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up @@ -555,15 +599,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //switched ERB escaped tags back to standard Mustache tags currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('currentPattern.extendedTemplate'); -// console.log(currentPattern.extendedTemplate); -} - -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log(patternlab.listitems); -//console.log(currentPattern.dataKeys); -} //find and process any listItem blocks within the pattern list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -575,14 +610,6 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); - -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log('DATA SIZE END: ' + JSON.stringify(currentPattern).length + 'B'); -//processEnd = Date.now() / 1000; -//console.log('PROCESS END: ' + processEnd); -//console.log('PROCESS TIME: ' + (processEnd - processBegin)); -} - } } @@ -682,11 +709,8 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m combine_listItems: function (patternlab) { buildListItems(patternlab); }, - winnow_unused_tags: function (template, pattern) { - return winnowUnusedTags(template, pattern); - }, - get_data_keys: function (data) { - return getDataKeys(data); + get_data_keys: function (data, uniqueKeys) { + return getDataKeys(data, uniqueKeys); }, get_pattern_by_key: function (key, patternlab) { return getpatternbykey(key, patternlab); @@ -694,6 +718,9 @@ if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.m merge_data: function (existingData, newData) { return mergeData(existingData, newData); }, + winnow_unused_tags: function (template, pattern) { + return winnowUnusedTags(template, pattern); + }, process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 00c3c9c57..80b71201b 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -85,11 +85,11 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); - patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data); - patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems)); -//console.log('patternlab.dataKeys'); -//console.log(patternlab.dataKeys); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); + patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); +var processBegin = Date.now() / 1000; +console.log('BUILD PATTERNS BEGIN: ' + processBegin); //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -126,7 +126,10 @@ var patternlab_engine = function (config) { //export patterns if necessary pattern_exporter.export_patterns(patternlab); -console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); +var processEnd = Date.now() / 1000; +console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); +console.log('BUILD PATTERNS END: ' + processEnd); +console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); } function addToPatternPaths(bucketName, pattern) { @@ -202,6 +205,9 @@ console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); fs.outputFileSync(path.resolve(paths.public.styleguide, 'html/styleguide.html'), mainPageHeadHtml + styleguideHtml + mainPageFootHtml); + //unset styleguidePatterns + styleguidePatterns = []; + //build the viewall pages var prevSubdir = '', prevGroup = ''; @@ -271,6 +277,9 @@ console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); var viewAllHtml = pattern_assembler.renderPattern(viewAllTemplate, {partials: viewAllPatterns, patternPartial: patternPartial, cacheBuster: patternlab.cacheBuster}); fs.outputFileSync(paths.public.patterns + pattern.flatPatternPath + '/index.html', mainPageHeadHtml + viewAllHtml + mainPageFootHtml); } + + //unset viewAllPatterns + viewAllPatterns = []; } //build the patternlab website @@ -281,6 +290,11 @@ console.log('BUILD PATTERNS END: ' + (Date.now() / 1000)); for (i = 0; i < patternlab.patterns.length; i++) { var pattern = patternlab.patterns[i]; + + //unset all pattern.patternPartials here since they take up a lot of memory + //and we won't be needing them again + pattern.patternPartial = ''; + var bucketName = pattern.name.replace(/\\/g, '-').split('-')[1]; //check if the bucket already exists diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index ee57e4b04..fa8ed7d55 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -47,9 +47,10 @@ if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { } //find pattern lineage - //TODO: consider removing the lineage hunter. it only works at the - //iterative level, and isn't called upon any further. we need to keep the - //patternlab object as light as possible. + //TODO: consider repurposing lineage hunter. it currently only works at the + //iterative level, and isn't called upon any further. however, it could be + //repurposed to target and render only those files affected by a template edit. + //this could bring an enormous performance improvement on large projects. lineage_hunter.find_lineage(pseudoPatternsArray[i], patternlab); } } diff --git a/package.json b/package.json index 588f19d60..7241bd087 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,9 @@ "diveSync": "^0.3.0", "fs-extra": "^0.26.2", "glob": "^7.0.0", + "hogan": "^1.0.2", "html-entities": "^1.2.0", - "matchdep": "^1.0.0", - "mustache": "^2.2.0" + "matchdep": "^1.0.0" }, "devDependencies": { "bs-html-injector": "^3.0.0", From 27d3e90c325c9b84c13202351c73f6739d9c3ec1 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sat, 12 Mar 2016 11:16:14 -0500 Subject: [PATCH 119/162] working listitems --- builder/pattern_assembler.js | 65 ++++++++++++++---------------------- core/lib/list_item_hunter.js | 41 ++++++++++++++++------- 2 files changed, 54 insertions(+), 52 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index f6901abc1..3457a379f 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -125,43 +125,27 @@ * Recursively get all the property keys from the JSON data for a pattern. * * @param {object} data - * @param {array} uniqueKeys At top level of recursion, this should be an empty array. + * @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, file) { + function getDataKeys(data, uniqueKeys) { var keys; for (var key in data) { if (data.hasOwnProperty(key)) { if (!(typeof data === 'object' && data instanceof Array)) { if (uniqueKeys.indexOf(key) === -1) { -// keys.push(key); uniqueKeys.push(key); } else { continue; } } if (typeof data[key] === 'object') { -if (file) { -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -// console.log(uniqueKeys); -} -} - getDataKeys(data[key], uniqueKeys, file); -// uniqueKeys = uniqueKeys.concat(keys); + getDataKeys(data[key], uniqueKeys); } } } -/* -if (file) { -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { - console.log(key); - if (key === 'headline') { - console.log(uniqueKeys); - } -} -} -*/ + return uniqueKeys; } @@ -343,20 +327,9 @@ if (file.indexOf('04-pages/00-homepage.mustache') > -1) { if (patternlab.config.debug) { console.log('found pattern-specific listitems.json for ' + currentPattern.key); } - catch(e) { - } - - //add the raw template to memory - currentPattern.template = fs.readFileSync(file, 'utf8'); - - //find any stylemodifiers that may be in the current pattern - currentPattern.stylePartials = findPartialsWithStyleModifiers(currentPattern); - - //find any pattern parameters that may be in the current pattern - currentPattern.parameteredPartials = findPartialsWithPatternParameters(currentPattern); - - //add currentPattern to patternlab.patterns array - addPattern(currentPattern, patternlab); + } + catch (err) { + currentPattern.listitems = {}; } //add the raw template to memory @@ -485,7 +458,7 @@ var processEnd; //console.log('ALLDATA SIZE: ' + JSON.stringify(allData).length + 'B'); processBegin = Date.now() / 1000; //add allData keys to currentPattern.dataKeys - currentPattern.dataKeys = getDataKeys(allData, [], file); + currentPattern.dataKeys = getDataKeys(allData, []); if (file.indexOf('04-pages/00-homepage.mustache') > -1) { // console.log('currentPattern.dataKeys'); // console.log(currentPattern.dataKeys); @@ -494,14 +467,14 @@ processEnd = Date.now() / 1000; //console.log('ALLDATA PREPARE END: ' + processEnd); //console.log('ALLDATA PREPARE TIME: ' + (processEnd - processBegin)); - //add listItem keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_keys()); + //add listitem iteration keys to currentPattern.dataKeys + currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); processBegin = Date.now() / 1000; //console.log('LIST ITEM DATA SIZE: ' + JSON.stringify(patternlab.listitems).length + 'B'); var listItemKeys = getDataKeys(patternlab.listitems, []); if (file.indexOf('04-pages/00-homepage.mustache') > -1) { - console.log(listItemKeys); +// console.log(listItemKeys); /* console.log('currentPattern.dataKeys'); console.log(currentPattern.dataKeys); @@ -511,8 +484,20 @@ processEnd = Date.now() / 1000; //console.log('LIST ITEM DATA PREPARE END: ' + processEnd); //console.log('LIST ITEM DATA PREPARE TIME: ' + (processEnd - processBegin)); - //add listitems.json keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(patternlab.listitems, [])); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + // console.log(pattern.extendedTemplate); + // console.log('patternBlock'); + // console.log(patternBlock); +// console.log(patternlab.listitems); +} + //first merge global and local listitem data + mergeData(patternlab.listitems, currentPattern.listitems); +if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log(currentPattern.listitems); +} + + //add merged listitem keys to currentPattern.dataKeys + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); //copy winnowed template to extendedTemplate currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 3de42a2c7..b738311b6 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -19,7 +19,7 @@ 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 getListItemKeys() { + function getListItemIterationKeys() { return items; } @@ -27,6 +27,7 @@ var list_item_hunter = function () { //find any listitem blocks var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { +//console.log('patternBlock'); for (var i = 0; i < liMatches.length; i++) { if (patternlab.config.debug) { @@ -35,13 +36,11 @@ var list_item_hunter = function () { //find the boundaries of the block var loopNumberString = liMatches[i].split('.')[1].split('}')[0].trim(); - var end = liMatches[i].replace('#', '/'); - var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]) + liMatches[i].length, pattern.extendedTemplate.indexOf(end)).trim(); if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log(pattern.extendedTemplate); -// console.log('patternBlock'); -// console.log(patternBlock); +//console.log(loopNumberString); } + var end = liMatches[i].replace('#', '/'); + var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]) + liMatches[i].length, pattern.extendedTemplate.indexOf(end)).trim(); //build arrays that repeat the block, however large we need to var repeatedBlockTemplate = []; @@ -53,18 +52,36 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache } //check for a local listitems.json file - var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); +// var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { +// console.log(pattern.extendedTemplate); +// console.log(patternBlock); +//console.log(pattern.listitems); +} //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] for (j = 0; j < repeatedBlockTemplate.length; j++) { var thisBlockTemplate = repeatedBlockTemplate[j]; var thisBlockHTML = ""; - //combine listItem data with pattern data with global data - var itemData = listData['' + items.indexOf(loopNumberString)]; //this is a property like "2" + var itemData = pattern.listitems['' + items.indexOf(loopNumberString)]; //this is a property like "2" var patternData = pattern.jsonFileData; - var allData = pattern_assembler.merge_data(patternData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup + var allData = pattern_assembler.merge_data(patternData, itemData !== undefined ? itemData[j] : {}); //itemData could be undefined if the listblock contains no partial, just markup +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log(pattern.abspath); +// console.log(thisBlockTemplate); +// console.log(loopNumberString); +/* +console.log('BEGIN pattern.listitems[\'5\']'); +console.log(pattern.listitems['5']); + +console.log('END pattern.listitems[\'5\']'); +*/ +console.log('BEGIN ' + i); +console.log(allData); +console.log('END ' + i); +} thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); //add the rendered HTML to our string @@ -84,8 +101,8 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache } return { - get_list_item_keys: function() { - return getListItemKeys(); + get_list_item_iteration_keys: function() { + return getListItemIterationKeys(); }, process_list_item_partials: function (pattern, patternlab) { processListItemPartials(pattern, patternlab); From 540fbe95458fae169d58aee251e37937e5c7324e Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Sun, 13 Mar 2016 11:45:07 -0400 Subject: [PATCH 120/162] limiting object clones --- builder/pattern_assembler.js | 202 ++++++++++++++++++++----------- core/lib/list_item_hunter.js | 42 ++----- core/lib/patternlab.js | 1 + core/lib/pseudopattern_hunter.js | 4 +- 4 files changed, 145 insertions(+), 104 deletions(-) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 3457a379f..23c37da0c 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -184,6 +184,10 @@ function mergeData(obj1, obj2) { obj2 = obj2 || {}; //eslint-disable-line no-param-reassign +if (obj1.hasOwnProperty('1')) { + console.log('listitems mergeData'); + console.log(obj2); +} for (var p in obj1) { //eslint-disable-line guard-for-in try { @@ -219,8 +223,21 @@ pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); +var begin = Date.now() / 1000; +if (pattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log(pattern.abspath); +console.log('RENDER BEGIN: ' + begin); +console.log('pattern.extendedTemplate: ' + pattern.extendedTemplate.length + 'B'); +//console.log(pattern.extendedTemplate); +console.log('pattern.jsonFileData: ' + JSON.stringify(pattern.jsonFileData).length + 'B'); +} //render the extendedTemplate with all data pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); +var processEnd = Date.now() / 1000; +if (pattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('RENDER END: ' + processEnd); +console.log('RENDER TIME: ' + (processEnd - begin)); +} //add footer info before writing patternFooter = renderPattern(patternlab.footer, pattern); @@ -238,8 +255,11 @@ pattern.extendedTemplate = ''; pattern.tmpTemplate = ''; pattern.dataKeys = null; - pattern.jsonFileData = null; pattern.listitems = null; + + if (pattern.jsonFileData !== patternlab.data) { + pattern.jsonFileData = null; + } } /** @@ -268,6 +288,9 @@ //escape partial tags by switching them to ERB syntax. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); + //removing empty lines for some reason reduced rendering time considerably. + templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); + //render to winnow used tags. var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); @@ -319,28 +342,20 @@ return; } - //look for a listitems.json file for this template - try { - var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + ".listitems.json"); - currentPattern.listitems = fs.readJSONSync(listJsonFileName); - buildListItems(currentPattern); - if (patternlab.config.debug) { - console.log('found pattern-specific listitems.json for ' + currentPattern.key); - } - } - catch (err) { - currentPattern.listitems = {}; - } - //add the raw template to memory currentPattern.template = fs.readFileSync(file, 'utf8'); - //do the same with extendedTemplate to avoid undefined type errors - //trying to keep memory footprint small, so set it to empty string at first - currentPattern.extendedTemplate = ''; - - //do the same with tmpTemplate + //define tmpTemplate and listitems to avoid undefined type errors + //trying to keep memory footprint small, so set it empty at first currentPattern.tmpTemplate = ''; + currentPattern.listitems = null; + + //do the same with extendedTemplate + //skip this on underscore prefixed files, as they don't use extendedTemplate + //and since it will need to skip in processPatternRecursive + if (filename.charAt(0) !== '_') { + currentPattern.extendedTemplate = ''; + } //find pattern lineage //TODO: consider repurposing lineage hunter. it currently only works at the @@ -384,8 +399,12 @@ var processBegin = Date.now() / 1000; var processEnd; if (recursionLevel === 0) { -//console.log('PROCESS START: ' + processBegin); +processBegin = Date.now() / 1000; //console.log(file); +if (file.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log(file); +console.log('PROCESS START: ' + processBegin); +} //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -394,6 +413,7 @@ var processEnd; if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { return; } +console.log(file); //output .json pseudoPattern variants to the file system and return. //diveSync should process these variants after their originals, given that @@ -408,32 +428,45 @@ var processEnd; //look for a json file for this template var globalData = patternlab.data; var jsonFilename; - var jsonString; + var localJsonString; //allData will get overwritten by mergeData, so keep it scoped to this function. var allData = null; - //get json data local to this pattern try { + + //check if there is json data local to this pattern jsonFilename = file.substr(0, file.lastIndexOf('.')) + '.json'; - jsonString = fs.readFileSync(jsonFilename); - //since mergeData will overwrite its 2nd param, we need to keep allData - //and currentPattern.jsonFileData distinct. - allData = JSON.parse(jsonString); - currentPattern.jsonFileData = JSON.parse(jsonString); + //if so, load it into memory as a string (to create 2 non-referencing objects). + localJsonString = fs.readFileSync(jsonFilename); if (patternlab.config.debug) { console.log('found pattern-specific data.json for ' + currentPattern.key); } } - catch (error) { + catch (err) { + //do nothing } - //get data keys for globalData, currentPattern data, and pseudoPattern data. - //mergeData() overwrites the 2nd param, so we don't need assignment statements - mergeData(globalData, allData); - mergeData(globalData, currentPattern.jsonFileData); + //set currentPattern.jsonFileData + if (localJsonString) { + try { + allData = mergeData(patternlab.data, JSON.parse(localJsonString)); + currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); + } + catch (err) { + + //since we're parsing json, output errors for debugging + console.log(err); + } + + //if this pattern doesn't have a local .json file, save + //CPU steps by just creating a reference to the patternlab.data object. + } else { + currentPattern.jsonFileData = patternlab.data; + } + var needle = currentPattern.subdir + '/' + currentPattern.fileName + '~*.json'; var pseudoPatternFiles = glob.sync(needle, { cwd: paths.source.patterns, @@ -442,75 +475,99 @@ var processEnd; }); var pseudoPatternsArray = []; var pseudoPattern; +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER GLOB: ' + ((Date.now() / 1000) - processBegin)); +} if (pseudoPatternFiles.length) { + mergeData(patternlab.data, allData); + for (i = 0; i < pseudoPatternFiles.length; i++) { pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); if (pseudoPattern) { pseudoPatternsArray.push(pseudoPattern); //update the allData object. + //pseudoPattern.jsonFileData set in processPatternIterative. mergeData(pseudoPattern.jsonFileData, allData); } } + + + //get data keys for patternlab data, currentPattern data, and pseudoPattern data. + //mergeData() overwrites the 2nd param, so we don't need assignment statements +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('BEFORE FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); +} + //if this pattern doesn't have pseudoPatterns or a local .json file, save + //CPU steps by just creating a reference to the patternlab.data object. + } else if (!localJsonString) { + allData = patternlab.data; } -//console.log('ALLDATA SIZE: ' + JSON.stringify(allData).length + 'B'); -processBegin = Date.now() / 1000; + //look for a listitems.json file for this template + var localListItemsString; + try { + var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); + // localListItemsString = fs.readFileSync(listJsonFileName); + currentPattern.listitems = fs.readJSONsync(listJsonFileName); + + if (patternlab.config.debug) { + console.log('found pattern-specific listitems.json for ' + currentPattern.key); + } + } + catch (err) { + //do nothing + } + + +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); +} + +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER SECOND MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); +} +var alldataBegin = Date.now() / 1000; +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('DATA SIZE: ' + JSON.stringify(allData).length + 'B'); +console.log('DATA PREPARE BEGIN: ' + alldataBegin); +} + //add allData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(allData, []); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -// console.log('currentPattern.dataKeys'); -// console.log(currentPattern.dataKeys); +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER GETDATAKEYS: ' + ((Date.now() / 1000) - alldataBegin)); } -processEnd = Date.now() / 1000; -//console.log('ALLDATA PREPARE END: ' + processEnd); -//console.log('ALLDATA PREPARE TIME: ' + (processEnd - processBegin)); //add listitem iteration keys to currentPattern.dataKeys currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); - -processBegin = Date.now() / 1000; -//console.log('LIST ITEM DATA SIZE: ' + JSON.stringify(patternlab.listitems).length + 'B'); -var listItemKeys = getDataKeys(patternlab.listitems, []); -if (file.indexOf('04-pages/00-homepage.mustache') > -1) { -// console.log(listItemKeys); - /* - console.log('currentPattern.dataKeys'); - console.log(currentPattern.dataKeys); - */ -} -processEnd = Date.now() / 1000; -//console.log('LIST ITEM DATA PREPARE END: ' + processEnd); -//console.log('LIST ITEM DATA PREPARE TIME: ' + (processEnd - processBegin)); - -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - // console.log(pattern.extendedTemplate); - // console.log('patternBlock'); - // console.log(patternBlock); -// console.log(patternlab.listitems); -} - //first merge global and local listitem data - mergeData(patternlab.listitems, currentPattern.listitems); -if (currentPattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log(currentPattern.listitems); +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('AFTER FIRST DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); } //add merged listitem keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); + if (currentPattern.listitems) { + currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); + if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { + console.log('AFTER SECOND DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); + } + } //copy winnowed template to extendedTemplate currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); +processEnd = Date.now() / 1000; +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +console.log('DATA PREPARE END: ' + processEnd); +console.log('DATA PREPARE TIME: ' + (processEnd - alldataBegin)); +} } //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); -//parameteredPartials = null; -if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.mustache') > -1) { -// console.log('RECURSION LEVEL: ' + recursionLevel); -// console.log('currentPattern.extendedTemplate: ' + currentPattern.extendedTemplate.length + 'B'); -//console.log('DATA SIZE: ' + JSON.stringify(currentPattern).length + 'B'); -// console.log(currentPattern.extendedTemplate); +if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { + console.log('RECURSION LEVEL: ' + recursionLevel); + console.log('TIME: ' + (Date.now() / 1000)); } //if the template contains any pattern parameters, recurse through them @@ -595,6 +652,7 @@ if (currentPattern.abspath.indexOf('02-organisms/accordions/format-editions-tv.m //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); +processEnd = Date.now() / 1000; } } diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index b738311b6..9917b54d1 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -24,10 +24,18 @@ var list_item_hunter = function () { } function processListItemPartials(pattern, patternlab) { + //find any listitem blocks var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { -//console.log('patternBlock'); + pattern_assembler.combine_listItems(pattern); +console.log('list_item_hunter'); +console.log(patternlab.listitems); + + //merge global and local listitem data and save it to currentPatterns.listitems + pattern.listitems = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); +console.log(pattern.listitems); + for (var i = 0; i < liMatches.length; i++) { if (patternlab.config.debug) { @@ -36,9 +44,6 @@ var list_item_hunter = function () { //find the boundaries of the block var loopNumberString = liMatches[i].split('.')[1].split('}')[0].trim(); -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -//console.log(loopNumberString); -} var end = liMatches[i].replace('#', '/'); var patternBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]) + liMatches[i].length, pattern.extendedTemplate.indexOf(end)).trim(); @@ -51,14 +56,6 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache repeatedBlockTemplate.push(patternBlock); } - //check for a local listitems.json file -// var listData = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log(pattern.extendedTemplate); -// console.log(patternBlock); -//console.log(pattern.listitems); -} - //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] for (j = 0; j < repeatedBlockTemplate.length; j++) { var thisBlockTemplate = repeatedBlockTemplate[j]; @@ -68,33 +65,18 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache var patternData = pattern.jsonFileData; var allData = pattern_assembler.merge_data(patternData, itemData !== undefined ? itemData[j] : {}); //itemData could be undefined if the listblock contains no partial, just markup -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log(pattern.abspath); -// console.log(thisBlockTemplate); -// console.log(loopNumberString); -/* -console.log('BEGIN pattern.listitems[\'5\']'); -console.log(pattern.listitems['5']); - -console.log('END pattern.listitems[\'5\']'); -*/ -console.log('BEGIN ' + i); -console.log(allData); -console.log('END ' + i); -} thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); //add the rendered HTML to our string repeatedBlockHtml = repeatedBlockHtml + thisBlockHTML; + + //unset the allData reference to free up memory + allData = null; } //replace the block with our generated HTML var repeatingBlock = pattern.extendedTemplate.substring(pattern.extendedTemplate.indexOf(liMatches[i]), pattern.extendedTemplate.indexOf(end) + end.length); pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml); -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { -// console.log('repeatedBlockHtml'); -// console.log(repeatedBlockHtml); -} } } diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 80b71201b..62d1a3c86 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -458,6 +458,7 @@ console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); patternlab.viewAllPaths[bucketName][pattern.patternSubGroup] = pattern.flatPatternPath; } +console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); //the patternlab site requires a lot of partials to be rendered. //patternNav diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index fa8ed7d55..7e4a46d90 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -29,8 +29,8 @@ var pseudopattern_hunter = function () { console.log('found pseudoPattern variant of ' + currentPattern.key); } - //extend any existing data with variant data - var variantFileData = pattern_assembler.merge_data(currentPattern.jsonFileData, pseudoPatternsArray[i].jsonFileData); + //extend any existing data with variant data. + pattern_assembler.merge_data(currentPattern.jsonFileData, pseudoPatternsArray[i].jsonFileData); //see if this file has a state pattern_assembler.setPatternState(pseudoPatternsArray[i], patternlab); From 149fc4989a8b8d5d88e1a7ed5ce894c946ec44c7 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 06:38:22 -0400 Subject: [PATCH 121/162] performant recursive builder --- builder/parameter_hunter.js | 27 +++- builder/pattern_assembler.js | 286 +++++++++++++++++++++++++++-------- 2 files changed, 243 insertions(+), 70 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 2d15da1eb..338cbdd2b 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -145,7 +145,7 @@ var parameter_hunter = function () { } //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 - partialPattern.tmpTemplate = partialPattern.template; + partialPattern.tmpTemplate = partialPattern.escapedTemplate; if (patternlab.config.debug) { console.log('found patternParameters for ' + partialName); @@ -181,18 +181,39 @@ var parameter_hunter = function () { //apply replacement based on allowable characters from lines 78 and 79 of mustache.js //of the Mustache for JS project. regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%$1%>'); + //since ERB is already used for escaping in partialPattern.escapedTemplate, + //using <%% %%> as escaping tags. + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); + regex = new RegExp('<%([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)%>', 'g'); + partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); } } +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('partialPattern.abspath'); + console.log(partialPattern.abspath); + console.log('partialPattern.tmpTemplate BEFORE'); + console.log(partialPattern.tmpTemplate); +} + //then set the new delimiter at the beginning of the extended template - partialPattern.tmpTemplate = '{{=<% %>=}}' + partialPattern.tmpTemplate; + partialPattern.tmpTemplate = '{{=<%% %%>=}}' + partialPattern.tmpTemplate; //the reason for rendering at this point is to eliminate the unwanted //recursion paths that would remain if irrelevant conditional tags persisted. partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); + +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('partialPattern.tmpTemplate AFTER'); + console.log(partialPattern.tmpTemplate); +} partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('parameter_hunter winnow AFTER'); + console.log(partialPattern.tmpTemplate); +} + //replace parameteredPartials with their rendered values. var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); regex = new RegExp(pMatch, 'g'); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 23c37da0c..4863141cc 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -182,6 +182,16 @@ return null; } + /** + * Merge the properties of two JSON objects, with the 2nd taking priority over + * the 1st when the same property key exists for both. + * + * @param {object} obj1 + * @param {object} obj2 If obj2 is null or undefined, be sure to make an + * assignment to the output of this function. In other cases, obj2 get + * mutated, and no assignment is necessary. + * @returns {object} obj2 The mutated obj2 object. + */ function mergeData(obj1, obj2) { obj2 = obj2 || {}; //eslint-disable-line no-param-reassign if (obj1.hasOwnProperty('1')) { @@ -268,36 +278,99 @@ console.log('RENDER TIME: ' + (processEnd - begin)); * tags persisted. Targeting non-partial tags that are not keyed in the JSON * data for this pattern. Those will be deleted after this runs. * - * @param {string} template The template to render. + * @param {string|null} template The template to winnow and render or null if + * setting up the pattern.escapedTemplate property. * @param {object} data The data to render with. * @param {object} dataKeys The data to render with. - * @returns {string} templateRendered + * @returns {string} templateWinnowed */ - function winnowUnusedTags(template, pattern) { + function winnowUnusedTags(template, pattern, patternlab) { + var dataKeys; var escapedKey; + var i; var regex; - var templateEscaped = template; + var templateEscaped; + var templateWinnowed; + +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('winnowUnusedTags'); +} + if (template === null) { + dataKeys = patternlab.dataKeys; + templateEscaped = pattern.template; + } else { + dataKeys = pattern.dataKeys; + templateEscaped = template; +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('dataKeys'); + console.log(dataKeys); +} + } + +var processBegin = Date.now() / 1000; +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log(pattern.abspath); + console.log('template'); + console.log(template); +} //escaped all tags that match keys in the JSON data. - for (var i = 0; i < pattern.dataKeys.length; i++) { - escapedKey = pattern.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + //it can be 10% faster to process large dataKeys arrays in one read with a + //large regex than to read many timesi and process with small regexes. + escapedKey = '('; + if (dataKeys.length) { + for (i = 0; i < dataKeys.length; i++) { + escapedKey += dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&') + '|'; + } + escapedKey = escapedKey.slice(0, escapedKey.length - 1); + } + escapedKey += ')'; regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); - } //escape partial tags by switching them to ERB syntax. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); //removing empty lines for some reason reduced rendering time considerably. templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('templateEscaped'); + console.log(templateEscaped); +} + + if (template === null) { +// if (!template) { + pattern.escapedTemplate = templateEscaped; - //render to winnow used tags. - var templateRendered = renderPattern(templateEscaped, pattern.jsonFileData); + } else { + + //render to winnow unused tags. + templateWinnowed = renderPattern(templateEscaped, pattern.jsonFileData); + } //after that's done, switch only partial tags back to standard Mustache tags and return. - templateRendered = templateRendered.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + if (templateWinnowed) { + templateWinnowed = templateWinnowed.replace(/<%>([^%]+)%>/g, '{{>$1}}'); + } - return templateRendered; +var processEnd = Date.now() / 1000; +/* +if (pattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { + console.log('WINNOW BEGIN: ' + processBegin); + console.log('WINNOW END: ' + processEnd); + console.log('WINNOW TIME: ' + (processEnd - processBegin)); +} +*/ +if (typeof templateWinnowed === 'undefined') { +// console.log('templateWinnowed UNDEFINED'); +// console.log(pattern.abspath); +} +if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('templateWinnowed'); + console.log(templateWinnowed); +} + + return templateWinnowed; } function processPatternIterative(file, patternlab) { @@ -330,8 +403,7 @@ console.log('RENDER TIME: ' + (processEnd - begin)); currentPattern.patternName = currentPattern.patternName.replace('~', '-'); currentPattern.jsonFileData = fs.readJSONSync(file); addPattern(currentPattern, patternlab); - } - catch (err) { + } catch (err) { // do nothing } return; @@ -350,6 +422,12 @@ console.log('RENDER TIME: ' + (processEnd - begin)); currentPattern.tmpTemplate = ''; currentPattern.listitems = null; + //needs to be initialized as {} in order to run winnowUnusedTags + currentPattern.jsonFileData = {}; + + //this writes currentPattern.escapedTemplate which needs to be initialized + winnowUnusedTags(null, currentPattern, patternlab); + //do the same with extendedTemplate //skip this on underscore prefixed files, as they don't use extendedTemplate //and since it will need to skip in processPatternRecursive @@ -400,10 +478,9 @@ var processBegin = Date.now() / 1000; var processEnd; if (recursionLevel === 0) { processBegin = Date.now() / 1000; -//console.log(file); -if (file.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +if (file.indexOf('01-molecules/components/user-menu.mustache') > -1) { console.log(file); -console.log('PROCESS START: ' + processBegin); +console.log('PROCESS BEGIN: ' + processBegin); } //find current pattern in patternlab object using var file as a key @@ -413,7 +490,6 @@ console.log('PROCESS START: ' + processBegin); if (!currentPattern || typeof currentPattern.extendedTemplate === 'undefined') { return; } -console.log(file); //output .json pseudoPattern variants to the file system and return. //diveSync should process these variants after their originals, given that @@ -429,8 +505,8 @@ console.log(file); var globalData = patternlab.data; var jsonFilename; var localJsonString; - //allData will get overwritten by mergeData, so keep it scoped to this function. - var allData = null; + //localData will get overwritten by mergeData, so keep it scoped to this function. + var localData = null; try { @@ -443,8 +519,7 @@ console.log(file); if (patternlab.config.debug) { console.log('found pattern-specific data.json for ' + currentPattern.key); } - } - catch (err) { + } catch (err) { //do nothing } @@ -452,10 +527,9 @@ console.log(file); //set currentPattern.jsonFileData if (localJsonString) { try { - allData = mergeData(patternlab.data, JSON.parse(localJsonString)); + localData = JSON.parse(localJsonString); currentPattern.jsonFileData = mergeData(patternlab.data, JSON.parse(localJsonString)); - } - catch (err) { + } catch (err) { //since we're parsing json, output errors for debugging console.log(err); @@ -475,34 +549,28 @@ console.log(file); }); var pseudoPatternsArray = []; var pseudoPattern; -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER GLOB: ' + ((Date.now() / 1000) - processBegin)); -} if (pseudoPatternFiles.length) { - mergeData(patternlab.data, allData); +// mergeData(patternlab.data, localData); for (i = 0; i < pseudoPatternFiles.length; i++) { pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); if (pseudoPattern) { pseudoPatternsArray.push(pseudoPattern); - //update the allData object. + //update the localData object. //pseudoPattern.jsonFileData set in processPatternIterative. - mergeData(pseudoPattern.jsonFileData, allData); + mergeData(pseudoPattern.jsonFileData, localData); } } //get data keys for patternlab data, currentPattern data, and pseudoPattern data. //mergeData() overwrites the 2nd param, so we don't need assignment statements -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('BEFORE FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); -} //if this pattern doesn't have pseudoPatterns or a local .json file, save //CPU steps by just creating a reference to the patternlab.data object. - } else if (!localJsonString) { - allData = patternlab.data; +// } else if (!localJsonString) { +// localData = patternlab.data; } //look for a listitems.json file for this template @@ -515,47 +583,63 @@ console.log('BEFORE FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); if (patternlab.config.debug) { console.log('found pattern-specific listitems.json for ' + currentPattern.key); } - } - catch (err) { + } catch (err) { //do nothing } + currentPattern.extendedTemplate = currentPattern.template; +/* + for (i = 0; i < patternlab.dataKeys.length; i++) { + escapedKey = patternlab.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + templateEscaped = currentPattern.template.replace(regex, '<%$1%>'); + } -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER FIRST MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); -} + //escape partial tags by switching them to ERB syntax. + templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER SECOND MERGEDATA: ' + ((Date.now() / 1000) - processBegin)); -} -var alldataBegin = Date.now() / 1000; -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('DATA SIZE: ' + JSON.stringify(allData).length + 'B'); -console.log('DATA PREPARE BEGIN: ' + alldataBegin); + //removing empty lines for some reason reduces rendering time considerably. + templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); + currentPattern.escapedTemplate = templateEscaped; + */ +if (currentPattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { +// console.log('templateEscaped BEFORE'); +// console.log(templateEscaped); } - //add allData keys to currentPattern.dataKeys - currentPattern.dataKeys = getDataKeys(allData, []); + //add localData keys to currentPattern.dataKeys + currentPattern.dataKeys = getDataKeys(localData, []); if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { console.log('AFTER GETDATAKEYS: ' + ((Date.now() / 1000) - alldataBegin)); } //add listitem iteration keys to currentPattern.dataKeys - currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); +// currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { console.log('AFTER FIRST DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); } //add merged listitem keys to currentPattern.dataKeys if (currentPattern.listitems) { +console.log('dataKeys'); currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { console.log('AFTER SECOND DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); } } - //copy winnowed template to extendedTemplate - currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.template, currentPattern); +if (currentPattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { +// console.log('templateEscaped BEFORE'); +// console.log(templateEscaped); +// console.log(currentPattern.escapedTemplate); +// console.log(currentPattern.dataKeys); +} + + + + + +// currentPattern.extendedTemplate = currentPattern.template; processEnd = Date.now() / 1000; if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { console.log('DATA PREPARE END: ' + processEnd); @@ -563,19 +647,32 @@ console.log('DATA PREPARE TIME: ' + (processEnd - alldataBegin)); } } + +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log('RECURSION LEVEL: ' + recursionLevel); +} + //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { - console.log('RECURSION LEVEL: ' + recursionLevel); - console.log('TIME: ' + (Date.now() / 1000)); -} +//parameteredPartials = null; +//if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('parameteredPartials'); + console.log(parameteredPartials); +} //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { if (patternlab.config.debug) { console.log('found parametered partials for ' + currentPattern.key); } + if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { +//console.log('RECURSION LEVEL: ' + recursionLevel); +//console.log('WINNOWING parameteredPartials'); + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); + } + //recursively render currentPattern.extendedTemplate via parameter_hunter.find_parameters() parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); @@ -589,12 +686,24 @@ if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { //foundPatternPartials = null; var uniquePartials = []; +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('foundPatternPartials'); + console.log(foundPatternPartials); +} + //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { if (patternlab.config.debug) { console.log('found partials for ' + currentPattern.key); } + //copy winnowed template to extendedTemplate + if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { +//console.log('RECURSION LEVEL: ' + recursionLevel); +//console.log('WINNOWING foundPatternPartials'); + currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); + } + for (i = 0; i < foundPatternPartials.length; i++) { //limit iteration to one time per partial. eliminate duplicates. @@ -612,24 +721,40 @@ if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { if (!partialPattern) { throw 'Could not find pattern with key ' + partialKey; } else { - partialPattern.tmpTemplate = partialPattern.template; + if (!partialPattern.tmpTemplate) { + partialPattern.tmpTemplate = partialPattern.escapedTemplate; - //if the current tag has styleModifier data, replace the styleModifier value in the partial - if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { - style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); - } + //if the current tag has styleModifier data, replace the styleModifier value in the partial + if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); + } + +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log(partialPattern.abspath); +console.log('partialPattern.escapedTemplate'); +console.log(partialPattern.escapedTemplate); +} - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); + var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); + // var winnowedPartial = partialPattern.tmpTemplate; + + partialPattern.tmpTemplate = winnowedPartial; + } //replace each partial tag with the partial's template. //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, winnowedPartial); - partialPattern.tmpTemplate = ''; +// partialPattern.tmpTemplate = ''; + //since these partials do not process parameters, there's no need to + //unset the tmpTemplates until after the currentPattern completes + //processing. this will save some cpu cycles by reducing the number + //of times this tmpTemplate needs to be re-generated for this pattern } } +// currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up @@ -638,9 +763,10 @@ if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { //do only when popped back to the top level of recursion if (recursionLevel === 0) { - - //switched ERB escaped tags back to standard Mustache tags - currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); + if (currentPattern.extendedTemplate !== currentPattern.template) { + //switch ERB escaped tags back to standard Mustache tags + currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(/<%([^%]+)%>/g, '{{$1}}'); + } //find and process any listItem blocks within the pattern list_item_hunter.process_list_item_partials(currentPattern, patternlab); @@ -650,9 +776,35 @@ if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); } +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { + console.log('BEFORE OUTPUT'); + console.log('currentPattern.extendedTemplate'); + console.log(currentPattern.extendedTemplate); +} //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); processEnd = Date.now() / 1000; +var processTime = processEnd - processBegin; +//if (file.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { +if (processTime > 0.1) { +console.log(file); +console.log('PROCESS START: ' + processBegin); +console.log('PROCESS END: ' + processEnd); +console.log('PROCESS TIME: ' + processTime); + +} + +if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { +console.log('PROCESS START: ' + processBegin); +console.log('PROCESS END: ' + processEnd); +console.log('PROCESS TIME: ' + processTime); + +} + + //unset all tmpTemplates + for (i = 0; i < patternlab.patterns.length; i++) { + patternlab.patterns[i].tmpTemplate = ''; + } } } From a94a1e61d34bdc8ee8492cac8e76fa2723b2a846 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 06:57:57 -0400 Subject: [PATCH 122/162] working listitem hunter --- builder/.list_item_hunter.js.swp | Bin 0 -> 12288 bytes builder/.pattern_assembler.js.swp | Bin 0 -> 57344 bytes builder/.patternlab.js.swp | Bin 0 -> 36864 bytes builder/pattern_assembler.js | 25 +++++++++++++------------ core/lib/patternlab.js | 3 +++ 5 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 builder/.list_item_hunter.js.swp create mode 100644 builder/.pattern_assembler.js.swp create mode 100644 builder/.patternlab.js.swp diff --git a/builder/.list_item_hunter.js.swp b/builder/.list_item_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..fdc1b9a790bb1ce5f7d8c19c19d970c30b86c097 GIT binary patch literal 12288 zcmeHNO^h5z6|V3TAP^E^12!hs7nL~al+NJM}H;>2G7kxMT400+3i1th+zuKt;sbqw4PJ=$-( zySl1gz3=_ho8201y>w-lKQ(xg;qxeC!>`_b>5VVW8NJ0Ak!!sF=Y~iHC4-4nW>c%& zk{--dx;{91(U3OLjhWCCM>nJ;6D@>A|11%s%}m9#`n*Xyb|y9{8s##HNk@q^c8HPb zaF%CI(%jsCfo+eLftCR<@G!fuv%Tf0IJfZ_Kl70nTUJ^IS_WDMS_WDMS_WDMS_WDM zS_b})7_f^6*elTYT|wuU!}WocYj|ugEdwnBEdwnBEdwnBEdwnBEdwnBEdwnBEdwnB z|AP#O*#Fy~z2?5~F7P;T?P11V03HX<0*?ZZ0KfeZV{Zbl1D^*j0uKUrKgigRfgb?}z(c^FA7boJ z!1saIfv*8OKo{r$|M&o7uK~A#pS>UJ0A2w;2V4L?4txyw-TN5(7Vs+Yb>KuuaQ?jLaEI|u5!Ds2%bb~;=ZwSKykD|-)0DWqa-JYL5%z4MFT8InM zPFz#*2|9r;OIb|uO-dJuums-j^=hCAUB=YKm9WHY`b?t62Yp^VQ|up~w`meq?Iaxv z9p0Dy-${bWN5*ROEXiA2-#}uux2{dPiQE--JR`Fw_j{F%?%f|+_V{^@%OIg_YG;i_ zMp00W+ZpkZ(~2KSJL4+XuubOZrkFo}bN6b^VCgeXzThdPN*~wL^L1J={TkI!$j zlu{;&}AYZJkK7>QCZy6kOqq65@Law>Vxzo2=O{MU_Nq5a= zuhW6a{B7;ZN-bW<(-G+#-uZj`PA6v!jvwI?)Pl4X0-iF`n_UT1Z&Y z+ri}x=aqI@dSnU$X9{j?GGtLojy zDwT$ngE(W)ovpZ=DuEfz(z~T4xx@%6JDr-}Iyr{qS#pYgdks58#Q{Gqv=+w(?ksGu zg?H^h=S&@uV>%HCDSkveBXDh1O_!4w9N2SFhxmHl{BKh+yt|p2gLnL!3A#5x0Ho!v z=lsYm8E%4=F3k#N{Z`aD*Xi?4)M;4Njc}%DM%3zXvq+@vb_Si^-uC_=Je}ZaYkzG8 zQH0b}q|uQ=S`k{3;i||gp8A^Lra!`;jY2_^sA;z|aU*?2a>Y{WMjLsXxXT4iz3|xK zNKG;>-j&$~`+P$~WVF(yU1&hiL{0}Wjq<4rz~F-3yB!%4+9QA^0=SY@1+6TCmNi#f zO0AMsC422n?LqID)0ZN+_Jwr;QRFuSK26j}BwRSs)EIYVS01~4*0mdPNJt!RHyh^~ zxx`*Cwk1<13wD}bON)VOP1QS2PV)q9?O8$hhMr@Uj<75F%FLOyDj5S`&Q2BM+-+p8 zIw*6b_tUb7Ih9A}cXioU&At|^6`{~9hz?FGGPh|ITThX7aUPi0HR^v-`WBv5cz7r= zeZq9>Bm6bJ>I!ZTDkC58M%u+@=tb#ipV`9X0*S`L;q~#E%#`U~I~_CIZ@c<<(|?&YMs#q`y!o1lE~V!}`-scgsOnLX}= zG;Qp0LPLB9krPQe9KVK|869zx&bqy#;$L&3&}AXY9_WlVO<%~RCZwq7)R{Zge9N8J z<}W(>Eb1%$X7}96q|+M=i|+t^#tN5Q4gd_Otn0sEu#Mc1FCNDhbq3>4L;!yHu5&kR zPT2wWD8--ABIeI&g~H0k>$5IiuO)^uzgr^9EoAXErjHDd!cB`QrQo#hyNmcxj%g64 zzKVO)(Xp@VwBPl1uiS)h`)1b*;-tv4%2GNeT}5wz>@i3=lA602_v7fFukU5+@uc8%vTgge3$|fD9p!0}MG}f`O2262JlG_rJ^A zs!EHOgfpo+`m3tnyYDXF{qDWrcJG^Bf5XmQ!NsL#7x+A>P?&rDeK&mg<%bI|{6e7+ zhPrt2&qSqO32UXfYBMUfnw@soDlIhY-4B=dMPVx{Pb^eg;cR)L+76@gVx>*`My)bk zY&2)X{NKfJV|$@e49nA{(E2F)K(U_gNZ1qKutP+&lT0R;vW7*OCp76saik1sr*CZFM& zU3cG)%6*^Z{%*PNM(+MkxW5m$@Bfp#f2RBU3GVw!SAZ|aU%%Pi-<7-n7@C%6*^Z8szhTth;`L`<~9-f1JC%%YFZT?*8N5^;!3Q=A-QopTGOF@Jx5VdYbp$ zV}q{&1qKutP+&lT0R;vW7*Jq9fdK^u6c|uoK!E`T9uW#uP-xeX^WRI6#sBa1{~w%F zD0~5Y4!jGz1iT2W1H<3~a6b5H@D%X3KUpYz8@wGH1M^@GYym$DKK#T&;STUB@Jg@@ zI-m`n06vES;3(Jzt^#GS4y*+qK>28H-OiIUk0xN6>ur|I0lf9ffs`#;Mw5o z7&YDrj)1LTEqEF@7d#O>0sJL~k&l75fd2~a0IvlH!R6pd;2iJ(_JVuC{{(LauLG|E zuLhTbHQhc3-WYKrP6_zTHCw^((Ml^I1fw2Q8^KJo(XLb* zL{rqNQCnA|k>GeiX_ZVDgU!MI1DBag9kK27qVQmfgU<`HsgH-jeEqjsw^)9$oF z($94oGwo`#5ttB;>&R-S@*j@NR7s>;HF>u}9%}?mTT)!n!=u5m(V$8tnx$IUm~Ss! z7E~__4s&5wrM*y^t2LXgVe_+9Y0Nh3!z01kpgO{1dS-vISUoVxclChz^RW5ju>LqU za#>I=hf$5n7iX(cg`kome}utIr&U`{Hy~Q*%+1xp;ijccxxCPBFK#NAqjqKHNb_je zq83XfXj8tW6GFyjBPu^<WmRhEm@M)7dvXeF9y zRTtX{B`iIHz)^&37pt{!w$ut61i}o@R@#*jOQqEytVN;guM<8n8Z1^??P{eKxksyW z!Ek)Z_Ji$mUmO%#XwFv}YL?0$rtcPOm3HVd5PO&eBy5GZbgHdzc*tBBGAZKTx78lE z;XZLLqk-Cys#cm8JOz>%p_2OeE0yQ_mL#eh@qut?>XWep{=Cv0>8g0@A)hK9$ zOQXTz4*aYf0{B%4Oh<_Ho(+@lAee52l_QqYN??khwR2E0OfL7Rq~$huBS~qhRhf>s zvA_r-_u1tjJjTF?U{Tm;sl{-jUX?Z-8`i@{yP$$8+VqxbOUY-jdGlu9K7y!X0#UY4 z;>i)f=TS3Q3L!!`Yua6%CG+ZBHEf9z(_zqQRN>vxU}>Q`v*7cMQkl{Gf~sOhrpDuX z24ZlzPnxbmGEmp8^K~$jj{1lvnIkBvY6(*=HygF(xKm7rsJ(IT1hdUBY7DjgT*V!_ z(-GHpU8)PjRm^3LBm3P&PnaD9s4WKTf}!FN|L1P*uGB-#2}3^2EGqX%bsgFIN>^qr zAyt%TrukZPx>5_8(}%+u^;|pzNIdTN-xVyz_wjEc5veWH=UCs@exl9Dqk`w1XDg5! z`MKu!)JYkP;>KKcK9gOPCy}9o%|FF(>e*gT2NzwGYDCW@JqxfL5z{6L+ormHO!uXX zn-1%h_RK;UU1ob;Y~`*%9oJq~1Cq3o99!Xh$aD{p?Hp(RCVhGM`0?|HgOM#G!&>Qv zcdk@Nv_zFghFQ#3+Dpxq_ChNRSLT|X*2-MYVu|1N*Jy=9kGxX_c3`LMDy&@`!4-x>}xB#bbKSRU5O( zTIyPyVWCHYP{)s7F}y!GFtTNM|J2e{ajG;`zU{!ek>M?yrZ(;0TD+-Jymfu?(&C{N zE^guK@JcW;HN5}e)X0IgQzLpz5BF@$xLcTfcUk@@m(|dKCEc%smBw;FH3Gj56&noN zwZZCYuvCTI4d468So$#}#JW=;#Emp(+|CZrhDH)68|A6vs1iXTCQq9>vP*{<4~A4n zE45BIJlAY)I&ZqtI&Vb8LIM;O&8vQ?Q4wzrx{lPYgp+!{9O;d0or8EKR*h0{nz z^*RDvd)epdn(Bk=gJN)WLuo_lS^U_ze#3JL<+TOr|1U?cJ`X)x`oH&Ie+ivly8k=C ztsnwdfOEjv;IruT?*MNF3*b4R4E_OK{vPmtPzR&nLU14X-woaYj)5D%IJg#E19pJz zK=oJy2A=^11{4@jU_gNZ1qKutP+&lT0R;vW`1hayYHp_%mcnC;%~m@~%xj4Pg^ILl z3~~G~MbB%nI2NLC86?$)gF@lG}@HX!xGiSE2FEUCiB?8kA*`rc@DuKVjK5(K+^y`SF zYNOFy+Sfp7o}H}BM=9ryYosgHCOp(JDG#+tnl8>;H)0z0E3Y25<_%j78>b2CzIbd@ zt{wewg_%@_xzdI7ej-mzXEB@)+pYoA%ka@Kh%1+HF{$FtoL)XeqI7}zXZjbVx?dYE zN5-=^>O3*J;2NZI%vd4I4B>P!lRjTY&hhHnWLqHp{|}f}cHu*o{_o@W--C|-LJ)%e zU;^v{mxD{d#o*E4E9m_11}_B%!49w;+=tHpHSkfe0uF+U!B^4kKLBn92SEvZ2K&Qr zf?2Q$oCzKc&H!J;r~eipAOB6@3;6Os4}K4ff_30ApoI_r7H}ar1AG;qy?pxb0(XHn zxE@>!c7W~Rx!^na@qY#E1?Parf%oILe<9cdeg^y<{`vdC-QZ2&CEz%yfeCOaxCGpX zkN(5p9`JT>8<+$;zy;t8@E+)VCs+Zuf;NbN=>HG+?>_uvQK>tY5$0EEHNJ@{JN3$L#JK zrPdDlJMt)>xb_>0b!arhdKD=~VG;L@D$mT+D$p_dn`{4^8JoGxjgi&W$k=Kdomx#a&y#T|KOH|Z zR4a&R>Tlo78_g;Z&e}$$?>GV^H;ffG`Lmk*3@!CV=Hz0U%CVs~-^zGQ#4~jKLld2y z5@p8?Fr+@$PViB1+?tD5yISGWA!AhP!EtLqUQJkF5{s*~MWYTv%(g$*mG4ZC0vh7$AQzVTsW%~Y6RV~qs@!8cHH;|se z({8G6>u*{n2Y=edULv<9X7Qye$%z!0#nahlpj7Z@x|FR>10%a3ffo0GibnWTiCGCI zE3Db3eT`Y=+o7-L!L1T)DsS_TXsdZ-60j_e98XS^i zB_ehyrUo$w5HhS)>(vHR8yS|@u1$PniRf#iG!FCdb_Bz1VwTN@)|Ro;^H?U)nru9W z`a;~RntRtp5~P*M(oZjX#7$J{TU(yL*{(0fyo6(DD0?@=Db12G+an3FBh|)?91TPC z)vThtEq2;w(xr~9NVQxF!vrrVw5<@oAj(NqgmdzK2&jymY zyIL@Da8q(z>$nPv(XscKSmqSw#At?liLzq6qq`O|(#GDg-P^|Y29rB?jcp1P{xj?} zzA;>UMV>~mQ5W=jh)3-+$s?ppk98Nem6FWX7c1>%-AGvY_$%c@h+3j{FIgoeV5v4e z#jEs0;i%&~sSokc?X$x^rXh!GCG%HIP`7rd@A6ODIYD8enuYSDb=Aq_YU!n^zGN4% z>fCZXP&385crtoq=t>DS3PVj~VxM=uM){uVm(KN@)#|$_k}o@5@{r@0E5~;1+-nY~#evv{OwN^+LFl#!-~8O7H-{anHzEZDTf6kwRs($5aoM1&&` z7V0=MOQRJEx=6Hzl&qJXw|N4kK3E8cDMNg%BH+4os3|Kz(LBYPGc;1#TB}{nr7_L_ zTuC0AQ~7a(>ReQWQCgK;kg8pj#%&`eo7*QmC&mqS!X&k^OT9A{AR%tFWqAp}fBS^0 zejuCF#{G*X2zmPO27cLxbjwKiHg+RUrPvL{0}%WW&ZfdLOhm-E69pwM%_`m)fkbPS zl~#>7g;04}FoO(3)L_*HDR7CO5u_w2sAT;AUqLS~qO(i?M;$kxAEDd-5PSq21&aHB z68IO={RvnB`@qFO&#nWH2k#-TG4MF>elmL>sDcsjIrRD80e6Deg4ci!I0%Yh6g(3= z1AG@<|6SnMz^{TaFao6i|8MZ;;J3hUfc-#rfFGgvE584azz4xA!9j32*aZFteg7li z?ci6zuYebW7l7x3tHDL!hu8qV2!02=9=r}LfyaO^V-I*A_-vUDLJa88H6LkJJfER%}2*HiudN2-t4m^Mj;M?Hq;688<$b7^) z<+6`MZB>>s>uXx*@*HVd)-s-$j)4$J>Ksb1IL8Y%V`A2W>U={Bre<|X?-^NxNSijR zxI%H8M9|xrpjS!haX>iFY*P$MyxzPih`Ygz;x(yGtL4-+)gVX(%_8=*^t9dZ%nZq7 z7-bV>mKr7i1Wy?+wA>i6Q{s}FTU1!?VK?QzA$(5#=$h~Ch`(3~qZ9aWt9J?cy&KB9X#vbw%4 zm+O@yaIksGJrV4&0otaBUL30)^ZAr!IJ9(YdwBhb4U{Vl1uH9d=$ulADiJm^&)Cr1 zj;YyZTSY)u6ZRF&Fwl@z?Ip#OX~20>8?Lc86T)cpnuT>iLW}w@u5@bA^zHCTrz=FM z`LwBYmVQ1Jq%?_OsRekPZ6ER}I0nlv;-!cHH{#jcZ7F~>V`L;598*&o9c4c{*ma{N zc%~ghoEB?j^A@3fEMc~FM&DhaF7c|ZdibYVOXt$}N@ct59hxIYl!u`a@36tQ6cTuM zXrY7opv5y{o!Y{1k|0w^shoYlXCyA{Cq$^I*ffJ=4QF{9x>+s|es(vve+hO3kMj%2zGehqASO=kBp>zLG9JwJV_+ zW?5MXbDoHoY5R>kckkYFV_)sf_05%DiR=AzZ#AxW+LY9v$^2v_PYm)#^|PBsWM;RT zc6u%L=5@j~#e}Yyz6xMwLhGhuEFX9tiw9`=@(T&?KX@U*`xjnOo@cBQB7VV!)m1;{ z#6;3hn+tzMUnjic5(X{zDN_I7c4myBS3RrL?J5g|#yK0- zTI|py!r632uJ{vGXzKWsHm@9;@IQV>ty^OrV{BoD8PYzN^YIn8_tg%TO1ymqW)9I**4-nen99? zTjyD0^IeA=zv8UAx+gZ%{yc9K_J)jNU_5q8qK~q$ztVDgHfw*se~O1tI6gODe_vJY zI`pRA^8V7=bz2TzaC~)mWM%)Q&SgQ!91Pqnl`! zd(e;Ca=9i?hU+5j1h7Ij`vB@@Zvc!MRqgHr>jYwlCwm)EH-NE2w9*huOL=RZ`+vF`FgiS20h@W+&yx z$^YzcpJmTF3gwTaSEB#>^Zh=7uK#9m2Y3~zfSW-8&H{h`lf(^x+rcWh0sK7p273RO z!RNrI!M)&<;G;l${tkUEqbF1U`wK;Mc&L zz@6X@5P}kTEVv*0zz2ZN3fKmo4t^S(1AY?x02{&gz<0qv0L2z8fEjQ#_yIP8_X5Qi z>;gN$1>kGg2tER2H+VUC8F(qU23!H22)>NX;Pqf0>;hZClfXIPkFXUq!6u;d0L}&K z(;w#T1&}KBv12;Xy*;1ndU}e9EmE>BW$jkoTaV(z{mob6S1T6GG#A-Y(=_^zF>`qv znfz~Pq)QcoZj>Vf3gKR@GF#p zopZhs+7O<;H|iA+QT}sUfNLwOPCJ!EH%cRVRU$C!%(bpD?`>)^M&e8r}U{;qbdJ%rCyXY5}~J4vskyw zvV!FUN4f6c0?MMZ*lVexCz*Nc9T_!d?FD<+&~Pn$;qKWTU5zF^tg;n+Bbqlt#T-^z zmgSW`b)V6rdEFYXr50OTiaU1$hNr_wfDr|)AHCev2X{OTQ!s>SZ4%^Q?%FZ3(G;!t z09YmFs!^?25r=zd*jl@aXw*Ba4S~63@2i#@*equTss4yCL3p3>vKA?K4uTO0wXe^S zXO~8xX(Y;z;vX>Wn}#km?Q&*`N!wyW*G5!`cIAjfHa}gM!xgAW#$)dkZ|f;nHRExd zjAxg|3Dh!txSu*1!J8g6#CoSF(XdjqSgW>&WgFbT9{WGzj;oW{`*R!UQ#qUGdue(Zhnm;xJD&TGr>Q;VWe~zqpT^^*U}_6#U{zAkhhg+?D|}6hN+6% zL}rYi{>cxL{ms!X>i46)Ni&ln22t z1<_cn$PquRMasc&4d1k9Q74eZGcxm->+0S?x;>0+_K=fnO^}%>%JZ22PPk7Mp@eNN zq{gTP`)M2^K$1&J3eY6rELf7;O;T$ywlh@5hnEzWEzqolxbr%x<7G(U%@C@S|0I>L zC*p|i$xye_Mk-BeGO>ni8@K6mQ|;HJ>z}E*CMq?GrCny58SOIPsuPUjHP)7=H2IZS z^~x}Wn`k5^D823#R1J6CIBwH@yp2TavF_+->tE?!ea#Uvt76h9*c!}Xyk_NVgq-oj zqN<=C0?%`DyKs+Jsk-Db=B$5Mz#gf*StiPegbH?^jFaaCK*9eX?W zDl4<5dB*bJS@uHy%OCc&e@KBY=5Q>T zFR)o7S*nWe6JNAkmd!z_w~7z;&k!H8AuSY}v9B(jVKLc&tQuUtS%Z2eIT5G_V`sBB z^4^Inc#73qpHxkp&KkxloHB!`qH$JK*q?V6w?eBPt-zjwH!wrRmHq$G{STw#e+aCA z=YXFA-$K9tCeXhB7l7x3_29ec^8W(<4BQ5;06zo1g${oo_!{^GxE1J3Kg9w361War z3w|1;b@wl!qyHChCD;reKrjDe5P=bJK9HXNZg4wjfI8R;o(#T@9{zjacfqSc9Y|OI zdGIvw0DAamz^B2lgExWW;CbN5;791=p9232+zVa=c7m&c&iDIcbn)K?zX5(7+zfPv z-v`mde;LexQSkHNDd1f2CG_#%0y?)(dio@I0GfXpd ztvOSvX%>a+lCV(em&qLy+pBrVpF&1hm}HSy>%pSmWaT^)Z2BW<9m)0cN-kwl!2P?{jeJBc=9|Q8NCl*y#&LwKt)w{p1jO0+f(O{mZ6~bNd2iI}Bo1s}?UD!5I!4WXY&2W-wvBX}iq4m^~ zS~^+37~v(`5%SSHX)JrAE56SPIAk7_%LeL=;d)^E%Wv5=PNFeD7WgXwU=c=)ZiJ-ralBFWvRiwON zSJ6>FAELj=(aLyQp#uXtzYj=*O@+nQIX{S zQAU(nUC@Jw!HC6d7bTR8sQf0~(OjUBo0DVhB4;bh4R>QS#lldp zVtZiDPFbQYZ(k9t&nX6tPJKFTttKXGn{X0SHrrRinjH?Z;St6uYha`Wc|$z&R@%7? z?G&+^o;4<=QN-pDH;LpPv$5B!b|KXR-d=#pQj!U((9ScBE<&BFC>SaY;JR6Q4q3!%IC?%Ww(l3{Kc0jO5ibBm~FSeJvHcf358?S&qa0PzZTPWLOJMATFOpox_|6pIKj z3Z`beIg0if8QLDOOL)tXDxxw=c<(a<91Tn=)AJBcGDyqB0rC`q-^ZY+=^QAny>8gt zh^^rqT%A!z09{D>c)ym*kl{MBD0ZlHOVL>Hs89Q zWhD-!v{sa>Q13l+4A$1N_>}UDN@OEo(L$PSJP!D6jMLw!Og8A=1--zpbJbR4Wn)Bb z6Wt%A3lT#lH6#DZ(Pq`23}{`X5^4hirJF5hdCk|@Q$LP)-p=@zK<`$-AzlZ5iPl`{ z|GQB*zaYI6{olVo?~k4Cf1Gcf^M5~j{x`sfKpo70UEn%!G0@q6C2$r{48UK3yTA@m z1|=YSz^A}Rf&Bh21(yPy@&Aw50KN(C2X}x9*bIiix!|!tzWq;vKLu|G5om!+z(=qN zyaU_<7Qqr^~@K$gpxCfp8 zIJgx|fbXH}e+PUX$QJNH@ByHB|7CC`_*-=T7lTdU+2C2=yXgFPfp-GM`9BqW1-gs& zpBMcf)=$94$}J}wqFrHJcKY+v|5(?Scy}d<&Uxt3UJ+CO{~ys_eTHI8EE5EDno(bb zew{xxb&#N^iwhbdQByj zHnSy5CKlP)Pe1U=SV(0Z?LH0OXPP&R63i+N%~31AP?2RWh387Q=`3y9W-dL|T_s)^ zFjYwDz(X9=&E)F@h+?!D&Y;fCB(t%L!AGVQ)pK=22akztb=#D*h>W8RZ?oZaXFhg! z^dLbp@yC<5?Ed%xXUy^BGN)-aH{M`%DIPNOF~+v*(CBtTqsUs^pr70F5-$MCzbg-$ zgY>xkZE~Oy3jfDYa5~ZdIokN08M(_6ZDLPr+;nFU^9-8=n54{#xt9908QWksL#y0~ zSB(zd)YQxw-b8H#5|S2d zJJ}c$2RDtxW?wV`RYf5bM&UIw4DXGwf~OH~Q{g8VQ6Z&N(>PPvkVPw5rEGj}(kyc$ zFJ-!m5_~dkFxN}0i?+Jy(VqQH08QMGOb&*X#Qf^bQA-W|Obt}!%`Pir=NY$pa^@+W z&CxBzGs>(YWHlpS!E(8?NYib!ilMzqi@UMl)9E`?WMq73*3XlKlDj*Xnp1CEYvlVdPleU4j8DmQ zI=+qh)HFm0P_NypT>?#xs;NmT&+%I1F)6Vde>lIGWa^&GDVt3|K%Zxl=B8Iq4WfMR zF~?~yCI*_UKA&!YZ+}AOjL7A>A&Dl=?&M9LG9K~R@6b=?Viv6!<~5!0u!&o_<}^>>do3%G;YHlL*9#aoGzTfw1eK6LDN(4~TZ@S-TB9HwduO;6_Dvq$Ii4*ln zm#6A5d=;lgZo}*CF3M7k%>g^nkIZ3iB}KI=GEEPr_IlvwTnO1$MJKa-6Q7AKQAzAl zY}#$546eK3ZS?=AvcA5;>Hjx49rP}A{#Br}|DFea5u69^L%+WhTm!BKI`8jna3}ix zHt-#E`ELX1`tJcR2e*LlpufKvYy-~)mw=0b-sAV%;5DEEE(X5oXTn8Qp&IV_IM}Y#6j^76UJizPu{T+1rPlHc^4p1DxKcm+x2H;ab@ATUN&I6xC zzrPoJ66n2t&jDwFH=@(O2D}=S!C#=ye-<1CBj7{m@*e~r0IvgAgAwoq@ObcE=qnn( zyuY5`YgCNeSz_GUwmIO!`sZ?E)YaHQ5pOsi6jauwoc5=@|H z`y`Sb+-I1xgLheA-H>y(Tz6g=LlJokTPQQ6tcQA=hwAGml|B~Md|8fCX<;Vs0%Bxs z$cv}(EWjC2+F)RZmp!yBs5cpE>|>MNoZ9)C`sNao91aoSx`<21YR<4An&m=gCd(a$V#WtH70%=Smuz%ahR zTpF*$rUc*=>3Uff(t(DJ<#F=IsSfo>^oY*1rm=Z0eV8V3 z6j?vWk|uXe)4kKAXXzVzzJ4snefh!YW{B7g7x#M1Yh5uar#5!PTe-3yCVH8r+iA1H82jXIs<;oKrPh83k}#EsXybCk^Y zA`j#D7jc4-(M#wL^vhZ-St zI?qpbO3e|ho9$1BLjw27W$OE@yXXBK?HWYo9mb$U-A(7_2V`t)%`dR=QN~@zCi>jf zRkmh5#zdU2Un?Xz=@=rTOedaFYiyM6l@V*=(z~V}+fmzh?wy!?Nd45K&JV4Z`ixUg zt&{hXNS2Q4D$#9(q4TY|``pX)*r8 zPEgBRefR=$rnx${uZ*Jit3R0RM`<{{Z+nm%lkB?cV~5;F;hV;3MevZv#5_e;c?GXb-?w(C>A&-`l_( zxCuNDJQXaXRR>{*pwS1o@f2k zt8B80O%kuGf{Z=T#%4)RM(5QQ0bfHomD+J+Bawx1RzI%FyfHOA@*2D;2E&r`8R1Z9?greHRMU_A2PNn0};uSZ@)(V+~P4#2;uLn(c-dD|Y4^ z|7W`y_m(nrSvc!hDNQ*Jmcd3_P%8V$)~|<_pKC!^ihL+Z|H9)ASIIKZncx!^JRO0z z*B&k8=8|zsglwdUe=M7Z=X;s?PCsnK(!-xz<0@xjE(jmiiHqzqCKyu2b?jlmLc6^f zZBoP>b|)PJP^vd?WqVAe#Jf$(VWYTjf(VeAsC;8MUB0Grv@$W%sxG$6J31U2Ri?Sx z^>c{hl!#?80mA3+li%l%EAdcLV!_r-|C=aU9XB6@GQ>GrYv#4)IkBU=2z&VXvXt)d z^cXt{tJuLEEAEDG{H&nbs1I{#=#Bmi;Kgb^+wbYF38jB_JtmZ#=A3)hG0tS7-lZiX z8D2E<{IJQTmR68Xo=fdyY!dZY+`0wu2Xp9I!H~`Um+eOOy7$^_VNO@+)WbvByKMbR zw-m2V4`Vt5C~bqy3|^}X<_$Cx*>{=u$u!=1?OPKY+uT%SxLL=pno93-TUcC7hC71G z%)8n9<_Kv8Mx@3-n(t4->sgZIt+Z**RsXKZB~MMUUN}+na{g&ul6`O~7`n;?o@;&= z6&W+;d*W2mn-Aia5*WyN8u{4pse-Lkj&Q2Dip2&dn!Saai1QhOJ)h7;qZG- zN2!{L#@5dT`xx$FE#m~_i1>OFOx?2%)csWEXHItHFu4OGTZZ>fElm}tN>kBrjHe#$*bKO2u}zlV+Nnmq!6@G)NPq9fA1>WkK^^VZA} zgj$7MSC(RD3~^B%4tK#iqNCkhv-5E=y{ga^8DlAy(Cg%qLf71#f5gV_`uVrV{GD@U zB(9HMHCDgo9ym4ot!-I9?crhYeb@q2H;xnYD`dPJ%k7<4cYIH!$es2HnCAP=wlQoc z2|-Zn+@RNaGO&6k-cvPHl3sKb0eW5Ua+2hI9{s$dvUO#x552OdH>Llh!WMqh>Hqv` zKCea3e+76sxCThy|31*(|J%URz`5Yb;C<-$ZvgW^@A&%#a0a*+9sh3d0(Dfx+^%J*hRRiNnvK#U zX#e`Mfo0UV5SMFD+h9ZGk?<@T8hcoh zeTA4O4=Re=5=^yH`vV-kOc6ROLvH}YqD2J^`4op|1v<+~j>A%Mno723`tVk_*}`?P z=R5zMm4I{4&`G%~v2{l+-=!#16M)Uz;f^g5A0ILeHIBHV)IHhkvy1+af5x^*Ia&fq zl*#6=fI^8$y5pZxN#;5yexaV2dkHJs!cRf!Q9>n4XX|G~-Ai9LOdFrvC(`h?!^V;Q z*~ED`8qK|4q9w6qtu#f83^jco1(0E%B!DN@z~F4F&BiH@llcJ2Sa+31=0ztQ=> z1R}5j`~`ac?}Fb3zX|RJEpQ%K19aB^tHBoVbnpZ8{0G4I!54w{{ND-g0NVHe5^yv4 zDe!pkIB++*|Es~3;Bs&ocq(`b_%M3@Yr#Ai0Yl&d@PE73S4`_f5;8Eb4&{z8f?gf7Y-Uogkyb$QTz)yk{|Xoci&BvXSux#g3yf z>tK#`A!9n;&TPI7(_Km{vQNvvXq~e}?QwveUePk|o#t^QKtZxrY4i^8h_6l7n|M#HZe+@|g$L(xBUw79&!S}m$Z}1sVU_gNZ1qKutP+&lT r0R;vW7*Jq9fdK^u6c|uoK!JY)3iPvjcstbz?&ohQR*ii^it_${cu|p> literal 0 HcmV?d00001 diff --git a/builder/.patternlab.js.swp b/builder/.patternlab.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..3cb6b546c5514f45aeb353dd4f210383374d2c99 GIT binary patch literal 36864 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 UHT}#P$4n=)jI6PMtk2c>Kj|vCnE(I) literal 0 HcmV?d00001 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 4863141cc..268581fab 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -286,7 +286,7 @@ console.log('RENDER TIME: ' + (processEnd - begin)); */ function winnowUnusedTags(template, pattern, patternlab) { var dataKeys; - var escapedKey; + var escapedKeys; var i; var regex; var templateEscaped; @@ -308,25 +308,26 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) } var processBegin = Date.now() / 1000; -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log(pattern.abspath); - console.log('template'); - console.log(template); -} + //escaped all tags that match keys in the JSON data. //it can be 10% faster to process large dataKeys arrays in one read with a //large regex than to read many timesi and process with small regexes. - escapedKey = '('; if (dataKeys.length) { + escapedKeys = '('; for (i = 0; i < dataKeys.length; i++) { - escapedKey += dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&') + '|'; + escapedKeys += dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); + if (i < dataKeys.length - 1) { + escapedKeys += '|'; + } } - escapedKey = escapedKey.slice(0, escapedKey.length - 1); - } - escapedKey += ')'; - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + escapedKeys += ')'; + regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKeys + '\\s*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); +if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { + console.log(templateEscaped); +} + } //escape partial tags by switching them to ERB syntax. templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 62d1a3c86..916a0c41c 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -16,6 +16,7 @@ var patternlab_engine = function (config) { diveSync = require('diveSync'), of = require('./object_factory'), pa = require('./pattern_assembler'), + lih = require('./list_item_hunter'), mh = require('./media_hunter'), pe = require('./pattern_exporter'), lh = require('./lineage_hunter'), @@ -79,6 +80,7 @@ var patternlab_engine = function (config) { var pattern_assembler = new pa(), entity_encoder = new he(), + list_item_hunter = new lih(), pattern_exporter = new pe(), lineage_hunter = new lh(), patterns_dir = paths.source.patterns; @@ -86,6 +88,7 @@ var patternlab_engine = function (config) { pattern_assembler.combine_listItems(patternlab); patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); + patternlab.dataKeys = patternlab.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); var processBegin = Date.now() / 1000; From 8a06cf7053ff29ec192e63ddac9386d4b8b3eef9 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 07:26:37 -0400 Subject: [PATCH 123/162] working local listitems.json --- builder/.list_item_hunter.js.swp | Bin 12288 -> 0 bytes builder/.pattern_assembler.js.swp | Bin 57344 -> 0 bytes builder/.patternlab.js.swp | Bin 36864 -> 0 bytes builder/pattern_assembler.js | 36 ++++++++++++++++++++++++------ core/lib/list_item_hunter.js | 6 ++--- 5 files changed, 32 insertions(+), 10 deletions(-) delete mode 100644 builder/.list_item_hunter.js.swp delete mode 100644 builder/.pattern_assembler.js.swp delete mode 100644 builder/.patternlab.js.swp diff --git a/builder/.list_item_hunter.js.swp b/builder/.list_item_hunter.js.swp deleted file mode 100644 index fdc1b9a790bb1ce5f7d8c19c19d970c30b86c097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 diff --git a/builder/.patternlab.js.swp b/builder/.patternlab.js.swp deleted file mode 100644 index 3cb6b546c5514f45aeb353dd4f210383374d2c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 UHT}#P$4n=)jI6PMtk2c>Kj|vCnE(I) diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 268581fab..8b6859c5f 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -405,7 +405,7 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) currentPattern.jsonFileData = fs.readJSONSync(file); addPattern(currentPattern, patternlab); } catch (err) { - // do nothing + console.log(err); } return; } @@ -575,17 +575,39 @@ console.log('PROCESS BEGIN: ' + processBegin); } //look for a listitems.json file for this template - var localListItemsString; +var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); +if (currentPattern.abspath.indexOf('00-comment-thread.mustache') > -1) { +console.log(listJsonFileName); +} + + var hasLocalListItems = false; + var listJsonFileName; try { var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); + hasLocalListItems = fs.statSync(listJsonFileName); + } catch (err) { + //do nothing + } +if (currentPattern.abspath.indexOf('00-atoms/00-global/00-colors') > -1) { + console.log(currentPattern.abspath); + console.log('hasLocalListItems'); + console.log(hasLocalListItems); +} + if (hasLocalListItems) { + try { // localListItemsString = fs.readFileSync(listJsonFileName); - currentPattern.listitems = fs.readJSONsync(listJsonFileName); +//console.log('currentPattern.listitems'); + currentPattern.listitems = fs.readJSONSync(listJsonFileName); + //console.log('guh'); - if (patternlab.config.debug) { - console.log('found pattern-specific listitems.json for ' + currentPattern.key); + if (patternlab.config.debug) { + console.log('found pattern-specific listitems.json for ' + currentPattern.key); + } + } catch (err) { + + //to troubleshoot malformed json + console.log(err); } - } catch (err) { - //do nothing } currentPattern.extendedTemplate = currentPattern.template; diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 9917b54d1..5f24ccc11 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -29,12 +29,12 @@ var list_item_hunter = function () { var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { pattern_assembler.combine_listItems(pattern); -console.log('list_item_hunter'); -console.log(patternlab.listitems); +//console.log('list_item_hunter'); +//console.log(patternlab.listitems); //merge global and local listitem data and save it to currentPatterns.listitems pattern.listitems = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); -console.log(pattern.listitems); +//console.log(pattern.listitems); for (var i = 0; i < liMatches.length; i++) { From ff37ef82b5f172cc0d34fbfc1aa5f74869e2b989 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 08:30:17 -0400 Subject: [PATCH 124/162] eslinting --- builder/.parameter_hunter.js.swp | Bin 0 -> 20480 bytes builder/parameter_hunter.js | 24 +-- builder/pattern_assembler.js | 321 +++++-------------------------- core/lib/list_item_hunter.js | 11 +- core/lib/patternlab.js | 15 +- core/lib/patternlab_grunt.js | 2 - core/lib/patternlab_gulp.js | 2 - core/lib/pseudopattern_hunter.js | 17 +- 8 files changed, 61 insertions(+), 331 deletions(-) create mode 100644 builder/.parameter_hunter.js.swp diff --git a/builder/.parameter_hunter.js.swp b/builder/.parameter_hunter.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..14824722798b1d978520abbbb3758f51cc752d3b GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 338cbdd2b..f84247d3d 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -12,11 +12,8 @@ var parameter_hunter = function () { - var extend = require('util')._extend, - lih = require('./list_item_hunter'), - pa = require('./pattern_assembler'), + var pa = require('./pattern_assembler'), smh = require('./style_modifier_hunter'), - list_item_hunter = new lih(), pattern_assembler = new pa(), style_modifier_hunter = new smh(); @@ -140,7 +137,7 @@ var parameter_hunter = function () { var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); if (!partialPattern) { - throw 'Could not find pattern with key ' + partialName; + console.log('Could not find pattern with key ' + partialName); continue; } @@ -181,6 +178,7 @@ var parameter_hunter = function () { //apply replacement based on allowable characters from lines 78 and 79 of mustache.js //of the Mustache for JS project. regex = new RegExp('\\{\\{([\\{#\\^\\/&]?\\s*' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); + //since ERB is already used for escaping in partialPattern.escapedTemplate, //using <%% %%> as escaping tags. partialPattern.tmpTemplate = partialPattern.tmpTemplate.replace(regex, '<%%$1%%>'); @@ -189,13 +187,6 @@ var parameter_hunter = function () { } } -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('partialPattern.abspath'); - console.log(partialPattern.abspath); - console.log('partialPattern.tmpTemplate BEFORE'); - console.log(partialPattern.tmpTemplate); -} - //then set the new delimiter at the beginning of the extended template partialPattern.tmpTemplate = '{{=<%% %%>=}}' + partialPattern.tmpTemplate; @@ -203,17 +194,8 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) //recursion paths that would remain if irrelevant conditional tags persisted. partialPattern.tmpTemplate = pattern_assembler.renderPattern(partialPattern.tmpTemplate, paramData); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('partialPattern.tmpTemplate AFTER'); - console.log(partialPattern.tmpTemplate); -} partialPattern.tmpTemplate = pattern_assembler.winnow_unused_tags(partialPattern.tmpTemplate, pattern); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('parameter_hunter winnow AFTER'); - console.log(partialPattern.tmpTemplate); -} - //replace parameteredPartials with their rendered values. var pMatch = parameteredPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); regex = new RegExp(pMatch, 'g'); diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 8b6859c5f..b14f06443 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -129,8 +129,6 @@ * @returns {array} keys A flat, one-dimensional array. */ function getDataKeys(data, uniqueKeys) { - var keys; - for (var key in data) { if (data.hasOwnProperty(key)) { if (!(typeof data === 'object' && data instanceof Array)) { @@ -194,10 +192,6 @@ */ function mergeData(obj1, obj2) { obj2 = obj2 || {}; //eslint-disable-line no-param-reassign -if (obj1.hasOwnProperty('1')) { - console.log('listitems mergeData'); - console.log(obj2); -} for (var p in obj1) { //eslint-disable-line guard-for-in try { @@ -224,6 +218,40 @@ if (obj1.hasOwnProperty('1')) { return obj2; } + function parseDataLinksHelper(patternlab, obj, key) { + var linkRE, dataObjAsString, linkMatches, expandedLink; + + linkRE = /link\.[A-z0-9-_]+/g; + dataObjAsString = JSON.stringify(obj); + linkMatches = dataObjAsString.match(linkRE); + + if (linkMatches) { + for (var i = 0; i < linkMatches.length; i++) { + expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; + if (expandedLink) { + if (patternlab.config.debug) { + console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); + } + dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); + } + } + } + return JSON.parse(dataObjAsString); + } + + //look for pattern links included in data files. + //these will be in the form of link.* WITHOUT {{}}, which would still be there from direct pattern inclusion + function parseDataLinks(patternlab) { + //look for link.* such as link.pages-blog as a value + + patternlab.data = parseDataLinksHelper(patternlab, patternlab.data, 'data.json'); + + //loop through all patterns + for (var i = 0; i < patternlab.patterns.length; i++) { + patternlab.patterns[i].jsonFileData = parseDataLinksHelper(patternlab, patternlab.patterns[i].jsonFileData, patternlab.patterns[i].key); + } + } + function outputPatternToFS(pattern, patternlab) { var fs = require('fs-extra'); var he = require('html-entities').AllHtmlEntities; @@ -233,21 +261,8 @@ if (obj1.hasOwnProperty('1')) { pattern.jsonFileData = parseDataLinksHelper(patternlab, pattern.jsonFileData, pattern.key); -var begin = Date.now() / 1000; -if (pattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log(pattern.abspath); -console.log('RENDER BEGIN: ' + begin); -console.log('pattern.extendedTemplate: ' + pattern.extendedTemplate.length + 'B'); -//console.log(pattern.extendedTemplate); -console.log('pattern.jsonFileData: ' + JSON.stringify(pattern.jsonFileData).length + 'B'); -} //render the extendedTemplate with all data pattern.patternPartial = renderPattern(pattern.extendedTemplate, pattern.jsonFileData); -var processEnd = Date.now() / 1000; -if (pattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('RENDER END: ' + processEnd); -console.log('RENDER TIME: ' + (processEnd - begin)); -} //add footer info before writing patternFooter = renderPattern(patternlab.footer, pattern); @@ -263,6 +278,7 @@ console.log('RENDER TIME: ' + (processEnd - begin)); //since we're done with these pattern properties, free them from memory pattern.extendedTemplate = ''; + pattern.template = ''; pattern.tmpTemplate = ''; pattern.dataKeys = null; pattern.listitems = null; @@ -292,24 +308,14 @@ console.log('RENDER TIME: ' + (processEnd - begin)); var templateEscaped; var templateWinnowed; -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('winnowUnusedTags'); -} if (template === null) { dataKeys = patternlab.dataKeys; templateEscaped = pattern.template; } else { dataKeys = pattern.dataKeys; templateEscaped = template; -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('dataKeys'); - console.log(dataKeys); -} } -var processBegin = Date.now() / 1000; - - //escaped all tags that match keys in the JSON data. //it can be 10% faster to process large dataKeys arrays in one read with a //large regex than to read many timesi and process with small regexes. @@ -324,9 +330,6 @@ var processBegin = Date.now() / 1000; escapedKeys += ')'; regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKeys + '\\s*\\}?)\\}\\}', 'g'); templateEscaped = templateEscaped.replace(regex, '<%$1%>'); -if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache') > -1) { - console.log(templateEscaped); -} } //escape partial tags by switching them to ERB syntax. @@ -334,13 +337,8 @@ if (pattern.abspath.indexOf('02-organisms/02-comments/00-comment-thread.mustache //removing empty lines for some reason reduced rendering time considerably. templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('templateEscaped'); - console.log(templateEscaped); -} if (template === null) { -// if (!template) { pattern.escapedTemplate = templateEscaped; } else { @@ -354,23 +352,6 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) templateWinnowed = templateWinnowed.replace(/<%>([^%]+)%>/g, '{{>$1}}'); } -var processEnd = Date.now() / 1000; -/* -if (pattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { - console.log('WINNOW BEGIN: ' + processBegin); - console.log('WINNOW END: ' + processEnd); - console.log('WINNOW TIME: ' + (processEnd - processBegin)); -} -*/ -if (typeof templateWinnowed === 'undefined') { -// console.log('templateWinnowed UNDEFINED'); -// console.log(pattern.abspath); -} -if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('templateWinnowed'); - console.log(templateWinnowed); -} - return templateWinnowed; } @@ -454,9 +435,9 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. * @param {number} recursionLevel Top level === 0. Increments by 1 after that. - * @param {object} currentPattern Only submitted on recursionLevel > 0. + * @param {object} currentPatternAsParam Only submitted on recursionLevel > 0. */ - function processPatternRecursive(file, patternlab, recursionLevel, currentPattern) { + function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam) { var fs = require('fs-extra'), glob = require('glob'), path = require('path'); @@ -472,17 +453,11 @@ if (pattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) style_modifier_hunter = new smh(), pseudopattern_hunter = new pph(); + var currentPattern; var i; // for the for loops var paths = patternlab.config.paths; -var processBegin = Date.now() / 1000; -var processEnd; if (recursionLevel === 0) { -processBegin = Date.now() / 1000; -if (file.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log(file); -console.log('PROCESS BEGIN: ' + processBegin); -} //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -503,9 +478,9 @@ console.log('PROCESS BEGIN: ' + processBegin); //continue with regular mustache templates //look for a json file for this template - var globalData = patternlab.data; var jsonFilename; var localJsonString; + //localData will get overwritten by mergeData, so keep it scoped to this function. var localData = null; @@ -552,7 +527,6 @@ console.log('PROCESS BEGIN: ' + processBegin); var pseudoPattern; if (pseudoPatternFiles.length) { -// mergeData(patternlab.data, localData); for (i = 0; i < pseudoPatternFiles.length; i++) { pseudoPattern = getpatternbykey(path.resolve(paths.source.patterns, pseudoPatternFiles[i]), patternlab); @@ -564,42 +538,20 @@ console.log('PROCESS BEGIN: ' + processBegin); mergeData(pseudoPattern.jsonFileData, localData); } } - - - //get data keys for patternlab data, currentPattern data, and pseudoPattern data. - //mergeData() overwrites the 2nd param, so we don't need assignment statements - //if this pattern doesn't have pseudoPatterns or a local .json file, save - //CPU steps by just creating a reference to the patternlab.data object. -// } else if (!localJsonString) { -// localData = patternlab.data; } - //look for a listitems.json file for this template -var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); -if (currentPattern.abspath.indexOf('00-comment-thread.mustache') > -1) { -console.log(listJsonFileName); -} - var hasLocalListItems = false; var listJsonFileName; try { var listJsonFileName = path.resolve(patternlab.config.paths.source.patterns, currentPattern.subdir, currentPattern.fileName + '.listitems.json'); hasLocalListItems = fs.statSync(listJsonFileName); } catch (err) { + //do nothing } -if (currentPattern.abspath.indexOf('00-atoms/00-global/00-colors') > -1) { - console.log(currentPattern.abspath); - console.log('hasLocalListItems'); - console.log(hasLocalListItems); -} if (hasLocalListItems) { try { - // localListItemsString = fs.readFileSync(listJsonFileName); -//console.log('currentPattern.listitems'); currentPattern.listitems = fs.readJSONSync(listJsonFileName); - //console.log('guh'); - if (patternlab.config.debug) { console.log('found pattern-specific listitems.json for ' + currentPattern.key); } @@ -610,80 +562,24 @@ if (currentPattern.abspath.indexOf('00-atoms/00-global/00-colors') > -1) { } } - currentPattern.extendedTemplate = currentPattern.template; -/* - for (i = 0; i < patternlab.dataKeys.length; i++) { - escapedKey = patternlab.dataKeys[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); - regex = new RegExp('\\{\\{([\\{#\\^\\/&]?(\\s*|[^\\}]*\\.)' + escapedKey + '\\s*\\}?)\\}\\}', 'g'); - templateEscaped = currentPattern.template.replace(regex, '<%$1%>'); - } - - //escape partial tags by switching them to ERB syntax. - templateEscaped = templateEscaped.replace(/\{\{>([^\}]+)\}\}/g, '<%>$1%>'); - - //removing empty lines for some reason reduces rendering time considerably. - templateEscaped = templateEscaped.replace(/^\s*$\n/gm, ''); - currentPattern.escapedTemplate = templateEscaped; - */ -if (currentPattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { -// console.log('templateEscaped BEFORE'); -// console.log(templateEscaped); -} + currentPattern.extendedTemplate = currentPattern.template; //add localData keys to currentPattern.dataKeys currentPattern.dataKeys = getDataKeys(localData, []); -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER GETDATAKEYS: ' + ((Date.now() / 1000) - alldataBegin)); -} - - //add listitem iteration keys to currentPattern.dataKeys -// currentPattern.dataKeys = currentPattern.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('AFTER FIRST DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); -} //add merged listitem keys to currentPattern.dataKeys if (currentPattern.listitems) { -console.log('dataKeys'); currentPattern.dataKeys = currentPattern.dataKeys.concat(getDataKeys(currentPattern.listitems, currentPattern.dataKeys)); - if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { - console.log('AFTER SECOND DATAKEYS CONCAT: ' + ((Date.now() / 1000) - alldataBegin)); - } } -if (currentPattern.abspath.indexOf('02-organisms/00-global/00-header.mustache') > -1) { -// console.log('templateEscaped BEFORE'); -// console.log(templateEscaped); -// console.log(currentPattern.escapedTemplate); -// console.log(currentPattern.dataKeys); -} - - - - - -// currentPattern.extendedTemplate = currentPattern.template; -processEnd = Date.now() / 1000; -if (currentPattern.abspath.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -console.log('DATA PREPARE END: ' + processEnd); -console.log('DATA PREPARE TIME: ' + (processEnd - alldataBegin)); -} + //set currentPattern for recursionLevel > 0 + } else { + currentPattern = currentPatternAsParam; } - -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log('RECURSION LEVEL: ' + recursionLevel); -} - //find parametered partials var parameteredPartials = findPartialsWithPatternParameters(currentPattern.extendedTemplate); -//parameteredPartials = null; -//if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('parameteredPartials'); - console.log(parameteredPartials); -} //if the template contains any pattern parameters, recurse through them if (parameteredPartials && parameteredPartials.length) { if (patternlab.config.debug) { @@ -691,8 +587,6 @@ if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') } if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { -//console.log('RECURSION LEVEL: ' + recursionLevel); -//console.log('WINNOWING parameteredPartials'); currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); } @@ -706,14 +600,8 @@ if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') //find non-parametered partials. var foundPatternPartials = findPartials(currentPattern.extendedTemplate); -//foundPatternPartials = null; var uniquePartials = []; -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('foundPatternPartials'); - console.log(foundPatternPartials); -} - //recurse through non-parametered partials if (foundPatternPartials && foundPatternPartials.length) { if (patternlab.config.debug) { @@ -722,8 +610,6 @@ if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') //copy winnowed template to extendedTemplate if (recursionLevel === 0 && currentPattern.extendedTemplate === currentPattern.template) { -//console.log('RECURSION LEVEL: ' + recursionLevel); -//console.log('WINNOWING foundPatternPartials'); currentPattern.extendedTemplate = winnowUnusedTags(currentPattern.escapedTemplate, currentPattern); } @@ -752,14 +638,7 @@ if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); } -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log(partialPattern.abspath); -console.log('partialPattern.escapedTemplate'); -console.log(partialPattern.escapedTemplate); -} - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); - // var winnowedPartial = partialPattern.tmpTemplate; partialPattern.tmpTemplate = winnowedPartial; } @@ -769,15 +648,8 @@ console.log(partialPattern.escapedTemplate); var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - -// partialPattern.tmpTemplate = ''; - //since these partials do not process parameters, there's no need to - //unset the tmpTemplates until after the currentPattern completes - //processing. this will save some cpu cycles by reducing the number - //of times this tmpTemplate needs to be re-generated for this pattern } } -// currentPattern.tmpTemplate = winnowUnusedTags(currentPattern.tmpTemplate, currentPattern); //recurse, going a level deeper, with each render eliminating nested partials //when there are no more nested partials, we'll pop back up @@ -799,30 +671,8 @@ console.log(partialPattern.escapedTemplate); pseudopattern_hunter.find_pseudopatterns(currentPattern, patternlab, pseudoPatternsArray); } -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { - console.log('BEFORE OUTPUT'); - console.log('currentPattern.extendedTemplate'); - console.log(currentPattern.extendedTemplate); -} //output rendered pattern to the file system outputPatternToFS(currentPattern, patternlab); -processEnd = Date.now() / 1000; -var processTime = processEnd - processBegin; -//if (file.indexOf('00-atoms/00-meta/_00-head.mustache') > -1) { -if (processTime > 0.1) { -console.log(file); -console.log('PROCESS START: ' + processBegin); -console.log('PROCESS END: ' + processEnd); -console.log('PROCESS TIME: ' + processTime); - -} - -if (currentPattern.abspath.indexOf('01-molecules/components/user-menu.mustache') > -1) { -console.log('PROCESS START: ' + processBegin); -console.log('PROCESS END: ' + processEnd); -console.log('PROCESS TIME: ' + processTime); - -} //unset all tmpTemplates for (i = 0; i < patternlab.patterns.length; i++) { @@ -831,77 +681,6 @@ console.log('PROCESS TIME: ' + processTime); } } - function parseDataLinksHelper(patternlab, obj, key) { - var linkRE, dataObjAsString, linkMatches, expandedLink; - - linkRE = /link\.[A-z0-9-_]+/g; - dataObjAsString = JSON.stringify(obj); - linkMatches = dataObjAsString.match(linkRE); - - if (linkMatches) { - for (var i = 0; i < linkMatches.length; i++) { - expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; - if (expandedLink) { - if (patternlab.config.debug) { - console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); - } - dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); - } - } - } - - function buildListItems(container){ - //combine all list items into one structure - var list = []; - for (var item in container.listitems) { - if( container.listitems.hasOwnProperty(item)) { - list.push(container.listitems[item]); - } - } - container.listItemArray = shuffle(list); - - for(var i = 1; i <= container.listItemArray.length; i++){ - var tempItems = []; - if( i === 1){ - tempItems.push(container.listItemArray[0]); - container.listitems['' + i ] = tempItems; - } else{ - for(var c = 1; c <= i; c++){ - tempItems.push(container.listItemArray[c - 1]); - container.listitems['' + i ] = tempItems; - } - } - } - } - - //http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript - function shuffle(o){ - for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); - return o; - } - - function parseDataLinksHelper (patternlab, obj, key) { - var linkRE, dataObjAsString, linkMatches, expandedLink; - - linkRE = /link\.[A-z0-9-_]+/g - dataObjAsString = JSON.stringify(obj); - linkMatches = dataObjAsString.match(linkRE) - - if(linkMatches) { - for (var i = 0; i < linkMatches.length; i++) { - expandedLink = patternlab.data.link[linkMatches[i].split('.')[1]]; - if (expandedLink) { - if(patternlab.config.debug){ - console.log('expanded data link from ' + linkMatches[i] + ' to ' + expandedLink + ' inside ' + key); - } - dataObjAsString = dataObjAsString.replace(linkMatches[i], expandedLink); - } - } - } - return JSON.parse(dataObjAsString) - } - } - return { find_pattern_partials: function (pattern) { return findPartials(pattern); @@ -936,6 +715,12 @@ console.log('PROCESS TIME: ' + processTime); merge_data: function (existingData, newData) { return mergeData(existingData, newData); }, + parse_data_links_helper: function (patternlab, obj, key) { + return parseDataLinksHelper(patternlab, obj, key); + }, + parse_data_links: function (patternlab) { + parseDataLinks(patternlab); + }, winnow_unused_tags: function (template, pattern) { return winnowUnusedTags(template, pattern); }, @@ -944,12 +729,6 @@ console.log('PROCESS TIME: ' + processTime); }, process_pattern_recursive: function (file, patternlab, recursionLevel) { processPatternRecursive(file, patternlab, recursionLevel); - }, - parse_data_links_helper: function (patternlab, obj, key) { - return parseDataLinksHelper(patternlab, obj, key); - }, - parse_data_links: function (patternlab) { - parseDataLinks(patternlab); } return { diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 5f24ccc11..41f9f13b4 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -12,11 +12,8 @@ var list_item_hunter = function () { - var extend = require('util')._extend, - pa = require('./pattern_assembler'), - smh = require('./style_modifier_hunter'), + var pa = require('./pattern_assembler'), 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 getListItemIterationKeys() { @@ -29,12 +26,9 @@ var list_item_hunter = function () { var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { pattern_assembler.combine_listItems(pattern); -//console.log('list_item_hunter'); -//console.log(patternlab.listitems); //merge global and local listitem data and save it to currentPatterns.listitems pattern.listitems = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); -//console.log(pattern.listitems); for (var i = 0; i < liMatches.length; i++) { @@ -58,7 +52,6 @@ var list_item_hunter = function () { //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] for (j = 0; j < repeatedBlockTemplate.length; j++) { - var thisBlockTemplate = repeatedBlockTemplate[j]; var thisBlockHTML = ""; var itemData = pattern.listitems['' + items.indexOf(loopNumberString)]; //this is a property like "2" @@ -83,7 +76,7 @@ var list_item_hunter = function () { } return { - get_list_item_iteration_keys: function() { + get_list_item_iteration_keys: function () { return getListItemIterationKeys(); }, process_list_item_partials: function (pattern, patternlab) { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 916a0c41c..0bff50dba 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -19,8 +19,6 @@ var patternlab_engine = function (config) { lih = require('./list_item_hunter'), mh = require('./media_hunter'), pe = require('./pattern_exporter'), - lh = require('./lineage_hunter'), - he = require('html-entities').AllHtmlEntities, patternlab = {}; patternlab.package = fs.readJSONSync('./package.json'); @@ -79,7 +77,6 @@ var patternlab_engine = function (config) { setCacheBust(); var pattern_assembler = new pa(), - entity_encoder = new he(), list_item_hunter = new lih(), pattern_exporter = new pe(), lineage_hunter = new lh(), @@ -91,8 +88,6 @@ var patternlab_engine = function (config) { patternlab.dataKeys = patternlab.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); -var processBegin = Date.now() / 1000; -console.log('BUILD PATTERNS BEGIN: ' + processBegin); //diveSync once to perform iterative populating of patternlab object diveSync( patterns_dir, @@ -129,10 +124,6 @@ console.log('BUILD PATTERNS BEGIN: ' + processBegin); //export patterns if necessary pattern_exporter.export_patterns(patternlab); -var processEnd = Date.now() / 1000; -console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); -console.log('BUILD PATTERNS END: ' + processEnd); -console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); } function addToPatternPaths(bucketName, pattern) { @@ -216,6 +207,10 @@ console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); prevGroup = ''; for (i = 0; i < patternlab.patterns.length; i++) { + + //unset escapedTemplates + patternlab.patterns[i].escapedTemplate = ''; + // skip underscore-prefixed files if (isPatternExcluded(patternlab.patterns[i])) { if (patternlab.config.debug) { @@ -461,7 +456,6 @@ console.log('BUILD PATTERNS TIME: ' + (processEnd - processBegin) + 'sec'); patternlab.viewAllPaths[bucketName][pattern.patternSubGroup] = pattern.flatPatternPath; } -console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); //the patternlab site requires a lot of partials to be rendered. //patternNav @@ -511,7 +505,6 @@ console.log('PATTERNLAB DATA SIZE: ' + JSON.stringify(patternlab).length + 'B'); printDebug(); } }; - }; module.exports = patternlab_engine; diff --git a/core/lib/patternlab_grunt.js b/core/lib/patternlab_grunt.js index 93a636cfb..d124a7e0e 100644 --- a/core/lib/patternlab_grunt.js +++ b/core/lib/patternlab_grunt.js @@ -12,7 +12,6 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (grunt) { grunt.registerTask('patternlab', 'create design systems with atomic design', function (arg) { -console.log(Date.now() / 1000); var patternlab = patternlab_engine(); if (arguments.length === 0) { @@ -34,7 +33,6 @@ console.log(Date.now() / 1000); if (arg && (arg !== "v" && arg !== "only_patterns" && arg !== "help")) { patternlab.help(); } -console.log(Date.now() / 1000); }); }; diff --git a/core/lib/patternlab_gulp.js b/core/lib/patternlab_gulp.js index 03ed47b8d..be02179cf 100644 --- a/core/lib/patternlab_gulp.js +++ b/core/lib/patternlab_gulp.js @@ -13,10 +13,8 @@ var patternlab_engine = require('./patternlab.js'); module.exports = function (gulp) { gulp.task('patternlab', ['clean'], function (cb) { -console.log(Date.now() / 1000); var patternlab = patternlab_engine(); patternlab.build(false); -console.log(Date.now() / 1000); cb(); }); diff --git a/core/lib/pseudopattern_hunter.js b/core/lib/pseudopattern_hunter.js index 7e4a46d90..76fb2b6f8 100644 --- a/core/lib/pseudopattern_hunter.js +++ b/core/lib/pseudopattern_hunter.js @@ -13,16 +13,11 @@ var pseudopattern_hunter = function () { function findpseudopatterns(currentPattern, patternlab, pseudoPatternsArray) { - var glob = require('glob'), - fs = require('fs-extra'), - pa = require('./pattern_assembler'), - lh = require('./lineage_hunter'), - of = require('./object_factory'), - path = require('path'); + var pa = require('./pattern_assembler'), + lh = require('./lineage_hunter'); var pattern_assembler = new pa(); var lineage_hunter = new lh(); - var paths = patternlab.config.paths; for (var i = 0; i < pseudoPatternsArray.length; i++) { if (patternlab.config.debug) { @@ -37,14 +32,6 @@ var pseudopattern_hunter = function () { //use the same template as the non-variant pseudoPatternsArray[i].extendedTemplate = currentPattern.extendedTemplate; -if (currentPattern.abspath.indexOf('04-pages/00-homepage.mustache') > -1) { - /* - console.log('pseudoPatternsArray[i].extendedTemplate'); - console.log(pseudoPatternsArray[i].extendedTemplate); - console.log('pseudoPatternsArray[i].jsonFileData'); - console.log(pseudoPatternsArray[i].jsonFileData); - */ -} //find pattern lineage //TODO: consider repurposing lineage hunter. it currently only works at the From 4c25f1d2fed246dfe4d534f2b2794d8bb3b5bb38 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Mon, 14 Mar 2016 10:09:13 -0400 Subject: [PATCH 125/162] updating unit tests --- builder/.parameter_hunter.js.swp | Bin 20480 -> 0 bytes builder/pattern_assembler.js | 20 +++++---- core/lib/patternlab.js | 2 +- test/list_item_hunter_tests.js | 1 + test/parameter_hunter_tests.js | 9 ++-- test/pattern_assembler_tests.js | 62 +++++++++++++++++----------- test/pseudopattern_hunter_tests.js | 29 ++++++------- test/style_modifier_hunter_tests.js | 20 ++++----- 8 files changed, 82 insertions(+), 61 deletions(-) delete mode 100644 builder/.parameter_hunter.js.swp diff --git a/builder/.parameter_hunter.js.swp b/builder/.parameter_hunter.js.swp deleted file mode 100644 index 14824722798b1d978520abbbb3758f51cc752d3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index b14f06443..9acb9a8de 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -434,10 +434,11 @@ * * @param {string} file The abspath of pattern being processed. * @param {object} patternlab The patternlab object. - * @param {number} recursionLevel Top level === 0. Increments by 1 after that. + * @param {number|undefined} recursionLevel Top level === 0. Increments by 1 after that. * @param {object} currentPatternAsParam Only submitted on recursionLevel > 0. + * @param {boolean} test When unit testing, pass in true to not output to file system. */ - function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam) { + function processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test) { var fs = require('fs-extra'), glob = require('glob'), path = require('path'); @@ -457,7 +458,8 @@ var i; // for the for loops var paths = patternlab.config.paths; - if (recursionLevel === 0) { + if (!recursionLevel) { + recursionLevel = 0; //find current pattern in patternlab object using var file as a key currentPattern = getpatternbykey(file, patternlab); @@ -472,7 +474,9 @@ //tildes come after periods in ASCII order. as such, their extendedTemplates //should be filled out and renderable. if (path.extname(file) === '.json') { - outputPatternToFS(currentPattern, patternlab); + if (!test) { + outputPatternToFS(currentPattern, patternlab); + } return; } @@ -672,7 +676,9 @@ } //output rendered pattern to the file system - outputPatternToFS(currentPattern, patternlab); + if (!test) { + outputPatternToFS(currentPattern, patternlab); + } //unset all tmpTemplates for (i = 0; i < patternlab.patterns.length; i++) { @@ -727,8 +733,8 @@ process_pattern_iterative: function (file, patternlab) { processPatternIterative(file, patternlab); }, - process_pattern_recursive: function (file, patternlab, recursionLevel) { - processPatternRecursive(file, patternlab, recursionLevel); + process_pattern_recursive: function (file, patternlab, recursionLevel, currentPatternAsParam, test) { + processPatternRecursive(file, patternlab, recursionLevel, currentPatternAsParam, test); } return { diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 0bff50dba..97002ea3a 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -118,7 +118,7 @@ var patternlab_engine = function (config) { console.log(err); return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab); } ); diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index eb3ade6cf..02276cbbd 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -419,6 +419,7 @@ pl.config = {}; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 114b75028..1e33a0ca6 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -269,6 +269,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -284,10 +285,10 @@ pattern_assembler.process_pattern_iterative(outerParameteredFile, pl); //act - pattern_assembler.process_pattern_recursive(atomFile, pl, atomFile); - pattern_assembler.process_pattern_recursive(styleFile, pl, styleFile); - pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, innerParameteredFile); - pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, outerParameteredFile); + pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(styleFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(innerParameteredFile, pl, 0, null, true); + pattern_assembler.process_pattern_recursive(outerParameteredFile, pl, 0, null, true); var outerParameteredPattern = pattern_assembler.get_pattern_by_key(outerParameteredFile, pl); //assert. diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 0228a68ba..1b98618da 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -251,7 +251,7 @@ return; } - pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, path.resolve(file)); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0, null, true); } ); @@ -292,6 +292,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -304,7 +305,7 @@ pattern_assembler.process_pattern_iterative(groupFile, pl); //act - pattern_assembler.process_pattern_recursive(groupFile, pl, groupFile); + pattern_assembler.process_pattern_recursive(groupFile, pl, 0, null, true); var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert @@ -328,6 +329,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -339,7 +341,7 @@ pattern_assembler.process_pattern_iterative(groupFile, pl); //act - pattern_assembler.process_pattern_recursive(groupFile, pl, groupFile); + pattern_assembler.process_pattern_recursive(groupFile, pl, 0, null, true); var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert @@ -363,6 +365,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -374,7 +377,7 @@ pattern_assembler.process_pattern_iterative(mixedFile, pl); //act - pattern_assembler.process_pattern_recursive(mixedFile, pl, mixedFile); + pattern_assembler.process_pattern_recursive(mixedFile, pl, 0, null, true); var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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) @@ -382,7 +385,7 @@ 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){ + '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(); @@ -398,6 +401,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -409,7 +413,7 @@ pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - pattern_assembler.process_pattern_recursive(bookendFile, pl, bookendFile); + pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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) @@ -433,6 +437,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -444,7 +449,7 @@ pattern_assembler.process_pattern_iterative(mixedFile, pl); //act - pattern_assembler.process_pattern_recursive(mixedFile, pl, mixedFile); + pattern_assembler.process_pattern_recursive(mixedFile, pl, 0, null, true); var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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) @@ -468,6 +473,7 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; @@ -479,7 +485,7 @@ pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - pattern_assembler.process_pattern_recursive(bookendFile, pl, bookendFile); + pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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) @@ -592,6 +598,7 @@ 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.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []) 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'); @@ -599,24 +606,29 @@ patternlab.data.link = {}; patternlab.partials = {}; - diveSync(patterns_dir, - { - filter: function(path, dir){ - if(dir){ - var remainingPath = path.replace(patterns_dir, ''); - var isValidPath = remainingPath.indexOf('/_') === -1; - return isValidPath; - } - return true; + diveSync( + patterns_dir, + function (err, file) { + //log any errors + if (err) { + console.log(err); + return; } - }, - function(err, file){ + pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); + } + ); + + //diveSync again to recursively include partials, filling out the + //extendedTemplate property of the patternlab.patterns elements + diveSync( + patterns_dir, + function (err, file) { //log any errors - if(err){ + if (err) { console.log(err); return; } - pattern_assembler.process_pattern_iterative(file, patternlab); + pattern_assembler.process_pattern_recursive(path.resolve(file), patternlab, 0, null, true); } ); @@ -712,8 +724,8 @@ //assert test.equals(patternlab.patterns.length, 1); - test.equals(patternlab.partials['test-bar'] != undefined, true); - test.equals(patternlab.partials['test-bar'], 'barExtended'); + test.equals(patternlab.patterns[0] != undefined, true); + test.equals(patternlab.patterns[0].extendedTemplate, 'barExtended'); test.done(); }, 'addPattern - adds pattern template to patternlab partial object if extendedtemplate does not exist yet' : function(test){ @@ -733,8 +745,8 @@ //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[0] != undefined, true); + test.equals(patternlab.patterns[0].template, 'bar'); test.done(); } }; diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 3a97b773f..85089d1d6 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -1,12 +1,13 @@ (function () { "use strict"; - var pha = require('../core/lib/pseudopattern_hunter'); - var pa = require('../core/lib/pattern_assembler'); - var object_factory = require('../core/lib/object_factory'); + var path = require('path'); + var pha = require('../builder/pseudopattern_hunter'); + var pa = require('../builder/pattern_assembler'); + var object_factory = require('../builder/object_factory'); exports['pseudopattern_hunter'] = { - 'pseudpattern found and added as a pattern' : function(test){ + 'pseudopattern found and added as a pattern' : function(test){ //arrange var fs = require('fs-extra'); var pattern_assembler = new pa(); @@ -23,27 +24,27 @@ }; pl.data = {}; pl.data.link = {}; + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) pl.config.debug = false; pl.patterns = []; pl.partials = {}; pl.config.patternStates = {}; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '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 atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var atomVariantFile = path.resolve('test/files/_patterns/00-test/03-styled-atom~alt.json'); - pattern_assembler.addPattern(atomPattern, pl); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(atomVariantFile, pl); //act - var patternCountBefore = pl.patterns.length; - pseudopattern_hunter.find_pseudopatterns(atomPattern, pl); + pattern_assembler.process_pattern_recursive(atomFile, pl, 0, null, true); + var atomPattern = pattern_assembler.get_pattern_by_key(atomFile, pl); + var atomVariantPattern = pattern_assembler.get_pattern_by_key(atomVariantFile, pl); //assert - test.equals(patternCountBefore + 1, pl.patterns.length); - test.equals(pl.patterns[1].key, 'test-styled-atom-alt'); + test.equals(pl.patterns[1].key, 'test-styled-atom~alt'); test.equals(pl.patterns[1].extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), ' {{message}} '); - test.equals(JSON.stringify(pl.patterns[1].jsonFileData), JSON.stringify({"message": "alternateMessage"})); + test.equals(JSON.stringify(pl.patterns[1].jsonFileData), JSON.stringify({"message":"alternateMessage","link":{"test-styled-atom":"/patterns/00-test-03-styled-atom/00-test-03-styled-atom.html","test-styled-atom-alt":"/patterns/00-test-03-styled-atom~alt/00-test-03-styled-atom~alt.html"}})); test.done(); } diff --git a/test/style_modifier_hunter_tests.js b/test/style_modifier_hunter_tests.js index 7a3562ad0..8bb4e565d 100644 --- a/test/style_modifier_hunter_tests.js +++ b/test/style_modifier_hunter_tests.js @@ -4,7 +4,7 @@ var smh = require('../core/lib/style_modifier_hunter'); exports['consume_style_modifier'] = { - 'uses the partial stylemodifer to modify the patterns extendedTemplate' : function(test){ + 'uses the partial stylemodifer to modify the patterns tmpTemplate' : function(test){ //arrange var pl = {}; pl.partials = {}; @@ -12,7 +12,7 @@ pl.config.debug = false; var pattern = { - extendedTemplate: '
' + tmpTemplate: '
' }; var style_modifier_hunter = new smh(); @@ -21,7 +21,7 @@ style_modifier_hunter.consume_style_modifier(pattern, '{{> partial:bar}}', pl); //assert - test.equals(pattern.extendedTemplate, '
'); + test.equals(pattern.tmpTemplate, '
'); test.done(); }, 'replaces style modifiers with spaces in the syntax' : function(test){ @@ -32,7 +32,7 @@ pl.config.debug = false; var pattern = { - extendedTemplate: '
' + tmpTemplate: '
' }; var style_modifier_hunter = new smh(); @@ -41,7 +41,7 @@ style_modifier_hunter.consume_style_modifier(pattern, '{{> partial:bar}}', pl); //assert - test.equals(pattern.extendedTemplate, '
'); + test.equals(pattern.tmpTemplate, '
'); test.done(); }, 'replaces multiple style modifiers' : function(test){ @@ -52,7 +52,7 @@ pl.config.debug = false; var pattern = { - extendedTemplate: '
' + tmpTemplate: '
' }; var style_modifier_hunter = new smh(); @@ -61,10 +61,10 @@ style_modifier_hunter.consume_style_modifier(pattern, '{{> partial:bar|baz|dum}}', pl); //assert - test.equals(pattern.extendedTemplate, '
'); + test.equals(pattern.tmpTemplate, '
'); test.done(); }, - 'does not alter pattern extendedTemplate if styleModifier not found in partial' : function(test){ + 'does not alter pattern tmpTemplate if styleModifier not found in partial' : function(test){ //arrange var pl = {}; pl.partials = {}; @@ -72,7 +72,7 @@ pl.config.debug = false; var pattern = { - extendedTemplate: '
' + tmpTemplate: '
' }; var style_modifier_hunter = new smh(); @@ -81,7 +81,7 @@ style_modifier_hunter.consume_style_modifier(pattern, '{{> partial}}', pl); //assert - test.equals(pattern.extendedTemplate, '
'); + test.equals(pattern.tmpTemplate, '
'); test.done(); } }; From 3b7794f139d6d9cb30433df73f043d9d43f5cbd7 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 00:20:43 -0400 Subject: [PATCH 126/162] updating unit tests --- builder/parameter_hunter.js | 2 +- builder/pattern_assembler.js | 19 ++--- test/list_item_hunter_tests.js | 117 +++++++++++++--------------- test/parameter_hunter_tests.js | 89 +++++++++++++-------- test/pattern_assembler_tests.js | 72 ++++++++--------- test/pseudopattern_hunter_tests.js | 3 +- test/style_modifier_hunter_tests.js | 4 - 7 files changed, 156 insertions(+), 150 deletions(-) diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index f84247d3d..8e0af3f7b 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -201,7 +201,7 @@ var parameter_hunter = function () { regex = new RegExp(pMatch, 'g'); pattern.extendedTemplate = pattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); - // Free tmpTemplate from memory. + //free tmpTemplate from memory. partialPattern.tmpTemplate = ''; } } diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 9acb9a8de..00aee7a5e 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -634,24 +634,25 @@ if (!partialPattern) { throw 'Could not find pattern with key ' + partialKey; } else { - if (!partialPattern.tmpTemplate) { - partialPattern.tmpTemplate = partialPattern.escapedTemplate; + partialPattern.tmpTemplate = partialPattern.escapedTemplate; - //if the current tag has styleModifier data, replace the styleModifier value in the partial - if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { - style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); - } + //if the current tag has styleModifier data, replace the styleModifier value in the partial + if (findPartialsWithStyleModifiers(foundPatternPartials[i])) { + style_modifier_hunter.consume_style_modifier(partialPattern, foundPatternPartials[i], patternlab); + } - var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); + var winnowedPartial = winnowUnusedTags(partialPattern.tmpTemplate, currentPattern); - partialPattern.tmpTemplate = winnowedPartial; - } + partialPattern.tmpTemplate = winnowedPartial; //replace each partial tag with the partial's template. //escape regex special characters as per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters var escapedPartial = foundPatternPartials[i].replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); var regex = new RegExp(escapedPartial, 'g'); currentPattern.extendedTemplate = currentPattern.extendedTemplate.replace(regex, partialPattern.tmpTemplate); + + //free tmpTemplate from memory. + partialPattern.tmpTemplate = ''; } } diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index 02276cbbd..f560a6d07 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -2,8 +2,9 @@ "use strict"; var lih = require('../core/lib/list_item_hunter'); - var pa = require('../core/lib/pattern_assembler'); var object_factory = require('../core/lib/object_factory'); + var pa = require('../core/lib/pattern_assembler'); + var path = require('path'); exports['list_item_hunter'] = { 'process_list_item_partials finds and outputs basic repeating blocks' : function(test){ @@ -223,20 +224,18 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = { - "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", - "extendedTemplate" : "{{#listItems.two}}{{> test-simple }}{{/listItems.two}}", - "key": "test-patternName", - "jsonFileData" : {}, - "listitems" : { - "2": [ - { - "title": "One" - }, - { - "title": "Two" - }, - ] + "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", + "extendedTemplate" : "{{#listItems.two}}{{ title }}{{/listItems.two}}", + "key": "test-patternName", + "jsonFileData" : {}, + "listitems" : { + "1": { + "title": "One" + }, + "2": { + "title": "Two" } + } }; var patternlab = { @@ -277,7 +276,7 @@ list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "OneTwo" ); + test.ok(currentPattern.extendedTemplate.match(/OneTwo|TwoOne/)); test.done(); }, @@ -286,20 +285,18 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = { - "template": "{{#listItems.one}}{{ title }}{{/listItems.one}}", - "extendedTemplate" : "{{#listItems.one}}{{> test-simple }}{{/listItems.one}}", - "key": "test-patternName", - "jsonFileData" : {}, - "listitems" : { - "2": [ - { - "title": "One" - }, - { - "title": "Two" - }, - ] + "template": "{{#listItems.one}}{{ title }}{{/listItems.one}}", + "extendedTemplate" : "{{#listItems.one}}{{ title }}{{/listItems.one}}", + "key": "test-patternName", + "jsonFileData" : {}, + "listitems" : { + "1": { + "number": "One" + }, + "2": { + "number": "Two" } + } }; var patternlab = { @@ -349,29 +346,24 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = { - "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" - }, - ] + "template": "{{#listItems.one}}{{ number }}{{/listItems.one}}", + "extendedTemplate" : "{{#listItems.one}}{{ number }}{{/listItems.one}}", + "key": "test-patternName", + "jsonFileData" : {}, + "listitems" : { + "1": { + "number": "One" } + } }; var patternlab = { "listitems": { + "1": [ + { + "title": "Foo" + } + ], "2": [ { "title": "Foo" @@ -403,7 +395,7 @@ list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "One" ); + test.equals(currentPattern.extendedTemplate, "One"); test.done(); }, @@ -416,13 +408,18 @@ var patterns_dir = './test/files/_patterns'; var pl = {}; - pl.config = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir + } + } + }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, ['two', 'message']); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; pl.config.patterns = { source: patterns_dir}; pl.listitems = { "1": [ @@ -440,24 +437,18 @@ ] }; - var atomPattern = new object_factory.oPattern('test/files/_patterns/00-test/03-styled-atom.mustache', '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 object_factory.oPattern('test/files/_patterns/00-test/11-bookend-listitem.mustache', '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); + var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); + var bookendFile = path.resolve('test/files/_patterns/00-test/11-bookend-listitem.mustache'); - pl.patterns.push(atomPattern); - pl.patterns.push(bookendPattern); + pattern_assembler.process_pattern_iterative(atomFile, pl); + pattern_assembler.process_pattern_iterative(bookendFile, pl); //act - list_item_hunter.process_list_item_partials(bookendPattern, pl); + pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); + var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, pl); //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(); } diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index 1e33a0ca6..e63599501 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -16,7 +16,9 @@ "flatPatternPath": "02-organisms-02-comments", "key": "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.') }}", + "escapedTemplate": "{{> 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.') }}", + "dataKeys": [], "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.') }}" @@ -38,6 +40,7 @@ "flatPatternPath": "01-molecules-06-components", "key": "molecules-single-comment", "template": "

{{description}}

", + "escapedTemplate": "

{{description}}

", "extendedTemplate": "

{{description}}

" } ], @@ -57,7 +60,7 @@ var patternlab = patternlabClosure(); var parameter_hunter = new ph(); - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); test.equals(currentPattern.extendedTemplate, '

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

'); test.done(); @@ -67,14 +70,15 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var pa = require('../builder/pattern_assembler'); + var pattern_assembler = new pa(); - patternlab.patterns[0].template = "

{{foo}}

{{description}}

"; - patternlab.patterns[0].extendedTemplate = patternlab.patterns[0].template; + currentPattern.escapedTemplate = '

{{foo}}

' + currentPattern.template; + currentPattern.extendedTemplate = currentPattern.escapedTemplate; patternlab.data.foo = 'Bar'; - patternlab.data.description = 'Baz'; - patternlab.patterns[0].jsonFileData = patternlab.data; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, currentPattern.parameteredPartials); + currentPattern.extendedTemplate = pattern_assembler.renderPattern(currentPattern.extendedTemplate, patternlab.data); test.equals(currentPattern.extendedTemplate, '

Bar

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

'); test.done(); @@ -84,13 +88,15 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; 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; + currentPattern.dataKeys = []; + 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.') }}"; + parameteredPartials[1] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

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

'); test.done(); @@ -100,13 +106,15 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; 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; + currentPattern.dataKeys = []; + 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.') }}"; + parameteredPartials[1] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

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

'); test.done(); @@ -118,12 +126,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(description: true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -133,12 +143,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(description: \"true\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -148,12 +160,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment('description': true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -163,12 +177,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment('description': 'true not,\\'true\\'') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true not,'true'

'); test.done(); @@ -178,12 +194,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment('description': \"true not:'true'\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true not:'true'

'); test.done(); @@ -193,12 +211,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(\"description\": true) }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -208,12 +228,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(\"description\": 'true not \",true\"') }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true not ",true"

'); test.done(); @@ -223,12 +245,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; currentPattern.template = "{{> molecules-single-comment(\"description\": \"true not \\\":true\\\"\") }}"; currentPattern.extendedTemplate = currentPattern.template; - currentPattern.parameteredPartials[0] = currentPattern.template; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true not ":true"

'); test.done(); @@ -238,12 +262,14 @@ var currentPattern = currentPatternClosure(); var patternlab = patternlabClosure(); var parameter_hunter = new ph(); + var parameteredPartials = []; 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; + currentPattern.dataKeys = []; + parameteredPartials[0] = currentPattern.template; - parameter_hunter.find_parameters(currentPattern, patternlab); + parameter_hunter.find_parameters(currentPattern, patternlab, parameteredPartials); test.equals(currentPattern.extendedTemplate, '

true

'); test.done(); @@ -269,10 +295,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); var styleFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index 1b98618da..e2e58370d 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -201,12 +201,12 @@ patternlab.config.paths.source.patterns = patterns_dir; patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); 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 diveSync(patterns_dir, @@ -259,20 +259,23 @@ 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; + var fooFile = path.resolve(patterns_dir + '/00-test/00-foo.mustache'); + var barFile = path.resolve(patterns_dir + '/00-test/01-bar.mustache'); - //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; - } - } + pattern_assembler.process_pattern_iterative(fooFile, patternlab); + pattern_assembler.process_pattern_iterative(barFile, patternlab); + + //act + pattern_assembler.process_pattern_recursive(fooFile, patternlab, 0, null, true); + pattern_assembler.process_pattern_recursive(barFile, patternlab, 0, null, true); + var fooPattern = pattern_assembler.get_pattern_by_key(fooFile, patternlab); + var barPattern = pattern_assembler.get_pattern_by_key(barFile, patternlab); //check initial values - test.equals(foo, '{{> test-bar }}'); - test.equals(bar, 'bar'); + test.equals(fooPattern.template.trim(), '{{> test-bar }}'); + test.equals(barPattern.template.trim(), 'bar'); //test that 00-foo.mustache included partial 01-bar.mustache - test.equals(fooExtended, 'bar'); + test.equals(fooPattern.extendedTemplate.trim(), 'bar'); test.done(); }, @@ -292,11 +295,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; - var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var groupFile = path.resolve('test/files/_patterns/00-test/04-group.mustache'); @@ -309,7 +310,7 @@ var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert - var expectedValue = '
{{message}} {{message}} {{message}} {{message}}
'; + var expectedValue = '
'; test.equals(groupPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -329,10 +330,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var groupFile = path.resolve('test/files/_patterns/00-test/10-multiple-classes-numeric.mustache'); @@ -345,7 +345,7 @@ var groupPattern = pattern_assembler.get_pattern_by_key(groupFile, pl); //assert - var expectedValue = '
{{message}} {{message}} bar
'; + var expectedValue = '
bar
'; test.equals(groupPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -365,10 +365,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var mixedFile = path.resolve('test/files/_patterns/00-test/06-mixed.mustache'); @@ -380,8 +379,9 @@ pattern_assembler.process_pattern_recursive(mixedFile, pl, 0, null, true); var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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}}
'; + //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first group, + //and {{message}} to be rendered as an empty strings in the second, third, and last groups, since they did not receive any value submissions. + var expectedValue = '
'; test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -401,10 +401,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var bookendFile = path.resolve('test/files/_patterns/00-test/09-bookend.mustache'); @@ -416,8 +415,9 @@ pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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}}
'; + //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first and last group, + //and {{message}} to be rendered as an empty strings in the second and third groups, since they did not receive any value submissions. + var expectedValue = '
'; test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -437,10 +437,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var mixedFile = path.resolve('test/files/_patterns/00-test/07-mixed-params.mustache'); @@ -452,8 +451,8 @@ pattern_assembler.process_pattern_recursive(mixedFile, pl, 0, null, true); var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, 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
'; + //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first span, since they did not receive any value submissions. + var expectedValue = '
2 3 4
'; test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -473,10 +472,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); var bookendFile = path.resolve('test/files/_patterns/00-test/08-bookend-params.mustache'); @@ -488,8 +486,8 @@ pattern_assembler.process_pattern_recursive(bookendFile, pl, 0, null, true); var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, 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}}
'; + //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first and last span, since they did not receive any value submissions. + var expectedValue = '
2 3
'; test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); }, @@ -511,7 +509,6 @@ 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 = {}; //act diveSync(patterns_dir, @@ -598,13 +595,12 @@ 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.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []) + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); 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( patterns_dir, @@ -712,7 +708,6 @@ var pattern_assembler = new pa(); var patternlab = {}; patternlab.patterns = []; - patternlab.partials = {}; patternlab.data = {link: {}}; var pattern = new object_factory.oPattern('test/files/_patterns/00-test/01-bar.mustache', '00-test', '01-bar.mustache'); @@ -733,7 +728,6 @@ var pattern_assembler = new pa(); var patternlab = {}; patternlab.patterns = []; - patternlab.partials = {}; patternlab.data = {link: {}}; var pattern = new object_factory.oPattern('test/files/_patterns/00-test/01-bar.mustache', '00-test', '01-bar.mustache'); diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 85089d1d6..152d5d270 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -24,10 +24,9 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []) + pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); pl.config.debug = false; pl.patterns = []; - pl.partials = {}; pl.config.patternStates = {}; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); diff --git a/test/style_modifier_hunter_tests.js b/test/style_modifier_hunter_tests.js index 8bb4e565d..ff4280a24 100644 --- a/test/style_modifier_hunter_tests.js +++ b/test/style_modifier_hunter_tests.js @@ -7,7 +7,6 @@ 'uses the partial stylemodifer to modify the patterns tmpTemplate' : function(test){ //arrange var pl = {}; - pl.partials = {}; pl.config = {}; pl.config.debug = false; @@ -27,7 +26,6 @@ 'replaces style modifiers with spaces in the syntax' : function(test){ //arrange var pl = {}; - pl.partials = {}; pl.config = {}; pl.config.debug = false; @@ -47,7 +45,6 @@ 'replaces multiple style modifiers' : function(test){ //arrange var pl = {}; - pl.partials = {}; pl.config = {}; pl.config.debug = false; @@ -67,7 +64,6 @@ 'does not alter pattern tmpTemplate if styleModifier not found in partial' : function(test){ //arrange var pl = {}; - pl.partials = {}; pl.config = {}; pl.config.debug = false; From 9e711384627a0b59e5e8a870ee1537f6e2d331a8 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 16:58:45 -0400 Subject: [PATCH 127/162] working unit tests --- builder/parameter_hunter.js | 3 +- builder/pattern_assembler.js | 17 +- core/lib/list_item_hunter.js | 21 +- core/lib/patternlab.js | 2 - test/files/_patterns/00-test/01-bar.mustache | 2 +- .../_patterns/00-test/02-listitems.mustache | 2 + test/list_item_hunter_tests.js | 327 ++++++------------ test/parameter_hunter_tests.js | 5 +- test/pattern_assembler_tests.js | 45 ++- test/pseudopattern_hunter_tests.js | 2 +- 10 files changed, 164 insertions(+), 262 deletions(-) create mode 100644 test/files/_patterns/00-test/02-listitems.mustache diff --git a/builder/parameter_hunter.js b/builder/parameter_hunter.js index 8e0af3f7b..eaab61b76 100644 --- a/builder/parameter_hunter.js +++ b/builder/parameter_hunter.js @@ -137,8 +137,7 @@ var parameter_hunter = function () { var partialPattern = pattern_assembler.get_pattern_by_key(partialName, patternlab); if (!partialPattern) { - console.log('Could not find pattern with key ' + partialName); - continue; + throw('Could not find pattern with key ' + partialName); } //if we retrieved a pattern we should make sure that its tmpTemplate is reset. looks to fix #190 diff --git a/builder/pattern_assembler.js b/builder/pattern_assembler.js index 00aee7a5e..18c61bb9b 100644 --- a/builder/pattern_assembler.js +++ b/builder/pattern_assembler.js @@ -131,7 +131,7 @@ function getDataKeys(data, uniqueKeys) { for (var key in data) { if (data.hasOwnProperty(key)) { - if (!(typeof data === 'object' && data instanceof Array)) { + if (data.constructor !== Array) { if (uniqueKeys.indexOf(key) === -1) { uniqueKeys.push(key); } else { @@ -282,6 +282,7 @@ pattern.tmpTemplate = ''; pattern.dataKeys = null; pattern.listitems = null; + pattern.listitemsRaw = null; if (pattern.jsonFileData !== patternlab.data) { pattern.jsonFileData = null; @@ -402,9 +403,14 @@ //define tmpTemplate and listitems to avoid undefined type errors //trying to keep memory footprint small, so set it empty at first currentPattern.tmpTemplate = ''; - currentPattern.listitems = null; - //needs to be initialized as {} in order to run winnowUnusedTags + //needs to be empty object so buildListItems can work + currentPattern.listitems = {}; + + //needs to be null so list_item_hunter.process_list_item_partials can work + currentPattern.listitemsRaw = null; + + //needs to be initialized as {} so winnowUnusedTags can work currentPattern.jsonFileData = {}; //this writes currentPattern.escapedTemplate which needs to be initialized @@ -555,7 +561,10 @@ } if (hasLocalListItems) { try { - currentPattern.listitems = fs.readJSONSync(listJsonFileName); + currentPattern.listitems = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); + currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, fs.readJSONSync(listJsonFileName)); + buildListItems(currentPattern); + if (patternlab.config.debug) { console.log('found pattern-specific listitems.json for ' + currentPattern.key); } diff --git a/core/lib/list_item_hunter.js b/core/lib/list_item_hunter.js index 41f9f13b4..7593840be 100644 --- a/core/lib/list_item_hunter.js +++ b/core/lib/list_item_hunter.js @@ -25,10 +25,23 @@ var list_item_hunter = function () { //find any listitem blocks var liMatches = pattern_assembler.find_list_items(pattern.extendedTemplate, patternlab); if (liMatches !== null) { - pattern_assembler.combine_listItems(pattern); - //merge global and local listitem data and save it to currentPatterns.listitems - pattern.listitems = pattern_assembler.merge_data(patternlab.listitems, pattern.listitems); + if (pattern.listitemsRaw) { + + //copy, don't reference + pattern.listitems = JSON.parse(JSON.stringify(pattern.listitemsRaw)); + + //if no local listitems.json file, use global listitems data + } else { + + //copy, don't reference + pattern.listitems = JSON.parse(JSON.stringify(patternlab.listitems)); + pattern.listitemsRaw = JSON.parse(JSON.stringify(patternlab.listitems)); + } + + //this shuffles listitemsRaw, and builds it into an object of array of + //objects and saves that in listitems + pattern_assembler.combine_listItems(pattern); for (var i = 0; i < liMatches.length; i++) { @@ -53,11 +66,11 @@ var list_item_hunter = function () { //iterate over each copied block, rendering its contents along with pattenlab.listitems[j] for (j = 0; j < repeatedBlockTemplate.length; j++) { var thisBlockHTML = ""; - var itemData = pattern.listitems['' + items.indexOf(loopNumberString)]; //this is a property like "2" var patternData = pattern.jsonFileData; var allData = pattern_assembler.merge_data(patternData, itemData !== undefined ? itemData[j] : {}); //itemData could be undefined if the listblock contains no partial, just markup + thisBlockHTML = pattern_assembler.renderPattern(patternBlock, allData); //add the rendered HTML to our string diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 97002ea3a..2c18bc93a 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -82,8 +82,6 @@ var patternlab_engine = function (config) { lineage_hunter = new lh(), patterns_dir = paths.source.patterns; - pattern_assembler.combine_listItems(patternlab); - patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); patternlab.dataKeys = patternlab.dataKeys.concat(list_item_hunter.get_list_item_iteration_keys()); patternlab.dataKeys = patternlab.dataKeys.concat(pattern_assembler.get_data_keys(patternlab.listitems, [])); diff --git a/test/files/_patterns/00-test/01-bar.mustache b/test/files/_patterns/00-test/01-bar.mustache index 5716ca598..08573a42b 100644 --- a/test/files/_patterns/00-test/01-bar.mustache +++ b/test/files/_patterns/00-test/01-bar.mustache @@ -1 +1 @@ -bar +{{message}}bar diff --git a/test/files/_patterns/00-test/02-listitems.mustache b/test/files/_patterns/00-test/02-listitems.mustache new file mode 100644 index 000000000..89ced8929 --- /dev/null +++ b/test/files/_patterns/00-test/02-listitems.mustache @@ -0,0 +1,2 @@ +{{#listItems.one}}{{> 00-test/00-foo }}{{/listItems.one}} +{{#listItems.one}}{{> 00-test/01-bar.mustache }}{{/listItems.one}} diff --git a/test/list_item_hunter_tests.js b/test/list_item_hunter_tests.js index f560a6d07..8eb2c953d 100644 --- a/test/list_item_hunter_tests.js +++ b/test/list_item_hunter_tests.js @@ -19,26 +19,17 @@ var patternlab = { "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "1": { + "title": "Foo" + }, + "2": { + "title": "Bar" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, - "config": {"debug": false}, - "partials" : {} + "config": {"debug": false} }; var list_item_hunter = new lih(); @@ -47,7 +38,7 @@ list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "FooBar" ); + test.ok(currentPattern.extendedTemplate.match(/(FooBar|BarFoo)/)); test.done(); }, @@ -64,26 +55,17 @@ var patternlab = { "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "1": { + "title": "Foo" + }, + "2": { + "title": "Bar" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, - "config": {"debug": false}, - "partials" : {} + "config": {"debug": false} }; var list_item_hunter = new lih(); @@ -92,130 +74,63 @@ list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "FooBar" ); + test.ok(currentPattern.extendedTemplate.match(/(FooBar|BarFoo)/)); test.done(); }, '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 = { - "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", - "extendedTemplate" : "{{#listItems.two}}{{> test-simple }}{{/listItems.two}}", - "key": "test-patternName", - "jsonFileData" : {} - }; + //will test recursion and verbose partial inclusion syntax + var fs = require('fs-extra'); + var pattern_assembler = new pa(); + var patterns_dir = './test/files/_patterns'; - var patternlab = { - "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] - }, - "data": { - "link": {}, - "partials": [] - }, - "config": {"debug": false}, - "patterns": [ - { - "template": "{{ title }}", - "extendedTemplate" : "{{ title }}", - "key": "test-simple", - "jsonFileData" : {} + var pl = {}; + pl.config = { + paths: { + source: { + patterns: patterns_dir } - ], - "partials" : {} + } }; - - var list_item_hunter = new lih(); - - //act - list_item_hunter.process_list_item_partials(currentPattern, patternlab); - - //assert - test.equals(currentPattern.extendedTemplate, "FooBar" ); - - test.done(); - }, - - 'process_list_item_partials finds verbose partials and outputs repeated renders' : function(test){ - var pattern1 = { - "template": "{{#listItems.one}}{{> 00-test/00-foo }}{{/listItems.one}}", - "extendedTemplate" : "{{#listItems.one}}{{> 00-test/00-foo }}{{/listItems.one}}", - "key": "test-foo", - "jsonFileData" : {} + pl.data = {}; + pl.data.link = {}; + pl.dataKeys = ['one', 'message']; + pl.config.debug = false; + pl.patterns = []; + pl.config.patterns = { source: patterns_dir}; + pl.listitems = { + "1": { + "message": "Foo" + }, + "2": { + "message": "Bar" + } }; - var pattern2 = { - "template": "{{#listItems.two}}{{> 00-test/01-bar.mustache }}{{/listItems.two}}", - "extendedTemplate" : "{{#listItems.two}}{{> 00-test/01-bar.mustache }}{{/listItems.two}}", - "key": "test-bar", - "jsonFileData" : {} - }; + var fooFile = path.resolve('test/files/_patterns/00-test/00-foo.mustache'); + var barFile = path.resolve('test/files/_patterns/00-test/01-bar.mustache'); + var listitemsFile = path.resolve('test/files/_patterns/00-test/02-listitems.mustache'); - var patternlab = { - "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] - }, - "data": { - "link": {}, - "partials": [] - }, - "config": {"debug": false}, - "patterns": [ - { - "template": "{{ title }}", - "extendedTemplate" : "{{ title }}", - "subdir": "00-test", - "fileName": "00-foo", - "jsonFileData" : {}, - "key": "test-foo", - }, - { - "template": "{{ title }}", - "extendedTemplate" : "{{ title }}", - "subdir": "00-test", - "fileName": "01-bar", - "jsonFileData" : {}, - "key": "test-bar", - } - ], - "partials" : {} - }; + //the contents of these files: + //00-foo.mustache: + // {{> test-bar }} + //01-bar.mustache: + // {{message}}bar + //02-listitems.mustache + // {{#listItems.one}}{{> 00-test/00-foo }}{{/listItems.one}} + // {{#listItems.one}}{{> 00-test/01-bar.mustache }}{{/listItems.one}} - var list_item_hunter = new lih(); + pattern_assembler.process_pattern_iterative(fooFile, pl); + pattern_assembler.process_pattern_iterative(barFile, pl); + pattern_assembler.process_pattern_iterative(listitemsFile, pl); //act - list_item_hunter.process_list_item_partials(pattern1, patternlab); - list_item_hunter.process_list_item_partials(pattern2, patternlab); + pattern_assembler.process_pattern_recursive(listitemsFile, pl, 0, null, true); + var listitemsPattern = pattern_assembler.get_pattern_by_key(listitemsFile, pl); //assert - test.equals(pattern1.extendedTemplate, "Foo" ); - test.equals(pattern2.extendedTemplate, "FooBar" ); + test.ok(listitemsPattern.extendedTemplate.replace(/\n/g, '').match(/(FoobarFoobar|BarbarBarbar)/)); test.done(); }, @@ -226,9 +141,10 @@ var currentPattern = { "template": "{{#listItems.two}}{{ title }}{{/listItems.two}}", "extendedTemplate" : "{{#listItems.two}}{{ title }}{{/listItems.two}}", - "key": "test-patternName", + "key": "test-patternName1", "jsonFileData" : {}, - "listitems" : { + "listitems": {}, + "listitemsRaw": { "1": { "title": "One" }, @@ -239,24 +155,16 @@ }; var patternlab = { - "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "listitems" : { + "1": { + "title": "Foo" + }, + "2": { + "title": "Bar" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, "config": {"debug": false}, "patterns": [ @@ -266,8 +174,7 @@ "key": "test-simple", "jsonFileData" : {} } - ], - "partials" : {} + ] }; var list_item_hunter = new lih(); @@ -289,35 +196,22 @@ "extendedTemplate" : "{{#listItems.one}}{{ title }}{{/listItems.one}}", "key": "test-patternName", "jsonFileData" : {}, - "listitems" : { + "listitems": {}, + "listitemsRaw": { "1": { "number": "One" - }, - "2": { - "number": "Two" } } }; var patternlab = { "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "1": { + "title": "Foo" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, "config": {"debug": false}, "patterns": [ @@ -327,13 +221,14 @@ "key": "test-simple", "jsonFileData" : {} } - ], - "partials" : {} + ] }; var list_item_hunter = new lih(); + var pattern_assembler = new pa(); //act + currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, currentPattern.listitemsRaw); list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert @@ -346,36 +241,32 @@ //arrange //setup current pattern from what we would have during execution var currentPattern = { - "template": "{{#listItems.one}}{{ number }}{{/listItems.one}}", - "extendedTemplate" : "{{#listItems.one}}{{ number }}{{/listItems.one}}", + "template": "{{#listItems.two}}{{ number }}{{/listItems.two}}", + "extendedTemplate" : "{{#listItems.two}}{{ number }}{{/listItems.two}}", "key": "test-patternName", "jsonFileData" : {}, - "listitems" : { + "listitems": {}, + "listitemsRaw" : { "1": { "number": "One" + }, + "2": { + "number": "Two" } } }; var patternlab = { "listitems": { - "1": [ - { - "title": "Foo" - } - ], - "2": [ - { - "title": "Foo" - }, - { - "title": "Bar" - } - ] + "1": { + "title": "Foo" + }, + "2": { + "title": "Bar" + } }, "data": { - "link": {}, - "partials": [] + "link": {} }, "config": {"debug": false}, "patterns": [ @@ -385,17 +276,18 @@ "key": "test-simple", "jsonFileData" : {} } - ], - "partials" : {} + ] }; var list_item_hunter = new lih(); + var pattern_assembler = new pa(); //act + currentPattern.listitemsRaw = pattern_assembler.merge_data(patternlab.listitems, currentPattern.listitemsRaw); list_item_hunter.process_list_item_partials(currentPattern, patternlab); //assert - test.equals(currentPattern.extendedTemplate, "One"); + test.ok(currentPattern.extendedTemplate.match(/(OneTwo|TwoOne)/)); test.done(); }, @@ -417,24 +309,17 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, ['two', 'message']); + pl.dataKeys = ['two', 'message']; pl.config.debug = false; pl.patterns = []; pl.config.patterns = { source: patterns_dir}; pl.listitems = { - "1": [ - { - "message": "Foo" - } - ], - "2": [ - { - "message": "Foo" - }, - { - "message": "Bar" - } - ] + "1": { + "message": "Foo" + }, + "2": { + "message": "Bar" + } }; var atomFile = path.resolve('test/files/_patterns/00-test/03-styled-atom.mustache'); @@ -448,8 +333,8 @@ var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, pl); //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
'; - test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); + var expectedValue = /
(Foo|Bar) <\/span> (Foo|Bar) <\/span> (Foo|Bar) <\/span> (Foo|Bar) <\/span> (Foo|Bar) <\/span> (Foo|Bar) <\/span> <\/div>/; + test.ok(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim().match(expectedValue)); test.done(); } diff --git a/test/parameter_hunter_tests.js b/test/parameter_hunter_tests.js index e63599501..906a363ad 100644 --- a/test/parameter_hunter_tests.js +++ b/test/parameter_hunter_tests.js @@ -49,8 +49,7 @@ }, data: { description: 'Not a quote from a smart man' - }, - partials: {} + } } }; @@ -295,7 +294,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; diff --git a/test/pattern_assembler_tests.js b/test/pattern_assembler_tests.js index e2e58370d..a5304ccb6 100644 --- a/test/pattern_assembler_tests.js +++ b/test/pattern_assembler_tests.js @@ -273,7 +273,7 @@ //check initial values test.equals(fooPattern.template.trim(), '{{> test-bar }}'); - test.equals(barPattern.template.trim(), 'bar'); + test.equals(barPattern.template.trim(), '{{message}}bar'); //test that 00-foo.mustache included partial 01-bar.mustache test.equals(fooPattern.extendedTemplate.trim(), 'bar'); @@ -295,7 +295,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -330,7 +330,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -365,7 +365,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -380,7 +380,7 @@ var mixedPattern = pattern_assembler.get_pattern_by_key(mixedFile, pl); //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first group, - //and {{message}} to be rendered as an empty strings in the second, third, and last groups, since they did not receive any value submissions. + //and {{message}} to be rendered as an empty strings in the second, third, and last groups, since they did not receive any value submissions. var expectedValue = '
'; test.equals(mixedPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); @@ -401,7 +401,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -416,7 +416,7 @@ var bookendPattern = pattern_assembler.get_pattern_by_key(bookendFile, pl); //assert. here we expect {{styleModifier}} and {{message}} to be rendered as empty strings in the first and last group, - //and {{message}} to be rendered as an empty strings in the second and third groups, since they did not receive any value submissions. + //and {{message}} to be rendered as an empty strings in the second and third groups, since they did not receive any value submissions. var expectedValue = '
'; test.equals(bookendPattern.extendedTemplate.replace(/\s\s+/g, ' ').replace(/\n/g, ' ').trim(), expectedValue.trim()); test.done(); @@ -437,7 +437,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -472,7 +472,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; @@ -504,6 +504,7 @@ patternlab.config.paths.source.patterns = patterns_dir; patternlab.data = fs.readJSONSync(path.resolve(patternlab.config.paths.source.data, 'data.json')); + patternlab.dataKeys = pattern_assembler.get_data_keys(patternlab.data, []); 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'); @@ -511,36 +512,32 @@ patternlab.data.link = {}; //act - diveSync(patterns_dir, - { - filter: function(path, dir){ - if(dir){ - var remainingPath = path.replace(patterns_dir, ''); - var isValidPath = remainingPath.indexOf('/_') === -1; - return isValidPath; - } - return true; - } - }, - function(err, file){ + diveSync( + patterns_dir, + function (err, file) { //log any errors - if(err){ + if (err) { console.log(err); return; } - pattern_assembler.process_pattern_iterative(path.resolve(file), patternlab); } ); //assert var foundVariant = false; + var variantIgnored = false; for(var i = 0; i < patternlab.patterns.length; i++){ if(patternlab.patterns[i].fileName.indexOf('~') > -1){ foundVariant = true; + if(typeof patternlab.patterns[i].extendedTemplate === 'undefined'){ + variantIgnored = true; + } } } - test.equals(foundVariant, false); + + test.equals(foundVariant, true); + test.equals(variantIgnored, true); test.done(); }, 'setState - applies any patternState matching the pattern' : function(test){ diff --git a/test/pseudopattern_hunter_tests.js b/test/pseudopattern_hunter_tests.js index 152d5d270..2101c0b7d 100644 --- a/test/pseudopattern_hunter_tests.js +++ b/test/pseudopattern_hunter_tests.js @@ -24,7 +24,7 @@ }; pl.data = {}; pl.data.link = {}; - pl.dataKeys = pattern_assembler.get_data_keys(pl.data, []); + pl.dataKeys = []; pl.config.debug = false; pl.patterns = []; pl.config.patternStates = {}; From 81d8a1d8879db2cc2e92d6fb5fd0e20f264910b0 Mon Sep 17 00:00:00 2001 From: e2tha-e Date: Tue, 15 Mar 2016 17:12:23 -0400 Subject: [PATCH 128/162] eslinting --- builder/.pattern_assembler.js.swp | Bin 0 -> 40960 bytes builder/parameter_hunter.js | 2 +- builder/pattern_assembler.js | 11 +++++------ 3 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 builder/.pattern_assembler.js.swp diff --git a/builder/.pattern_assembler.js.swp b/builder/.pattern_assembler.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..7323cbae352a06f42326a03c94c5f640e4d54f5c GIT binary patch literal 40960 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