'Marc Wäckerlin', 'email' => 'marc [at] waeckerlin [dot-org]', 'name' => 'Definition List Plugin', 'desc' => 'HTML Definition List', 'url' => 'http://marc.waeckerlin.org'); } function getType() { return 'container'; } // function getPType() { // return 'block'; // } function getSort() { return 3; } function accepts($mode) { if (!count($this->allowedModes)) { global $PARSER_MODES; $this->allowedModes = array_merge($PARSER_MODES['container'], $PARSER_MODES['baseonly'], $PARSER_MODES['formatting'], $PARSER_MODES['substition'], $PARSER_MODES['protected'], $PARSER_MODES['disabled'], $PARSER_MODES['paragraphs']); unset($this->allowedModes[array_search('preformatted', $this->allowedModes)]); } return parent::accepts($mode); } function connectTo($mode) { $this->Lexer->addEntryPattern('^ *\!', $mode, 'plugin_dl'); $this->Lexer->addEntryPattern('^ *\?[^\n]*', $mode, 'plugin_dl'); } function postConnect() { $this->Lexer->addPattern('\n *\!', 'plugin_dl'); $this->Lexer->addPattern('^ *\!', 'plugin_dl'); $this->Lexer->addPattern('\n *\?[^\n]*', 'plugin_dl'); $this->Lexer->addPattern('^ *\?[^\n]*', 'plugin_dl'); $this->Lexer->addExitPattern('\n$', 'plugin_dl'); } function handle($match, $state, $pos, &$handler){ if (($state==DOKU_LEXER_MATCHED || $state==DOKU_LEXER_ENTER) && ereg('\?', $match)) { $title = htmlspecialchars(ereg_replace("\n* *\?(.*)", '\1', $match)); $match = ereg_replace("(\n* *\?).*", '\1', $match); } else { $title = ''; } return array($match, $state, $title); } function render($format, &$renderer, $data) { static $close = ''; static $level = 0; static $last_neesting = 0; static $indent = array(); static $dlstart = "\n
"; static $dlend = "\n
"; static $dtstart = "\n
"; static $dtend = "
"; static $ddstart = "\n
"; static $ddend = "
"; list($match, $state, $title) = $data; while ($match[0]=="\n") $match=substr($match, 1); $neesting = strlen($match); if ($state==DOKU_LEXER_MATCHED) { if ($last_neesting<$neesting) { $renderer->doc .= $close.$ddstart.$dlstart; $close = ''; $indent[++$level] = $neesting; } else if ($last_neesting>$neesting) { $renderer->doc .= $close.$dlend.($level?$ddend:''); $close = ''; while ($level && $indent[--$level]>$neesting) $renderer->doc .= $dlend.($level?$ddend:''); } $last_neesting = $neesting; } switch ($state) { case DOKU_LEXER_ENTER: { $last_neesting = $neesting; if ($level>0) $renderer->doc .= $close; for (; $level>0; --$level) $renderer->doc .= $dlend.($level!=1?$ddend:''); $renderer->doc .= $dlstart; if (ereg('\?', $match)) { $renderer->doc .= $dtstart; $close = $dtend; if ($title!='') $renderer->doc .= ''.$title; } else if (ereg('!', $match)) { $renderer->doc .= $ddstart; $close = $ddend; } else return false; $indent[++$level] = $neesting; } return true; case DOKU_LEXER_EXIT: { $renderer->doc .= $close; for (; $level>0; --$level) $renderer->doc .= $dlend.($level!=1?$ddend:''); $renderer->doc .= "\n"; } return true; case DOKU_LEXER_MATCHED: { if (ereg('\?', $match)) { $renderer->doc .= $close; $renderer->doc .= $dtstart; $close = $dtend; if ($title!='') $renderer->doc .= ''.$title; } else if (ereg('!', $match)) { $renderer->doc .= $close; $renderer->doc .= $ddstart; $close = $ddend; } else return false; } return true; case DOKU_LEXER_UNMATCHED: { $renderer->doc .= htmlspecialchars($match); } return true; } return false; } } ?>