}} current month * - {{calendar>YYYY-MM}} specific month * - {{calendar>YYYY-MM&base=chronological}} custom base namespace (optional) */ class syntax_plugin_luxtools_calendar extends SyntaxPlugin { /** @inheritdoc */ public function getType() { return 'substition'; } /** @inheritdoc */ public function getPType() { return 'block'; } /** @inheritdoc */ public function getSort() { return 224; } /** @inheritdoc */ public function connectTo($mode) { $this->Lexer->addSpecialPattern('\{\{calendar>.*?\}\}', $mode, 'plugin_luxtools_calendar'); } /** @inheritdoc */ public function handle($match, $state, $pos, Doku_Handler $handler) { $match = substr($match, strlen('{{calendar>'), -2); [$target, $flags] = array_pad(explode('&', $match, 2), 2, ''); $target = trim((string)$target); $params = $this->parseFlags($flags); $baseNs = $params['base'] ?? 'chronological'; $resolved = $this->resolveTargetMonth($target); if ($resolved === null) { return [ 'ok' => false, 'error' => 'calendar_err_badmonth', ]; } return [ 'ok' => true, 'year' => $resolved['year'], 'month' => $resolved['month'], 'base' => $baseNs, ]; } /** @inheritdoc */ public function render($format, Doku_Renderer $renderer, $data) { if ($data === false || !is_array($data)) return false; if ($format !== 'xhtml') return false; if (!($renderer instanceof Doku_Renderer_xhtml)) return false; if (!($data['ok'] ?? false)) { $message = (string)$this->getLang((string)($data['error'] ?? 'calendar_err_badmonth')); if ($message === '') $message = 'Invalid calendar month. Use YYYY-MM.'; $renderer->doc .= '