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