*/ class syntax_plugin_diagrams_embed extends \dokuwiki\Extension\SyntaxPlugin { /** @inheritDoc */ public function getType() { return 'substition'; } /** @inheritDoc */ public function getPType() { return 'block'; } /** @inheritDoc */ public function getSort() { return 319; } /** @inheritDoc */ public function connectTo($mode) { // only register if embed mode is enabled if(!($this->getConf('mode') & Diagrams::MODE_EMBED)) return; // auto load sanitizer require_once __DIR__ . '/../vendor/autoload.php'; $this->Lexer->addSpecialPattern('.*?(?:)', $mode, 'plugin_diagrams_embed'); } /** @inheritDoc */ public function handle($match, $state, $pos, Doku_Handler $handler) { [$open, $rest] = sexplode('>', $match, 2); $params = substr($open, 9); $svg = substr($rest, 0, -10); // embed positions $svglen = strlen($svg); $svgpos = $pos + strpos($match, '>'); /** @var helper_plugin_diagrams $helper */ $helper = plugin_load('helper', 'diagrams'); if(!$helper->isDiagram($svg)) return false; // sanitize svg $sanitizer = new Sanitizer(); $svg = $sanitizer->sanitize($svg); if(!$svg) { global $ID; Logger::debug('diagrams: invalid SVG on '.$ID, $sanitizer->getXmlIssues()); return false; } $data = [ 'svg' => $svg, 'align' => '', 'width' => '', 'height' => '', 'pos' => $svgpos, 'len' => $svglen, ]; if (preg_match('/\b(left|right|center)\b/', $params, $matches)) { $data['align'] = $matches[1]; } if (preg_match('/\b(\d+)x(\d+)\b/', $params, $matches)) { $data['width'] = (int)$matches[1]; $data['height'] = (int)$matches[2]; } return $data; } /** @inheritDoc */ public function render($format, Doku_Renderer $renderer, $data) { if ($format !== 'xhtml') return false; if(!$data) return false; $style = ''; if($data['width'] && $data['height']) { $style .= 'width: ' . $data['width'] . 'px; '; $style .= 'height: ' . $data['height'] . 'px; '; $class = 'fixedSize'; } else { $class = 'autoSize'; } $attr = [ 'class' => "plugin_diagrams_embed $class media" . $data['align'], 'style' => $style, 'data-pos' => $data['pos'], 'data-len' => $data['len'], ]; $tag = '
%s
'; $renderer->doc .= sprintf($tag, buildAttributes($attr), $data['svg']); return true; } }