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