state = $state;
$this->clazz = $clazz;
$this->tag = $tag;
}
public function setState($state) {
$this->state = $state;
}
public function getState() {
return $this->state;
}
public function getClazz() {
return $this->clazz;
}
public function getTag() {
return $this->tag;
}
public function equal ($other) {
if ($other == NULL ) {
return false;
}
$otherState = $other->getState();
$otherClazz = $other->getClazz();
$otherTag = $other->getTag();
return $this->equalToValues ($otherState, $otherClazz, $otherTag);
}
public function equalToValues ($otherState, $otherClazz, $otherTag) {
if ( $this->state != NULL && $otherState != NULL &&
$this->state != $otherState ) {
return false;
}
if ( $this->clazz != NULL && $otherClazz != NULL &&
$this->clazz != $otherClazz ) {
return false;
}
if ( $this->tag != NULL && $otherTag != NULL &&
$this->tag != $otherTag ) {
return false;
}
return true;
}
}
class creole_state_callback {
protected $event;
protected $ownEvent;
protected $callback;
/**
* Constructor.
*/
public function __construct($state, $clazz, $tag, $ownState, $ownClazz, $ownTag, $callback) {
if ( $state == NULL && $clazz == NULL && $tag == NULL ) {
$this->event = NULL;
} else {
$this->event = new creole_syntax_event ($state, $clazz, $tag);
}
if ( $ownState == NULL && $ownClazz == NULL && $ownTag == NULL ) {
$this->ownEvent = NULL;
} else {
$this->ownEvent = new creole_syntax_event ($ownState, $ownClazz, $ownTag);
}
$this->callback = $callback;
}
public function eventMatches (creole_syntax_event $compare) {
return $this->event->equal($compare);
}
public function ownEventMatches (creole_syntax_event $compare) {
return $this->ownEvent->equal($compare);
}
public function execute ($queuedEvent, $pos, $match, &$handler) {
//call_user_func($this->callback, $this->ownEvent, $pos, $match, $handler);
call_user_func($this->callback, $queuedEvent, $pos, $match, $handler);
}
public function getOwnEvent () {
return $this->ownEvent;
}
}
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class helper_plugin_creole_eventhandler extends DokuWiki_Plugin {
protected static $queue = array();
protected static $callbacks = array();
protected static $trace_dump = 'syntax_plugin_creole_base - Trace-Dump:
';
/**
* Constructor.
*/
public function __construct() {
self::$queue = array();
self::$callbacks = array();
self::$trace_dump = 'syntax_plugin_creole_base - Trace-Dump:
';
}
/**
* @return array
*/
function getMethods() {
$result = array();
$result[] = array(
'name' => 'getColorValue',
'desc' => 'returns the color value for a given CSS color name. Returns "#000000" if the name is unknown',
'params' => array('name' => 'string'),
'return' => array('color value' => 'string'),
);
return $result;
}
public function addOnNotify ($state, $clazz, $tag, $ownState, $ownClazz, $ownTag, $callback) {
self::$callbacks [] = new creole_state_callback
($state, $clazz, $tag, $ownState, $ownClazz, $ownTag, $callback);
}
public function notifyEvent ($state, $clazz, $tag, $pos, $match, $handler) {
$state = strtolower($state);
$clazz = strtolower($clazz);
$tag = strtolower($tag);
$event = new creole_syntax_event($state, $clazz, $tag);
// Callback all functions registered for this event,
// if they have got an event in the queue.
$q_max = count(self::$queue);
for ( $q_index = $q_max-1 ; $q_index >= 0 ; $q_index-- ) {
for ( $cb_index = 0 ; $cb_index < count (self::$callbacks) ; $cb_index++ ) {
if ( self::$queue[$q_index] != NULL &&
self::$callbacks [$cb_index]->eventMatches($event) &&
self::$callbacks [$cb_index]->ownEventMatches(self::$queue[$q_index]) ) {
// Match found, call callback function.
self::$callbacks [$cb_index]->execute(self::$queue [$q_index], $pos, $match, $handler);
}
}
}
if ( $state == 'open' ) {
self::$queue [] = $event;
}
if ( $state == 'close' ) {
// Remove an matching open event from the queue.
// Change state of this event to open and search for it.
$event->setState('open');
for ( $q_index = 0 ; $q_index < count(self::$queue) ; $q_index++ ) {
if ( $event->equal(self::$queue [$q_index]) ) {
self::$queue [$q_index] = NULL;
}
}
}
}
public function queuedEventExists ($state, $clazz, $tag) {
for ( $q_index = 0 ; $q_index < count(self::$queue) ; $q_index++ ) {
if ( self::$queue [$q_index] != NULL &&
self::$queue [$q_index]->equalToValues($state, $clazz, $tag) ) {
return true;
}
}
return false;
}
/**
* helper function to simplify writing plugin calls to the instruction list
* first three arguments are passed to function render as $data
*/
public function writeCall($class, $state, $data1, $data2, $pos, $match, &$handler) {
$handler->addPluginCall($class, array($state, $data1, $data2), $state, $pos, $match);
}
public function getTraceDump () {
return self::$trace_dump;
}
public function addToTraceDump ($content) {
self::$trace_dump .= $content;
}
}
// vim:ts=4:sw=4:et:enc=utf-8: