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:
Thiemo Kreuz 2019-11-22 09:49:27 +01:00 committed by Adam Wight
parent a823fa23d9
commit 177c9cc1eb
2 changed files with 27 additions and 25 deletions

View file

@ -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 '';
} }

View file

@ -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 ] ],