From 7ee162430f82cb4d6e6b9b0e4b8cbf382bf642b7 Mon Sep 17 00:00:00 2001 From: Justin Georgi Date: Sat, 26 Oct 2024 15:47:57 -0700 Subject: [PATCH] Refactor to MediaHandler transform Signed-off-by: Justin Georgi --- extension.json | 22 +++-- includes/GlModelHandler.php | 67 ++++++++++++++ .../{GlModelViewer.php => GlModelHooks.php} | 36 +++++--- includes/GlModelTransformOutput.php | 92 +++++++++++++++++++ 4 files changed, 192 insertions(+), 25 deletions(-) create mode 100644 includes/GlModelHandler.php rename includes/{GlModelViewer.php => GlModelHooks.php} (90%) create mode 100644 includes/GlModelTransformOutput.php diff --git a/extension.json b/extension.json index 325d2a4..e338f18 100644 --- a/extension.json +++ b/extension.json @@ -7,17 +7,19 @@ "license-name": "MIT", "type": "media", "manifest_version": 2, - "AutoloadClasses": { - "GlModelViewer": "includes/GlModelViewer.php" - }, + "AutoloadNamespaces": { + "MediaWiki\\Extension\\GlModelViewer\\": "includes/" + }, + "MediaHandlers": { + "model/gltf-binary": "MediaWiki\\Extension\\GlModelViewer\\GlModelHandler" + }, "Hooks": { - "MimeMagicInit": "GlModelViewer::onMimeMagicInit", - "MimeMagicImproveFromExtension": "GlModelViewer::onMimeMagicImproveFromExtension", - "BeforePageDisplay": "GlModelViewer::onBeforePageDisplay", - "ImageBeforeProduceHTML": "GlModelViewer::onImageBeforeProduceHTML", - "ImageOpenShowImageInlineBefore": "GlModelViewer::onImageOpenShowImageInlineBefore", - "AlternateEditPreview": "GlModelViewer::onAlternateEditPreview" - }, + "MimeMagicInit": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onMimeMagicInit", + "MimeMagicImproveFromExtension": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onMimeMagicImproveFromExtension", + "BeforePageDisplay": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onBeforePageDisplay", + "ImageBeforeProduceHTML": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onImageBeforeProduceHTML", + "AlternateEditPreview": "MediaWiki\\Extension\\GlModelViewer\\GlModelHooks::onAlternateEditPreview" + }, "ResourceFileModulePaths": { "localBasePath": "modules", "remoteExtPath": "GlModelViewer/modules" diff --git a/includes/GlModelHandler.php b/includes/GlModelHandler.php new file mode 100644 index 0000000..1346df3 --- /dev/null +++ b/includes/GlModelHandler.php @@ -0,0 +1,67 @@ +validateParam() + * @param int $flags A bitfield, may contain self::TRANSFORM_LATER + * @return MediaTransformOutput + */ + public function doTransform($image, $dstPath, $dstUrl, $params, $flags = 0) { + echo ''; + + return new GlModelTransformOutput($image, ['type' => 'glb']); + } + + /** + * 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/GlModelViewer.php b/includes/GlModelHooks.php similarity index 90% rename from includes/GlModelViewer.php rename to includes/GlModelHooks.php index baab1d1..581b0c6 100644 --- a/includes/GlModelViewer.php +++ b/includes/GlModelHooks.php @@ -1,7 +1,10 @@ addExtraTypes('model/gltf-binary glb gltf'); - $mime->addExtraInfo('model/gltf-binary [DRAWING]'); + $mime->addExtraInfo('model/gltf-binary [MULTIMEDIA]'); } /** @@ -23,7 +26,7 @@ class GlModelViewer extends ImageHandler { * @param string $ext extention of upload file * @param string &$mime current assigned mime type */ - public static function onMimeMagicImproveFromExtension( MimeAnalyzer $mimeAnalyzer, $ext, &$mime ) { + public static function onMimeMagicImproveFromExtension( $mimeAnalyzer, $ext, &$mime ) { if ( $mime !== 'model/gltf-binary' && in_array( $ext, ['glb', 'gltf'] ) ) { $mime = 'model/gltf-binary'; } @@ -36,7 +39,7 @@ class GlModelViewer extends ImageHandler { * * @param OutputPage $out compiled page html and manipulation methods */ - public static function onBeforePageDisplay(OutputPage $out) { + public static function onBeforePageDisplay($out) { preg_match('/(getHTML(),$findGltf); if ($findGltf[0]) { $mvScriptAttr = array( @@ -65,7 +68,7 @@ class GlModelViewer extends ImageHandler { * @param &$widthOption * @return bool|void True to continue default processing or false to abort for custom processing */ - public static function onImageBeforeProduceHTML( DummyLinker &$linker, Title &$title, &$file, array &$frameParams, array &$handlerParams, &$time, &$result, Parser $parser, string &$query, &$widthOption ) { + public static function onImageBeforeProduceHTML( &$linker, &$title, &$file, array &$frameParams, array &$handlerParams, &$time, &$result, $parser, string &$query, &$widthOption ) { if ($file->getMimeType() !== 'model/gltf-binary') { return true; } @@ -84,6 +87,13 @@ class GlModelViewer extends ImageHandler { */ public static function onImageOpenShowImageInlineBefore( $imagepage, $out ){ $file = $imagepage->getFile(); + $mh = $file->getHandler(); + $mt = $file->getMediaType(); + //$mmt = $mh->getHandler(); + echo ''; if ($file->getMimeType() == 'model/gltf-binary') { $viewer = self::buildViewer($file->getDescriptionText(), $file->getFullUrl(), ['class' => 'view-default']); $out->addHtml(Html::rawElement('div',['id' => 'file', 'class' => 'fullModelView'],$viewer)); @@ -101,7 +111,7 @@ class GlModelViewer extends ImageHandler { * @param ?ParserOutput &$parserOutput * @return bool|void True to continue default processing or false to abort for custom processing */ - public static function onAlternateEditPreview( EditPage $editor, Content $content, string &$previewHTML, ?ParserOutput &$parserOutput ) { + public static function onAlternateEditPreview( $editor, $content, string &$previewHTML, ?ParserOutput &$parserOutput ) { $file = MediaWikiServices::getInstance()->getRepoGroup()->findFile($editor->getTitle()); if (!$file || $file->getMimeType() !== 'model/gltf-binary') { return true; @@ -178,7 +188,9 @@ class GlModelViewer extends ImageHandler { //Add important additional attributes and render model-viewer with hotspots $attrModelView = array_merge(['src' => $srcUrl, 'class' => 'mv-model', 'interpolation-decay' => '100'], $attrModelView); $attrModelView['style'] = 'width: 100%; height: 100%; min-height: 400px;'; - $elModel = Html::rawElement('model-viewer', $attrModelView, implode($hotspots)); + $hotspotHtml = (isset($hotspots)) ? implode($hotspots) : ''; + + $elModel = Html::rawElement('model-viewer', $attrModelView, $hotspotHtml); //Render and return container element with model-viewer $attrContainer = array( @@ -233,10 +245,4 @@ class GlModelViewer extends ImageHandler { } echo $command; } - - /** - * ? But class won't work without it - */ - function doTransform($image, $dstPath, $dstUrl, $params, $flags = 0) { - } } \ No newline at end of file diff --git a/includes/GlModelTransformOutput.php b/includes/GlModelTransformOutput.php new file mode 100644 index 0000000..05a778c --- /dev/null +++ b/includes/GlModelTransformOutput.php @@ -0,0 +1,92 @@ +file = $file; + $this->parameters = $parameters; + $this->url = $file->getFullUrl(); + } + + /** + * 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 + * + * @return string HTML + */ + public function toHtml($options = []) { + return Html::rawElement( 'div',[ 'class' => 'my-model-class'], $this->url . ' is a ' . $this->parameters['type'] . ' 3D model!' ); + /* + $parameters = $this->parameters; + + $style = []; + $style[] = "max-width: 100%;"; + $style[] = "max-height: 100%;"; + if (empty($options['no-dimensions'])) { + $parameters['width'] = $this->getWidth(); + $parameters['height'] = $this->getHeight(); + $style[] = "width: {$this->getWidth()}px;"; + $style[] = "height: {$this->getHeight()}px;"; + } + + if (!empty($options['valign'])) { + $style[] = "vertical-align: {$options['valign']};"; + } + + if (!empty($options['img-class'])) { + $class = $options['img-class']; + } + + if (!isset($parameters['start'])) { + $parameters['start'] = null; + } + if (!isset($parameters['end'])) { + $parameters['end'] = null; + } + + $inOut = false; + if ($parameters['start'] !== $parameters['end']) { + if ($parameters['start'] !== false) { + $inOut[] = $parameters['start']; + } + + if ($parameters['end'] !== false) { + $inOut[] = $parameters['end']; + } + } + + $descLink = Html::element( 'a', [ 'href' => $parameters['descriptionUrl'] ], $parameters['descriptionUrl'] ); + + return Html::rawElement( 'video', [ + 'src' => $this->url . ($inOut !== false ? '#t=' . implode(',', $inOut) : ''), + 'width' => $this->getWidth(), + 'height' => $this->getHeight(), + 'class' => $class ?? false, + 'style' => $style ? implode( ' ', $style ) : false, + 'controls' => true, + ], $descLink ); + */ + } +} \ No newline at end of file