Lexer->addEntryPattern('(?=.*?)', $mode, 'plugin_graveknowledge'); } public function postConnect() { // Register the closing tag $this->Lexer->addExitPattern('', 'plugin_graveknowledge'); } public function handle($match, $state, $pos, Doku_Handler $handler) { switch ($state) { case DOKU_LEXER_ENTER: return array($state, ''); case DOKU_LEXER_UNMATCHED: return array($state, $match); case DOKU_LEXER_EXIT: return array($state, ''); } return false; } public function render($format, Doku_Renderer $renderer, $data) { if($format != 'xhtml') return false; list($state, $match_data) = $data; switch ($state) { case DOKU_LEXER_ENTER: // Pre-calculate access conditions when the container starts $start = (int)$this->getConf('night_start_hour'); $end = (int)$this->getConf('night_end_hour'); $current_hour = (int)date('G'); $is_night = false; if ($start > $end) { if ($current_hour >= $start || $current_hour < $end) { $is_night = true; } } else { if ($current_hour >= $start && $current_hour < $end) { $is_night = true; } } // Store state in the renderer to manage nested content blocks $renderer->meta['graveknowledge_visible'] = $is_night; // If it is daytime, inject the alternative notice page immediately if (!$is_night) { $notice_ns = $this->getConf('notice_page'); if (!empty($notice_ns)) { $notice_text = p_wiki_xhtml($notice_ns, '', false); $notice_text = preg_replace('/^

|<\/p>$/', '', trim($notice_text)); $renderer->doc .= $notice_text; } else { $renderer->doc .= '[Content hidden until night]'; } } break; case DOKU_LEXER_UNMATCHED: // Only render the nested contents if night time access is validated if (!empty($renderer->meta['graveknowledge_visible'])) { // Pass the internal content back through the parser to keep text formatting $renderer->doc .= p_render($format, p_get_instructions($match_data), $info); } break; case DOKU_LEXER_EXIT: // Clear state property safely unset($renderer->meta['graveknowledge_visible']); break; } return true; } }