patternlab-node
Version:
Pattern Lab is a collection of tools to help you create atomic design systems. This is the node command line interface (CLI).
140 lines (109 loc) • 6.33 kB
JavaScript
;
var list_item_hunter = function () {
var extend = require('util')._extend,
pa = require('./pattern_assembler'),
smh = require('./style_modifier_hunter'),
plutils = require('./utilities'),
jsonCopy = require('./json_copy'),
Pattern = require('./object_factory').Pattern;
var pattern_assembler = new pa(),
style_modifier_hunter = new smh(),
items = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty'];
function processListItemPartials(pattern, patternlab) {
//find any listitem blocks
var matches = pattern.findListItems();
if (matches !== null) {
matches.forEach(function (liMatch) {
if (patternlab.config.debug) {
console.log('found listItem of size ' + liMatch + ' inside ' + pattern.patternPartial);
}
//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();
//build arrays that repeat the block, however large we need to
var repeatedBlockTemplate = [];
var repeatedBlockHtml = '';
for (var i = 0; i < items.indexOf(loopNumberString); i++) {
if (patternlab.config.debug) {
console.log('list item(s) in pattern', pattern.patternPartial, 'adding', patternBlock, 'to repeatedBlockTemplate');
}
repeatedBlockTemplate.push(patternBlock);
}
//check for a local listitems.json file
var listData;
try {
listData = jsonCopy(patternlab.listitems, 'config.paths.source.data listitems');
} catch (err) {
console.log('There was an error parsing JSON for ' + pattern.relPath);
console.log(err);
}
listData = plutils.mergeData(listData, pattern.listitems);
listData = pattern_assembler.parse_data_links_specific(patternlab, listData, 'listitems.json + any pattern listitems.json');
//iterate over each copied block, rendering its contents along with pattenlab.listitems[i]
for (var i = 0; i < repeatedBlockTemplate.length; i++) {
var thisBlockTemplate = repeatedBlockTemplate[i];
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;
var localData;
try {
globalData = jsonCopy(patternlab.data, 'config.paths.source.data global data');
localData = jsonCopy(pattern.jsonFileData, `${pattern.patternPartial} data`);
} catch (err) {
console.log('There was an error parsing JSON for ' + pattern.relPath);
console.log(err);
}
var allData = plutils.mergeData(globalData, localData);
allData = plutils.mergeData(allData, itemData !== undefined ? itemData[i] : {}); //itemData could be undefined if the listblock contains no partial, just markup
allData.link = extend({}, patternlab.data.link);
//check for partials within the repeated block
var foundPartials = Pattern.createEmpty({'template': thisBlockTemplate}).findPartials();
if (foundPartials && foundPartials.length > 0) {
for (var j = 0; j < foundPartials.length; j++) {
//get the partial
var partialName = foundPartials[j].match(/([\w\-\.\/~]+)/g)[0];
var partialPattern = pattern_assembler.getPartial(partialName, patternlab);
//create a copy of the partial so as to not pollute it after the get_pattern_by_key call.
var cleanPartialPattern;
try {
cleanPartialPattern = JSON.parse(JSON.stringify(partialPattern));
cleanPartialPattern = jsonCopy(partialPattern, `partial pattern ${partialName}`);
} catch (err) {
console.log('There was an error parsing JSON for ' + pattern.relPath);
console.log(err);
}
//if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #356
cleanPartialPattern.extendedTemplate = cleanPartialPattern.template;
//if partial has style modifier data, replace the styleModifier value
if (foundPartials[j].indexOf(':') > -1) {
style_modifier_hunter.consume_style_modifier(cleanPartialPattern, foundPartials[j], patternlab);
}
//replace its reference within the block with the extended template
thisBlockTemplate = thisBlockTemplate.replace(foundPartials[j], cleanPartialPattern.extendedTemplate);
}
//render with data
thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData, patternlab.partials);
} else {
//just render with mergedData
thisBlockHTML = pattern_assembler.renderPattern(thisBlockTemplate, allData, patternlab.partials);
}
//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);
pattern.extendedTemplate = pattern.extendedTemplate.replace(repeatingBlock, repeatedBlockHtml);
//update the extendedTemplate in the partials object in case this pattern is consumed later
patternlab.partials[pattern.patternPartial] = pattern.extendedTemplate;
});
}
}
return {
process_list_item_partials: function (pattern, patternlab) {
processListItemPartials(pattern, patternlab);
}
};
};
module.exports = list_item_hunter;