* @author Elan Ruusamäe */ namespace dokuwiki\plugin\htmlok; use Doku_Handler; use Doku_Renderer; abstract class BaseSyntaxPlugin extends \dokuwiki\Extension\SyntaxPlugin { /** @var string */ protected $type = 'protected'; /** @var string */ protected $ptype; /** @var int */ protected $sort; /** @var string */ protected $tag; /** @var string */ protected $mode; /** @var string|null */ protected $class; public function getType(): string { return $this->type; } public function getPType(): string { return $this->ptype; } public function getSort(): int { return $this->sort; } public function connectTo($mode) { $this->Lexer->addEntryPattern("<{$this->tag}>(?=.*?tag}>)", $mode, $this->mode); } public function postConnect() { $this->Lexer->addExitPattern("tag}>", $this->mode); } public function handle($match, $state, $pos, Doku_Handler $handler): array { switch ($state) { case DOKU_LEXER_ENTER: return [$state, $match]; case DOKU_LEXER_UNMATCHED: return [$state, $match]; case DOKU_LEXER_EXIT: return [$state, '']; } return []; } public function render($mode, Doku_Renderer $renderer, $data): bool { if ($mode !== 'xhtml') { return false; } [$state, $match] = $data; switch ($state) { case DOKU_LEXER_ENTER: if ($this->ptype === 'block') { $renderer->doc .= '
' . DOKU_LF; } break; case DOKU_LEXER_UNMATCHED: $renderer->doc .= $this->renderMatch($match); break; case DOKU_LEXER_EXIT: if ($this->ptype === 'block') { $renderer->doc .= '
' . DOKU_LF; } break; } return true; } abstract protected function renderMatch(string $match): string; /** * Execute PHP code if allowed * * @param string $text PHP code that is either executed or printed * @param string $wrapper html element to wrap result if $conf['phpok'] is okff * * @author Andreas Gohr * @author Elan Ruusamäe */ protected function php(string $text, string $wrapper = 'code'): string { if ($this->getConf('phpok')) { ob_start(); eval($text); $contents= ob_get_contents(); ob_end_clean(); return $contents; } return p_xhtml_cached_geshi($text, 'php', $wrapper); } /** * Output block level PHP code * * If 'phpok' is true this should evaluate the given code and append the result * to document. * * @param string $text The PHP code */ protected function phpblock(string $text): string { return $this->php($text, 'pre'); } /** * Insert HTML if allowed * * @param string $text html text * @param string $wrapper html element to wrap result if 'htmlok' is ok. * * @author Andreas Gohr * @author Elan Ruusamäe */ protected function html(string $text, string $wrapper = 'code'): string { if ($this->getConf('htmlok')) { return $text; } return p_xhtml_cached_geshi($text, 'html4strict', $wrapper); } /** * Output raw block-level HTML * * If $conf['htmlok'] is true this should add the code as is to $doc * * @param string $text The HTML */ protected function htmlblock(string $text): string { return $this->html($text, 'pre'); } }