1<?php
2/**
3 * DokuWiki plugin PageTitle Shorter; Syntax component
4 * Macro to set the short title of the page in metadata
5 *
6 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
7 * @author     Satoshi Sahara <sahara.satoshi@gmail.com>
8 */
9class syntax_plugin_pagetitle_shorter extends DokuWiki_Syntax_Plugin
10{
11    /** syntax type */
12    public function getType()
13    {
14        return 'substition';
15    }
16
17    /** paragraph type */
18    public function getPType()
19    {
20        return 'normal';
21    }
22
23    /**
24     * Connect pattern to lexer
25     */
26    protected $mode, $pattern;
27
28    /** sort number used to determine priority of this mode */
29    public function getSort()
30    {
31        return 990;
32    }
33
34    public function preConnect()
35    {
36        // syntax mode, drop 'syntax_' from class name
37        $this->mode = substr(__CLASS__, 7);
38
39        //syntax patterns
40        $this->pattern[5] = '~~ShortTitle:[^\n~]*~~';
41    }
42
43    public function connectTo($mode)
44    {
45        $this->Lexer->addSpecialPattern($this->pattern[5], $mode, $this->mode);
46    }
47
48    /**
49     * Handle the match
50     */
51    public function handle($match, $state, $pos, Doku_Handler $handler)
52    {
53        global $ID;
54        static $counter = [];
55
56        // ensure first matched pattern only effective
57        if (!isset($counter[$ID])) $counter[$ID] = 0;
58        if ($counter[$ID]++ > 0) return false;
59
60        // get short title
61        $short_title = trim(substr($match, 13, -2));
62        return $data = [$state, $short_title, $ID];
63    }
64
65    /**
66     * Create output
67     */
68    public function render($format, Doku_Renderer $renderer, $data)
69    {
70        global $ID;
71
72        list($state, $short_title, $id) = $data;
73
74        // skip calls that belong to different pages (eg. title of included page)
75        if ($id !== $ID) return false;
76
77        switch ($format) {
78            case 'metadata':
79                $renderer->meta['shorttitle'] = $short_title;
80                return true;
81            default:
82                return false;
83        }
84    }
85
86}
87