mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/DiscussionTools
synced 2024-11-24 16:34:21 +00:00
Merge "Add Range::compareBoundaryPoints"
This commit is contained in:
commit
be07ec8cfc
|
@ -488,4 +488,62 @@ class ImmutableRange {
|
||||||
return $AFollowsB ? 'after' : 'before';
|
return $AFollowsB ? 'after' : 'before';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public const START_TO_START = 0;
|
||||||
|
public const START_TO_END = 1;
|
||||||
|
public const END_TO_END = 2;
|
||||||
|
public const END_TO_START = 3;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares the boundary points of this Range with another Range.
|
||||||
|
*
|
||||||
|
* Ported from https://github.com/TRowbotham/PHPDOM (MIT)
|
||||||
|
*
|
||||||
|
* @see https://dom.spec.whatwg.org/#dom-range-compareboundarypoints
|
||||||
|
*
|
||||||
|
* @param int $how One of ImmutableRange::END_TO_END, ImmutableRange::END_TO_START,
|
||||||
|
* ImmutableRange::START_TO_END, ImmutableRange::START_TO_START
|
||||||
|
* @param ImmutableRange $sourceRange A Range whose boundary points are to be compared.
|
||||||
|
* @return int -1, 0, or 1
|
||||||
|
*/
|
||||||
|
public function compareBoundaryPoints( int $how, self $sourceRange ): int {
|
||||||
|
if ( self::getRootNode( $this->mStartContainer ) !== self::getRootNode( $sourceRange->startContainer ) ) {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ( $how ) {
|
||||||
|
case self::START_TO_START:
|
||||||
|
$thisPoint = [ $this->mStartContainer, $this->mStartOffset ];
|
||||||
|
$otherPoint = [ $sourceRange->startContainer, $sourceRange->startOffset ];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case self::START_TO_END:
|
||||||
|
$thisPoint = [ $this->mEndContainer, $this->mEndOffset ];
|
||||||
|
$otherPoint = [ $sourceRange->startContainer, $sourceRange->startOffset ];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case self::END_TO_END:
|
||||||
|
$thisPoint = [ $this->mEndContainer, $this->mEndOffset ];
|
||||||
|
$otherPoint = [ $sourceRange->endContainer, $sourceRange->endOffset ];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case self::END_TO_START:
|
||||||
|
$thisPoint = [ $this->mStartContainer, $this->mStartOffset ];
|
||||||
|
$otherPoint = [ $sourceRange->endContainer, $sourceRange->endOffset ];
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ( $this->computePosition( ...$thisPoint, ...$otherPoint ) ) {
|
||||||
|
case 'before':
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case 'equal':
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case 'after':
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue