xref: /plugin/combo/syntax/media.php (revision 23723136447b7913f53b9b11536e95bab29a3790)
121913ab3SNickeau<?php
221913ab3SNickeau
321913ab3SNickeau
4*23723136Sgerardnicouse ComboStrap\DokuPath;
5*23723136Sgerardnicouse ComboStrap\LogUtility;
6*23723136Sgerardnicouse ComboStrap\MediaLink;
721913ab3SNickeauuse ComboStrap\PluginUtility;
821913ab3SNickeauuse ComboStrap\Tag;
921913ab3SNickeauuse ComboStrap\TagAttributes;
1021913ab3SNickeau
1121913ab3SNickeaurequire_once(__DIR__ . '/../class/RasterImageLink.php');
1221913ab3SNickeau
1321913ab3SNickeauif (!defined('DOKU_INC')) die();
1421913ab3SNickeau
1521913ab3SNickeau
1621913ab3SNickeau/**
17*23723136Sgerardnico * Media
18*23723136Sgerardnico *
19*23723136Sgerardnico * Takes over the {@link \dokuwiki\Parsing\ParserMode\Media media mode}
20*23723136Sgerardnico * that is processed by {@link Doku_Handler_Parse_Media}
21*23723136Sgerardnico *
22*23723136Sgerardnico *
23*23723136Sgerardnico *
24*23723136Sgerardnico * It can be a internal / external media
2521913ab3SNickeau */
2621913ab3SNickeauclass syntax_plugin_combo_media extends DokuWiki_Syntax_Plugin
2721913ab3SNickeau{
2821913ab3SNickeau
2921913ab3SNickeau
3021913ab3SNickeau    const TAG = "media";
3121913ab3SNickeau
3221913ab3SNickeau    /**
3321913ab3SNickeau     * Used in the move plugin
3421913ab3SNickeau     * !!! The two last word of the plugin class !!!
3521913ab3SNickeau     */
3621913ab3SNickeau    const COMPONENT = 'combo_' . self::TAG;
3721913ab3SNickeau
3821913ab3SNickeau    /**
3921913ab3SNickeau     * The attribute that defines if the image is the first image in
4021913ab3SNickeau     * the component
4121913ab3SNickeau     *
4221913ab3SNickeau     */
4321913ab3SNickeau    const IS_FIRST_IMAGE_KEY = "isFirstImage";
4421913ab3SNickeau
4521913ab3SNickeau    /**
46*23723136Sgerardnico     * Found at {@link \dokuwiki\Parsing\ParserMode\Media}
4721913ab3SNickeau     */
48*23723136Sgerardnico    const MEDIA_PATTERN = "\{\{(?:[^>\}]|(?:\}[^\}]))+\}\}";
4921913ab3SNickeau
5021913ab3SNickeau
5121913ab3SNickeau    function getType()
5221913ab3SNickeau    {
5321913ab3SNickeau        return 'formatting';
5421913ab3SNickeau    }
5521913ab3SNickeau
5621913ab3SNickeau    /**
5721913ab3SNickeau     * How Dokuwiki will add P element
5821913ab3SNickeau     *
5921913ab3SNickeau     *  * 'normal' - The plugin can be used inside paragraphs (inline)
6021913ab3SNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
6121913ab3SNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
6221913ab3SNickeau     *
6321913ab3SNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
6421913ab3SNickeau     */
6521913ab3SNickeau    function getPType()
6621913ab3SNickeau    {
67*23723136Sgerardnico        /**
68*23723136Sgerardnico         * An image is not a block (it can be inside paragraph)
69*23723136Sgerardnico         */
7021913ab3SNickeau        return 'normal';
7121913ab3SNickeau    }
7221913ab3SNickeau
7321913ab3SNickeau    function getAllowedTypes()
7421913ab3SNickeau    {
7521913ab3SNickeau        return array('substition', 'formatting', 'disabled');
7621913ab3SNickeau    }
7721913ab3SNickeau
78*23723136Sgerardnico    /**
79*23723136Sgerardnico     * It should be less than {@link \dokuwiki\Parsing\ParserMode\Media::getSort()}
80*23723136Sgerardnico     * (It was 320 at the time of writing this code)
81*23723136Sgerardnico     * @return int
82*23723136Sgerardnico     *
83*23723136Sgerardnico     */
8421913ab3SNickeau    function getSort()
8521913ab3SNickeau    {
86*23723136Sgerardnico        return 319;
8721913ab3SNickeau    }
8821913ab3SNickeau
8921913ab3SNickeau
9021913ab3SNickeau    function connectTo($mode)
9121913ab3SNickeau    {
92*23723136Sgerardnico        $enable = $this->getConf(MediaLink::CONF_IMAGE_ENABLE, 1);
9321913ab3SNickeau        if (!$enable) {
9421913ab3SNickeau
9521913ab3SNickeau            // Inside a card, we need to take over and enable it
9621913ab3SNickeau            $modes = [
9721913ab3SNickeau                PluginUtility::getModeForComponent(syntax_plugin_combo_card::TAG),
9821913ab3SNickeau            ];
9921913ab3SNickeau            $enable = in_array($mode, $modes);
10021913ab3SNickeau        }
10121913ab3SNickeau
10221913ab3SNickeau        if ($enable) {
103*23723136Sgerardnico            $this->Lexer->addSpecialPattern(self::MEDIA_PATTERN, $mode, PluginUtility::getModeForComponent($this->getPluginComponent()));
10421913ab3SNickeau        }
10521913ab3SNickeau    }
10621913ab3SNickeau
10721913ab3SNickeau
10821913ab3SNickeau    function handle($match, $state, $pos, Doku_Handler $handler)
10921913ab3SNickeau    {
11021913ab3SNickeau
11121913ab3SNickeau        switch ($state) {
11221913ab3SNickeau
11321913ab3SNickeau
11421913ab3SNickeau            // As this is a container, this cannot happens but yeah, now, you know
11521913ab3SNickeau            case DOKU_LEXER_SPECIAL :
116*23723136Sgerardnico                $media = MediaLink::createFromRenderMatch($match);
11721913ab3SNickeau                $attributes = $media->toCallStackArray();
11821913ab3SNickeau                $tag = new Tag(self::TAG, $attributes, $state, $handler);
11921913ab3SNickeau                $parent = $tag->getParent();
12021913ab3SNickeau                $parentTag = "";
12121913ab3SNickeau                if (!empty($parent)) {
12221913ab3SNickeau                    $parentTag = $parent->getName();
12321913ab3SNickeau                    if ($parentTag == syntax_plugin_combo_link::TAG) {
12421913ab3SNickeau                        /**
12521913ab3SNickeau                         * The image is in a link, we don't want another link
12621913ab3SNickeau                         * to the image
12721913ab3SNickeau                         */
128*23723136Sgerardnico                        $attributes[TagAttributes::LINKING_KEY] = MediaLink::LINKING_NOLINK_VALUE;
12921913ab3SNickeau                    }
13021913ab3SNickeau                }
13121913ab3SNickeau                $isFirstSibling = $tag->isFirstMeaningFullSibling();
13221913ab3SNickeau                return array(
13321913ab3SNickeau                    PluginUtility::STATE => $state,
13421913ab3SNickeau                    PluginUtility::ATTRIBUTES => $attributes,
13521913ab3SNickeau                    PluginUtility::CONTEXT => $parentTag,
13621913ab3SNickeau                    self::IS_FIRST_IMAGE_KEY => $isFirstSibling
13721913ab3SNickeau                );
13821913ab3SNickeau
13921913ab3SNickeau
14021913ab3SNickeau        }
14121913ab3SNickeau        return array();
14221913ab3SNickeau
14321913ab3SNickeau    }
14421913ab3SNickeau
14521913ab3SNickeau    /**
14621913ab3SNickeau     * Render the output
14721913ab3SNickeau     * @param string $format
14821913ab3SNickeau     * @param Doku_Renderer $renderer
14921913ab3SNickeau     * @param array $data - what the function handle() return'ed
15021913ab3SNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
15121913ab3SNickeau     * @see DokuWiki_Syntax_Plugin::render()
15221913ab3SNickeau     *
15321913ab3SNickeau     *
15421913ab3SNickeau     */
15521913ab3SNickeau    function render($format, Doku_Renderer $renderer, $data)
15621913ab3SNickeau    {
15721913ab3SNickeau
15821913ab3SNickeau        $attributes = $data[PluginUtility::ATTRIBUTES];
15921913ab3SNickeau        switch ($format) {
16021913ab3SNickeau
16121913ab3SNickeau            case 'xhtml':
16221913ab3SNickeau
16321913ab3SNickeau                /** @var Doku_Renderer_xhtml $renderer */
16421913ab3SNickeau                $attributes = $data[PluginUtility::ATTRIBUTES];
165*23723136Sgerardnico                $media = MediaLink::createFromCallStackArray($attributes);
166*23723136Sgerardnico                if ($media->getScheme() == DokuPath::LOCAL_SCHEME) {
167*23723136Sgerardnico                    $media = MediaLink::createFromCallStackArray($attributes, $renderer->date_at);
16821913ab3SNickeau                    if ($media->isImage()) {
16921913ab3SNickeau                        $renderer->doc .= $media->renderMediaTagWithLink();
170*23723136Sgerardnico                        return true;
171*23723136Sgerardnico                    }
172*23723136Sgerardnico                }
17321913ab3SNickeau
17421913ab3SNickeau                /**
175*23723136Sgerardnico                 * This is not an local internal media image (a video or an url image)
17621913ab3SNickeau                 * Dokuwiki takes over
17721913ab3SNickeau                 */
178*23723136Sgerardnico                $type = $attributes['type'];
17921913ab3SNickeau                $src = $attributes['src'];
18021913ab3SNickeau                $title = $attributes['title'];
18121913ab3SNickeau                $align = $attributes['align'];
18221913ab3SNickeau                $width = $attributes['width'];
18321913ab3SNickeau                $height = $attributes['height'];
18421913ab3SNickeau                $cache = $attributes['cache'];
18521913ab3SNickeau                $linking = $attributes['linking'];
186*23723136Sgerardnico                switch ($type) {
187*23723136Sgerardnico                    case MediaLink::INTERNAL_MEDIA:
18821913ab3SNickeau                        $renderer->doc .= $renderer->internalmedia($src, $title, $align, $width, $height, $cache, $linking, true);
189*23723136Sgerardnico                        break;
190*23723136Sgerardnico                    case MediaLink::EXTERNAL_MEDIA:
191*23723136Sgerardnico                        $renderer->doc .= $renderer->externalmedia($src, $title, $align, $width, $height, $cache, $linking, true);
192*23723136Sgerardnico                        break;
193*23723136Sgerardnico                    default:
194*23723136Sgerardnico                        LogUtility::msg("The dokuwiki media type ($type) is unknown");
195*23723136Sgerardnico                        break;
19621913ab3SNickeau                }
19721913ab3SNickeau
198*23723136Sgerardnico                return true;
19921913ab3SNickeau
20021913ab3SNickeau            case "metadata":
20121913ab3SNickeau
20221913ab3SNickeau                /**
20321913ab3SNickeau                 * Keep track of the metadata
20421913ab3SNickeau                 * @var Doku_Renderer_metadata $renderer
20521913ab3SNickeau                 */
20621913ab3SNickeau                self::registerImageMeta($attributes, $renderer);
207*23723136Sgerardnico                return true;
20821913ab3SNickeau
20921913ab3SNickeau        }
21021913ab3SNickeau        // unsupported $mode
21121913ab3SNickeau        return false;
21221913ab3SNickeau    }
21321913ab3SNickeau
21421913ab3SNickeau    /**
21521913ab3SNickeau     * @param array $attributes
21621913ab3SNickeau     * @param Doku_Renderer_metadata $renderer
21721913ab3SNickeau     */
21821913ab3SNickeau    static public function registerImageMeta($attributes, $renderer)
21921913ab3SNickeau    {
220*23723136Sgerardnico        $type = $attributes['type'];
22121913ab3SNickeau        $src = $attributes['src'];
22221913ab3SNickeau        $title = $attributes['title'];
22321913ab3SNickeau        $align = $attributes['align'];
22421913ab3SNickeau        $width = $attributes['width'];
22521913ab3SNickeau        $height = $attributes['height'];
22621913ab3SNickeau        $cache = $attributes['cache']; // Cache: https://www.dokuwiki.org/images#caching
22721913ab3SNickeau        $linking = $attributes['linking'];
228*23723136Sgerardnico
229*23723136Sgerardnico        switch ($type) {
230*23723136Sgerardnico            case MediaLink::INTERNAL_MEDIA:
23121913ab3SNickeau                $renderer->internalmedia($src, $title, $align, $width, $height, $cache, $linking);
232*23723136Sgerardnico                break;
233*23723136Sgerardnico            case MediaLink::EXTERNAL_MEDIA:
234*23723136Sgerardnico                $renderer->externalmedia($src, $title, $align, $width, $height, $cache, $linking);
235*23723136Sgerardnico                break;
236*23723136Sgerardnico            default:
237*23723136Sgerardnico                LogUtility::msg("The dokuwiki media type ($type)  for metadata registration is unknown");
238*23723136Sgerardnico                break;
239*23723136Sgerardnico        }
240*23723136Sgerardnico
24121913ab3SNickeau    }
24221913ab3SNickeau
24321913ab3SNickeau
24421913ab3SNickeau}
24521913ab3SNickeau
246