1+ /*
2+ * patternlab-node - v0.10.0 - 2015
3+ *
4+ * Brian Muenzenmeyer, and the web community.
5+ * Licensed under the MIT license.
6+ *
7+ * Many thanks to Brad Frost and Dave Olsen for inspiration, encouragement, and advice.
8+ *
9+ */
10+
111( function ( ) {
212 "use strict" ;
313
414 var fs = require ( 'fs-extra' ) ,
15+ mustache = require ( 'mustache' ) ,
16+ ph = require ( './parameter_hunter' ) ,
517 path = require ( 'path' ) ;
618
19+ var parameter_hunter = new ph ( ) ;
20+
721 var pattern_assembler = function ( ) {
822
23+ //find and return any {{> template-name }} within pattern
24+ function findPartials ( pattern ) {
25+ var matches = pattern . template . match ( / { { > ( [ ] ) ? ( [ A - Z a - z 0 - 9 - ] + ) (?: \: [ A - Z a - z 0 - 9 - ] + ) ? (?: ( | ) \( .* ) ? ( [ ] ) ? } } / g) ;
26+ return matches ;
27+ }
28+
929 function setState ( pattern , patternlab ) {
1030 if ( patternlab . config . patternStates [ pattern . patternName ] ) {
1131 pattern . patternState = patternlab . config . patternStates [ pattern . patternName ] ;
1434 }
1535 }
1636
17- function addPattern ( pattern , patternLab ) {
18- patternLab . data . link [ pattern . patternGroup + '-' + pattern . patternName ] = '/patterns/' + pattern . patternLink ;
19- patternLab . patterns . push ( pattern ) ;
37+ function addPattern ( pattern , patternlab ) {
38+ patternlab . data . link [ pattern . patternGroup + '-' + pattern . patternName ] = '/patterns/' + pattern . patternLink ;
39+ patternlab . patterns . push ( pattern ) ;
40+ }
41+
42+ function renderPattern ( template , data , partials ) {
43+ if ( partials ) {
44+ return mustache . render ( template , data , partials ) ;
45+ } else {
46+ return mustache . render ( template , data ) ;
47+ }
48+ }
49+
50+ function processPatternFile ( file , patternlab ) {
51+ //extract some information
52+ var abspath = file . substring ( 2 ) ;
53+ var subdir = path . dirname ( path . relative ( './source/_patterns' , file ) ) . replace ( '\\' , '/' ) ;
54+ var filename = path . basename ( file ) ;
55+
56+ //ignore _underscored patterns, json (for now), and dotfiles
57+ if ( filename . charAt ( 0 ) === '_' || path . extname ( filename ) === '.json' || filename . charAt ( 0 ) === '.' ) {
58+ return ;
59+ }
60+
61+ //make a new Pattern Object
62+ currentPattern = new of . oPattern ( subdir , filename ) ;
63+
64+ //see if this file has a state
65+ pattern_assembler . setPatternState ( currentPattern , patternlab ) ;
66+
67+ //look for a json file for this template
68+ try {
69+ var jsonFilename = abspath . substr ( 0 , abspath . lastIndexOf ( "." ) ) + ".json" ;
70+ currentPattern . jsonFileData = fs . readJSONSync ( jsonFilename ) ;
71+ }
72+ catch ( e ) {
73+ }
74+
75+ //add the raw template to memory
76+ currentPattern . template = fs . readFileSync ( abspath , 'utf8' ) ;
77+
78+ //our helper function that does a lot of heavy lifting
79+ processPattern ( currentPattern , patternlab ) ;
80+ }
81+
82+ function processPattern ( pattern , patternlab , additionalData ) {
83+ //find how many partials there may be for the given pattern
84+ var foundPatternPartials = findPartials ( currentPattern ) ;
85+
86+ if ( foundPatternPartials != null && foundPatternPartials . length > 0 ) {
87+
88+ console . log ( foundPatternPartials ) ;
89+
90+ //determine if the template contains any pattern parameters. if so they must be immediately consumed
91+ var patternsConsumedWithParamaters = parameter_hunter . find_parameters ( pattern , patternlab ) ;
92+
93+ if ( patternsConsumedWithParamaters === 0 ) {
94+ //do something with the regular old partials
95+ }
96+
97+ } else {
98+ //we found no partials, so we are ready to render
99+
100+ }
101+
102+ //find pattern lineage
103+ lineage_hunter . find_lineage ( currentPattern , patternlab ) ;
104+
105+ //add as a partial in case this is referenced later. convert to syntax needed by existing patterns
106+ var sub = subdir . substring ( subdir . indexOf ( '-' ) + 1 ) ;
107+ var folderIndex = sub . indexOf ( path . sep ) ;
108+ var cleanSub = sub . substring ( 0 , folderIndex ) ;
109+
110+ //add any templates found to an object of partials, so downstream templates may use them too
111+ //look for the full path on nested patterns, else expect it to be flat
112+ var partialname = '' ;
113+ if ( cleanSub !== '' ) {
114+ partialname = cleanSub + '-' + currentPattern . patternName ;
115+ } else {
116+ partialname = currentPattern . patternGroup + '-' + currentPattern . patternName ;
117+ }
118+ patternlab . partials [ partialname ] = currentPattern . template ;
119+
120+ //look for a pseudo pattern by checking if there is a file containing same name, with ~ in it, ending in .json
121+ pseudopattern_hunter . find_pseudopatterns ( currentPattern , subdir , patternlab ) ;
122+
123+ //add to patternlab object so we can look these up later.
124+ pattern_assembler . addPattern ( currentPattern , patternlab ) ;
20125 }
21126
22127 return {
128+ find_pattern_partials : function ( pattern ) {
129+ return findPartials ( pattern ) ;
130+ } ,
23131 setPatternState : function ( pattern , patternlab ) {
24132 setState ( pattern , patternlab ) ;
25133 } ,
26- addPattern : function ( pattern , patternLab ) {
27- addPattern ( pattern , patternLab ) ;
134+ addPattern : function ( pattern , patternlab ) {
135+ addPattern ( pattern , patternlab ) ;
136+ } ,
137+ renderPattern : function ( template , data , partials ) {
138+ return renderPattern ( template , data , partials ) ;
139+ } ,
140+ process_pattern_file : function ( file , patternlab ) {
141+ processPatternFile ( file , patternlab ) ;
142+ } ,
143+ process_pattern : function ( pattern , patternlab , additionalData ) {
144+ processPattern ( pattern , patternlab , additionalData ) ;
28145 }
29146 } ;
30147
31148 } ;
32149
33150 module . exports = pattern_assembler ;
34151
35- } ( ) ) ;
152+ } ( ) ) ;
0 commit comments