*/ use dokuwiki\Parsing\Parser; // must be run within Dokuwiki if (!defined('DOKU_INC')) { die(); } /** * if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); * if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); * require_once(DOKU_PLUGIN.'syntax.php'); */ class syntax_plugin_flowcharts extends DokuWiki_Syntax_Plugin { function getType(){ return 'protected'; } // must return a number lower than returned by native 'code' mode (200) function getSort(){ return 158; } /** * Connect lookup pattern to lexer. * * @param string $mode Parser mode */ function connectTo($mode) { $this->Lexer->addEntryPattern('(?=.*?)',$mode,'plugin_flowcharts'); } function postConnect() { $this->Lexer->addExitPattern('','plugin_flowcharts'); } /** * Handle matches of the flowcharts syntax */ function handle($match, $state, $pos, Doku_Handler $handler){ switch ($state) { case DOKU_LEXER_ENTER: return array($state, ''); case DOKU_LEXER_UNMATCHED : return array($state, $match); case DOKU_LEXER_EXIT : return array($state, ''); } return false; } /** * Render xhtml output or metadata */ function render($mode, Doku_Renderer $renderer, $indata) { if($mode == 'xhtml'){ list($state, $match) = $indata; switch ($state) { case DOKU_LEXER_ENTER : // securityLevel loose allows more advanced functionality such as subgraphs to run. // @todo: this should be an option in the interface. $renderer->doc .= '
'; break; case DOKU_LEXER_UNMATCHED : $instructions = $this->p_get_instructions($match); $xhtml = $this->p_render($instructions); $renderer->doc .= $xhtml; break; case DOKU_LEXER_EXIT : $renderer->doc .= "
"; break; } return true; } return false; } /* * Get the parser instructions siutable for the mermaid * */ function p_get_instructions($text) { $modes = array(); // add default modes $std_modes = array('internallink', 'media','externallink'); foreach($std_modes as $m){ $class = 'dokuwiki\\Parsing\\ParserMode\\'.ucfirst($m); $obj = new $class(); $modes[] = array( 'sort' => $obj->getSort(), 'mode' => $m, 'obj' => $obj ); } // add formatting modes $fmt_modes = array('strong','emphasis','underline','monospace', 'subscript','superscript','deleted'); foreach($fmt_modes as $m){ $obj = new \dokuwiki\Parsing\ParserMode\Formatting($m); $modes[] = array( 'sort' => $obj->getSort(), 'mode' => $m, 'obj' => $obj ); } // Create the parser and handler $Parser = new Parser(new Doku_Handler()); //add modes to parser foreach($modes as $mode){ $Parser->addMode($mode['mode'],$mode['obj']); } // Do the parsing $p = $Parser->parse($text); return $p; } public function p_render($instructions) { $Renderer = p_get_renderer('flowcharts'); $Renderer->smileys = getSmileys(); $Renderer->entities = getEntities(); $Renderer->acronyms = getAcronyms(); $Renderer->interwiki = getInterwiki(); // Loop through the instructions foreach ($instructions as $instruction) { // Execute the callback against the Renderer if(method_exists($Renderer, $instruction[0])){ call_user_func_array(array(&$Renderer, $instruction[0]), $instruction[1] ? $instruction[1] : array()); } } return $Renderer->doc; } }