diff options
Diffstat (limited to 'bin/reevotech/vendor/addwiki/mediawiki-api/src/Service/PageGetter.php')
-rw-r--r-- | bin/reevotech/vendor/addwiki/mediawiki-api/src/Service/PageGetter.php | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/bin/reevotech/vendor/addwiki/mediawiki-api/src/Service/PageGetter.php b/bin/reevotech/vendor/addwiki/mediawiki-api/src/Service/PageGetter.php new file mode 100644 index 00000000..6c5c54cf --- /dev/null +++ b/bin/reevotech/vendor/addwiki/mediawiki-api/src/Service/PageGetter.php @@ -0,0 +1,246 @@ +<?php + +namespace Mediawiki\Api\Service; + +use Mediawiki\Api\SimpleRequest; +use Mediawiki\DataModel\Content; +use Mediawiki\DataModel\EditInfo; +use Mediawiki\DataModel\Page; +use Mediawiki\DataModel\PageIdentifier; +use Mediawiki\DataModel\Revision; +use Mediawiki\DataModel\Revisions; +use Mediawiki\DataModel\Title; +use RuntimeException; + +/** + * @access private + * + * @author Addshore + */ +class PageGetter extends Service { + + /** + * @since 0.2 + * + * @param int $id + * @param array $extraParams + * + * @return Page + */ + public function getFromRevisionId( $id, array $extraParams = [] ) { + $result = + $this->api->getRequest( + new SimpleRequest( + 'query', + $this->getQuery( [ 'revids' => $id ], $extraParams ) + ) + ); + + return $this->newPageFromResult( array_shift( $result['query']['pages'] ) ); + } + + /** + * @since 0.2 + * + * @param string|Title $title + * @param array $extraParams + * + * @return Page + */ + public function getFromTitle( $title, array $extraParams = [] ) { + if ( $title instanceof Title ) { + $title = $title->getTitle(); + } + $result = + $this->api->getRequest( + new SimpleRequest( + 'query', + $this->getQuery( [ 'titles' => $title ], $extraParams ) + ) + ); + + return $this->newPageFromResult( array_shift( $result['query']['pages'] ) ); + } + + /** + * @since 0.2 + * + * @param int $id + * @param array $extraParams + * + * @return Page + */ + public function getFromPageId( $id, array $extraParams = [] ) { + $result = + $this->api->getRequest( + new SimpleRequest( + 'query', + $this->getQuery( [ 'pageids' => $id ], $extraParams ) + ) + ); + + return $this->newPageFromResult( array_shift( $result['query']['pages'] ) ); + } + + /** + * @since 0.4 + * + * @param PageIdentifier $pageIdentifier + * @param array $extraParams + * + * @throws RuntimeException + * @return Page + */ + public function getFromPageIdentifier( + PageIdentifier $pageIdentifier, + array $extraParams = [] + ) { + if ( !$pageIdentifier->identifiesPage() ) { + throw new RuntimeException( '$pageIdentifier does not identify a page' ); + } + if ( !is_null( $pageIdentifier->getId() ) ) { + return $this->getFromPageId( $pageIdentifier->getId(), $extraParams ); + } else { + return $this->getFromTitle( $pageIdentifier->getTitle(), $extraParams ); + } + } + + /** + * @since 0.2 + * + * @param Page $page + * @param array $extraParams + * + * @return Page + */ + public function getFromPage( Page $page, array $extraParams = [] ) { + $result = + $this->api->getRequest( + new SimpleRequest( + 'query', + $this->getQuery( [ 'pageids' => $page->getId() ], $extraParams ) + ) + ); + $revisions = $this->getRevisionsFromResult( array_shift( $result['query']['pages'] ) ); + $revisions->addRevisions( $page->getRevisions() ); + + return new Page( + $page->getPageIdentifier(), + $revisions + ); + } + + /** + * @since 0.2 + * + * @param Revision $revision + * @param array $extraParams + * + * @return Page + */ + public function getFromRevision( Revision $revision, array $extraParams = [] ) { + $result = + $this->api->getRequest( + new SimpleRequest( + 'query', + $this->getQuery( [ 'revids' => $revision->getId() ], $extraParams ) + ) + ); + $revisions = $this->getRevisionsFromResult( array_shift( $result['query']['pages'] ) ); + $revisions->addRevision( $revision ); + + return new Page( + new PageIdentifier( + new Title( + $result['title'], + $result['ns'] + ), + $result['pageid'] + ), + $revisions + ); + } + + /** + * @param array $additionalParams + * + * @param array $extraParams + * + * @return array + */ + private function getQuery( $additionalParams, array $extraParams = [] ) { + $base = [ + 'prop' => 'revisions|info|pageprops', + 'rvprop' => 'ids|flags|timestamp|user|size|sha1|comment|content|tags', + 'inprop' => 'protection', + ]; + + return array_merge( $extraParams, $base, $additionalParams ); + } + + /** + * @param array $array + * + * @return Revisions + */ + private function getRevisionsFromResult( $array ) { + $revisions = new Revisions(); + $pageid = $array['pageid']; + foreach ( $array['revisions'] as $revision ) { + $revisions->addRevision( + new Revision( + $this->getContent( $array['contentmodel'], $revision['*'] ), + new PageIdentifier( new Title( $array['title'], $array['ns'] ), $pageid ), + $revision['revid'], + new EditInfo( + $revision['comment'], + array_key_exists( 'minor', $revision ), + array_key_exists( 'bot', $revision ) + ), + $revision['user'], + $revision['timestamp'] + ) + ); + } + + return $revisions; + } + + /** + * @param string $model + * @param string $content returned from the API + * + * @throws RuntimeException + * @return Content + */ + private function getContent( $model, $content ) { + return new Content( $content, $model ); + } + + /** + * @param array $array + * + * @return Page + */ + private function newPageFromResult( $array ) { + if ( array_key_exists( 'pageid', $array ) ) { + $pageid = $array['pageid']; + $revisions = $this->getRevisionsFromResult( $array ); + } else { + $pageid = 0; + $revisions = new Revisions(); + } + + return new Page( + new PageIdentifier( + new Title( + $array['title'], + $array['ns'] + ), + $pageid + ), + $revisions + ); + } + +} |