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 $pageid = []; 6507c401fcSEli Fenton preg_match('/<autott\s*([^>]+?)\s*>/', $match, $classes); 6607c401fcSEli Fenton preg_match('/<autott[^>]*>\s*([\s\S]+)\s*<\/autott>/', $match, $inner); 6707c401fcSEli Fenton if (count($inner) < 1) { 6807c401fcSEli Fenton return 'ERROR'; 6907c401fcSEli Fenton } 7007c401fcSEli Fenton $inner = $inner[1]; 7107c401fcSEli Fenton 7214a8da65SEli Fenton $data = []; 736bfd3f23SEli Fenton $classes = count($classes) >= 1 ? preg_split('/\s+/', $classes[1]) : []; 7407c401fcSEli Fenton $classes = implode(' ', array_map(function ($c) { 7507c401fcSEli Fenton return 'plugin-autotooltip__' . $c; 7607c401fcSEli Fenton }, $classes)); 776bfd3f23SEli Fenton $data['classes'] = strlen($classes) ? $classes : 'plugin-autotooltip__default'; 786bfd3f23SEli Fenton 7914a8da65SEli Fenton if (strchr($inner, '<') === FALSE) { 8014a8da65SEli Fenton $parts = array_map(function($s) {return trim($s);}, explode('|', $inner)); 813120b2e2SEli Fenton // <autott class1 class2>wikilink|desc</autott> 8214a8da65SEli Fenton if (cleanID($parts[0]) == $parts[0]) { 8314a8da65SEli Fenton $data['pageid'] = $parts[0]; 8414a8da65SEli Fenton if (count($parts) > 1) { 8514a8da65SEli Fenton $data['content'] = $parts[1]; 8614a8da65SEli Fenton } 8714a8da65SEli Fenton return $data; 8814a8da65SEli Fenton } 8914a8da65SEli Fenton } 90*e4338dabSEli Fenton // <autott class1 class2><content></content><tip></tip><title></title><pageid></pageid></autott> 9114a8da65SEli Fenton else { 92*e4338dabSEli Fenton $content = []; 93*e4338dabSEli Fenton $tip = []; 94*e4338dabSEli Fenton $title = []; 953120b2e2SEli Fenton preg_match('/<content>([\s\S]+)<\/content>/', $inner, $content); 963120b2e2SEli Fenton preg_match('/<tip>([\s\S]+)<\/tip>/', $inner, $tip); 97*e4338dabSEli Fenton preg_match('/<title>([\s\S]+)<\/title>/', $inner, $title); 9814a8da65SEli Fenton 9914a8da65SEli Fenton if (count($content) >= 1 || count($pageid) >= 1) { 10014a8da65SEli Fenton $data['content'] = count($content) >= 1 ? $content[1] : ''; 1016bfd3f23SEli Fenton $data['tip'] = count($tip) >= 1 ? $tip[1] : null; 102*e4338dabSEli Fenton $data['title'] = count($title) >= 1 ? $title[1] : null; 1036bfd3f23SEli Fenton 1046bfd3f23SEli Fenton return $data; 1056bfd3f23SEli Fenton } 10607c401fcSEli Fenton } 1076bfd3f23SEli Fenton 1086bfd3f23SEli Fenton return 'ERROR'; 1096bfd3f23SEli Fenton } 1106bfd3f23SEli Fenton 1116bfd3f23SEli Fenton 1126bfd3f23SEli Fenton /** 1136bfd3f23SEli Fenton * @param string $mode 1146bfd3f23SEli Fenton * @param Doku_Renderer $renderer 1156bfd3f23SEli Fenton * @param array|string $data - Data from handle() 1166bfd3f23SEli Fenton * @return bool|void 1176bfd3f23SEli Fenton */ 1186bfd3f23SEli Fenton function render($mode, Doku_Renderer $renderer, $data) { 1196a9a9b3aSEli Fenton if ($mode == 'xhtml') { 1206bfd3f23SEli Fenton if ($data == 'ERROR') { 1216bfd3f23SEli Fenton msg('Error: Invalid instantiation of autotooltip plugin'); 1226bfd3f23SEli Fenton } 1236bfd3f23SEli Fenton else if ($data['pageid']) { 124*e4338dabSEli Fenton $renderer->doc .= $this->m_helper->forWikilink($data['pageid'], $data['content'], '', $data['classes']); 1256bfd3f23SEli Fenton } 1266bfd3f23SEli Fenton else { 127*e4338dabSEli Fenton $renderer->doc .= $this->m_helper->forText($data['content'], $data['tip'], $data['title'], '', $data['classes']); 1286bfd3f23SEli Fenton } 1296bfd3f23SEli Fenton } 1306a9a9b3aSEli Fenton else { 1316a9a9b3aSEli Fenton if ($data == 'ERROR') { 1326a9a9b3aSEli Fenton $renderer->doc .= 'Error: Invalid instantiation of autotooltip plugin'; 1336a9a9b3aSEli Fenton } 1346a9a9b3aSEli Fenton else { 1356a9a9b3aSEli Fenton $renderer->doc .= $data['content']; 1366a9a9b3aSEli Fenton } 1376a9a9b3aSEli Fenton } 1386a9a9b3aSEli Fenton } 1396bfd3f23SEli Fenton} 140