@@ -18,17 +18,122 @@ var parameter_hunter = function () {
1818 style_modifier_hunter = new smh ( ) ,
1919 pattern_assembler = new pa ( ) ;
2020
21+ function paramToJson ( pString ) {
22+ var paramStringWellFormed = '' ;
23+ var paramStringTmp ;
24+ var colonPos ;
25+ var delimitPos ;
26+ var quotePos ;
27+ var paramString = pString ;
28+
29+ do {
30+
31+ //if param key is wrapped in single quotes, replace with double quotes.
32+ paramString = paramString . replace ( / ( ^ \s * [ \{ | \, ] \s * ) ' ( [ ^ ' ] + ) ' ( \s * \: ) / , '$1"$2"$3' ) ;
33+
34+ //if params key is not wrapped in any quotes, wrap in double quotes.
35+ paramString = paramString . replace ( / ( ^ \s * [ \{ | \, ] \s * ) ( [ ^ \s " ' \: ] + ) ( \s * \: ) / , '$1"$2"$3' ) ;
36+
37+ //move param key to paramStringWellFormed var.
38+ colonPos = paramString . indexOf ( ':' ) ;
39+
40+ //except to prevent infinite loops.
41+ if ( colonPos === - 1 ) {
42+ colonPos = paramString . length - 1 ;
43+ }
44+ else {
45+ colonPos += 1 ;
46+ }
47+ paramStringWellFormed += paramString . substring ( 0 , colonPos ) ;
48+ paramString = paramString . substring ( colonPos , paramString . length ) . trim ( ) ;
49+
50+ //if param value is wrapped in single quotes, replace with double quotes.
51+ if ( paramString [ 0 ] === '\'' ) {
52+ quotePos = paramString . search ( / [ ^ \\ ] ' / ) ;
53+
54+ //except for unclosed quotes to prevent infinite loops.
55+ if ( quotePos === - 1 ) {
56+ quotePos = paramString . length - 1 ;
57+ }
58+ else {
59+ quotePos += 2 ;
60+ }
61+
62+ //prepare param value for move to paramStringWellFormed var.
63+ paramStringTmp = paramString . substring ( 0 , quotePos ) ;
64+
65+ //unescape any escaped single quotes.
66+ paramStringTmp = paramStringTmp . replace ( / \\ ' / g, '\'' ) ;
67+
68+ //escape any double quotes.
69+ paramStringTmp = paramStringTmp . replace ( / " / g, '\\"' ) ;
70+
71+ //replace the delimiting single quotes with double quotes.
72+ paramStringTmp = paramStringTmp . replace ( / ^ ' / , '"' ) ;
73+ paramStringTmp = paramStringTmp . replace ( / ' $ / , '"' ) ;
74+
75+ //move param key to paramStringWellFormed var.
76+ paramStringWellFormed += paramStringTmp ;
77+ paramString = paramString . substring ( quotePos , paramString . length ) . trim ( ) ;
78+ }
79+
80+ //if param value is wrapped in double quotes, just move to paramStringWellFormed var.
81+ else if ( paramString [ 0 ] === '"' ) {
82+ quotePos = paramString . search ( / [ ^ \\ ] " / ) ;
83+
84+ //except for unclosed quotes to prevent infinite loops.
85+ if ( quotePos === - 1 ) {
86+ quotePos = paramString . length - 1 ;
87+ }
88+ else {
89+ quotePos += 2 ;
90+ }
91+
92+ //move param key to paramStringWellFormed var.
93+ paramStringWellFormed += paramString . substring ( 0 , quotePos ) ;
94+ paramString = paramString . substring ( quotePos , paramString . length ) . trim ( ) ;
95+ }
96+
97+ //if param value is not wrapped in quotes, move everthing up to the delimiting comma to paramStringWellFormed var.
98+ else {
99+ delimitPos = paramString . indexOf ( ',' ) ;
100+
101+ //except to prevent infinite loops.
102+ if ( delimitPos === - 1 ) {
103+ delimitPos = paramString . length - 1 ;
104+ }
105+ else {
106+ delimitPos += 1 ;
107+ }
108+ paramStringWellFormed += paramString . substring ( 0 , delimitPos ) ;
109+ paramString = paramString . substring ( delimitPos , paramString . length ) . trim ( ) ;
110+ }
111+
112+ //break at the end.
113+ if ( paramString . length === 1 ) {
114+ paramStringWellFormed += paramString . trim ( ) ;
115+ paramString = '' ;
116+ break ;
117+ }
118+
119+ } while ( paramString ) ;
120+
121+ return paramStringWellFormed ;
122+ }
123+
21124 function findparameters ( pattern , patternlab ) {
125+
22126 if ( pattern . parameteredPartials && pattern . parameteredPartials . length > 0 ) {
23- //compile this partial immediately, essentially consuming it.
24127
128+ //compile this partial immeadiately, essentially consuming it.
25129 pattern . parameteredPartials . forEach ( function ( pMatch ) {
26130 //find the partial's name and retrieve it
27131 var partialName = pMatch . match ( / ( [ \w \- \. \/ ~ ] + ) / g) [ 0 ] ;
28132 var partialPattern = pattern_assembler . get_pattern_by_key ( partialName , patternlab ) ;
29133
30134 //if we retrieved a pattern we should make sure that its extendedTemplate is reset. looks to fix #190
31135 partialPattern . extendedTemplate = partialPattern . template ;
136+
32137 if ( patternlab . config . debug ) {
33138 console . log ( 'found patternParameters for ' + partialName ) ;
34139 }
@@ -37,15 +142,7 @@ var parameter_hunter = function () {
37142 var leftParen = pMatch . indexOf ( '(' ) ;
38143 var rightParen = pMatch . indexOf ( ')' ) ;
39144 var paramString = '{' + pMatch . substring ( leftParen + 1 , rightParen ) + '}' ;
40-
41- //if param keys are wrapped in single quotes, replace with double quotes.
42- var paramStringWellFormed = paramString . replace ( / ( ' ) ( [ ^ ' ] + ) ( ' ) ( \s * \: ) / g, '"$2"$4' ) ;
43-
44- //if params keys are not wrapped in any quotes, wrap in double quotes.
45- paramStringWellFormed = paramStringWellFormed . replace ( / ( [ \{ | , ] \s * ) ( [ ^ \s " ' \: ] + ) ( \s * \: ) / g, '$1"$2"$3' ) ;
46-
47- //if param values are wrapped in single quotes, replace with double quotes.
48- paramStringWellFormed = paramStringWellFormed . replace ( / ( \: \s * ) ( ' ) ( [ ^ ' ] + ) ( ' ) / g, '$1"$3"' ) ;
145+ var paramStringWellFormed = paramToJson ( paramString ) ;
49146
50147 var paramData = { } ;
51148 var globalData = { } ;
0 commit comments