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