1*6bfd3f23SEli Fenton<?php 2*6bfd3f23SEli Fentonif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 3*6bfd3f23SEli Fentonif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 4*6bfd3f23SEli Fentonif(!defined('DOKU_REL')) define('DOKU_REL', '/dokuwiki/'); 5*6bfd3f23SEli Fentonrequire_once(DOKU_PLUGIN.'syntax.php'); 6*6bfd3f23SEli Fenton 7*6bfd3f23SEli Fenton/** 8*6bfd3f23SEli Fenton * Auto-Tooltip DokuWiki plugin 9*6bfd3f23SEli Fenton * 10*6bfd3f23SEli Fenton * @license MIT 11*6bfd3f23SEli Fenton * @author Eli Fenton 12*6bfd3f23SEli Fenton */ 13*6bfd3f23SEli Fentonclass syntax_plugin_autotooltip extends DokuWiki_Syntax_Plugin { 14*6bfd3f23SEli Fenton /** @type helper_plugin_autotooltip m_helper */ 15*6bfd3f23SEli Fenton private $m_helper; 16*6bfd3f23SEli Fenton 17*6bfd3f23SEli Fenton public function __construct() { 18*6bfd3f23SEli Fenton $this->m_helper = plugin_load('helper', 'autotooltip'); 19*6bfd3f23SEli Fenton } 20*6bfd3f23SEli Fenton 21*6bfd3f23SEli Fenton 22*6bfd3f23SEli Fenton /** 23*6bfd3f23SEli Fenton * @return string 24*6bfd3f23SEli Fenton */ 25*6bfd3f23SEli Fenton function getType() { 26*6bfd3f23SEli Fenton return 'substition'; 27*6bfd3f23SEli Fenton } 28*6bfd3f23SEli Fenton 29*6bfd3f23SEli Fenton 30*6bfd3f23SEli Fenton /** 31*6bfd3f23SEli Fenton * @return string 32*6bfd3f23SEli Fenton */ 33*6bfd3f23SEli Fenton function getPType() { 34*6bfd3f23SEli Fenton return 'normal'; 35*6bfd3f23SEli Fenton } 36*6bfd3f23SEli Fenton 37*6bfd3f23SEli Fenton 38*6bfd3f23SEli Fenton /** 39*6bfd3f23SEli Fenton * @return int 40*6bfd3f23SEli Fenton */ 41*6bfd3f23SEli Fenton function getSort() { 42*6bfd3f23SEli Fenton return 165; 43*6bfd3f23SEli Fenton } 44*6bfd3f23SEli Fenton 45*6bfd3f23SEli Fenton 46*6bfd3f23SEli Fenton /** 47*6bfd3f23SEli Fenton * @param $mode 48*6bfd3f23SEli Fenton */ 49*6bfd3f23SEli Fenton function connectTo($mode) { 50*6bfd3f23SEli Fenton $this->Lexer->addSpecialPattern('<tt2[^>]*>(?:[\s\S]*?</tt2>)', $mode, 'plugin_autotooltip'); 51*6bfd3f23SEli Fenton } 52*6bfd3f23SEli Fenton 53*6bfd3f23SEli Fenton /** 54*6bfd3f23SEli Fenton * @param string $match - The match from addEntryPattern. 55*6bfd3f23SEli Fenton * @param int $state - The DokuWiki event state. 56*6bfd3f23SEli Fenton * @param int $pos - The position in the full text. 57*6bfd3f23SEli Fenton * @param Doku_Handler $handler 58*6bfd3f23SEli Fenton * @return array|string 59*6bfd3f23SEli Fenton */ 60*6bfd3f23SEli Fenton function handle($match, $state, $pos, Doku_Handler $handler) { 61*6bfd3f23SEli Fenton // <tt2 class1 class2><content></content><tip></tip><pageid></pageid></tt2> 62*6bfd3f23SEli Fenton $classes = []; 63*6bfd3f23SEli Fenton $content = []; 64*6bfd3f23SEli Fenton $tip = []; 65*6bfd3f23SEli Fenton $pageid = []; 66*6bfd3f23SEli Fenton preg_match('/<tt2\s*([^>]+?)\s*>/', $match, $classes); 67*6bfd3f23SEli Fenton preg_match('/<content>(.+)<\/content>/', $match, $content); 68*6bfd3f23SEli Fenton preg_match('/<tip>(.+)<\/tip>/', $match, $tip); 69*6bfd3f23SEli Fenton preg_match('/<pageid>(.+)<\/pageid>/', $match, $pageid); 70*6bfd3f23SEli Fenton 71*6bfd3f23SEli Fenton if (count($content) >= 1) { 72*6bfd3f23SEli Fenton $data = ['content' => $content[1]]; 73*6bfd3f23SEli Fenton 74*6bfd3f23SEli Fenton $classes = count($classes) >= 1 ? preg_split('/\s+/', $classes[1]) : []; 75*6bfd3f23SEli Fenton $classes = implode(' ', array_map(function($c) {return 'plugin-autotooltip__' . $c;}, $classes)); 76*6bfd3f23SEli Fenton $data['classes'] = strlen($classes) ? $classes : 'plugin-autotooltip__default'; 77*6bfd3f23SEli Fenton 78*6bfd3f23SEli Fenton $data['pageid'] = count($pageid) >= 1 ? $pageid[1] : null; 79*6bfd3f23SEli Fenton $data['tip'] = count($tip) >= 1 ? $tip[1] : null; 80*6bfd3f23SEli Fenton 81*6bfd3f23SEli Fenton return $data; 82*6bfd3f23SEli Fenton } 83*6bfd3f23SEli Fenton 84*6bfd3f23SEli Fenton return 'ERROR'; 85*6bfd3f23SEli Fenton } 86*6bfd3f23SEli Fenton 87*6bfd3f23SEli Fenton 88*6bfd3f23SEli Fenton /** 89*6bfd3f23SEli Fenton * @param string $mode 90*6bfd3f23SEli Fenton * @param Doku_Renderer $renderer 91*6bfd3f23SEli Fenton * @param array|string $data - Data from handle() 92*6bfd3f23SEli Fenton * @return bool|void 93*6bfd3f23SEli Fenton */ 94*6bfd3f23SEli Fenton function render($mode, Doku_Renderer $renderer, $data) { 95*6bfd3f23SEli Fenton if ($data == 'ERROR') { 96*6bfd3f23SEli Fenton msg('Error: Invalid instantiation of autotooltip plugin'); 97*6bfd3f23SEli Fenton } 98*6bfd3f23SEli Fenton else if ($data['pageid']) { 99*6bfd3f23SEli Fenton $renderer->doc .= $this->m_helper->forWikilink($data['pageid'], $data['content'], $data['classes']); 100*6bfd3f23SEli Fenton } 101*6bfd3f23SEli Fenton else { 102*6bfd3f23SEli Fenton $renderer->doc .= $this->m_helper->forText($data['content'], $data['tip'], $data['classes']); 103*6bfd3f23SEli Fenton } 104*6bfd3f23SEli Fenton } 105*6bfd3f23SEli Fenton} 106