xref: /plugin/fontello/syntax.php (revision 1776c5c5befa8de3cc97e981444f6918b129ab85)
1*1776c5c5Sdh-tools<?php
2*1776c5c5Sdh-tools
3*1776c5c5Sdh-toolsuse dokuwiki\Extension\SyntaxPlugin;
4*1776c5c5Sdh-tools
5*1776c5c5Sdh-tools/**
6*1776c5c5Sdh-tools * Syntax component for inline icon rendering.
7*1776c5c5Sdh-tools */
8*1776c5c5Sdh-toolsclass syntax_plugin_fontello extends SyntaxPlugin
9*1776c5c5Sdh-tools{
10*1776c5c5Sdh-tools    /** @var helper_plugin_fontello */
11*1776c5c5Sdh-tools    protected $helper;
12*1776c5c5Sdh-tools
13*1776c5c5Sdh-tools    public function __construct()
14*1776c5c5Sdh-tools    {
15*1776c5c5Sdh-tools        $this->helper = $this->loadHelper('fontello');
16*1776c5c5Sdh-tools    }
17*1776c5c5Sdh-tools
18*1776c5c5Sdh-tools    /**
19*1776c5c5Sdh-tools     * @return string
20*1776c5c5Sdh-tools     */
21*1776c5c5Sdh-tools    public function getType()
22*1776c5c5Sdh-tools    {
23*1776c5c5Sdh-tools        return 'substition';
24*1776c5c5Sdh-tools    }
25*1776c5c5Sdh-tools
26*1776c5c5Sdh-tools    /**
27*1776c5c5Sdh-tools     * @return string
28*1776c5c5Sdh-tools     */
29*1776c5c5Sdh-tools    public function getPType()
30*1776c5c5Sdh-tools    {
31*1776c5c5Sdh-tools        return 'normal';
32*1776c5c5Sdh-tools    }
33*1776c5c5Sdh-tools
34*1776c5c5Sdh-tools    /**
35*1776c5c5Sdh-tools     * @return int
36*1776c5c5Sdh-tools     */
37*1776c5c5Sdh-tools    public function getSort()
38*1776c5c5Sdh-tools    {
39*1776c5c5Sdh-tools        return 190;
40*1776c5c5Sdh-tools    }
41*1776c5c5Sdh-tools
42*1776c5c5Sdh-tools    /**
43*1776c5c5Sdh-tools     * @param string $mode
44*1776c5c5Sdh-tools     * @return void
45*1776c5c5Sdh-tools     */
46*1776c5c5Sdh-tools    public function connectTo($mode)
47*1776c5c5Sdh-tools    {
48*1776c5c5Sdh-tools        $this->Lexer->addSpecialPattern('<icon:[A-Za-z0-9_-]+(?:\|(?:toc|notoc))?>', $mode, 'plugin_fontello');
49*1776c5c5Sdh-tools    }
50*1776c5c5Sdh-tools
51*1776c5c5Sdh-tools    /**
52*1776c5c5Sdh-tools     * @param string $match
53*1776c5c5Sdh-tools     * @param int $state
54*1776c5c5Sdh-tools     * @param int $pos
55*1776c5c5Sdh-tools     * @param Doku_Handler $handler
56*1776c5c5Sdh-tools     * @return array
57*1776c5c5Sdh-tools     */
58*1776c5c5Sdh-tools    public function handle($match, $state, $pos, Doku_Handler $handler)
59*1776c5c5Sdh-tools    {
60*1776c5c5Sdh-tools        $token = $this->helper->parseIconToken($match);
61*1776c5c5Sdh-tools        if ($token === null) {
62*1776c5c5Sdh-tools            return [
63*1776c5c5Sdh-tools                'raw' => $match,
64*1776c5c5Sdh-tools                'name' => '',
65*1776c5c5Sdh-tools                'class' => null,
66*1776c5c5Sdh-tools                'missing_package' => false,
67*1776c5c5Sdh-tools            ];
68*1776c5c5Sdh-tools        }
69*1776c5c5Sdh-tools
70*1776c5c5Sdh-tools        $name = $token['name'];
71*1776c5c5Sdh-tools        $hasPackage = $this->helper->hasActivePackage();
72*1776c5c5Sdh-tools        $class = $hasPackage ? $this->helper->getIconClass($name) : null;
73*1776c5c5Sdh-tools
74*1776c5c5Sdh-tools        return [
75*1776c5c5Sdh-tools            'raw' => $match,
76*1776c5c5Sdh-tools            'name' => $name,
77*1776c5c5Sdh-tools            'class' => $class,
78*1776c5c5Sdh-tools            'missing_package' => !$hasPackage,
79*1776c5c5Sdh-tools        ];
80*1776c5c5Sdh-tools    }
81*1776c5c5Sdh-tools
82*1776c5c5Sdh-tools    /**
83*1776c5c5Sdh-tools     * @param string $format
84*1776c5c5Sdh-tools     * @param Doku_Renderer $renderer
85*1776c5c5Sdh-tools     * @param array $data
86*1776c5c5Sdh-tools     * @return bool
87*1776c5c5Sdh-tools     */
88*1776c5c5Sdh-tools    public function render($format, Doku_Renderer $renderer, $data)
89*1776c5c5Sdh-tools    {
90*1776c5c5Sdh-tools        if ($format !== 'xhtml') return false;
91*1776c5c5Sdh-tools
92*1776c5c5Sdh-tools        /** @var Doku_Renderer_xhtml $renderer */
93*1776c5c5Sdh-tools        if (!empty($data['class'])) {
94*1776c5c5Sdh-tools            $renderer->doc .= '<span class="fontello-icon ' . hsc($data['class']) . '" aria-hidden="true"></span>';
95*1776c5c5Sdh-tools        } elseif (!empty($data['missing_package'])) {
96*1776c5c5Sdh-tools            $renderer->doc .= hsc(sprintf($this->getLang('icon_missing_package'), $data['name']));
97*1776c5c5Sdh-tools        } else {
98*1776c5c5Sdh-tools            $renderer->doc .= hsc($data['raw']);
99*1776c5c5Sdh-tools        }
100*1776c5c5Sdh-tools
101*1776c5c5Sdh-tools        return true;
102*1776c5c5Sdh-tools    }
103*1776c5c5Sdh-tools}
104