*/ // must be run within Dokuwiki if(!defined('DOKU_INC')) die(); if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once(DOKU_PLUGIN.'syntax.php'); /** * All DokuWiki plugins to extend the parser/rendering mechanism * need to inherit from this class */ class syntax_plugin_weiqi extends DokuWiki_Syntax_Plugin { // these class vars are like conf vars (will be in the admin page one day) // they are initialized in the plugin constructor syntax_plugin_weiqi() // syntax starts at , ends at where xxx is $syntax_tag var $syntax_tag; /** * Plugin Constructor. */ function syntax_plugin_weiqi() { require_once(DOKU_INC.'lib/plugins/weiqi/weiqi_parser.php'); // enable direct access to language strings $this->setupLocale(); // enable direct access to configuration $this->loadConfig(); $this->syntax_tag = 'weiqi'; // have a look at weiqi_parser.php // for some explanations about those config items $this->conf = array( 'attributes_key' => 'attributes:', 'caption_key' => 'caption:', 'img_path_web' => DOKU_BASE.'lib/plugins/weiqi/img/', 'img_path_fs' => 'lib/plugins/weiqi/img/', 'letter_sequence' => 'abcdefghjklmnopqrstuvwxyz', 'plain_text_coeff' => 0.7, 'allowed_attribute_keys' => array( 'demo', 'goban', 'coords', 'grid_size', 'reverse_numbers', 'reverse_letters', 'start_number', 'start_letter', 'advanced'), 'default_attributes' => array( 'demo' => false, 'goban' => 1, 'grid_size' => 25, 'edges_width' => 10, 'coords' => false, 'reverse_numbers' => false, 'reverse_letters' => false, 'start_number' => 1, 'start_letter' => 1, 'advanced' => false, ) ); } function getInfo() { return array( 'author' => 'Grahack', 'email' => 'christophegragnic@yahoo.fr', 'date' => '2008-06-19', 'name' => 'Weiqi Plugin', 'desc' => 'Displays Weiqi (also named Go game or Baduk) diagrams', 'url' => 'http://wiki.splitbrain.org/plugin:weiqi', ); } function getType() { return 'protected'; } function getAllowedTypes() { return array('formatting', 'disabled'); } function getPType(){ return 'block';} function getSort() { return 999; } function connectTo($mode) { $pattern = '<'.$this->syntax_tag.'.*?>(?=.*?syntax_tag.'>)'; $this->Lexer->addEntryPattern($pattern,$mode,'plugin_weiqi'); } function postConnect() { $this->Lexer->addExitPattern('syntax_tag.'>','plugin_weiqi'); } function handle($match, $state, $pos, &$handler) { if ($state == DOKU_LEXER_UNMATCHED) { $parser = new weiqi_parser(); $parser->set_conf($this->conf); $parsed = $parser->parse($match); if (!$parser->error) return array($state, $parsed); else { switch ($parser->error_code) { case WEIQI_ERROR_BAD_ATTRIBUTES : $message = $this->lang['weiqi bad attributes'] .' ('.trim($parser->error_data['attributes_str']).')
'; $bad_attributes = ''; foreach( $parser->error_data['errors'] as $key => $value) { if ($value == '') { $bad_attributes.= ', '.$key .' '.$this->lang['weiqi not allowed']; } else { $bad_attributes.= ', '.$value .' '.$this->lang['weiqi not allowed for'].' '.$key; } } $message.= trim(trim($bad_attributes, ',')); break; case WEIQI_ERROR_ONE_CAPTION : $message = $this->lang['weiqi one caption']; break; case WEIQI_ERROR_RECTANGULAR : $message = $this->lang['weiqi rectangular']; break; default : $message = $this->lang['weiqi unknown error']; } return array($state, array(), $message); } } else return array($state); } function render($mode, &$renderer, $data) { if ($mode == 'xhtml') { list($state, $goban_data, $message) = $data; switch ($state) { case DOKU_LEXER_ENTER : $renderer->doc .= '
'; return true; case DOKU_LEXER_UNMATCHED : if ($message!='') { $renderer->doc.= '
'; $renderer->doc.= $this->lang['weiqi error'].': '.$message; $renderer->doc.= '
'; // no need to display the goban if something is wrong // so we stop here return true; } $parser = new weiqi_parser(); $parser->set_conf($this->conf); $renderer->doc .= $parser->render($goban_data); return true; case DOKU_LEXER_EXIT : $renderer->doc .= "
"; return true; } } return false; } }