Cenarium has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/278702

Change subject: Improve handling of pages with multiple reflists
......................................................................

Improve handling of pages with multiple reflists

This improves the structure of the references data on pages with
multiple <references/> tags. References are now numbered in the
order of appearance of each <reference/> tag, which provides more
useful information. This incidentally gives to the API 'reflist'
param its correct meaning.

Change-Id: I39fcdee9cf67d8debe2a6e134f847729026786f5
---
M ApiQueryReferences.php
M Cite_body.php
2 files changed, 26 insertions(+), 34 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Cite 
refs/changes/02/278702/1

diff --git a/ApiQueryReferences.php b/ApiQueryReferences.php
index 96d7428..fcc52de 100644
--- a/ApiQueryReferences.php
+++ b/ApiQueryReferences.php
@@ -80,20 +80,19 @@
                        // some pages may not have references stored
                        if ( $storedRefs !== false ) {
                                // a page can have multiple <references> tags 
but they all have unique keys
-                               foreach ( $storedRefs['refs'] as $index => 
$grouping ) {
-                                       foreach ( $grouping as $group => 
$members ) {
-                                               foreach ( $members as $name => 
$ref ) {
-                                                       $ref['name'] = $name;
-                                                       $key = $ref['key'];
-                                                       if ( is_string( $name ) 
) {
-                                                               $id = 
Cite::getReferencesKey( $name . '-' . $key );
-                                                       } else {
-                                                               $id = 
Cite::getReferencesKey( $key );
-                                                       }
-                                                       $ref['group'] = $group;
-                                                       $ref['reflist'] = 
$index;
-                                                       $allReferences[$id] = 
$ref;
+                               foreach ( $storedRefs['references'] as $index 
=> list( $group, $members ) ) {
+                                       foreach ( $members as $name => $ref ) {
+                                               $ref['name'] = $name;
+                                               $key = $ref['key'];
+                                               if ( is_string( $name ) ) {
+                                                       $id = 
Cite::getReferencesKey( $name . '-' . $key );
+                                               } else {
+                                                       $id = 
Cite::getReferencesKey( $key );
                                                }
+                                               $ref['group'] = $group;
+                                               $ref['reflist'] = $index;
+
+                                               $allReferences[$id] = $ref;
                                        }
                                }
                        }
diff --git a/Cite_body.php b/Cite_body.php
index 872448c..801fb28 100644
--- a/Cite_body.php
+++ b/Cite_body.php
@@ -168,7 +168,7 @@
        /**
         * @var bool
         */
-       private $mBumpRefData = false;
+       private $referencesDataFullySaved = false;
 
        /**
         * Did we install us into $wgHooks yet?
@@ -207,10 +207,6 @@
                if ( is_callable( array( $frame, 'setVolatile' ) ) ) {
                        $frame->setVolatile();
                }
-
-               // new <ref> tag, we may need to bump the ref data counter
-               // to avoid overwriting a previous group
-               $this->mBumpRefData = true;
 
                return $ret;
        }
@@ -761,7 +757,7 @@
                }
 
                if ( !$this->mParser->getOptions()->getIsPreview() ) {
-                       // save references data for later use by LinksUpdate 
hooks
+                       // save references data for later storage
                        $this->saveReferencesData( $group );
                }
 
@@ -1135,9 +1131,11 @@
                }
 
                if ( !$parser->getOptions()->getIsPreview() ) {
-                       // save references data for later use by LinksUpdate 
hooks
                        if ( $this->mRefs && isset( 
$this->mRefs[self::DEFAULT_GROUP] ) ) {
+                               // save references data for later storage
                                $this->saveReferencesData();
+                               // protect against multiple calls
+                               $this->referencesDataFullySaved = true;
                        }
                        $isSectionPreview = false;
                } else {
@@ -1152,6 +1150,10 @@
                        if ( $group === self::DEFAULT_GROUP || 
$isSectionPreview ) {
                                $s .= $this->referencesFormat( $group );
                        } else {
+                               // cleanup usually done in referencesFormat
+                               unset( $this->mRefs[$group] );
+                               unset( $this->mGroupCnt[$group] );
+                               // show error
                                $s .= "\n<br />" .
                                        $this->error( 
'cite_error_group_refs_without_references', htmlspecialchars( $group ) );
                        }
@@ -1181,27 +1183,18 @@
         */
        private function saveReferencesData( $group = self::DEFAULT_GROUP ) {
                global $wgCiteStoreReferencesData;
-               if ( !$wgCiteStoreReferencesData ) {
+               if ( !$wgCiteStoreReferencesData || 
$this->referencesDataFullySaved ) {
                        return;
                }
+               static $reflistIndex = 1;
+
                $savedRefs = $this->mParser->getOutput()->getExtensionData( 
self::EXT_DATA_KEY );
                if ( $savedRefs === null ) {
                        // Initialize array structure
-                       $savedRefs = array(
-                               'refs' => array(),
-                               'version' => self::DATA_VERSION_NUMBER,
-                       );
+                       $savedRefs = array( 'version' => 
self::DATA_VERSION_NUMBER );
                }
-               if ( $this->mBumpRefData ) {
-                       // This handles pages with multiple <references/> tags 
with <ref> tags in between.
-                       // On those, a group can appear several times, so we 
need to avoid overwriting
-                       // a previous appearance.
-                       $savedRefs['refs'][] = array();
-                       $this->mBumpRefData = false;
-               }
-               $n = count( $savedRefs['refs'] ) - 1;
                // save group
-               $savedRefs['refs'][$n][$group] = $this->mRefs[$group];
+               $savedRefs['references'][$reflistIndex++] = array( $group, 
$this->mRefs[$group] );
 
                $this->mParser->getOutput()->setExtensionData( 
self::EXT_DATA_KEY, $savedRefs );
        }

-- 
To view, visit https://gerrit.wikimedia.org/r/278702
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I39fcdee9cf67d8debe2a6e134f847729026786f5
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Cite
Gerrit-Branch: master
Gerrit-Owner: Cenarium <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to