* $ctr = Pluf::factory('Pluf_Text_Wiki_Renderer'); * $xhtml_text = $ctr->render($wiki_text); * */ class Pluf_Text_Wiki_Renderer { /** * HTML version of analysed text. */ private $_newtext; private $_isBlocOpen=false; /** * Current opened block element. */ private $_currentBloc; /** * List of available blocks. */ private $_blocList=array(); /** * List of parameters for the engine. */ public $params=array(); /** * Inline parser for the Wiki Inline tags. */ public $inlineParser=null; /** * List of lines with wiki errors. */ public $errors; /** * Config object to customized the renderer. */ public $config=null; /** * Constructor of the renderer. * * Create the needed objects for the rendering. * * @param Configuration Custom configuration object (null) */ function __construct($config=null) { if (is_null($config)) { $this->config = new Pluf_Text_Wiki_Configuration(); } else { $this->config = $config; } // Gost block $this->_currentBloc = new Pluf_Text_Wiki_BlockRenderer($this); $this->inlineParser = new Pluf_Text_Wiki_InlineParser( $this->config->inlinetags, $this->config->simpletags, $this->config->inlineTagSeparator, $this->config->checkWikiWord, $this->config->checkWikiWordFunction, $this->config->escapeSpecialChars ); foreach ($this->config->bloctags as $name=>$ok) { if ($ok) { $this->_blocList[] = new $name($this); } } } /** * Main method to convert the wiki text into XHTML. * * @param string Text to be converted. * @return string Converted text into XHTML. */ function render($text) { // Split on \r (mac), \n (unix) or \r\n (windows) $lignes = preg_split("/\015\012|\015|\012/", $text); $this->_newtext = array(); $this->_isBlocOpen = false; $this->errors = false; $this->_currentBloc = new Pluf_Text_Wiki_BlockRenderer($this); // Go through all the lines. foreach ($lignes as $num=>$ligne) { if ($ligne == '') { // pas de trim à cause des pre // ligne vide $this->_closeBloc(); } else { // detection de debut de bloc (liste, tableau, hr, titre) foreach ($this->_blocList as $bloc) { if ($bloc->detect($ligne)) { break; } } // c'est le debut d'un bloc (ou ligne d'un bloc en cours) if ($bloc->getType() != $this->_currentBloc->getType()) { // on ferme le precedent si c'etait un different $this->_closeBloc(); $this->_currentBloc = $bloc; if($this->_openBloc()) { $this->_newtext[] = $this->_currentBloc->getRenderedLine(); } else { $this->_newtext[] = $this->_currentBloc->getRenderedLine(); $this->_newtext[] = $this->_currentBloc->close(); $this->_isBlocOpen = false; $this->_currentBloc = new Pluf_Text_Wiki_BlockRenderer($this); } } else { $this->_currentBloc->setMatch($bloc->getMatch()); $this->_newtext[] = $this->_currentBloc->getRenderedLine(); } if($this->inlineParser->getError()) { $this->errors[$num+1] = $ligne; } } } $this->_closeBloc(); return implode("\n", $this->_newtext); } /** * Returns configuration object. * * @return WikiRendererConfig */ function getConfig() { return $this->config; } /** * Retourne l'objet inlineParser (WikiInlineParser) utilisé dans le moteur * @access public * @see WikiInlineParser * @return WikiInlineParser */ function getInlineParser() { return $this->inlineParser; } /** * renvoi la liste des erreurs detectées par le moteur * @access public * @return array */ function getErrors() { return $this->errors; } /** * renvoi la version de wikirenderer * @access public * @return string version */ function getVersion() { return '2.1'; } /** * ferme un bloc * @access private */ function _closeBloc() { if ($this->_isBlocOpen) { $this->_isBlocOpen = false; $this->_newtext[] = $this->_currentBloc->close(); $this->_currentBloc = new Pluf_Text_Wiki_BlockRenderer($this); } } /** * ouvre un bloc et le referme eventuellement suivant sa nature * @return boolean indique si le bloc reste ouvert ou pas * @access private */ function _openBloc() { if (!$this->_isBlocOpen) { $this->_newtext[] = $this->_currentBloc->open(); $this->_isBlocOpen = true; return !$this->_currentBloc->closeNow(); } else { return true; } } }