xref: /plugin/diagrams/syntax/mediafile.php (revision 046ca1447d01a47b6caa55952ebefa80c90967a9)
1<?php
2
3use dokuwiki\plugin\diagrams\Diagrams;
4
5/**
6 * Class syntax_plugin_diagrams
7 */
8class syntax_plugin_diagrams_mediafile extends DokuWiki_Syntax_Plugin {
9
10    /**
11     * @inheritdoc
12     */
13    public function getType()
14    {
15        return 'substition';
16    }
17
18    /**
19     * @inheritdoc
20     */
21    public function getSort()
22    {
23        return 319;
24    }
25
26    /**
27     * @inheritdoc
28     */
29    public function connectTo($mode)
30    {
31        // only register if mediafile mode is enabled
32        if(!($this->getConf('mode') & Diagrams::MODE_MEDIA)) return;
33
34        $this->Lexer->addSpecialPattern('\{\{[^\}]+(?:\.svg)[^\}]*?\}\}',$mode,'plugin_diagrams_mediafile');
35    }
36
37    /**
38     * Parse SVG syntax into media data
39     *
40     * @param string $match
41     * @param int $state
42     * @param int $pos
43     * @param Doku_Handler $handler
44     * @return array|bool
45     */
46    public function handle($match, $state, $pos, Doku_Handler $handler)
47    {
48        $data = Doku_Handler_Parse_Media($match);
49        $data['url'] = ml($data['src'], ['cache' => 'nocache'], true, '&');
50        return $data;
51    }
52
53    /**
54     * Render the diagram SVG as <object> instead of <img> to allow links,
55     * except when rendering to a PDF
56     *
57     * @param string $format
58     * @param Doku_Renderer $renderer
59     * @param array $data
60     * @return bool
61     */
62    public function render($format, Doku_Renderer $renderer, $data)
63    {
64        if ($format !== 'xhtml') return false;
65
66        $imageAttributes = array(
67            'class'   => 'media',
68            'width'   => $data['width'] ?: '',
69            'height'  => $data['height'] ?: '',
70            'title'   => $data['title'],
71        );
72
73
74        if(is_a($renderer, 'renderer_plugin_dw2pdf')) {
75            $imageAttributes['align'] = $data['align'];
76            $imageAttributes['src'] = $data['url'];
77            $renderer->doc .= '<img '. buildAttributes($imageAttributes) . '/>';
78        } else {
79            $imageAttributes['class'] .= ' diagrams-svg';
80            $imageAttributes['class'] .= ' media' . $data['align'];
81            $imageAttributes['data'] = $data['url'];
82            $imageAttributes['data-id'] = cleanID($data['src']);
83            $imageAttributes['type'] = 'image/svg+xml';
84            $imageAttributes['data-pos'] = $data['pos'] ?: '';
85            $imageAttributes['data-len'] = $data['len'] ?: '';
86
87            $tag = '<object %s></object>';
88            $renderer->doc .= sprintf($tag, buildAttributes($imageAttributes, true));
89        }
90
91        return true;
92    }
93}
94