16bfd3f23SEli Fenton<?php 26bfd3f23SEli Fentonif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 36bfd3f23SEli Fentonif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 46bfd3f23SEli Fentonif(!defined('DOKU_REL')) define('DOKU_REL', '/dokuwiki/'); 56bfd3f23SEli Fentonrequire_once(DOKU_PLUGIN.'syntax.php'); 66bfd3f23SEli Fenton 76bfd3f23SEli Fenton/** 86bfd3f23SEli Fenton * Auto-Tooltip DokuWiki plugin 96bfd3f23SEli Fenton * 106bfd3f23SEli Fenton * @license MIT 116bfd3f23SEli Fenton * @author Eli Fenton 126bfd3f23SEli Fenton */ 136bfd3f23SEli Fentonclass syntax_plugin_autotooltip extends DokuWiki_Syntax_Plugin { 146bfd3f23SEli Fenton /** @type helper_plugin_autotooltip m_helper */ 156bfd3f23SEli Fenton private $m_helper; 166bfd3f23SEli Fenton 176bfd3f23SEli Fenton public function __construct() { 186bfd3f23SEli Fenton $this->m_helper = plugin_load('helper', 'autotooltip'); 196bfd3f23SEli Fenton } 206bfd3f23SEli Fenton 216bfd3f23SEli Fenton 226bfd3f23SEli Fenton /** 236bfd3f23SEli Fenton * @return string 246bfd3f23SEli Fenton */ 256bfd3f23SEli Fenton function getType() { 266bfd3f23SEli Fenton return 'substition'; 276bfd3f23SEli Fenton } 286bfd3f23SEli Fenton 296bfd3f23SEli Fenton 306bfd3f23SEli Fenton /** 316bfd3f23SEli Fenton * @return string 326bfd3f23SEli Fenton */ 336bfd3f23SEli Fenton function getPType() { 346bfd3f23SEli Fenton return 'normal'; 356bfd3f23SEli Fenton } 366bfd3f23SEli Fenton 376bfd3f23SEli Fenton 386bfd3f23SEli Fenton /** 396bfd3f23SEli Fenton * @return int 406bfd3f23SEli Fenton */ 416bfd3f23SEli Fenton function getSort() { 426bfd3f23SEli Fenton return 165; 436bfd3f23SEli Fenton } 446bfd3f23SEli Fenton 456bfd3f23SEli Fenton 466bfd3f23SEli Fenton /** 476bfd3f23SEli Fenton * @param $mode 486bfd3f23SEli Fenton */ 496bfd3f23SEli Fenton function connectTo($mode) { 5007c401fcSEli Fenton $this->Lexer->addSpecialPattern('<autott[^>]*>(?:[\s\S]*?</autott>)', $mode, 'plugin_autotooltip'); 516bfd3f23SEli Fenton } 526bfd3f23SEli Fenton 5307c401fcSEli Fenton 546bfd3f23SEli Fenton /** 556bfd3f23SEli Fenton * @param string $match - The match from addEntryPattern. 566bfd3f23SEli Fenton * @param int $state - The DokuWiki event state. 576bfd3f23SEli Fenton * @param int $pos - The position in the full text. 586bfd3f23SEli Fenton * @param Doku_Handler $handler 596bfd3f23SEli Fenton * @return array|string 606bfd3f23SEli Fenton */ 616bfd3f23SEli Fenton function handle($match, $state, $pos, Doku_Handler $handler) { 6207c401fcSEli Fenton $inner = []; 636bfd3f23SEli Fenton $classes = []; 646bfd3f23SEli Fenton $content = []; 656bfd3f23SEli Fenton $tip = []; 666bfd3f23SEli Fenton $pageid = []; 6707c401fcSEli Fenton preg_match('/<autott\s*([^>]+?)\s*>/', $match, $classes); 6807c401fcSEli Fenton preg_match('/<autott[^>]*>\s*([\s\S]+)\s*<\/autott>/', $match, $inner); 6907c401fcSEli Fenton if (count($inner) < 1) { 7007c401fcSEli Fenton return 'ERROR'; 7107c401fcSEli Fenton } 7207c401fcSEli Fenton $inner = $inner[1]; 7307c401fcSEli Fenton 7414a8da65SEli Fenton $data = []; 756bfd3f23SEli Fenton $classes = count($classes) >= 1 ? preg_split('/\s+/', $classes[1]) : []; 7607c401fcSEli Fenton $classes = implode(' ', array_map(function ($c) { 7707c401fcSEli Fenton return 'plugin-autotooltip__' . $c; 7807c401fcSEli Fenton }, $classes)); 796bfd3f23SEli Fenton $data['classes'] = strlen($classes) ? $classes : 'plugin-autotooltip__default'; 806bfd3f23SEli Fenton 8114a8da65SEli Fenton // <autott class1 class2>wikilink|Desc</autott> 8214a8da65SEli Fenton if (strchr($inner, '<') === FALSE) { 8314a8da65SEli Fenton $parts = array_map(function($s) {return trim($s);}, explode('|', $inner)); 8414a8da65SEli Fenton if (cleanID($parts[0]) == $parts[0]) { 8514a8da65SEli Fenton $data['pageid'] = $parts[0]; 8614a8da65SEli Fenton if (count($parts) > 1) { 8714a8da65SEli Fenton $data['content'] = $parts[1]; 8814a8da65SEli Fenton } 8914a8da65SEli Fenton return $data; 9014a8da65SEli Fenton } 9114a8da65SEli Fenton } 9214a8da65SEli Fenton // <autott class1 class2><content></content><tip></tip><pageid></pageid></autott> 9314a8da65SEli Fenton else { 9414a8da65SEli Fenton preg_match('/<content>(.+)<\/content>/', $inner, $content); 9514a8da65SEli Fenton preg_match('/<tip>(.+)<\/tip>/', $inner, $tip); 9614a8da65SEli Fenton 9714a8da65SEli Fenton if (count($content) >= 1 || count($pageid) >= 1) { 9814a8da65SEli Fenton $data['content'] = count($content) >= 1 ? $content[1] : ''; 9914a8da65SEli Fenton 1006bfd3f23SEli Fenton $data['tip'] = count($tip) >= 1 ? $tip[1] : null; 1016bfd3f23SEli Fenton 1026bfd3f23SEli Fenton return $data; 1036bfd3f23SEli Fenton } 10407c401fcSEli Fenton } 1056bfd3f23SEli Fenton 1066bfd3f23SEli Fenton return 'ERROR'; 1076bfd3f23SEli Fenton } 1086bfd3f23SEli Fenton 1096bfd3f23SEli Fenton 1106bfd3f23SEli Fenton /** 1116bfd3f23SEli Fenton * @param string $mode 1126bfd3f23SEli Fenton * @param Doku_Renderer $renderer 1136bfd3f23SEli Fenton * @param array|string $data - Data from handle() 1146bfd3f23SEli Fenton * @return bool|void 1156bfd3f23SEli Fenton */ 1166bfd3f23SEli Fenton function render($mode, Doku_Renderer $renderer, $data) { 117*6a9a9b3aSEli Fenton if ($mode == 'xhtml') { 1186bfd3f23SEli Fenton if ($data == 'ERROR') { 1196bfd3f23SEli Fenton msg('Error: Invalid instantiation of autotooltip plugin'); 1206bfd3f23SEli Fenton } 1216bfd3f23SEli Fenton else if ($data['pageid']) { 1226bfd3f23SEli Fenton $renderer->doc .= $this->m_helper->forWikilink($data['pageid'], $data['content'], $data['classes']); 1236bfd3f23SEli Fenton } 1246bfd3f23SEli Fenton else { 1256bfd3f23SEli Fenton $renderer->doc .= $this->m_helper->forText($data['content'], $data['tip'], $data['classes']); 1266bfd3f23SEli Fenton } 1276bfd3f23SEli Fenton } 128*6a9a9b3aSEli Fenton else { 129*6a9a9b3aSEli Fenton if ($data == 'ERROR') { 130*6a9a9b3aSEli Fenton $renderer->doc .= 'Error: Invalid instantiation of autotooltip plugin'; 131*6a9a9b3aSEli Fenton } 132*6a9a9b3aSEli Fenton else { 133*6a9a9b3aSEli Fenton $renderer->doc .= $data['content']; 134*6a9a9b3aSEli Fenton } 135*6a9a9b3aSEli Fenton } 136*6a9a9b3aSEli Fenton } 1376bfd3f23SEli Fenton} 138