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