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;
}
}