Index: branches/wmf/1.19wmf1/tests/parser/parserTests.txt |
— | — | @@ -9096,6 +9096,96 @@ |
9097 | 9097 | |
9098 | 9098 | !! end |
9099 | 9099 | |
| 9100 | +!! test |
| 9101 | +Strip marker in urlencode |
| 9102 | +!! input |
| 9103 | +{{urlencode:x<nowiki/>y}} |
| 9104 | +{{urlencode:x<nowiki/>y|wiki}} |
| 9105 | +{{urlencode:x<nowiki/>y|path}} |
| 9106 | +!! result |
| 9107 | +<p>xy |
| 9108 | +xy |
| 9109 | +xy |
| 9110 | +</p> |
| 9111 | +!! end |
| 9112 | + |
| 9113 | +!! test |
| 9114 | +Strip marker in lc |
| 9115 | +!! input |
| 9116 | +{{lc:x<nowiki/>y}} |
| 9117 | +!! result |
| 9118 | +<p>xy |
| 9119 | +</p> |
| 9120 | +!! end |
| 9121 | + |
| 9122 | +!! test |
| 9123 | +Strip marker in uc |
| 9124 | +!! input |
| 9125 | +{{uc:x<nowiki/>y}} |
| 9126 | +!! result |
| 9127 | +<p>XY |
| 9128 | +</p> |
| 9129 | +!! end |
| 9130 | + |
| 9131 | +!! test |
| 9132 | +Strip marker in formatNum |
| 9133 | +!! input |
| 9134 | +{{formatnum:1<nowiki/>2}} |
| 9135 | +{{formatnum:1<nowiki/>2|R}} |
| 9136 | +!! result |
| 9137 | +<p>12 |
| 9138 | +12 |
| 9139 | +</p> |
| 9140 | +!! end |
| 9141 | + |
| 9142 | +!! test |
| 9143 | +Strip marker in grammar |
| 9144 | +!! options |
| 9145 | +language=fi |
| 9146 | +!! input |
| 9147 | +{{grammar:elative|foo<nowiki/>bar}} |
| 9148 | +!! result |
| 9149 | +<p>foobarista |
| 9150 | +</p> |
| 9151 | +!! end |
| 9152 | + |
| 9153 | +!! test |
| 9154 | +Strip marker in padleft |
| 9155 | +!! input |
| 9156 | +{{padleft:|2|x<nowiki/>y}} |
| 9157 | +!! result |
| 9158 | +<p>xy |
| 9159 | +</p> |
| 9160 | +!! end |
| 9161 | + |
| 9162 | +!! test |
| 9163 | +Strip marker in padright |
| 9164 | +!! input |
| 9165 | +{{padright:|2|x<nowiki/>y}} |
| 9166 | +!! result |
| 9167 | +<p>xy |
| 9168 | +</p> |
| 9169 | +!! end |
| 9170 | + |
| 9171 | +!! test |
| 9172 | +Strip marker in anchorencode |
| 9173 | +!! input |
| 9174 | +{{anchorencode:x<nowiki/>y}} |
| 9175 | +!! result |
| 9176 | +<p>xy |
| 9177 | +</p> |
| 9178 | +!! end |
| 9179 | + |
| 9180 | +!! test |
| 9181 | +nowiki inside link inside heading (bug 18295) |
| 9182 | +!! input |
| 9183 | +==[[foo|x<nowiki>y</nowiki>z]]== |
| 9184 | +!! result |
| 9185 | +<h2><span class="editsection">[<a href="https://www.mediawiki.org/index.php?title=Parser_test&action=edit&section=1" title="Edit section: xyz">edit</a>]</span> <span class="mw-headline" id="xyz"><a href="https://www.mediawiki.org/index.php?title=Foo&action=edit&redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span></h2> |
| 9186 | + |
| 9187 | +!! end |
| 9188 | + |
| 9189 | + |
9100 | 9190 | TODO: |
9101 | 9191 | more images |
9102 | 9192 | more tables |
Index: branches/wmf/1.19wmf1/includes/parser/Parser.php |
— | — | @@ -4065,15 +4065,17 @@ |
4066 | 4066 | } |
4067 | 4067 | |
4068 | 4068 | # The safe header is a version of the header text safe to use for links |
4069 | | - # Avoid insertion of weird stuff like <math> by expanding the relevant sections |
4070 | | - $safeHeadline = $this->mStripState->unstripBoth( $headline ); |
4071 | 4069 | |
4072 | 4070 | # Remove link placeholders by the link text. |
4073 | 4071 | # <!--LINK number--> |
4074 | 4072 | # turns into |
4075 | 4073 | # link text with suffix |
4076 | | - $safeHeadline = $this->replaceLinkHoldersText( $safeHeadline ); |
| 4074 | + # Do this before unstrip since link text can contain strip markers |
| 4075 | + $safeHeadline = $this->replaceLinkHoldersText( $headline ); |
4077 | 4076 | |
| 4077 | + # Avoid insertion of weird stuff like <math> by expanding the relevant sections |
| 4078 | + $safeHeadline = $this->mStripState->unstripBoth( $safeHeadline ); |
| 4079 | + |
4078 | 4080 | # Strip out HTML (first regex removes any tag not allowed) |
4079 | 4081 | # Allowed tags are <sup> and <sub> (bug 8393), <i> (bug 26375) and <b> (r105284) |
4080 | 4082 | # We strip any parameter from accepted tags (second regex) |
— | — | @@ -5638,6 +5640,16 @@ |
5639 | 5641 | } |
5640 | 5642 | |
5641 | 5643 | /** |
| 5644 | + * Remove any strip markers found in the given text. |
| 5645 | + * |
| 5646 | + * @param $text Input string |
| 5647 | + * @return string |
| 5648 | + */ |
| 5649 | + function killMarkers( $text ) { |
| 5650 | + return $this->mStripState->killMarkers( $text ); |
| 5651 | + } |
| 5652 | + |
| 5653 | + /** |
5642 | 5654 | * Save the parser state required to convert the given half-parsed text to |
5643 | 5655 | * HTML. "Half-parsed" in this context means the output of |
5644 | 5656 | * recursiveTagParse() or internalParse(). This output has strip markers |
Index: branches/wmf/1.19wmf1/includes/parser/CoreParserFunctions.php |
— | — | @@ -164,17 +164,21 @@ |
165 | 165 | |
166 | 166 | // Encode as though it's a wiki page, '_' for ' '. |
167 | 167 | case 'url_wiki': |
168 | | - return wfUrlencode( str_replace( ' ', '_', $s ) ); |
| 168 | + $func = 'wfUrlencode'; |
| 169 | + $s = str_replace( ' ', '_', $s ); |
| 170 | + break; |
169 | 171 | |
170 | 172 | // Encode for an HTTP Path, '%20' for ' '. |
171 | 173 | case 'url_path': |
172 | | - return rawurlencode( $s ); |
| 174 | + $func = 'rawurlencode'; |
| 175 | + break; |
173 | 176 | |
174 | 177 | // Encode for HTTP query, '+' for ' '. |
175 | 178 | case 'url_query': |
176 | 179 | default: |
177 | | - return urlencode( $s ); |
| 180 | + $func = 'urlencode'; |
178 | 181 | } |
| 182 | + return $parser->markerSkipCallback( $s, $func ); |
179 | 183 | } |
180 | 184 | |
181 | 185 | static function lcfirst( $parser, $s = '' ) { |
— | — | @@ -194,11 +198,7 @@ |
195 | 199 | */ |
196 | 200 | static function lc( $parser, $s = '' ) { |
197 | 201 | global $wgContLang; |
198 | | - if ( is_callable( array( $parser, 'markerSkipCallback' ) ) ) { |
199 | | - return $parser->markerSkipCallback( $s, array( $wgContLang, 'lc' ) ); |
200 | | - } else { |
201 | | - return $wgContLang->lc( $s ); |
202 | | - } |
| 202 | + return $parser->markerSkipCallback( $s, array( $wgContLang, 'lc' ) ); |
203 | 203 | } |
204 | 204 | |
205 | 205 | /** |
— | — | @@ -208,11 +208,7 @@ |
209 | 209 | */ |
210 | 210 | static function uc( $parser, $s = '' ) { |
211 | 211 | global $wgContLang; |
212 | | - if ( is_callable( array( $parser, 'markerSkipCallback' ) ) ) { |
213 | | - return $parser->markerSkipCallback( $s, array( $wgContLang, 'uc' ) ); |
214 | | - } else { |
215 | | - return $wgContLang->uc( $s ); |
216 | | - } |
| 212 | + return $parser->markerSkipCallback( $s, array( $wgContLang, 'uc' ) ); |
217 | 213 | } |
218 | 214 | |
219 | 215 | static function localurl( $parser, $s = '', $arg = null ) { return self::urlFunction( 'getLocalURL', $s, $arg ); } |
— | — | @@ -252,12 +248,13 @@ |
253 | 249 | * @param null $raw |
254 | 250 | * @return |
255 | 251 | */ |
256 | | - static function formatNum( $parser, $num = '', $raw = null) { |
257 | | - if ( self::israw( $raw ) ) { |
258 | | - return $parser->getFunctionLang()->parseFormattedNumber( $num ); |
| 252 | + static function formatnum( $parser, $num = '', $raw = null) { |
| 253 | + if ( self::isRaw( $raw ) ) { |
| 254 | + $func = array( $parser->getFunctionLang(), 'parseFormattedNumber' ); |
259 | 255 | } else { |
260 | | - return $parser->getFunctionLang()->formatNum( $num ); |
| 256 | + $func = array( $parser->getFunctionLang(), 'formatNum' ); |
261 | 257 | } |
| 258 | + return $parser->markerSkipCallback( $num, $func ); |
262 | 259 | } |
263 | 260 | |
264 | 261 | /** |
— | — | @@ -267,6 +264,7 @@ |
268 | 265 | * @return |
269 | 266 | */ |
270 | 267 | static function grammar( $parser, $case = '', $word = '' ) { |
| 268 | + $word = $parser->killMarkers( $word ); |
271 | 269 | return $parser->getFunctionLang()->convertGrammar( $word, $case ); |
272 | 270 | } |
273 | 271 | |
— | — | @@ -637,7 +635,8 @@ |
638 | 636 | /** |
639 | 637 | * Unicode-safe str_pad with the restriction that $length is forced to be <= 500 |
640 | 638 | */ |
641 | | - static function pad( $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) { |
| 639 | + static function pad( $parser, $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) { |
| 640 | + $padding = $parser->killMarkers( $padding ); |
642 | 641 | $lengthOfPadding = mb_strlen( $padding ); |
643 | 642 | if ( $lengthOfPadding == 0 ) return $string; |
644 | 643 | |
— | — | @@ -661,11 +660,11 @@ |
662 | 661 | } |
663 | 662 | |
664 | 663 | static function padleft( $parser, $string = '', $length = 0, $padding = '0' ) { |
665 | | - return self::pad( $string, $length, $padding, STR_PAD_LEFT ); |
| 664 | + return self::pad( $parser, $string, $length, $padding, STR_PAD_LEFT ); |
666 | 665 | } |
667 | 666 | |
668 | 667 | static function padright( $parser, $string = '', $length = 0, $padding = '0' ) { |
669 | | - return self::pad( $string, $length, $padding ); |
| 668 | + return self::pad( $parser, $string, $length, $padding ); |
670 | 669 | } |
671 | 670 | |
672 | 671 | /** |
— | — | @@ -674,6 +673,7 @@ |
675 | 674 | * @return string |
676 | 675 | */ |
677 | 676 | static function anchorencode( $parser, $text ) { |
| 677 | + $text = $parser->killMarkers( $text ); |
678 | 678 | return substr( $parser->guessSectionNameFromWikiText( $text ), 1); |
679 | 679 | } |
680 | 680 | |
Index: branches/wmf/1.19wmf1/includes/parser/StripState.php |
— | — | @@ -181,5 +181,15 @@ |
182 | 182 | $key = $m[1]; |
183 | 183 | return "{$this->prefix}{$this->tempMergePrefix}-$key" . Parser::MARKER_SUFFIX; |
184 | 184 | } |
| 185 | + |
| 186 | + /** |
| 187 | + * Remove any strip markers found in the given text. |
| 188 | + * |
| 189 | + * @param $text Input string |
| 190 | + * @return string |
| 191 | + */ |
| 192 | + function killMarkers( $text ) { |
| 193 | + return preg_replace( $this->regex, '', $text ); |
| 194 | + } |
185 | 195 | } |
186 | 196 | |