summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/Browse/SubjectLookup.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/Browse/SubjectLookup.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/Browse/SubjectLookup.php144
1 files changed, 144 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/Browse/SubjectLookup.php b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/Browse/SubjectLookup.php
new file mode 100644
index 00000000..c995619e
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Api/Browse/SubjectLookup.php
@@ -0,0 +1,144 @@
+<?php
+
+namespace SMW\MediaWiki\Api\Browse;
+
+use SMW\ApplicationFactory;
+use SMW\DIWikiPage;
+use SMW\MediaWiki\Specials\Browse\HtmlBuilder;
+use SMW\Store;
+use SMW\Exception\RedirectTargetUnresolvableException;
+use SMW\Exception\ParameterNotFoundException;
+
+/**
+ * @license GNU GPL v2+
+ * @since 3.0
+ *
+ * @author mwjames
+ */
+class SubjectLookup extends Lookup {
+
+ /**
+ * @var Store
+ */
+ private $store;
+
+ /**
+ * @since 3.0
+ *
+ * @param Store $store
+ */
+ public function __construct( Store $store ) {
+ $this->store = $store;
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @return string|integer
+ */
+ public function getVersion() {
+ return 'SubjectLookup:' . self::VERSION;
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param array $parameters
+ *
+ * @return array
+ */
+ public function lookup( array $parameters ) {
+
+ if ( !isset( $parameters['subject'] ) ) {
+ throw new ParameterNotFoundException( 'subject' );
+ }
+
+ if ( !isset( $parameters['ns'] ) ) {
+ throw new ParameterNotFoundException( 'ns' );
+ }
+
+ if ( !isset( $parameters['iw'] ) ) {
+ $parameters['iw'] = '';
+ }
+
+ if ( !isset( $parameters['subobject'] ) ) {
+ $parameters['subobject'] = '';
+ }
+
+ if ( isset( $parameters['type'] ) && $parameters['type'] === 'html' ) {
+ $data = $this->buildHTML( $parameters );
+ } else {
+ $data = $this->doSerialize( $parameters );
+ }
+
+ // Changing this output format requires to set a new version
+ $res = [
+ 'query' => $data,
+ 'meta' => [
+ 'type' => 'subject'
+ ]
+ ];
+
+ return $res;
+ }
+
+ private function buildHTML( $params ) {
+
+ if ( !isset( $params['options'] ) ) {
+ throw new ParameterNotFoundException( 'options' );
+ }
+
+ $subject = new DIWikiPage(
+ $params['subject'],
+ $params['ns'],
+ $params['iw'],
+ $params['subobject']
+ );
+
+ $htmlBuilder = new HtmlBuilder(
+ $this->store,
+ $subject
+ );
+
+ $htmlBuilder->setOptions(
+ $params['options']
+ );
+
+ return $htmlBuilder->buildHTML();
+ }
+
+ private function doSerialize( $params ) {
+
+ $applicationFactory = ApplicationFactory::getInstance();
+ $subobject = isset( $params['subobject'] ) ? $params['subobject'] : '';
+
+ $title = $applicationFactory->newTitleFactory()->newFromText(
+ $params['subject'],
+ $params['ns']
+ );
+
+ $deepRedirectTargetResolver = $applicationFactory->newMwCollaboratorFactory()->newDeepRedirectTargetResolver();
+
+ try {
+ $title = $deepRedirectTargetResolver->findRedirectTargetFor( $title );
+ } catch ( \Exception $e ) {
+ throw new RedirectTargetUnresolvableException( $e->getMessage() );
+ }
+
+ $dataItem = new DIWikiPage(
+ $title->getDBkey(),
+ $title->getNamespace(),
+ $title->getInterwiki(),
+ $subobject
+ );
+
+ $semanticData = $applicationFactory->getStore()->getSemanticData(
+ $dataItem
+ );
+
+ $semanticDataSerializer = $applicationFactory->newSerializerFactory()->newSemanticDataSerializer();
+
+ return $semanticDataSerializer->serialize( $semanticData );
+ }
+
+}