xref: /plugin/autotooltip/syntax.php (revision 6bfd3f23b88eaf72b526530268de105d7e747a15)
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