Jackmcbarn has uploaded a new change for review. https://gerrit.wikimedia.org/r/181999
Change subject: Fix TOC anchor name collisions in edge cases ...................................................................... Fix TOC anchor name collisions in edge cases Currently, the parser adds a "_2" to the second of two identical headlines to avoid collisions, but there's still a collision if another headline actually ends in "_2". This change causes the new headline to also be checked for a collision, and advances to "_3" or beyond if there is one. Bug: T26787 Change-Id: Id0a55aa4c1917bac2f8f0d4863fcb85bd3dff1ca --- M includes/parser/Parser.php 1 file changed, 12 insertions(+), 15 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/99/181999/1 diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index e3a4ea5..407fb9a 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -4693,16 +4693,22 @@ $legacyArrayKey = strtolower( $legacyHeadline ); } - # count how many in assoc. array so we can track dupes in anchors + # Create the anchor for linking from the TOC to the section + $anchor = $safeHeadline; + $legacyAnchor = $legacyHeadline; if ( isset( $refers[$arrayKey] ) ) { - $refers[$arrayKey]++; + for ( $i = 2; isset( $refers["${arrayKey}_$i"] ); ++$i ); + $anchor .= "_$i"; + $refers["${arrayKey}_$i"] = true; } else { - $refers[$arrayKey] = 1; + $refers[$arrayKey] = true; } - if ( isset( $refers[$legacyArrayKey] ) ) { - $refers[$legacyArrayKey]++; + if ( $legacyHeadline !== false && isset( $refers[$legacyArrayKey] ) ) { + for ( $i = 2; isset( $refers["${legacyArrayKey}_$i"] ); ++$i ); + $legacyAnchor .= "_$i"; + $refers["${legacyArrayKey}_$i"] = true; } else { - $refers[$legacyArrayKey] = 1; + $refers[$legacyArrayKey] = true; } # Don't number the heading if it is the only one (looks silly) @@ -4715,15 +4721,6 @@ ) . ' ' . $headline; } - # Create the anchor for linking from the TOC to the section - $anchor = $safeHeadline; - $legacyAnchor = $legacyHeadline; - if ( $refers[$arrayKey] > 1 ) { - $anchor .= '_' . $refers[$arrayKey]; - } - if ( $legacyHeadline !== false && $refers[$legacyArrayKey] > 1 ) { - $legacyAnchor .= '_' . $refers[$legacyArrayKey]; - } if ( $enoughToc && ( !isset( $wgMaxTocLevel ) || $toclevel < $wgMaxTocLevel ) ) { $toc .= Linker::tocLine( $anchor, $tocline, $numbering, $toclevel, ( $isTemplate ? false : $sectionIndex ) ); -- To view, visit https://gerrit.wikimedia.org/r/181999 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id0a55aa4c1917bac2f8f0d4863fcb85bd3dff1ca Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: Jackmcbarn <jackmcb...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits