xref: /plugin/backlinks/syntax.php (revision d5c4cf25c3257aba74758eebe7cb66b1367d0d65)
1df3d88adSMichael Klier<?php
2df3d88adSMichael Klier/**
352fa4f27SMark Prins * DokuWiki Syntax Plugin Backlinks.
4df3d88adSMichael Klier *
5e70bf163SMichael Klier * Shows a list of pages that link back to a given page.
6e70bf163SMichael Klier *
752fa4f27SMark Prins * Syntax:  {{backlinks>[pagename][#filterNS|!#filterNS]}}
8e70bf163SMichael Klier *
952fa4f27SMark Prins *   [pagename] - a valid wiki pagename or a . for the current page
1039718802SMark Prins *   [filterNS] - a valid,absolute namespace name, optionally prepended with ! to exclude
11e70bf163SMichael Klier *
12df3d88adSMichael Klier * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
13df3d88adSMichael Klier * @author  Michael Klier <chi@chimeric.de>
142287a730SMark Prins * @author  Mark C. Prins <mprins@users.sf.net>
15df3d88adSMichael Klier */
16df3d88adSMichael Klier
17df3d88adSMichael Klier/**
18df3d88adSMichael Klier * All DokuWiki plugins to extend the parser/rendering mechanism
19d2570a6cSMark Prins * need to inherit from this class.
20df3d88adSMichael Klier */
21df3d88adSMichael Klierclass syntax_plugin_backlinks extends DokuWiki_Syntax_Plugin {
22df3d88adSMichael Klier    /**
232287a730SMark Prins     * Syntax Type.
24df3d88adSMichael Klier     *
25d2570a6cSMark Prins     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php.
26d2570a6cSMark Prins     *
272287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getType()
28df3d88adSMichael Klier     */
29d2570a6cSMark Prins    public function getType() {
30d2570a6cSMark Prins        return 'substition';
31d2570a6cSMark Prins    }
322287a730SMark Prins
332287a730SMark Prins    /**
342287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getPType()
352287a730SMark Prins     */
36d2570a6cSMark Prins    public function getPType() {
37d2570a6cSMark Prins        return 'block';
38d2570a6cSMark Prins    }
392287a730SMark Prins
402287a730SMark Prins    /**
412287a730SMark Prins     * @see Doku_Parser_Mode::getSort()
422287a730SMark Prins     */
43d2570a6cSMark Prins    public function getSort() {
44d2570a6cSMark Prins        return 304;
45d2570a6cSMark Prins    }
46df3d88adSMichael Klier
47df3d88adSMichael Klier    /**
482287a730SMark Prins     * Connect pattern to lexer.
49d2570a6cSMark Prins     *
502287a730SMark Prins     * @see Doku_Parser_Mode::connectTo()
51df3d88adSMichael Klier     */
52d2570a6cSMark Prins    public function connectTo($mode) {
53df3d88adSMichael Klier        $this->Lexer->addSpecialPattern('\{\{backlinks>.+?\}\}', $mode, 'plugin_backlinks');
54df3d88adSMichael Klier    }
55df3d88adSMichael Klier
56df3d88adSMichael Klier    /**
572287a730SMark Prins     * Handler to prepare matched data for the rendering process.
58d2570a6cSMark Prins     *
592287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
60df3d88adSMichael Klier     */
61d2570a6cSMark Prins    public function handle($match, $state, $pos, Doku_Handler $handler) {
62b3014541SMark Prins        // strip {{backlinks> from start and }} from end
63b3014541SMark Prins        $match = substr($match, 12, -2);
6439718802SMark Prins
65d2570a6cSMark Prins        $includeNS = '';
6639718802SMark Prins        if(strstr($match, "#")) {
671ed0f63eSMark Prins            $includeNS = substr(strstr($match, "#", false), 1);
681ed0f63eSMark Prins            $match     = strstr($match, "#", true);
6939718802SMark Prins        }
7039718802SMark Prins
7139718802SMark Prins        return (array($match, $includeNS));
72df3d88adSMichael Klier    }
73df3d88adSMichael Klier
74df3d88adSMichael Klier    /**
75df3d88adSMichael Klier     * Handles the actual output creation.
76d2570a6cSMark Prins     *
772287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::render()
78df3d88adSMichael Klier     */
79*d5c4cf25SMark Prins    public function render($format, Doku_Renderer $renderer, $data) {
80154ef50cSMichael Klier        global $lang;
817a3c4628SDirk Melchers        global $INFO;
827a3c4628SDirk Melchers        global $ID;
837a3c4628SDirk Melchers
847a3c4628SDirk Melchers        $id = $ID;
857a3c4628SDirk Melchers        // If it's a sidebar, get the original id.
867a3c4628SDirk Melchers        if($INFO != null) {
877a3c4628SDirk Melchers            $id = $INFO['id'];
887a3c4628SDirk Melchers        }
897a3c4628SDirk Melchers        $match = $data[0];
907a3c4628SDirk Melchers        $match = ($match == '.') ? $id : $match;
917a3c4628SDirk Melchers        if(strstr($match, ".:")) {
927a3c4628SDirk Melchers            resolve_pageid(getNS($id), $match, $exists);
937a3c4628SDirk Melchers        }
94df3d88adSMichael Klier
95*d5c4cf25SMark Prins        if($format == 'xhtml') {
96df3d88adSMichael Klier            $renderer->info['cache'] = false;
97df3d88adSMichael Klier
987a3c4628SDirk Melchers            $backlinks = ft_backlinks($match);
99af390d34SMichael Klier
1007a3c4628SDirk Melchers            dbglog($backlinks, "backlinks: all backlinks to: $match");
10152fa4f27SMark Prins
102d2570a6cSMark Prins            $renderer->doc .= '<div id="plugin__backlinks">' . "\n";
103154ef50cSMichael Klier
10439718802SMark Prins            $filterNS = $data[1];
10539718802SMark Prins            if(!empty($backlinks) && !empty($filterNS)) {
10639718802SMark Prins                if(stripos($filterNS, "!", 0) === 0) {
10739718802SMark Prins                    $filterNS = substr($filterNS, 1);
10852fa4f27SMark Prins                    dbglog($filterNS, "backlinks: exluding all of namespace: $filterNS");
1091ed0f63eSMark Prins                    $backlinks = array_filter(
1101ed0f63eSMark Prins                        $backlinks, function ($ns) use ($filterNS) {
11139718802SMark Prins                        return stripos($ns, $filterNS, 0) !== 0;
1121ed0f63eSMark Prins                    }
1131ed0f63eSMark Prins                    );
11439718802SMark Prins                } else {
11552fa4f27SMark Prins                    dbglog($filterNS, "backlinks: including namespace: $filterNS only");
1161ed0f63eSMark Prins                    $backlinks = array_filter(
1171ed0f63eSMark Prins                        $backlinks, function ($ns) use ($filterNS) {
11839718802SMark Prins                        return stripos($ns, $filterNS, 0) === 0;
1191ed0f63eSMark Prins                    }
1201ed0f63eSMark Prins                    );
12139718802SMark Prins                }
12239718802SMark Prins            }
12339718802SMark Prins
12452fa4f27SMark Prins            dbglog($backlinks, "backlinks: all backlinks to be rendered");
12552fa4f27SMark Prins
126df3d88adSMichael Klier            if(!empty($backlinks)) {
127df3d88adSMichael Klier
128df3d88adSMichael Klier                $renderer->doc .= '<ul class="idx">';
129df3d88adSMichael Klier
130df3d88adSMichael Klier                foreach($backlinks as $backlink) {
131cef58d31SMichael Klier                    $name = p_get_metadata($backlink, 'title');
1327ce29d5aSScrutinizer Auto-Fixer                    if(empty($name)) {
1337ce29d5aSScrutinizer Auto-Fixer                        $name = $backlink;
1347ce29d5aSScrutinizer Auto-Fixer                    }
135df3d88adSMichael Klier                    $renderer->doc .= '<li><div class="li">';
136b3014541SMark Prins                    $renderer->doc .= html_wikilink(':' . $backlink, $name);
137d2570a6cSMark Prins                    $renderer->doc .= '</div></li>' . "\n";
138df3d88adSMichael Klier                }
139df3d88adSMichael Klier
140d2570a6cSMark Prins                $renderer->doc .= '</ul>' . "\n";
141154ef50cSMichael Klier            } else {
142d2570a6cSMark Prins                $renderer->doc .= "<strong>Plugin Backlinks: " . $lang['nothingfound'] . "</strong>" . "\n";
143df3d88adSMichael Klier            }
144df3d88adSMichael Klier
145d2570a6cSMark Prins            $renderer->doc .= '</div>' . "\n";
146154ef50cSMichael Klier
147df3d88adSMichael Klier            return true;
148df3d88adSMichael Klier        }
149df3d88adSMichael Klier        return false;
150df3d88adSMichael Klier    }
151df3d88adSMichael Klier}
152