'image/', 'width' => 90, 'height' => 90, 'agg_width' => '', 'agg_height' => '' ]; /** * Checks against the allowed mime types * * @param string $rawvalue * @return int|string */ public function validate($rawvalue) { $rawvalue = parent::validate($rawvalue); if (!trim($this->config['mime'])) return $rawvalue; $allows = explode(',', $this->config['mime']); $allows = array_map('trim', $allows); $allows = array_filter($allows); [, $mime, ] = mimetype($rawvalue, false); foreach ($allows as $allow) { if (strpos($mime, $allow) === 0) return $rawvalue; } throw new ValidationException('Media mime type', $mime, $this->config['mime']); } /** * Output the stored data * * If outputted in an aggregation we collect the images into a gallery. * * @param string|int $value the value stored in the database * @param \Doku_Renderer $R the renderer currently used to render the data * @param string $mode The mode the output is rendered in (eg. XHTML) * @return bool true if $mode could be satisfied */ public function renderValue($value, \Doku_Renderer $R, $mode) { // get width and height from config $width = null; $height = null; if ($this->config['width']) $width = $this->config['width']; if ($this->config['height']) $height = $this->config['height']; if (!empty($R->info['struct_table_hash'])) { // this is an aggregation, check for special values if ($this->config['agg_width']) $width = $this->config['agg_width']; if ($this->config['agg_height']) $height = $this->config['agg_height']; } $html = ''; if (!media_isexternal($value)) { if (is_a($R, '\Doku_Renderer_xhtml')) { /** @var \Doku_Renderer_xhtml $R */ $html = $R->internalmedia($value, null, null, $width, $height, null, 'direct', true); } else { $R->internalmedia($value, null, null, $width, $height, null, 'direct'); } } elseif (is_a($R, '\Doku_Renderer_xhtml')) { /** @var \Doku_Renderer_xhtml $R */ $html = $R->externalmedia($value, null, null, $width, $height, null, 'direct', true); } else { $R->externalmedia($value, null, null, $width, $height, null, 'direct'); } // add gallery meta data in XHTML if ($mode == 'xhtml') { [, $mime, ] = mimetype($value, false); if (substr($mime, 0, 6) == 'image/') { $hash = empty($R->info['struct_table_hash']) ? '' : "[gal-" . $R->info['struct_table_hash'] . "]"; $html = str_replace('href', "rel=\"lightbox$hash\" href", $html); } $R->doc .= $html; } return true; } /** * Return the editor to edit a single value * * @param string $name the form name where this has to be stored * @param string $rawvalue the current value * * @param string $htmlID * * @return string html */ public function valueEditor($name, $rawvalue, $htmlID) { static $count = 0; $count++; $id = $htmlID ?: 'struct__' . md5($name . $count); $params = [ 'name' => $name, 'value' => $rawvalue, 'class' => 'struct_media', 'id' => $id ]; $attributes = buildAttributes($params, true); $html = ""; $html .= ""; return $html; } /** * @inheritDoc */ public function renderTagCloudLink($value, \Doku_Renderer $R, $mode, $page, $filter, $weight, $showCount = null) { $media = $this->displayValue($value); if ($mode == 'xhtml' && $this->getConfig()['mime'] == 'image/') { $url = wl($page, $filter); $image = ml($media, ['h' => $weight, 'w' => $weight]); $media_escaped = hsc($media); $R->doc .= "
"; $R->doc .= ""; $R->doc .= "$media_escaped"; $R->doc .= ""; $R->doc .= "
"; return; } $R->internallink("$page?$filter", $media); } }