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