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