xref: /plugin/button/action.php (revision 50e33a4ad4704571bf5063c987ad5d8017008e19)
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