Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
61.90% covered (warning)
61.90%
13 / 21
62.50% covered (warning)
62.50%
5 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
ParsoidRenderID
65.00% covered (warning)
65.00%
13 / 20
62.50% covered (warning)
62.50%
5 / 8
20.25
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 newFromKey
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
3.14
 newFromParserOutput
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 newFromETag
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getKey
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 __toString
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getRevisionID
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getUniqueID
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace MediaWiki\Edit;
4
5use InvalidArgumentException;
6use MediaWiki\Parser\ParserOutput;
7use Stringable;
8
9/**
10 * Represents the identity of a specific rendering of a specific revision
11 * at some point in time.
12 *
13 * @since 1.39
14 * @unstable since 1.39, should be stable by 1.39 release.
15 */
16class ParsoidRenderID implements Stringable {
17    private int $revisionID;
18    private string $uniqueID;
19    private string $stashKey;
20
21    /**
22     * @param int $revisionID Revision that was rendered
23     * @param string $uniqueID An identifier for a point in time.
24     */
25    public function __construct( int $revisionID, string $uniqueID ) {
26        $this->revisionID = $revisionID;
27        $this->uniqueID = $uniqueID;
28        $this->stashKey = $revisionID . '/' . $uniqueID;
29    }
30
31    /**
32     * @param string $key String representation of render ID
33     * (synonymous with an etag with double quotes) as returned by ::getKey().
34     *
35     * @return self
36     * @see newFromETag()
37     *
38     */
39    public static function newFromKey( string $key ): self {
40        [ $revisionID, $uniqueID ] = explode( '/', $key, 2 );
41
42        if ( $revisionID === null || $uniqueID === null ) {
43            throw new InvalidArgumentException( 'Bad key: ' . $key );
44        }
45
46        return new self( (int)$revisionID, $uniqueID );
47    }
48
49    /**
50     * Create a ParsoidRenderID from the revision and render id stored in
51     * a ParserOutput.
52     * @param ParserOutput $parserOutput
53     * @return self
54     */
55    public static function newFromParserOutput( ParserOutput $parserOutput ): self {
56        $revisionID = $parserOutput->getCacheRevisionId();
57        $uniqueID = $parserOutput->getRenderId();
58
59        if ( $revisionID === null || $uniqueID === null ) {
60            throw new InvalidArgumentException( 'Missing render id' );
61        }
62
63        return new self( $revisionID, $uniqueID );
64    }
65
66    /**
67     * This constructs a new render ID from the given ETag.
68     *
69     * Any suffix after a second forward slash will be ignored e.g.
70     * ->newFromEtag( '1/abc/stash' ) will return '1/abc' when ->getKey()
71     * is called on the ParsoidRenderID object instance.
72     *
73     * @param string $eTag ETag with double quotes,
74     *   see https://www.rfc-editor.org/rfc/rfc7232#section-2.3
75     *
76     * @return ParsoidRenderID|null The render ID embedded in the ETag,
77     *         or null if the ETag was malformed.
78     * @see newFromKey() if ETag already has outside quotes trimmed
79     *
80     */
81    public static function newFromETag( string $eTag ): ?self {
82        if ( !preg_match( '@^(?:W/)?"(\d+)/([^/]+)(:?/.*)?"$@', $eTag, $m ) ) {
83            return null;
84        }
85
86        [ , $revisionID, $uniqueID ] = $m;
87
88        return new self( (int)$revisionID, $uniqueID );
89    }
90
91    /**
92     * This returns the canonical string representation from
93     * the parsoid render ID which can be used to in newFromString().
94     *
95     * @return string
96     */
97    public function getKey(): string {
98        return $this->stashKey;
99    }
100
101    public function __toString() {
102        return $this->stashKey;
103    }
104
105    /**
106     * Get the revision ID from the parsoid render ID object.
107     *
108     * @return int
109     */
110    public function getRevisionID(): int {
111        return $this->revisionID;
112    }
113
114    /**
115     * Get the unique identifier from the parsoid render ID object.
116     *
117     * @return string
118     */
119    public function getUniqueID(): string {
120        return $this->uniqueID;
121    }
122
123}
124
125/** @deprecated class alias since 1.42 */
126class_alias( ParsoidRenderID::class, 'MediaWiki\\Parser\\Parsoid\\ParsoidRenderID' );