*/
class syntax_plugin_imapmarkers_reference extends \dokuwiki\Extension\SyntaxPlugin {
private const MATCH_IS_UNKNOWN = 0;
private const MATCH_IS_AREA = 1;
private const MATCH_IS_CONFIG = 2;
private const MATCH_IS_LOCATION = 3;
private bool $is_debug;
private string $component;
function __construct() {
$this->is_debug = false;
global $ID;
$this->component = sprintf("plugin_%s_%s", $this->getPluginName(), $this->getPluginComponent());
if ($this->is_debug) {
dbglog(sprintf("syntax_plugin_imapmarkers_reference.__construct ID='%s' COMPONENT='%s'", cleanID($ID), $this->getPluginComponent()));
}
}
//function getType(){ return 'substition';}
function getType() {
return 'formatting';
}
function getAllowedTypes() {
return array('formatting', 'substition', 'disabled');
}
function getPType() {
return 'normal';
}
function getSort() {
return 184;
}
// override default accepts() method to allow nesting - ie, to get the plugin accepts its own entry syntax
function accepts($mode) {
if ($mode == substr(get_class($this), 7))
return true;
return parent::accepts($mode);
}
/**
* Connect pattern to lexer
*/
function connectTo($mode) {
$this->Lexer->addSpecialPattern('\{{2}(?i)IMAPMLOC>.+?\}{2}', $mode, $this->component);
}
/**
* Handle the match
*/
function handle($match, $state, $pos, Doku_Handler $handler) {
$args = array($state);
switch ($state) {
case DOKU_LEXER_SPECIAL:
// check for marker location:
$is_correct = false;
$err_msg = "";
$matches = array();
$match = trim($match);
if ($this->is_debug) {
dbglog(sprintf("syntax_plugin_imapmarkers_reference.handle MATCH='%s' COMPONENT='%s'", $match, $this->getPluginComponent()));
}
if (preg_match("/\{{2}(?i)IMAPMLOC>\s*(.+?)\s*\|\s*(.+?)\s*\}{2}/", $match, $matches)) {
$loc_id = $matches[1];
$loc_title = $matches[2];
$is_correct = true;
$args = array($state, self::MATCH_IS_LOCATION, $is_correct, $err_msg, $loc_id, $loc_title);
} else {
$err_msg = sprintf("Malformed location! LOCATION='%s'", $match);
$args = array($state, self::MATCH_IS_UNKNOWN, $is_correct, $err_msg);
}
if ($this->is_debug) {
dbglog(sprintf("syntax_plugin_imapmarkers_reference.handle::DOKU_LEXER_SPECIAL: [%d] MATCH='%s'", $this->nr_imagemap_handler, $match));
}
break;
case DOKU_LEXER_UNMATCHED:
$handler->_addCall('cdata', array($match), $pos);
return false;
}
return $args;
}
/**
* Create output
*/
function render($mode, Doku_Renderer $renderer, $data) {
if ($mode == 'xhtml') {
$state = $data[0];
static $has_content = false;
switch ($state) {
case DOKU_LEXER_SPECIAL:
if ($this->is_debug) {
dbglog(sprintf("syntax_plugin_imapmarkers.render::DOKU_LEXER_SPECIAL: [%d] DATA='%s'", $this->nr_imagemap_render, implode(", ", $data)));
}
$match_type = self::MATCH_IS_UNKNOWN;
$is_correct = false;
$err_msg = "";
list($state, $match_type, $is_correct, $err_msg) = $data;
if ($is_correct) {
switch ($match_type) {
case self::MATCH_IS_LOCATION:
list($state, $match_type, $is_correct, $err_msg, $loc_id, $loc_title) = $data;
$renderer->doc .= sprintf('%s', $loc_id, $loc_title);
break;
}
} else {
$renderer->doc .= sprintf('
ERROR -- %s%s', $err_msg, DOKU_LF);
}
break;
}
}
return true;
} // public function render
}