diff options
Diffstat (limited to 'platform/www/lib/plugins/refnotes/syntax/notes.php')
-rw-r--r-- | platform/www/lib/plugins/refnotes/syntax/notes.php | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/refnotes/syntax/notes.php b/platform/www/lib/plugins/refnotes/syntax/notes.php new file mode 100644 index 0000000..32263ac --- /dev/null +++ b/platform/www/lib/plugins/refnotes/syntax/notes.php @@ -0,0 +1,221 @@ +<?php + +/** + * Plugin RefNotes: Note renderer + * + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Mykola Ostrovskyy <dwpforge@gmail.com> + */ + +require_once(DOKU_PLUGIN . 'refnotes/core.php'); + +class syntax_plugin_refnotes_notes extends DokuWiki_Syntax_Plugin { + + private $mode; + + /** + * Constructor + */ + public function __construct() { + $this->mode = substr(get_class($this), 7); + } + + /** + * What kind of syntax are we? + */ + public function getType() { + return 'substition'; + } + + public function getPType() { + return 'block'; + } + + /** + * Where to sort in? + */ + public function getSort() { + return 150; + } + + public function connectTo($mode) { + $this->Lexer->addSpecialPattern('~~REFNOTES.*?~~', $mode, $this->mode); + $this->Lexer->addSpecialPattern('<refnotes[^>]*?\/>', $mode, $this->mode); + $this->Lexer->addSpecialPattern('<refnotes(?:[^>]*?[^/>])?>.*?<\/refnotes>', $mode, $this->mode); + } + + /** + * Handle the match + */ + public function handle($match, $state, $pos, Doku_Handler $handler) { + switch ($match[0]) { + case '~': + return $this->handleBasic($match); + + case '<': + return $this->handleExtended($match); + } + + return false; + } + + /** + * Create output + */ + public function render($mode, Doku_Renderer $renderer, $data) { + try { + if($mode == 'xhtml') { + switch ($data[0]) { + case 'style': + refnotes_renderer_core::getInstance()->styleNamespace($data[1]['ns'], $data[2]); + break; + + case 'map': + refnotes_renderer_core::getInstance()->setNamespaceMapping($data[1]['ns'], $data[2]); + break; + + case 'render': + $this->renderNotes($mode, $renderer, $data[1]); + break; + } + + return true; + } + elseif ($mode == 'odt') { + switch ($data[0]) { + case 'render': + $this->renderNotes($mode, $renderer, $data[1]); + break; + } + + return true; + } + } + catch (Exception $error) { + msg($error->getMessage(), -1); + } + + return false; + } + + /** + * + */ + private function handleBasic($syntax) { + preg_match('/~~REFNOTES(.*?)~~/', $syntax, $match); + + return array('render', $this->parseAttributes($match[1])); + } + + /** + * + */ + private function handleExtended($syntax) { + preg_match('/<refnotes(.*?)(?:\/>|>(.*?)<\/refnotes>)/s', $syntax, $match); + $attribute = $this->parseAttributes($match[1]); + $style = array(); + + if ($match[2] != '') { + $style = $this->parseStyles($match[2]); + } + + if (count($style) > 0) { + return array('split', $attribute, $style); + } + else { + return array('render', $attribute); + } + } + + /** + * + */ + private function parseAttributes($syntax) { + $propertyMatch = array( + 'ns' => '/^' . refnotes_namespace::getNamePattern('required') . '$/', + 'limit' => '/^\/?\d+$/' + ); + + $attribute = array(); + $token = preg_split('/\s+/', $syntax, -1, PREG_SPLIT_NO_EMPTY); + foreach ($token as $t) { + foreach ($propertyMatch as $name => $pattern) { + if (preg_match($pattern, $t) == 1) { + $attribute[$name][] = $t; + break; + } + } + } + + if (array_key_exists('ns', $attribute)) { + /* Ensure that namespaces are in canonic form */ + $attribute['ns'] = array_map('refnotes_namespace::canonizeName', $attribute['ns']); + + if (count($attribute['ns']) > 1) { + $attribute['map'] = array_slice($attribute['ns'], 1); + } + + $attribute['ns'] = $attribute['ns'][0]; + } + else { + $attribute['ns'] = ':'; + } + + if (array_key_exists('limit', $attribute)) { + $attribute['limit'] = end($attribute['limit']); + } + + return $attribute; + } + + /** + * + */ + private function parseStyles($syntax) { + $style = array(); + preg_match_all('/([-\w]+)\s*:[ \t]*([^\s\n;].*?)[ \t]*?(?:[\n;]|$)/', $syntax, $match, PREG_SET_ORDER); + foreach ($match as $m) { + $style[$m[1]] = $m[2]; + } + + /* Validate direct-to-html styles */ + if (array_key_exists('notes-separator', $style)) { + if (preg_match('/(?:\d+\.?|\d*\.\d+)(?:%|em|px)|none/', $style['notes-separator'], $match) == 1) { + $style['notes-separator'] = $match[0]; + } + else { + $style['notes-separator'] = ''; + } + } + + /* Ensure that namespaces are in canonic form */ + if (array_key_exists('inherit', $style)) { + $style['inherit'] = refnotes_namespace::canonizeName($style['inherit']); + } + + return $style; + } + + /** + * + */ + private function renderNotes($mode, $renderer, $attribute) { + $limit = array_key_exists('limit', $attribute) ? $attribute['limit'] : ''; + $doc = refnotes_renderer_core::getInstance()->renderNotes($mode, $attribute['ns'], $limit); + + if ($doc != '') { + if ($mode == 'xhtml') { + $open = '<div class="refnotes">' . DOKU_LF; + $close = '</div>' . DOKU_LF; + } + else { + $open = ''; + $close = ''; + } + + $renderer->doc .= $open; + $renderer->doc .= $doc; + $renderer->doc .= $close; + } + } +} |