1ab97758cSPeter Stumm<?php 2ab97758cSPeter Stumm/** 3ab97758cSPeter Stumm * Action Component for the Button Plugin 4ab97758cSPeter Stumm * 5ab97758cSPeter Stumm * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6ab97758cSPeter Stumm * @author Xavier Decuyper <xavier.decuyper@gmail.com> 7929f708eSThisNameIsNotAllowed * 8929f708eSThisNameIsNotAllowed * 9929f708eSThisNameIsNotAllowed * @author ThisNameIsNotAllowed 10929f708eSThisNameIsNotAllowed * 17/11/2016 : Extended for usage with the move plugin (Added eventhandler and callback) 1105a56333SRémi Peyronnet * 1205a56333SRémi Peyronnet * @author Remi Peyronnet 1305a56333SRémi Peyronnet * 19/11/2016 : rewrote move plugin handler to work with all button syntaxes 14ab97758cSPeter Stumm */ 15ab97758cSPeter Stumm 16*50e33a4aSRémi Peyronnet/* 17*50e33a4aSRémi Peyronnet// Thanks to #28 : autoloaded & now deprecated (https://www.dokuwiki.org/devel:releases:refactor2020) 18*50e33a4aSRémi Peyronnet 19ab97758cSPeter Stumm// must be run within Dokuwiki 20ab97758cSPeter Stummif(!defined('DOKU_INC')) die(); 21ab97758cSPeter Stumm 22ab97758cSPeter Stummif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 23ab97758cSPeter Stummrequire_once(DOKU_PLUGIN.'action.php'); 24*50e33a4aSRémi Peyronnet*/ 25ab97758cSPeter Stumm 26ab97758cSPeter Stummclass action_plugin_button extends DokuWiki_Action_Plugin { 27ab97758cSPeter Stumm 28ab97758cSPeter Stumm function register(Doku_Event_Handler $controller){ 29ab97758cSPeter Stumm $controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'handle_toolbar', array ()); 30929f708eSThisNameIsNotAllowed $controller->register_hook('PLUGIN_MOVE_HANDLERS_REGISTER', 'BEFORE', $this, 'handleBeforePageMove', array()); 31ab97758cSPeter Stumm } 32ab97758cSPeter Stumm 33ab97758cSPeter Stumm function handle_toolbar(&$event, $param) { 34ab97758cSPeter Stumm $syntaxDiv = $this->getConf('syntaxDiv'); 35ab97758cSPeter Stumm $syntaxSpan = $this->getConf('syntaxSpan'); 36ab97758cSPeter Stumm 37ab97758cSPeter Stumm $event->data[] = array ( 38ab97758cSPeter Stumm 'type' => 'format', 39ab97758cSPeter Stumm 'title' => 'Insert button', 40ab97758cSPeter Stumm 'icon' => '../../plugins/button/images/add-button.png', 41ab97758cSPeter Stumm 'open' => '[[{}', 42ab97758cSPeter Stumm 'close' => ']]', 43ab97758cSPeter Stumm 'sample' => 'Wiki link|Button title' 44ab97758cSPeter Stumm ); 45ab97758cSPeter Stumm } 46929f708eSThisNameIsNotAllowed 47929f708eSThisNameIsNotAllowed public function handleBeforePageMove(Doku_Event $event, $param){ 48929f708eSThisNameIsNotAllowed $event->data['handlers']['button'] = array($this, 'rewrite_button'); 49929f708eSThisNameIsNotAllowed } 50929f708eSThisNameIsNotAllowed 5105a56333SRémi Peyronnet function move_newid($handler, $page, $type) 5205a56333SRémi Peyronnet { 5305a56333SRémi Peyronnet if (method_exists($handler, 'adaptRelativeId')) { // move plugin before version 2015-05-16 5405a56333SRémi Peyronnet $newpage = $handler->adaptRelativeId($page); 55929f708eSThisNameIsNotAllowed } else { 5605a56333SRémi Peyronnet $newpage = $handler->resolveMoves($page, $type); 5705a56333SRémi Peyronnet $newpage = $handler->relativeLink($page, $newpage, $type); 5805a56333SRémi Peyronnet } 5905a56333SRémi Peyronnet return $newpage; 60929f708eSThisNameIsNotAllowed } 61929f708eSThisNameIsNotAllowed 62340fc94cSlisps public function rewrite_button($match, $state, $pos, $plugin, helper_plugin_move_handler $handler) 637db634ddSRémi Peyronnet { 64929f708eSThisNameIsNotAllowed $returnValue = $match; 6505a56333SRémi Peyronnet 66340fc94cSlisps if($state !== DOKU_LEXER_ENTER) return $returnValue; 678228596eSRemi Peyronnet 688228596eSRemi Peyronnet // If same identifier do nothing (do not work, have not found how to detect if it is a real move or only a new display...) 698228596eSRemi Peyronnet //if (($handler->id == $handler->origID) && ($handler->ns == $handler->origNS)) return $returnValue; 708228596eSRemi Peyronnet 7105a56333SRémi Peyronnet if (preg_match('/\[\[{(?<image>[^}\|]*)\|?(?<css>[^}]*)}(?<link>[^\]\|]*)\|?(?<title>[^\]]*)/', $match, $data)) 7205a56333SRémi Peyronnet { 7305a56333SRémi Peyronnet // Skip syntaxes that should not be rewritten 74340fc94cSlisps if (($data['image'] != 'conf.styles') && ($data['image'] != 'conf.target') && $data['image']) { 7505a56333SRémi Peyronnet $data['image'] = $this->move_newid($handler, $data['image'], 'media'); 76340fc94cSlisps } 778228596eSRemi Peyronnet if($data['link']) { // Adapt link 788228596eSRemi Peyronnet $link_items=explode("#",$data['link']); 798228596eSRemi Peyronnet $link_items[0] = $this->move_newid($handler, $link_items[0], 'page'); 808228596eSRemi Peyronnet $data['link'] = implode("#",$link_items); 81340fc94cSlisps } 8205a56333SRémi Peyronnet // Rebuild button syntax 8305a56333SRémi Peyronnet $returnValue="[[{" . $data['image']; 8405a56333SRémi Peyronnet if ($data['css']) $returnValue .= "|" . $data['css']; 8505a56333SRémi Peyronnet $returnValue.="}"; 8605a56333SRémi Peyronnet $returnValue.=$data['link']; 8705a56333SRémi Peyronnet if (substr($match,-1) == "|") $returnValue.="|"; 8805a56333SRémi Peyronnet if ($data['title']) $returnValue .= "|" . $data['title']; 8905a56333SRémi Peyronnet } 9005a56333SRémi Peyronnet //dbglog("REWRITE : " . $match . " ----> " . $returnValue); 91929f708eSThisNameIsNotAllowed return $returnValue; 92929f708eSThisNameIsNotAllowed } 93ab97758cSPeter Stumm} 94ab97758cSPeter Stumm 95