xref: /plugin/autotooltip/syntax.php (revision e3504fb92442e20ce3a6ad3570679b282fdce6ca)
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 Fenton
66bfd3f23SEli Fenton/**
76bfd3f23SEli Fenton * Auto-Tooltip DokuWiki plugin
86bfd3f23SEli Fenton *
96bfd3f23SEli Fenton * @license    MIT
106bfd3f23SEli Fenton * @author     Eli Fenton
116bfd3f23SEli Fenton */
126bfd3f23SEli Fentonclass syntax_plugin_autotooltip extends DokuWiki_Syntax_Plugin {
136bfd3f23SEli Fenton	/** @type helper_plugin_autotooltip m_helper */
146bfd3f23SEli Fenton	private $m_helper;
156bfd3f23SEli Fenton
166bfd3f23SEli Fenton	public function __construct() {
176bfd3f23SEli Fenton		$this->m_helper = plugin_load('helper', 'autotooltip');
186bfd3f23SEli Fenton	}
196bfd3f23SEli Fenton
206bfd3f23SEli Fenton
216bfd3f23SEli Fenton	/**
226bfd3f23SEli Fenton	 * @return string
236bfd3f23SEli Fenton	 */
246bfd3f23SEli Fenton	function getType() {
256bfd3f23SEli Fenton		return 'substition';
266bfd3f23SEli Fenton	}
276bfd3f23SEli Fenton
286bfd3f23SEli Fenton
296bfd3f23SEli Fenton	/**
306bfd3f23SEli Fenton	 * @return string
316bfd3f23SEli Fenton	 */
326bfd3f23SEli Fenton	function getPType() {
336bfd3f23SEli Fenton		return 'normal';
346bfd3f23SEli Fenton	}
356bfd3f23SEli Fenton
366bfd3f23SEli Fenton
376bfd3f23SEli Fenton	/**
386bfd3f23SEli Fenton	 * @return int
396bfd3f23SEli Fenton	 */
406bfd3f23SEli Fenton	function getSort() {
416bfd3f23SEli Fenton		return 165;
426bfd3f23SEli Fenton	}
436bfd3f23SEli Fenton
446bfd3f23SEli Fenton
456bfd3f23SEli Fenton	/**
466bfd3f23SEli Fenton	 * @param $mode
476bfd3f23SEli Fenton	 */
486bfd3f23SEli Fenton	function connectTo($mode) {
4907c401fcSEli Fenton		$this->Lexer->addSpecialPattern('<autott[^>]*>(?:[\s\S]*?</autott>)', $mode, 'plugin_autotooltip');
506bfd3f23SEli Fenton	}
516bfd3f23SEli Fenton
5207c401fcSEli Fenton
536bfd3f23SEli Fenton	/**
546bfd3f23SEli Fenton	 * @param string $match - The match from addEntryPattern.
556bfd3f23SEli Fenton	 * @param int $state - The DokuWiki event state.
566bfd3f23SEli Fenton	 * @param int $pos - The position in the full text.
576bfd3f23SEli Fenton	 * @param Doku_Handler $handler
586bfd3f23SEli Fenton	 * @return array|string
596bfd3f23SEli Fenton	 */
606bfd3f23SEli Fenton	function handle($match, $state, $pos, Doku_Handler $handler) {
6107c401fcSEli Fenton		$inner = [];
626bfd3f23SEli Fenton		$classes = [];
636bfd3f23SEli Fenton		$pageid = [];
6407c401fcSEli Fenton		preg_match('/<autott\s*([^>]+?)\s*>/', $match, $classes);
6507c401fcSEli Fenton		preg_match('/<autott[^>]*>\s*([\s\S]+)\s*<\/autott>/', $match, $inner);
6607c401fcSEli Fenton		if (count($inner) < 1) {
6707c401fcSEli Fenton			return 'ERROR';
6807c401fcSEli Fenton		}
6907c401fcSEli Fenton		$inner = $inner[1];
7007c401fcSEli Fenton
7114a8da65SEli Fenton		$data = [];
72b7bccb09SEli Fenton		$data['classes'] = count($classes) >= 1 ? $classes[1] : '';
736bfd3f23SEli Fenton
7414a8da65SEli Fenton		if (strchr($inner, '<') === FALSE) {
7514a8da65SEli Fenton			$parts = array_map(function($s) {return trim($s);}, explode('|', $inner));
763120b2e2SEli Fenton			// <autott class1 class2>wikilink|desc</autott>
7714a8da65SEli Fenton			if (cleanID($parts[0]) == $parts[0]) {
7814a8da65SEli Fenton				$data['pageid'] = $parts[0];
7914a8da65SEli Fenton				if (count($parts) > 1) {
8014a8da65SEli Fenton					$data['content'] = $parts[1];
8114a8da65SEli Fenton				}
8214a8da65SEli Fenton				return $data;
8314a8da65SEli Fenton			}
8414a8da65SEli Fenton		}
85e4338dabSEli Fenton		// <autott class1 class2><content></content><tip></tip><title></title><pageid></pageid></autott>
8614a8da65SEli Fenton		else {
87e4338dabSEli Fenton			$content = [];
88e4338dabSEli Fenton			$tip = [];
89e4338dabSEli Fenton			$title = [];
903120b2e2SEli Fenton			preg_match('/<content>([\s\S]+)<\/content>/', $inner, $content);
913120b2e2SEli Fenton			preg_match('/<tip>([\s\S]+)<\/tip>/', $inner, $tip);
92e4338dabSEli Fenton			preg_match('/<title>([\s\S]+)<\/title>/', $inner, $title);
9314a8da65SEli Fenton
9414a8da65SEli Fenton			if (count($content) >= 1 || count($pageid) >= 1) {
9514a8da65SEli Fenton				$data['content'] = count($content) >= 1 ? $content[1] : '';
966bfd3f23SEli Fenton				$data['tip'] = count($tip) >= 1 ? $tip[1] : null;
97e4338dabSEli Fenton				$data['title'] = count($title) >= 1 ? $title[1] : null;
986bfd3f23SEli Fenton
996bfd3f23SEli Fenton				return $data;
1006bfd3f23SEli Fenton			}
10107c401fcSEli Fenton		}
1026bfd3f23SEli Fenton
1036bfd3f23SEli Fenton		return 'ERROR';
1046bfd3f23SEli Fenton	}
1056bfd3f23SEli Fenton
1066bfd3f23SEli Fenton
1076bfd3f23SEli Fenton	/**
1086bfd3f23SEli Fenton	 * @param string $mode
1096bfd3f23SEli Fenton	 * @param Doku_Renderer $renderer
1106bfd3f23SEli Fenton	 * @param array|string $data - Data from handle()
1116bfd3f23SEli Fenton	 * @return bool|void
1126bfd3f23SEli Fenton	 */
1136bfd3f23SEli Fenton	function render($mode, Doku_Renderer $renderer, $data) {
1146a9a9b3aSEli Fenton		if ($mode == 'xhtml') {
1156bfd3f23SEli Fenton			if ($data == 'ERROR') {
1166bfd3f23SEli Fenton				msg('Error: Invalid instantiation of autotooltip plugin');
1176bfd3f23SEli Fenton			}
1187b1b7514SZioth			else if (isset($data['pageid'])) {
1197b1b7514SZioth				$renderer->doc .= $this->m_helper->forWikilink($data['pageid'], $data['content']??'', '', $data['classes']??'');
1206bfd3f23SEli Fenton			}
1216bfd3f23SEli Fenton			else {
1227b1b7514SZioth				$renderer->doc .= $this->m_helper->forText($data['content']??'', $data['tip']??'', $data['title']??'', '', $data['classes']??'');
1236bfd3f23SEli Fenton			}
1246bfd3f23SEli Fenton		}
1256a9a9b3aSEli Fenton		else {
1266a9a9b3aSEli Fenton			if ($data == 'ERROR') {
1276a9a9b3aSEli Fenton				$renderer->doc .= 'Error: Invalid instantiation of autotooltip plugin';
1286a9a9b3aSEli Fenton			}
1296a9a9b3aSEli Fenton			else {
130*e3504fb9SZioth				$renderer->doc .= $data['content'] ?? '';
1316a9a9b3aSEli Fenton			}
1326a9a9b3aSEli Fenton		}
1336a9a9b3aSEli Fenton	}
1346bfd3f23SEli Fenton}
135