vložený text
* {--smazaný text--} -> smazaný text
* {==zvýrazněný text==} -> zvýrazněný text
* {~~původní~>nový~~} -> původnínový
* {>>komentář<<} ->
*/
if (!defined('DOKU_INC')) {
die();
}
class syntax_plugin_criticmarkup extends DokuWiki_Syntax_Plugin {
public function getType() {
return 'formatting';
}
public function getPType() {
return 'normal';
}
public function getSort() {
return 199;
}
/**
* Registrace vzorů pro všechny režimy
*/
public function connectTo($mode) {
$this->Lexer->addSpecialPattern('\{\+\+.*?\+\+\}', $mode, 'plugin_criticmarkup'); // insert
$this->Lexer->addSpecialPattern('\{\-\-.*?\-\-\}', $mode, 'plugin_criticmarkup'); // delete
$this->Lexer->addSpecialPattern('\{==.*?==\}', $mode, 'plugin_criticmarkup'); // mark
$this->Lexer->addSpecialPattern('\{~~.*?~~\}', $mode, 'plugin_criticmarkup'); // substitution
$this->Lexer->addSpecialPattern('\{>>.*?<<\}', $mode, 'plugin_criticmarkup'); // comment
}
/**
* Rozparsování nalezeného zápisu
*/
public function handle($match, $state, $pos, Doku_Handler $handler) {
// $match je např.:
// "{++text++}", "{--text--}", "{==text==}", "{~~old~>new~~}", "{>>comment<<}"
// druh podle prvních dvou znaků po '{'
$marker = substr($match, 1, 2);
$type = null;
switch ($marker) {
case '++':
$type = 'ins';
break;
case '--':
$type = 'del';
break;
case '==':
$type = 'mark';
break;
case '~~':
$type = 'subst';
break;
case '>>':
$type = 'comment';
break;
default:
return null;
}
// odřízneme počáteční "{++"/"{--"/"{=="/"{~~"/"{>>" (3 znaky)
// a koncové "++}"/"--}"/"==}"/"~~}"/"<<}" (3 znaky)
$inner = substr($match, 3, -3);
if ($type === 'subst') {
// {~~původní~>nový~~}
$parts = explode('~>', $inner, 2);
$old = isset($parts[0]) ? $parts[0] : '';
$new = isset($parts[1]) ? $parts[1] : '';
return array(
'type' => 'subst',
'old' => $old,
'new' => $new,
);
}
return array(
'type' => $type,
'text' => $inner,
);
}
/**
* Generování výsledného XHTML
*/
public function render($mode, Doku_Renderer $R, $data) {
if ($mode !== 'xhtml') {
return false;
}
if ($data === null || !is_array($data)) {
return false;
}
$type = $data['type'];
switch ($type) {
case 'ins':
$R->doc .= '';
$R->cdata($data['text']);
$R->doc .= '';
break;
case 'del':
$R->doc .= '';
$R->cdata($data['text']);
$R->doc .= '';
break;
case 'mark':
$R->doc .= '';
$R->cdata($data['text']);
$R->doc .= '';
break;
case 'subst':
// {~~old~>new~~} -> oldnew
$old = isset($data['old']) ? $data['old'] : '';
$new = isset($data['new']) ? $data['new'] : '';
if ($old !== '') {
$R->doc .= '';
$R->cdata($old);
$R->doc .= '';
}
if ($new !== '') {
$R->doc .= '';
$R->cdata($new);
$R->doc .= '';
}
break;
case 'comment':
// {>>komentář<<} ->
$R->doc .= '';
break;
default:
return false;
}
return true;
}
}