xref: /plugin/backlinks/syntax.php (revision fe957bb77085fa5123aa131d5d16d51490b98806)
1df3d88adSMichael Klier<?php
2*fe957bb7Sgithub-actions[bot]
3*fe957bb7Sgithub-actions[bot]use dokuwiki\Extension\SyntaxPlugin;
4*fe957bb7Sgithub-actions[bot]
5df3d88adSMichael Klier/**
652fa4f27SMark Prins * DokuWiki Syntax Plugin Backlinks.
7df3d88adSMichael Klier *
8e70bf163SMichael Klier * Shows a list of pages that link back to a given page.
9e70bf163SMichael Klier *
1052fa4f27SMark Prins * Syntax:  {{backlinks>[pagename][#filterNS|!#filterNS]}}
11e70bf163SMichael Klier *
1252fa4f27SMark Prins *   [pagename] - a valid wiki pagename or a . for the current page
1339718802SMark Prins *   [filterNS] - a valid,absolute namespace name, optionally prepended with ! to exclude
14e70bf163SMichael Klier *
15df3d88adSMichael Klier * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
16df3d88adSMichael Klier * @author  Michael Klier <chi@chimeric.de>
172287a730SMark Prins * @author  Mark C. Prins <mprins@users.sf.net>
18df3d88adSMichael Klier */
19df3d88adSMichael Klier/**
20df3d88adSMichael Klier * All DokuWiki plugins to extend the parser/rendering mechanism
21d2570a6cSMark Prins * need to inherit from this class.
22df3d88adSMichael Klier */
23*fe957bb7Sgithub-actions[bot]class syntax_plugin_backlinks extends SyntaxPlugin
24*fe957bb7Sgithub-actions[bot]{
25df3d88adSMichael Klier    /**
262287a730SMark Prins     * Syntax Type.
27df3d88adSMichael Klier     *
28d2570a6cSMark Prins     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php.
29d2570a6cSMark Prins     *
302287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getType()
31df3d88adSMichael Klier     */
32*fe957bb7Sgithub-actions[bot]    public function getType()
33*fe957bb7Sgithub-actions[bot]    {
34d2570a6cSMark Prins        return 'substition';
35d2570a6cSMark Prins    }
362287a730SMark Prins
372287a730SMark Prins    /**
382287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getPType()
392287a730SMark Prins     */
40*fe957bb7Sgithub-actions[bot]    public function getPType()
41*fe957bb7Sgithub-actions[bot]    {
42d2570a6cSMark Prins        return 'block';
43d2570a6cSMark Prins    }
442287a730SMark Prins
452287a730SMark Prins    /**
462287a730SMark Prins     * @see Doku_Parser_Mode::getSort()
472287a730SMark Prins     */
48*fe957bb7Sgithub-actions[bot]    public function getSort()
49*fe957bb7Sgithub-actions[bot]    {
50d2570a6cSMark Prins        return 304;
51d2570a6cSMark Prins    }
52df3d88adSMichael Klier
53df3d88adSMichael Klier    /**
542287a730SMark Prins     * Connect pattern to lexer.
55d2570a6cSMark Prins     *
562287a730SMark Prins     * @see Doku_Parser_Mode::connectTo()
57df3d88adSMichael Klier     */
58*fe957bb7Sgithub-actions[bot]    public function connectTo($mode)
59*fe957bb7Sgithub-actions[bot]    {
60df3d88adSMichael Klier        $this->Lexer->addSpecialPattern('\{\{backlinks>.+?\}\}', $mode, 'plugin_backlinks');
61df3d88adSMichael Klier    }
62df3d88adSMichael Klier
63df3d88adSMichael Klier    /**
642287a730SMark Prins     * Handler to prepare matched data for the rendering process.
65d2570a6cSMark Prins     *
662287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
67df3d88adSMichael Klier     */
68*fe957bb7Sgithub-actions[bot]    public function handle($match, $state, $pos, Doku_Handler $handler)
69*fe957bb7Sgithub-actions[bot]    {
70b3014541SMark Prins        // strip {{backlinks> from start and }} from end
71b3014541SMark Prins        $match = substr($match, 12, -2);
7239718802SMark Prins
73d2570a6cSMark Prins        $includeNS = '';
7439718802SMark Prins        if (strstr($match, "#")) {
751ed0f63eSMark Prins            $includeNS = substr(strstr($match, "#", false), 1);
761ed0f63eSMark Prins            $match     = strstr($match, "#", true);
7739718802SMark Prins        }
7839718802SMark Prins
79*fe957bb7Sgithub-actions[bot]        return ([$match, $includeNS]);
80df3d88adSMichael Klier    }
81df3d88adSMichael Klier
82df3d88adSMichael Klier    /**
83df3d88adSMichael Klier     * Handles the actual output creation.
84d2570a6cSMark Prins     *
852287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::render()
86df3d88adSMichael Klier     */
87*fe957bb7Sgithub-actions[bot]    public function render($format, Doku_Renderer $renderer, $data)
88*fe957bb7Sgithub-actions[bot]    {
89154ef50cSMichael Klier        global $lang;
907a3c4628SDirk Melchers        global $INFO;
917a3c4628SDirk Melchers        global $ID;
927a3c4628SDirk Melchers
937a3c4628SDirk Melchers        $id = $ID;
947a3c4628SDirk Melchers        // If it's a sidebar, get the original id.
957a3c4628SDirk Melchers        if ($INFO != null) {
967a3c4628SDirk Melchers            $id = $INFO['id'];
977a3c4628SDirk Melchers        }
987a3c4628SDirk Melchers        $match = $data[0];
997a3c4628SDirk Melchers        $match = ($match == '.') ? $id : $match;
1007a3c4628SDirk Melchers        if (strstr($match, ".:")) {
1017a3c4628SDirk Melchers            resolve_pageid(getNS($id), $match, $exists);
1027a3c4628SDirk Melchers        }
103df3d88adSMichael Klier
104d5c4cf25SMark Prins        if ($format == 'xhtml') {
105df3d88adSMichael Klier            $renderer->info['cache'] = false;
106df3d88adSMichael Klier
1077a3c4628SDirk Melchers            $backlinks = ft_backlinks($match);
108af390d34SMichael Klier
1097a3c4628SDirk Melchers            dbglog($backlinks, "backlinks: all backlinks to: $match");
11052fa4f27SMark Prins
111d2570a6cSMark Prins            $renderer->doc .= '<div id="plugin__backlinks">' . "\n";
112154ef50cSMichael Klier
11339718802SMark Prins            $filterNS = $data[1];
11439718802SMark Prins            if (!empty($backlinks) && !empty($filterNS)) {
11539718802SMark Prins                if (stripos($filterNS, "!", 0) === 0) {
11639718802SMark Prins                    $filterNS = substr($filterNS, 1);
11752fa4f27SMark Prins                    dbglog($filterNS, "backlinks: exluding all of namespace: $filterNS");
1181ed0f63eSMark Prins                    $backlinks = array_filter(
119*fe957bb7Sgithub-actions[bot]                        $backlinks,
120*fe957bb7Sgithub-actions[bot]                        static fn($ns) => stripos($ns, $filterNS, 0) !== 0
1211ed0f63eSMark Prins                    );
12239718802SMark Prins                } else {
12352fa4f27SMark Prins                    dbglog($filterNS, "backlinks: including namespace: $filterNS only");
1241ed0f63eSMark Prins                    $backlinks = array_filter(
125*fe957bb7Sgithub-actions[bot]                        $backlinks,
126*fe957bb7Sgithub-actions[bot]                        static fn($ns) => stripos($ns, (string) $filterNS, 0) === 0
1271ed0f63eSMark Prins                    );
12839718802SMark Prins                }
12939718802SMark Prins            }
13039718802SMark Prins
13152fa4f27SMark Prins            dbglog($backlinks, "backlinks: all backlinks to be rendered");
13252fa4f27SMark Prins
133df3d88adSMichael Klier            if (!empty($backlinks)) {
134df3d88adSMichael Klier                $renderer->doc .= '<ul class="idx">';
135df3d88adSMichael Klier
136df3d88adSMichael Klier                foreach ($backlinks as $backlink) {
137cef58d31SMichael Klier                    $name = p_get_metadata($backlink, 'title');
1387ce29d5aSScrutinizer Auto-Fixer                    if (empty($name)) {
1397ce29d5aSScrutinizer Auto-Fixer                        $name = $backlink;
1407ce29d5aSScrutinizer Auto-Fixer                    }
141df3d88adSMichael Klier                    $renderer->doc .= '<li><div class="li">';
142b3014541SMark Prins                    $renderer->doc .= html_wikilink(':' . $backlink, $name);
143d2570a6cSMark Prins                    $renderer->doc .= '</div></li>' . "\n";
144df3d88adSMichael Klier                }
145df3d88adSMichael Klier
146d2570a6cSMark Prins                $renderer->doc .= '</ul>' . "\n";
147154ef50cSMichael Klier            } else {
148d2570a6cSMark Prins                $renderer->doc .= "<strong>Plugin Backlinks: " . $lang['nothingfound'] . "</strong>" . "\n";
149df3d88adSMichael Klier            }
150df3d88adSMichael Klier
151d2570a6cSMark Prins            $renderer->doc .= '</div>' . "\n";
152154ef50cSMichael Klier
153df3d88adSMichael Klier            return true;
154df3d88adSMichael Klier        }
155df3d88adSMichael Klier        return false;
156df3d88adSMichael Klier    }
157df3d88adSMichael Klier}
158