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

Reply via email to