110 $pre = preg_quote( self::PRE,
'/' );
111 $post = preg_quote( self::POST,
'/' );
113 $ok = preg_match_all(
"/$pre(.*)$post/Us", $text, $m );
114 if ( $ok ===
false ) {
115 throw new RuntimeException(
"Plural regular expression failed for text: $text" );
121 foreach ( $m[0] as $instanceIndex => $instanceText ) {
125 $pattern =
'/' . preg_quote( $instanceText,
'/' ) .
'/';
126 $template = preg_replace( $pattern, $ph, $template, 1 );
129 foreach ( explode(
'|', $m[ 1 ][ $instanceIndex ] ) as $form ) {
131 $ok = preg_match(
"~\s*([a-z]+)\s*=(.+)~s", $form, $m2 );
132 $keyword = $ok ? $m2[ 1 ] :
'other';
133 $value = $ok ? trim( $m2[ 2 ] ) : $form;
134 $instanceForms[] = [ $keyword, $value ];
137 $instanceMap[$ph] = $instanceForms;
140 return [ $template, $instanceMap ];
151 public static function expandTemplate( $template, array $instanceMap, $expectedKeywords ) {
155 foreach ( $instanceMap as $ph => $list ) {
156 $instanceMap[ $ph ] = self::convertFormListToFormMap( $list, $expectedKeywords );
159 foreach ( $expectedKeywords as $keyword ) {
165 foreach ( $instanceMap as $ph => $instanceFormMap ) {
167 $replacement = $instanceFormMap[ $keyword ] ??
'';
168 $form = str_replace( $ph, $replacement, $form );
171 $formArray[ $keyword ] = $form;