file = $file; $this->parameters = $parameters; } /** * 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 */ public function toHtml($options = []) { $descriptText = $this->file->getDescriptionText(); preg_match('/
([\S\s]*?)<\/pre>/',$descriptText,$annotDescript);
        $metadata = toml_decode($annotDescript[1], true);

        if (isset($metadata['baseImage'])) {
            $baseImage = MediaWikiServices::getInstance()->getRepoGroup()->findFile(`File:` . $metadata['baseImage']);
        } else {
            $baseImage = false;
        }

        return self::buildSvg($metadata,$baseImage);
	}

    /**
     * Build annotated SVG from TOML metadata
     * 
     * This takes in the metadata text from the file page (or the current editor)
     * 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
     */
    private function buildSvg($metadata, $baseImage) {
        //Gather basic data
        $elBaseImg = '';
        $vbHeight = 100;
        $vbWidth = 100;
        if ($baseImage) {
            $baseImageUrl = $baseImage->getFullUrl();
            $baseHeight = $baseImage->getHeight();
            $baseWidth = $baseImage->getWidth();
            $baseAspect = $baseHeight / $baseWidth;
            $vbWidth = 100 / sqrt($baseAspect);
            $vbHeight = $baseAspect * $vbWidth;
            $attrBase = array(
                'class' => 'annot-base',
                'preserveAspectRatio' => 'none',
                'width' => $vbWidth,
                'height' => $vbHeight,
                'href' => $baseImageUrl
            );
            $elBaseImg = Html::rawElement('image', $attrBase);
            }
        $mainConfig = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
        $context = RequestContext::getMain();

        //Render and return svg
        $attrSvg = array(
            'class' => 'annot-svg',
            'version' => '1.1',
            'viewBox' => "0 0 {$vbWidth} {$vbHeight}",
            'xml:space' => 'preserve',
            'xmlns' => 'http://www.w3.org/2000/svg'
        );

        return Html::rawElement('svg', $attrSvg, $elBaseImg);
    }

    /**
     * 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;
    }
}