*/ if (!defined('DOKU_INC')) die(); if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); require_once (DOKU_PLUGIN . 'syntax.php'); class syntax_plugin_rst extends DokuWiki_Syntax_Plugin { function getType() { return 'protected'; } function getPType() { return 'block'; } function getSort() { return 69; } function connectTo($mode) { $this->Lexer->addEntryPattern('(?=.*)', $mode, 'plugin_rst'); } function postConnect() { $this->Lexer->addExitPattern('', 'plugin_rst'); } function handle($match, $state, $pos, &$handler) { switch ($state) { case DOKU_LEXER_ENTER : return array($state, ''); case DOKU_LEXER_UNMATCHED : return array($match); case DOKU_LEXER_EXIT : return array($state, ''); } return array($state,''); } function render($mode, &$renderer, $data) { dbglog("mode is $mode, data[0] is $data[0]"); if ($mode == 'xhtml' && $data[0] != DOKU_LEXER_ENTER && $data[0] != DOKU_LEXER_EXIT) { $descriptorspec = array( 0 => array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to ); $cwd = '/tmp'; $env = NULL; $process = proc_open('rst2html --no-doc-title', $descriptorspec, $pipes, $cwd, $env); if (is_resource($process)) { // $pipes now looks like this: // 0 => writeable handle connected to child stdin // 1 => readable handle connected to child stdout // Any error output will be appended to /tmp/error-output.txt fwrite($pipes[0], $data[0]); fclose($pipes[0]); $output = stream_get_contents($pipes[1]); fclose($pipes[1]); // It is important that you close any pipes before calling // proc_close in order to avoid a deadlock $return_value = proc_close($process); } $renderer->doc .= $output; return true; } else { return false; } } /* function render($mode, &$renderer, $data) { //dbg('function render($mode, &$renderer, $data)-->'.' mode = '.$mode.' data = '.$data); //dbg($data); if ($mode == 'xhtml') { list($state,$match) = $data; switch ($state) { case DOKU_LEXER_ENTER : break; case DOKU_LEXER_UNMATCHED : dbglog("In render, $match is:" . $match); $match = $this->_toc($renderer, $match); $renderer->doc .= $match; break; case DOKU_LEXER_EXIT : break; } return true; }else if ($mode == 'metadata') { //dbg('function render($mode, &$renderer, $data)-->'.' mode = '.$mode.' data = '.$data); //dbg($data); list($state,$match) = $data; switch ($state) { case DOKU_LEXER_ENTER : break; case DOKU_LEXER_UNMATCHED : if (!$renderer->meta['title']){ $renderer->meta['title'] = $this->_rst_header($match); } $this->_toc($renderer, $match); $internallinks = $this->_internallinks($match); #dbg($internallinks); if (count($internallinks)>0){ foreach($internallinks as $internallink) { $renderer->internallink($internallink); } } break; case DOKU_LEXER_EXIT : break; } return true; } else { return false; } } */ function _rst_header($text) { $doc = new DOMDocument('1.0','UTF-8'); //dbg($doc); $meta = ''; $doc->loadHTML($meta.$text); //dbg($doc->saveHTML()); if ($nodes = $doc->getElementsByTagName('h1')){ return $nodes->item(0)->nodeValue; } return false; } function _internallinks($text) { $links = array(); if ( ! $text ) return $links; $doc = new DOMDocument('1.0', 'UTF-8'); $doc->loadHTML($text); if ($nodes = $doc->getElementsByTagName('a')){ foreach($nodes as $atag) { $href = $atag->getAttribute('href'); if (!preg_match('/^(https{0,1}:\/\/|ftp:\/\/|mailto:)/i',$href)){ $links[] = $href; } } } return $links; } function _toc(&$renderer, $text) { $doc = new DOMDocument('1.0','UTF-8'); //dbg($doc); $meta = ''; $doc->loadHTML($meta.$text); if ($nodes = $doc->getElementsByTagName("*")){ foreach($nodes as $node) { if (preg_match('/h([1-7])/',$node->tagName,$match)) { #dbg($node); $node->setAttribute('class', 'sectionedit'.$match[1]); $hid = $renderer->_headerToLink($node->nodeValue,'true'); $node->setAttribute('id',$hid); $renderer->toc_additem($hid, $node->nodeValue, $match[1]); } } } //remove outer tags of content $html = $doc->saveHTML(); $html = str_replace('','',$html); $html = preg_replace('/.+/', '', $html); $html = preg_replace('@.*@','', $html); return $html; } }