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