X-Git-Url: http://git.cyclocoop.org/%22.%24image2.%22?a=blobdiff_plain;f=includes%2Fparser%2FParser.php;h=3f0e38f5840836987219be12a404134183ef8616;hb=a2963315414d3044a9bb530d9cddd58210f89c39;hp=5da25465c6163492519a9faa1b0d2087d30bba96;hpb=8dfa5aa74d85ccbdd3c58390d21b36cd12c0ec05;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 5da25465c6..3f0e38f584 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -227,7 +227,7 @@ class Parser { * @var string Deprecated accessor for the strip marker prefix. * @deprecated since 1.26; use Parser::MARKER_PREFIX instead. */ - public $mUniqPrefix = Parser::MARKER_PREFIX; + public $mUniqPrefix = self::MARKER_PREFIX; /** * @var array Array with the language name of each language link (i.e. the @@ -736,17 +736,6 @@ class Parser { return $text; } - /** - * Get a random string - * - * @return string - * @deprecated since 1.26; use wfRandomString() instead. - */ - public static function getRandomString() { - wfDeprecated( __METHOD__, '1.26' ); - return wfRandomString( 16 ); - } - /** * Set the current user. * Should only be used when doing pre-save transform. @@ -757,17 +746,6 @@ class Parser { $this->mUser = $user; } - /** - * Accessor for mUniqPrefix. - * - * @return string - * @deprecated since 1.26; use Parser::MARKER_PREFIX instead. - */ - public function uniqPrefix() { - wfDeprecated( __METHOD__, '1.26' ); - return self::MARKER_PREFIX; - } - /** * Set the context title * @@ -972,15 +950,10 @@ class Parser { * * @param array $elements List of element names. Comments are always extracted. * @param string $text Source text string. - * @param array $matches Out parameter, Array: extracted tags - * @param string|null $uniq_prefix + * @param array &$matches Out parameter, Array: extracted tags * @return string Stripped text - * @since 1.26 The uniq_prefix argument is deprecated. */ - public static function extractTagsAndParams( $elements, $text, &$matches, $uniq_prefix = null ) { - if ( $uniq_prefix !== null ) { - wfDeprecated( __METHOD__ . ' called with $prefix argument', '1.26' ); - } + public static function extractTagsAndParams( $elements, $text, &$matches ) { static $n = 1; $stripped = ''; $matches = []; @@ -1295,7 +1268,7 @@ class Parser { if ( !$frame->depth ) { $flag = 0; } else { - $flag = Parser::PTD_FOR_INCLUSION; + $flag = self::PTD_FOR_INCLUSION; } $dom = $this->preprocessToDom( $text, $flag ); $text = $frame->expand( $dom ); @@ -2103,7 +2076,7 @@ class Parser { /** * Process [[ ]] wikilinks (RIL) - * @param string $s + * @param string &$s * @throws MWException * @return LinkHolderArray * @@ -2323,8 +2296,11 @@ class Parser { $this->mOutput->addLanguageLink( $nt->getFullText() ); } + /** + * Strip the whitespace interwiki links produce, see T10897 + */ $s = rtrim( $s . $prefix ); - $s .= trim( $trail, "\n" ) == '' ? '' : $prefix . $trail; + $s .= rtrim( $trail, "\n" ); continue; } @@ -2349,7 +2325,11 @@ class Parser { continue; } } elseif ( $ns == NS_CATEGORY ) { - $s = rtrim( $s . "\n" ); # T2087 + /** + * Strip the whitespace Category links produce, see T2087 + */ + $s = rtrim( $s . $prefix ); # T2087, T87753 + $s .= rtrim( $trail, "\n" ); if ( $wasblank ) { $sortkey = $this->getDefaultSort(); @@ -2361,11 +2341,6 @@ class Parser { $sortkey = $this->getConverterLanguage()->convertCategoryKey( $sortkey ); $this->mOutput->addCategory( $nt->getDBkey(), $sortkey ); - /** - * Strip the whitespace Category links produce, see T2087 - */ - $s .= trim( $prefix . $trail, "\n" ) == '' ? '' : $prefix . $trail; - continue; } } @@ -3411,7 +3386,7 @@ class Parser { # string or an array containing the string and any flags. This mungs # things around to match what this method should return. if ( !is_array( $result ) ) { - $result =[ + $result = [ 'found' => true, 'text' => $result, ]; @@ -4035,7 +4010,7 @@ class Parser { * @private */ public function formatHeadings( $text, $origText, $isMain = true ) { - global $wgMaxTocLevel, $wgExperimentalHtmlIds; + global $wgMaxTocLevel; # Inhibit editsection links if requested in the page if ( isset( $this->mDoubleUnderscores['noeditsection'] ) ) { @@ -4229,61 +4204,44 @@ class Parser { # Save headline for section edit hint before it's escaped $headlineHint = $safeHeadline; - if ( $wgExperimentalHtmlIds ) { - # For reverse compatibility, provide an id that's - # HTML4-compatible, like we used to. - # It may be worth noting, academically, that it's possible for - # the legacy anchor to conflict with a non-legacy headline - # anchor on the page. In this case likely the "correct" thing - # would be to either drop the legacy anchors or make sure - # they're numbered first. However, this would require people - # to type in section names like "abc_.D7.93.D7.90.D7.A4" - # manually, so let's not bother worrying about it. - $legacyHeadline = Sanitizer::escapeId( $safeHeadline, - [ 'noninitial', 'legacy' ] ); - $safeHeadline = Sanitizer::escapeId( $safeHeadline ); - - if ( $legacyHeadline == $safeHeadline ) { - # No reason to have both (in fact, we can't) - $legacyHeadline = false; - } - } else { - $legacyHeadline = false; - $safeHeadline = Sanitizer::escapeId( $safeHeadline, - 'noninitial' ); + $fallbackHeadline = Sanitizer::escapeIdForAttribute( $safeHeadline, Sanitizer::ID_FALLBACK ); + $linkAnchor = Sanitizer::escapeIdForLink( $safeHeadline ); + $safeHeadline = Sanitizer::escapeIdForAttribute( $safeHeadline, Sanitizer::ID_PRIMARY ); + if ( $fallbackHeadline === $safeHeadline ) { + # No reason to have both (in fact, we can't) + $fallbackHeadline = false; } - # HTML names must be case-insensitively unique (T12721). - # This does not apply to Unicode characters per - # https://www.w3.org/TR/html5/infrastructure.html#case-sensitivity-and-string-comparison + # HTML IDs must be case-insensitively unique for IE compatibility (T12721). # @todo FIXME: We may be changing them depending on the current locale. $arrayKey = strtolower( $safeHeadline ); - if ( $legacyHeadline === false ) { - $legacyArrayKey = false; + if ( $fallbackHeadline === false ) { + $fallbackArrayKey = false; } else { - $legacyArrayKey = strtolower( $legacyHeadline ); + $fallbackArrayKey = strtolower( $fallbackHeadline ); } # Create the anchor for linking from the TOC to the section $anchor = $safeHeadline; - $legacyAnchor = $legacyHeadline; + $fallbackAnchor = $fallbackHeadline; if ( isset( $refers[$arrayKey] ) ) { // @codingStandardsIgnoreStart for ( $i = 2; isset( $refers["${arrayKey}_$i"] ); ++$i ); // @codingStandardsIgnoreEnd $anchor .= "_$i"; + $linkAnchor .= "_$i"; $refers["${arrayKey}_$i"] = true; } else { $refers[$arrayKey] = true; } - if ( $legacyHeadline !== false && isset( $refers[$legacyArrayKey] ) ) { + if ( $fallbackHeadline !== false && isset( $refers[$fallbackArrayKey] ) ) { // @codingStandardsIgnoreStart - for ( $i = 2; isset( $refers["${legacyArrayKey}_$i"] ); ++$i ); + for ( $i = 2; isset( $refers["${fallbackArrayKey}_$i"] ); ++$i ); // @codingStandardsIgnoreEnd - $legacyAnchor .= "_$i"; - $refers["${legacyArrayKey}_$i"] = true; + $fallbackAnchor .= "_$i"; + $refers["${fallbackArrayKey}_$i"] = true; } else { - $refers[$legacyArrayKey] = true; + $refers[$fallbackArrayKey] = true; } # Don't number the heading if it is the only one (looks silly) @@ -4297,7 +4255,7 @@ class Parser { } if ( $enoughToc && ( !isset( $wgMaxTocLevel ) || $toclevel < $wgMaxTocLevel ) ) { - $toc .= Linker::tocLine( $anchor, $tocline, + $toc .= Linker::tocLine( $linkAnchor, $tocline, $numbering, $toclevel, ( $isTemplate ? false : $sectionIndex ) ); } @@ -4364,7 +4322,7 @@ class Parser { } $head[$headlineCount] = Linker::makeHeadline( $level, $matches['attrib'][$headlineCount], $anchor, $headline, - $editlink, $legacyAnchor ); + $editlink, $fallbackAnchor ); $headlineCount++; } @@ -4553,7 +4511,7 @@ class Parser { * Do not reuse this parser instance after calling getUserSig(), * as it may have changed if it's the $wgParser. * - * @param User $user + * @param User &$user * @param string|bool $nickname Nickname to use or false to use user's default nickname * @param bool|null $fancySig whether the nicknname is the complete signature * or null to use default value @@ -4914,7 +4872,7 @@ class Parser { * Replace "" link placeholders with actual links, in the buffer * Placeholders created in Linker::link() * - * @param string $text + * @param string &$text * @param int $options */ public function replaceLinkHolders( &$text, $options = 0 ) { @@ -5423,7 +5381,7 @@ class Parser { * Callback from the Sanitizer for expanding items found in HTML attribute * values, so they can be safely tested and escaped. * - * @param string $text + * @param string &$text * @param bool|PPFrame $frame * @return string */ @@ -5806,22 +5764,33 @@ class Parser { # Strip out wikitext links(they break the anchor) $text = $this->stripSectionName( $text ); $text = Sanitizer::normalizeSectionNameWhitespace( $text ); - return '#' . Sanitizer::escapeId( $text, 'noninitial' ); + return '#' . Sanitizer::escapeIdForLink( $text ); } /** * Same as guessSectionNameFromWikiText(), but produces legacy anchors - * instead. For use in redirects, since IE6 interprets Redirect: headers - * as something other than UTF-8 (apparently?), resulting in breakage. + * instead, if possible. For use in redirects, since various versions + * of Microsoft browsers interpret Location: headers as something other + * than UTF-8, resulting in breakage. * * @param string $text The section name * @return string An anchor */ public function guessLegacySectionNameFromWikiText( $text ) { + global $wgFragmentMode; + # Strip out wikitext links(they break the anchor) $text = $this->stripSectionName( $text ); $text = Sanitizer::normalizeSectionNameWhitespace( $text ); - return '#' . Sanitizer::escapeId( $text, [ 'noninitial', 'legacy' ] ); + + if ( isset( $wgFragmentMode[1] ) && $wgFragmentMode[1] === 'legacy' ) { + // ForAttribute() and ForLink() are the same for legacy encoding + $id = Sanitizer::escapeIdForAttribute( $text, Sanitizer::ID_FALLBACK ); + } else { + $id = Sanitizer::escapeIdForLink( $text ); + } + + return "#$id"; } /**