mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Cite
synced 2024-12-18 17:50:43 +00:00
Fix inconsistencies and deep nesting for follow="…"
* This fixes the refArg() function. If there is nothing wrong with the follow="…" attribute, it should not return null. * However, *everything* is false if an unknown error (e.g. an unknown attribute) occurs. * A trivial check for `if ( $follow )` is fine because all keys are guaranteed to not be the string "0". Change-Id: Ia4e37781e01db1ee6615ffc30bb68e47023c6634
This commit is contained in:
parent
a823fa23d9
commit
177c9cc1eb
46
src/Cite.php
46
src/Cite.php
|
@ -417,7 +417,7 @@ class Cite {
|
||||||
|
|
||||||
if ( $argv === [] ) {
|
if ( $argv === [] ) {
|
||||||
// No key
|
// No key
|
||||||
return [ null, null, false, $dir, null ];
|
return [ null, null, null, $dir, null ];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( isset( $argv['follow'] ) &&
|
if ( isset( $argv['follow'] ) &&
|
||||||
|
@ -460,7 +460,7 @@ class Cite {
|
||||||
* @param string|null $text Content from the <ref> tag
|
* @param string|null $text Content from the <ref> tag
|
||||||
* @param string|null $key Argument to the <ref> tag as returned by $this->refArg()
|
* @param string|null $key Argument to the <ref> tag as returned by $this->refArg()
|
||||||
* @param string $group
|
* @param string $group
|
||||||
* @param string|null $follow
|
* @param string|null $follow Guaranteed to not be a numeric string
|
||||||
* @param string[] $call
|
* @param string[] $call
|
||||||
* @param string $dir ref direction
|
* @param string $dir ref direction
|
||||||
* @param StripState $stripState
|
* @param StripState $stripState
|
||||||
|
@ -475,29 +475,31 @@ class Cite {
|
||||||
if ( !isset( $this->mGroupCnt[$group] ) ) {
|
if ( !isset( $this->mGroupCnt[$group] ) ) {
|
||||||
$this->mGroupCnt[$group] = 0;
|
$this->mGroupCnt[$group] = 0;
|
||||||
}
|
}
|
||||||
if ( $follow != null ) {
|
|
||||||
|
if ( $follow ) {
|
||||||
|
// We know the parent note already, so just perform the "follow" and bail out
|
||||||
if ( isset( $this->mRefs[$group][$follow] ) ) {
|
if ( isset( $this->mRefs[$group][$follow] ) ) {
|
||||||
// add text to the note that is being followed
|
|
||||||
$this->mRefs[$group][$follow]['text'] .= ' ' . $text;
|
$this->mRefs[$group][$follow]['text'] .= ' ' . $text;
|
||||||
} else {
|
return '';
|
||||||
// insert part of note at the beginning of the group
|
|
||||||
$k = 0;
|
|
||||||
foreach ( $this->mRefs[$group] as $k => $value ) {
|
|
||||||
if ( !isset( $value['follow'] ) ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
array_splice( $this->mRefs[$group], $k, 0, [ [
|
|
||||||
'count' => -1,
|
|
||||||
'text' => $text,
|
|
||||||
'key' => ++$this->mOutCnt,
|
|
||||||
'follow' => $follow,
|
|
||||||
'dir' => $dir
|
|
||||||
] ] );
|
|
||||||
array_splice( $this->mRefCallStack, $k, 0,
|
|
||||||
[ [ 'new', $call, $text, $key, $group, $this->mOutCnt ] ] );
|
|
||||||
}
|
}
|
||||||
// return an empty string : this is not a reference
|
|
||||||
|
// insert part of note at the beginning of the group
|
||||||
|
$k = 0;
|
||||||
|
foreach ( $this->mRefs[$group] as $k => $value ) {
|
||||||
|
if ( !isset( $value['follow'] ) ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
array_splice( $this->mRefs[$group], $k, 0, [ [
|
||||||
|
'count' => -1,
|
||||||
|
'text' => $text,
|
||||||
|
'key' => ++$this->mOutCnt,
|
||||||
|
'follow' => $follow,
|
||||||
|
'dir' => $dir,
|
||||||
|
] ] );
|
||||||
|
array_splice( $this->mRefCallStack, $k, 0,
|
||||||
|
[ [ 'new', $call, $text, $key, $group, $this->mOutCnt ] ] );
|
||||||
|
// A "follow" never gets it's own footnote marker
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,11 +32,11 @@ class CiteTest extends \MediaWikiUnitTestCase {
|
||||||
|
|
||||||
public function provideRefAttributes() {
|
public function provideRefAttributes() {
|
||||||
return [
|
return [
|
||||||
[ [], [ null, null, false, null, null ] ],
|
[ [], [ null, null, null, null, null ] ],
|
||||||
|
|
||||||
// One attribute only
|
// One attribute only
|
||||||
[ [ 'dir' => 'invalid' ], [ null, null, false, 'invalid', null ] ],
|
[ [ 'dir' => 'invalid' ], [ null, null, null, 'invalid', null ] ],
|
||||||
[ [ 'dir' => ' rtl ' ], [ null, null, false, 'rtl', null ] ],
|
[ [ 'dir' => ' rtl ' ], [ null, null, null, 'rtl', null ] ],
|
||||||
[ [ 'follow' => ' f ' ], [ null, null, 'f', null, null ] ],
|
[ [ 'follow' => ' f ' ], [ null, null, 'f', null, null ] ],
|
||||||
// FIXME: Unlike all other attributes, group isn't trimmed. Why?
|
// FIXME: Unlike all other attributes, group isn't trimmed. Why?
|
||||||
[ [ 'group' => ' g ' ], [ null, ' g ', null, null, null ] ],
|
[ [ 'group' => ' g ' ], [ null, ' g ', null, null, null ] ],
|
||||||
|
|
Loading…
Reference in a new issue