xref: /plugin/combo/syntax/media.php (revision 21913ab3235d516e2fa19c7e3929b555b3a2bda1)
1*21913ab3SNickeau<?php
2*21913ab3SNickeau
3*21913ab3SNickeau
4*21913ab3SNickeauuse ComboStrap\InternalMediaLink;
5*21913ab3SNickeauuse ComboStrap\PluginUtility;
6*21913ab3SNickeauuse ComboStrap\Tag;
7*21913ab3SNickeauuse ComboStrap\TagAttributes;
8*21913ab3SNickeau
9*21913ab3SNickeaurequire_once(__DIR__ . '/../class/RasterImageLink.php');
10*21913ab3SNickeau
11*21913ab3SNickeauif (!defined('DOKU_INC')) die();
12*21913ab3SNickeau
13*21913ab3SNickeau
14*21913ab3SNickeau/**
15*21913ab3SNickeau * Internal media
16*21913ab3SNickeau */
17*21913ab3SNickeauclass syntax_plugin_combo_media extends DokuWiki_Syntax_Plugin
18*21913ab3SNickeau{
19*21913ab3SNickeau
20*21913ab3SNickeau
21*21913ab3SNickeau    const TAG = "media";
22*21913ab3SNickeau
23*21913ab3SNickeau    /**
24*21913ab3SNickeau     * Used in the move plugin
25*21913ab3SNickeau     * !!! The two last word of the plugin class !!!
26*21913ab3SNickeau     */
27*21913ab3SNickeau    const COMPONENT = 'combo_' . self::TAG;
28*21913ab3SNickeau
29*21913ab3SNickeau    /**
30*21913ab3SNickeau     * The attribute that defines if the image is the first image in
31*21913ab3SNickeau     * the component
32*21913ab3SNickeau     *
33*21913ab3SNickeau     */
34*21913ab3SNickeau    const IS_FIRST_IMAGE_KEY = "isFirstImage";
35*21913ab3SNickeau
36*21913ab3SNickeau    /**
37*21913ab3SNickeau     * If the image is a card illustration it's not printed
38*21913ab3SNickeau     * The call is kept to update the index
39*21913ab3SNickeau     */
40*21913ab3SNickeau    const IS_CARD_ILLUSTRATION = "isCardIllustration";
41*21913ab3SNickeau
42*21913ab3SNickeau
43*21913ab3SNickeau    function getType()
44*21913ab3SNickeau    {
45*21913ab3SNickeau        return 'formatting';
46*21913ab3SNickeau    }
47*21913ab3SNickeau
48*21913ab3SNickeau    /**
49*21913ab3SNickeau     * How Dokuwiki will add P element
50*21913ab3SNickeau     *
51*21913ab3SNickeau     *  * 'normal' - The plugin can be used inside paragraphs (inline)
52*21913ab3SNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
53*21913ab3SNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
54*21913ab3SNickeau     *
55*21913ab3SNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
56*21913ab3SNickeau     */
57*21913ab3SNickeau    function getPType()
58*21913ab3SNickeau    {
59*21913ab3SNickeau        return 'normal';
60*21913ab3SNickeau    }
61*21913ab3SNickeau
62*21913ab3SNickeau    function getAllowedTypes()
63*21913ab3SNickeau    {
64*21913ab3SNickeau        return array('substition', 'formatting', 'disabled');
65*21913ab3SNickeau    }
66*21913ab3SNickeau
67*21913ab3SNickeau    function getSort()
68*21913ab3SNickeau    {
69*21913ab3SNickeau        return 201;
70*21913ab3SNickeau    }
71*21913ab3SNickeau
72*21913ab3SNickeau
73*21913ab3SNickeau    function connectTo($mode)
74*21913ab3SNickeau    {
75*21913ab3SNickeau        $enable = $this->getConf(InternalMediaLink::CONF_IMAGE_ENABLE, 1);
76*21913ab3SNickeau        if (!$enable) {
77*21913ab3SNickeau
78*21913ab3SNickeau            // Inside a card, we need to take over and enable it
79*21913ab3SNickeau            $modes = [
80*21913ab3SNickeau                PluginUtility::getModeForComponent(syntax_plugin_combo_card::TAG),
81*21913ab3SNickeau            ];
82*21913ab3SNickeau            $enable = in_array($mode, $modes);
83*21913ab3SNickeau        }
84*21913ab3SNickeau
85*21913ab3SNickeau        if ($enable) {
86*21913ab3SNickeau            $this->Lexer->addSpecialPattern(InternalMediaLink::INTERNAL_MEDIA_PATTERN, $mode, PluginUtility::getModeForComponent($this->getPluginComponent()));
87*21913ab3SNickeau        }
88*21913ab3SNickeau    }
89*21913ab3SNickeau
90*21913ab3SNickeau
91*21913ab3SNickeau    function handle($match, $state, $pos, Doku_Handler $handler)
92*21913ab3SNickeau    {
93*21913ab3SNickeau
94*21913ab3SNickeau        switch ($state) {
95*21913ab3SNickeau
96*21913ab3SNickeau
97*21913ab3SNickeau            // As this is a container, this cannot happens but yeah, now, you know
98*21913ab3SNickeau            case DOKU_LEXER_SPECIAL :
99*21913ab3SNickeau                $media = InternalMediaLink::createFromRenderMatch($match);
100*21913ab3SNickeau                $attributes = $media->toCallStackArray();
101*21913ab3SNickeau                $tag = new Tag(self::TAG, $attributes, $state, $handler);
102*21913ab3SNickeau                $parent = $tag->getParent();
103*21913ab3SNickeau                $parentTag = "";
104*21913ab3SNickeau                if (!empty($parent)) {
105*21913ab3SNickeau                    $parentTag = $parent->getName();
106*21913ab3SNickeau                    if ($parentTag == syntax_plugin_combo_link::TAG) {
107*21913ab3SNickeau                        /**
108*21913ab3SNickeau                         * The image is in a link, we don't want another link
109*21913ab3SNickeau                         * to the image
110*21913ab3SNickeau                         */
111*21913ab3SNickeau                        $attributes[TagAttributes::LINKING_KEY] = InternalMediaLink::LINKING_NOLINK_VALUE;
112*21913ab3SNickeau                    }
113*21913ab3SNickeau                }
114*21913ab3SNickeau                $isFirstSibling = $tag->isFirstMeaningFullSibling();
115*21913ab3SNickeau                return array(
116*21913ab3SNickeau                    PluginUtility::STATE => $state,
117*21913ab3SNickeau                    PluginUtility::ATTRIBUTES => $attributes,
118*21913ab3SNickeau                    PluginUtility::CONTEXT => $parentTag,
119*21913ab3SNickeau                    self::IS_FIRST_IMAGE_KEY => $isFirstSibling
120*21913ab3SNickeau                );
121*21913ab3SNickeau
122*21913ab3SNickeau
123*21913ab3SNickeau        }
124*21913ab3SNickeau        return array();
125*21913ab3SNickeau
126*21913ab3SNickeau    }
127*21913ab3SNickeau
128*21913ab3SNickeau    /**
129*21913ab3SNickeau     * Render the output
130*21913ab3SNickeau     * @param string $format
131*21913ab3SNickeau     * @param Doku_Renderer $renderer
132*21913ab3SNickeau     * @param array $data - what the function handle() return'ed
133*21913ab3SNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
134*21913ab3SNickeau     * @see DokuWiki_Syntax_Plugin::render()
135*21913ab3SNickeau     *
136*21913ab3SNickeau     *
137*21913ab3SNickeau     */
138*21913ab3SNickeau    function render($format, Doku_Renderer $renderer, $data)
139*21913ab3SNickeau    {
140*21913ab3SNickeau
141*21913ab3SNickeau        $attributes = $data[PluginUtility::ATTRIBUTES];
142*21913ab3SNickeau        switch ($format) {
143*21913ab3SNickeau
144*21913ab3SNickeau            case 'xhtml':
145*21913ab3SNickeau
146*21913ab3SNickeau                /** @var Doku_Renderer_xhtml $renderer */
147*21913ab3SNickeau                $attributes = $data[PluginUtility::ATTRIBUTES];
148*21913ab3SNickeau                $media = InternalMediaLink::createFromCallStackArray($attributes, $renderer->date_at);
149*21913ab3SNickeau                if ($media->isImage()) {
150*21913ab3SNickeau
151*21913ab3SNickeau                    $renderer->doc .= $media->renderMediaTagWithLink();
152*21913ab3SNickeau
153*21913ab3SNickeau                } else {
154*21913ab3SNickeau
155*21913ab3SNickeau                    /**
156*21913ab3SNickeau                     * This is not a media image (a video)
157*21913ab3SNickeau                     * Dokuwiki takes over
158*21913ab3SNickeau                     */
159*21913ab3SNickeau                    $src = $attributes['src'];
160*21913ab3SNickeau                    $title = $attributes['title'];
161*21913ab3SNickeau                    $align = $attributes['align'];
162*21913ab3SNickeau                    $width = $attributes['width'];
163*21913ab3SNickeau                    $height = $attributes['height'];
164*21913ab3SNickeau                    $cache = $attributes['cache'];
165*21913ab3SNickeau                    $linking = $attributes['linking'];
166*21913ab3SNickeau                    $renderer->doc .= $renderer->internalmedia($src, $title, $align, $width, $height, $cache, $linking, true);
167*21913ab3SNickeau
168*21913ab3SNickeau                }
169*21913ab3SNickeau
170*21913ab3SNickeau                break;
171*21913ab3SNickeau
172*21913ab3SNickeau            case "metadata":
173*21913ab3SNickeau
174*21913ab3SNickeau                /**
175*21913ab3SNickeau                 * Keep track of the metadata
176*21913ab3SNickeau                 * @var Doku_Renderer_metadata $renderer
177*21913ab3SNickeau                 */
178*21913ab3SNickeau                self::registerImageMeta($attributes, $renderer);
179*21913ab3SNickeau                break;
180*21913ab3SNickeau
181*21913ab3SNickeau        }
182*21913ab3SNickeau        // unsupported $mode
183*21913ab3SNickeau        return false;
184*21913ab3SNickeau    }
185*21913ab3SNickeau
186*21913ab3SNickeau    /**
187*21913ab3SNickeau     * @param array $attributes
188*21913ab3SNickeau     * @param Doku_Renderer_metadata $renderer
189*21913ab3SNickeau     */
190*21913ab3SNickeau    static public function registerImageMeta($attributes, $renderer)
191*21913ab3SNickeau    {
192*21913ab3SNickeau        $src = $attributes['src'];
193*21913ab3SNickeau        $title = $attributes['title'];
194*21913ab3SNickeau        $align = $attributes['align'];
195*21913ab3SNickeau        $width = $attributes['width'];
196*21913ab3SNickeau        $height = $attributes['height'];
197*21913ab3SNickeau        $cache = $attributes['cache']; // Cache: https://www.dokuwiki.org/images#caching
198*21913ab3SNickeau        $linking = $attributes['linking'];
199*21913ab3SNickeau        $renderer->internalmedia($src, $title, $align, $width, $height, $cache, $linking);
200*21913ab3SNickeau    }
201*21913ab3SNickeau
202*21913ab3SNickeau
203*21913ab3SNickeau}
204*21913ab3SNickeau
205