diff --git a/extension.json b/extension.json index b051000..2497bc2 100644 --- a/extension.json +++ b/extension.json @@ -1,21 +1,38 @@ { - "name": "AnatImageViewer", + "name": "AnnotatedImages", "author": "Justin Georgi", "url": "https://gitea.azgeorgis.net/jgeorgi/AnatImageViewer", - "description": "This extension allows the creation of .an pages in the Files namespace which will be annotated images.", + "description": "This extension allows the creation of pages in the Annotation namespace which will create annotated images.", "version": "0.0.1", "license-name": "MIT", "type": "media", "manifest_version": 1, + "requires": { + "MediaWiki": ">= 1.39.0" + }, + "namespaces": [ + { + "id": 2218, + "constant": "NS_AV_ANNOT", + "name": "Annotation", + "protection": "annotations-edit", + "subpages": false, + "content": false, + "defaultcontentmodel": "annotation" + }, + { + "id": 2219, + "constant": "NS_AV_ANNOT_TALK", + "name": "Annotation_talk", + "subpages": true, + "content": false, + "defaultcontentmodel": "wikitext" + } + ], "AutoloadNamespaces": { "MediaWiki\\Extension\\AnatImageViewer\\": "includes/" }, - "MediaHandlers": { - "image/annotation": "MediaWiki\\Extension\\AnatImageViewer\\AnatImageHandler" - }, - "Hooks": { - "MimeMagicInit": "MediaWiki\\Extension\\AnatImageViewer\\AnatImageHooks::onMimeMagicInit", - "MimeMagicImproveFromExtension": "MediaWiki\\Extension\\AnatImageViewer\\AnatImageHooks::onMimeMagicImproveFromExtension", - "ParserFirstCallInit": "MediaWiki\\Extension\\AnatImageViewer\\AnatImageHooks::onParserFirstCallInit" + "ContentHandlers": { + "annotation": "MediaWiki\\Extension\\AnatImageViewer\\AnnotationHandler" } } \ No newline at end of file diff --git a/includes/AnatImageHandler.php b/includes/AnatImageHandler.php deleted file mode 100644 index 6c9eb32..0000000 --- a/includes/AnatImageHandler.php +++ /dev/null @@ -1,63 +0,0 @@ -validateParam() - * @param int $flags A bitfield, may contain self::TRANSFORM_LATER - * @return MediaTransformOutput - */ - public function doTransform($image, $dstPath, $dstUrl, $params, $flags = 0) { - return new AnatImageTransformOutput($image, $params); - } - - /** - * Small helper function to display information on the browser console - * - * Usage: - * echo ''; - * - * @param $data information to display - * @param bool $add_script_tags true to put information is inside complete script tag - */ - public static function console_log($data, $add_script_tags = false) { - $command = 'console.log('. json_encode($data, JSON_HEX_TAG).');'; - if ($add_script_tags) { - $command = ''; - } - echo $command; - } -} \ No newline at end of file diff --git a/includes/AnatImageHooks.php b/includes/AnatImageHooks.php deleted file mode 100644 index 58a5197..0000000 --- a/includes/AnatImageHooks.php +++ /dev/null @@ -1,77 +0,0 @@ -addExtraTypes('image/annotation an'); - $mime->addExtraInfo('image/annotation [METAIMAGE]'); - } - - /** - * MWHook: Make sure that an files (fake) get the proper mime assignement on upload - * - * @see https://www.mediawiki.org/wiki/Manual:Hooks/MimeMagicImproveFromExtension - * - * @param MimeAnalyzer $mimeAnalyzer Instance of MW MimeAnalyzer object - * @param string $ext extention of upload file - * @param string &$mime current assigned mime type - */ - public static function onMimeMagicImproveFromExtension( $mimeAnalyzer, $ext, &$mime ) { - if ( $mime !== 'image/annotation' && in_array( $ext, ['an'] ) ) { - $mime = 'image/annotation'; - } - } - - /** - * MWHook: Called when the parser initializes for the first time - * - * @param Parser $parser: Parser object being initialized - */ - static function onParserFirstCallInit( $parser ) { - $parser->setHook('anconfig', array( __CLASS__, 'renderConfigTag')); - } - - /** - * Render the config toml in a
 tag
-     * 
-     * @param $input The text inside the custom tag
-     * @param array $args Any attributes given in the tag
-     * @param Parser $parser The parser object
-     * @param PPFrame $frame The parent frame calling the parser
-     * @return string HTML string of output
-     */
-    static function renderConfigTag( $input, array $args, $parser, $frame ) {
-		return '
' . $input . '
'; - } - - /** - * Small helper function to display information on the browser console - * - * Usage: - * echo ''; - * - * @param $data information to display - * @param bool $add_script_tags true to put information is inside complete script tag - */ - public static function console_log($data, $add_script_tags = false) { - $command = 'console.log('. json_encode($data, JSON_HEX_TAG).');'; - if ($add_script_tags) { - $command = ''; - } - echo $command; - } -} \ No newline at end of file diff --git a/includes/AnnotationContent.php b/includes/AnnotationContent.php new file mode 100644 index 0000000..7a396d5 --- /dev/null +++ b/includes/AnnotationContent.php @@ -0,0 +1,60 @@ +getText() ) ); + return $text === ''; + } + + /** + * Determines whether this content should be counted as a "page" for the wiki's statistics. + * + * @param bool|null $hasLinks + * + * @return bool + */ + public function isCountable( $hasLinks = null ) { + return false; + } + + public function isValid() { + return parent::isValid(); + } + + /** + * Should return text relevant to the wiki's search index. + * + * @return string + */ + public function getTextForSearchIndex() { + return strip_tags( $this->getText() ); + } + + public function convert( $toModel, $lossy = '' ) { + return parent::convert( $toModel, $lossy ); + } + + public function getSection( $sectionId ) { + return parent::getSection( $sectionId ); + } + + public function replaceSection( $sectionId, Content $with, $sectionTitle = '' ) { + return parent::replaceSection( $sectionId, $with, $sectionTitle ); + } +} \ No newline at end of file diff --git a/includes/AnatImageTransformOutput.php b/includes/AnnotationHandler.php similarity index 55% rename from includes/AnatImageTransformOutput.php rename to includes/AnnotationHandler.php index a1381de..ea52a62 100644 --- a/includes/AnatImageTransformOutput.php +++ b/includes/AnnotationHandler.php @@ -5,57 +5,78 @@ require_once __DIR__ . '/../vendor/autoload.php'; use Devium\Toml\Toml; use MediaWiki\MediaWikiServices; -use MediaTransformOutput; -use ConfigFactory; -use RequestContext; +use Content; +use Title; +use CodeContentHandler; +use MediaWiki\Content\Renderer\ContentParseParams; +use ParserOutput; use Html; +use IContextSource; +use MediaWiki\Content\ValidationParams; +use Status; -class AnatImageTransformOutput extends MediaTransformOutput { - /** - * Main Constructor - * - * @access public - * @param File $file - * @param array $parameters Parameters for constructing HTML. - * @return void - */ - public function __construct($file, $parameters) { - $this->file = $file; - $this->parameters = $parameters; - self::console_log($parameters, true); + +class AnnotationHandler extends CodeContentHandler { + private const ANNOT_VERSION = '0.1'; + + public function __construct( + $modelId = AnnotationContent::MODEL, + $formats = [ CONTENT_FORMAT_TEXT ] + ) { + parent::__construct( $modelId, $formats ); } + protected function getContentClass() { + return AnnotationContent::class; + } + /** - * Fetch HTML for this transform output - * - * @access public - * @param array $options Associative array of options. Boolean options - * should be indicated with a value of true for true, and false or - * absent for false. - * alt Alternate text or caption - * desc-link Boolean, show a description link - * file-link Boolean, show a file download link - * custom-url-link Custom URL to link to - * custom-title-link Custom Title object to link to - * valign vertical-align property, if the output is an inline element - * img-class Class applied to the "" tag, if there is such a tag - * preview Boolean, render is being called from a preview page - * - * @return string HTML + * Only allow this content handler to be used in the Module namespace + * @param Title $title + * @return bool */ - public function toHtml($options = []) { - $descriptText = $this->file->getDescriptionText(); - preg_match('/
([\S\s]*?)<\/pre>/',$descriptText,$annotDescript);
-        $metadata = toml_decode($annotDescript[1], true);
+	public function canBeUsedOn( Title $title ) {
+		if ( $title->getNamespace() !== NS_AV_ANNOT ) {
+			return false;
+		}
+
+		return parent::canBeUsedOn( $title );
+	}
+
+	/** @inheritDoc */
+	public function supportsPreloadContent(): bool {
+		return true;
+	}
+
+	public function serializeContent( Content $content, $format = null ) {
+		return parent::serializeContent( $content, $format );
+	}
+
+    public function unserializeContent( $text, $format = null ) {
+		return new AnnotationContent( $text );
+	}
+
+	public function makeEmptyContent() {
+		return new AnnotationContent( '' );
+	}
+
+    protected function fillParserOutput( Content $content, ContentParseParams $cpoParams, ParserOutput &$output	) {
+        parent::fillParserOutput( $content, $cpoParams, $output );
+        self::console_log('Parsing the fucking thing', true);
+
+        $metadata = toml_decode($content->getText(), true);
+        self::console_log(print_r($metadata, true), true);
 
         if (isset($metadata['baseImage'])) {
-            $baseImage = MediaWikiServices::getInstance()->getRepoGroup()->findFile(`File:` . $metadata['baseImage']);
+            $imageTitle = Title::makeTitleSafe( NS_FILE, $metadata['baseImage'] );
+            $baseImage = MediaWikiServices::getInstance()->getRepoGroup()->findFile($imageTitle);
+            self::console_log($baseImage->getFullUrl(), true);
         } else {
             $baseImage = false;
         }
 
-        return self::buildSvg($metadata,$baseImage);
-	}
+        $output->setText( self::buildSvg($metadata,$baseImage) );
+    }
 
     /**
      * Build annotated SVG from TOML metadata
@@ -64,9 +85,8 @@ class AnatImageTransformOutput extends MediaTransformOutput {
      * and produces the html string for the svg with base image and annotations.
      * 
      * @param string $metadata The metadata object parsed from the text
-     * @param string $baseImageUrl The full url pointing to the base image to annotate
-     * @param array $frameParams The additional user defined parameters for the viewer such as hotspot and view classes
-     * @return string Html string of the complete model-viewer element inside a div container
+     * @param File $baseImage The full url pointing to the base image to annotate
+     * @return string Html string of the complete svg
      */
     private function buildSvg($metadata, $baseImage) {
         //Gather basic data
@@ -89,8 +109,6 @@ class AnatImageTransformOutput extends MediaTransformOutput {
             );
             $elBaseImg = Html::rawElement('image', $attrBase);
             }
-        $mainConfig = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
-        $context = RequestContext::getMain();
 
         //Render and return svg
         $attrSvg = array(
diff --git a/includes/AnnotationHooks.php b/includes/AnnotationHooks.php
new file mode 100644
index 0000000..22d081d
--- /dev/null
+++ b/includes/AnnotationHooks.php
@@ -0,0 +1,41 @@
+getNamespace() === NS_AV_ANNOT ) {
+            self::console_log('Found fucking thing!',true);
+            $model = CONTENT_MODEL_ANNOTATION;
+		}
+	}
+
+    /**
+     * Small helper function to display information on the browser console
+     * 
+     * Usage:
+     * echo '';
+     * 
+     * @param $data information to display
+     * @param bool $add_script_tags true to put information is inside complete script tag
+     */
+    public static function console_log($data, $add_script_tags = false) {
+        $command = 'console.log('. json_encode($data, JSON_HEX_TAG).');';
+        if ($add_script_tags) {
+            $command = '';
+        }
+        echo $command;
+    }
+}
\ No newline at end of file