}} * {{maintenance_tasks>&past=14}} */ class syntax_plugin_luxtools_maintenance extends SyntaxPlugin { private const DEFAULT_PAST_DAYS = 30; /** @inheritdoc */ public function getType() { return 'substition'; } /** @inheritdoc */ public function getPType() { return 'block'; } /** @inheritdoc */ public function getSort() { return 225; } /** @inheritdoc */ public function connectTo($mode) { $this->Lexer->addSpecialPattern( '\{\{maintenance_tasks>.*?\}\}', $mode, 'plugin_luxtools_maintenance' ); } /** @inheritdoc */ public function handle($match, $state, $pos, Doku_Handler $handler) { $match = substr($match, strlen('{{maintenance_tasks>'), -2); $params = $this->parseFlags($match); return [ 'ok' => true, 'past' => $this->normalizePastDays($params['past'] ?? null), ]; } /** @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; $renderer->nocache(); $slots = CalendarSlot::loadAll($this); $maintenanceSlot = $slots['maintenance'] ?? null; if ($maintenanceSlot === null || !$maintenanceSlot->isEnabled()) { $renderer->doc .= '
' . '

' . hsc($this->getLang('maintenance_no_tasks')) . '

'; return true; } $todayIso = date('Y-m-d'); $pastDays = $this->normalizePastDays($data['past'] ?? null); $tasks = CalendarService::openMaintenanceTasks($maintenanceSlot, $todayIso, $pastDays); $ajaxUrl = defined('DOKU_BASE') ? (string)DOKU_BASE . 'lib/exe/ajax.php' : 'lib/exe/ajax.php'; $secToken = function_exists('getSecurityToken') ? (string)getSecurityToken() : ''; $title = (string)$this->getLang('chronological_maintenance_title'); if ($title === '') $title = 'Tasks'; $renderer->doc .= '
'; $renderer->doc .= '

' . hsc($title) . '

'; if ($tasks === []) { $noTasks = (string)$this->getLang('maintenance_no_tasks'); if ($noTasks === '') $noTasks = 'No open tasks.'; $renderer->doc .= '

' . hsc($noTasks) . '

'; } else { $renderer->doc .= ''; } $renderer->doc .= '
'; return true; } /** * @param string $rawFlags * @return array */ protected function parseFlags(string $rawFlags): array { $rawFlags = trim($rawFlags); if ($rawFlags === '') { return []; } if ($rawFlags[0] === '&') { $rawFlags = substr($rawFlags, 1); } $params = []; foreach (explode('&', $rawFlags) as $flag) { if (trim($flag) === '') continue; [$name, $value] = array_pad(explode('=', $flag, 2), 2, ''); $name = strtolower(trim($name)); $value = trim($value); if ($name === '') continue; $params[$name] = $value; } return $params; } /** * @param mixed $value * @return int */ protected function normalizePastDays($value): int { if ($value === null || $value === '') { return self::DEFAULT_PAST_DAYS; } if (is_int($value)) { return max(0, $value); } $value = trim((string)$value); if ($value === '' || !preg_match('/^-?\d+$/', $value)) { return self::DEFAULT_PAST_DAYS; } return max(0, (int)$value); } }