return result === null ? null : [ result[0], result[2] ];
}
+ function templateWithOutReplacement() {
+ var result = sequence( [
+ templateName,
+ colon,
+ paramExpression
+ ] );
+ return result === null ? null : [ result[0], result[2] ];
+ }
+
var colon = makeStringParser(':');
var templateContents = choice( [
function() {
var res = sequence( [
- templateWithReplacement,
+ // templates can have placeholders for dynamic replacement eg: {{PLURAL:$1|one car|$1 cars}}
+ // or no placeholders eg: {{GRAMMAR:genitive|{{SITENAME}}}
+ choice( [ templateWithReplacement, templateWithOutReplacement ] ),
nOrMore( 0, templateParam )
] );
return res === null ? null : res[0].concat( res[1] );
templateContents
= twr:templateWithReplacement p:templateParam* { return twr.concat(p) }
+ / twr:templateWithOutReplacement p:templateParam* { return twr.concat(p) }
/ t:templateName p:templateParam* { return p.length ? [ t, p ] : [ t ] }
templateWithReplacement
= t:templateName ":" r:replacement { return [ t, r ] }
+templateWithOutReplacement
+ = t:templateName ":" p:paramExpression { return [ t, p ] }
+
templateParam
= "|" e:paramExpression* { return e.length > 1 ? [ "CONCAT" ].concat(e) : e[0]; }