xref: /plugin/backlinks/syntax.php (revision 52fa4f272a2e4333b8f0a813a57d59d386575820)
1df3d88adSMichael Klier<?php
2df3d88adSMichael Klier/**
3*52fa4f27SMark Prins * DokuWiki Syntax Plugin Backlinks.
4df3d88adSMichael Klier *
5e70bf163SMichael Klier * Shows a list of pages that link back to a given page.
6e70bf163SMichael Klier *
7*52fa4f27SMark Prins * Syntax:  {{backlinks>[pagename][#filterNS|!#filterNS]}}
8e70bf163SMichael Klier *
9*52fa4f27SMark 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 */
164d4aa292SMichael Klierif(!defined('DOKU_INC')) die();
17df3d88adSMichael Klier
18df3d88adSMichael Klierif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
19df3d88adSMichael Klierif(!defined('DW_LF')) define('DW_LF',"\n");
20df3d88adSMichael Klier
21df3d88adSMichael Klierrequire_once(DOKU_PLUGIN.'syntax.php');
22cef58d31SMichael Klierrequire_once(DOKU_INC.'inc/parserutils.php');
23df3d88adSMichael Klier
24df3d88adSMichael Klier/**
25df3d88adSMichael Klier * All DokuWiki plugins to extend the parser/rendering mechanism
26df3d88adSMichael Klier * need to inherit from this class
27df3d88adSMichael Klier */
28df3d88adSMichael Klierclass syntax_plugin_backlinks extends DokuWiki_Syntax_Plugin {
29df3d88adSMichael Klier    /**
302287a730SMark Prins     * Syntax Type.
31df3d88adSMichael Klier     *
32df3d88adSMichael Klier     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
332287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getType()
34df3d88adSMichael Klier     */
35df3d88adSMichael Klier    function getType()  { return 'substition'; }
362287a730SMark Prins
372287a730SMark Prins    /**
382287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getPType()
392287a730SMark Prins     */
40df3d88adSMichael Klier    function getPType() { return 'block'; }
412287a730SMark Prins
422287a730SMark Prins    /**
432287a730SMark Prins     * @see Doku_Parser_Mode::getSort()
442287a730SMark Prins     */
45df3d88adSMichael Klier    function getSort()  { return 304; }
46df3d88adSMichael Klier
47df3d88adSMichael Klier    /**
482287a730SMark Prins     * Connect pattern to lexer.
492287a730SMark Prins     * @see Doku_Parser_Mode::connectTo()
50df3d88adSMichael Klier     */
51df3d88adSMichael Klier    function connectTo($mode) {
52df3d88adSMichael Klier        $this->Lexer->addSpecialPattern('\{\{backlinks>.+?\}\}', $mode, 'plugin_backlinks');
53df3d88adSMichael Klier    }
54df3d88adSMichael Klier
55df3d88adSMichael Klier    /**
562287a730SMark Prins     * Handler to prepare matched data for the rendering process.
572287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
58df3d88adSMichael Klier     */
59c5d4ac8eSAndreas Gohr    function handle($match, $state, $pos, Doku_Handler $handler){
60e8c4dcc1Snico
61e8c4dcc1Snico        // Take the id of the source
62e8c4dcc1Snico        // It can be a rendering of a sidebar
63e8c4dcc1Snico        global $INFO;
64df3d88adSMichael Klier        global $ID;
65e8c4dcc1Snico        $id = $ID;
66e8c4dcc1Snico        // If it's a sidebar, get the original id.
67e8c4dcc1Snico        if ($INFO != null) {
68e8c4dcc1Snico            $id = $INFO['id'];
69e8c4dcc1Snico        }
70e8c4dcc1Snico
71b3ce3c89SMichael Klier        $match = substr($match,12,-2); //strip {{backlinks> from start and }} from end
7239718802SMark Prins
7339718802SMark Prins        if(strstr($match, "#")){
7439718802SMark Prins            $includeNS = substr(strstr($match, "#", FALSE), 1);
7539718802SMark Prins            $match= strstr($match, "#", TRUE);
7639718802SMark Prins        }
7739718802SMark Prins
78e8c4dcc1Snico        $match = ($match == '.') ? $id : $match;
79df3d88adSMichael Klier
801a05a48bSMichael Klier        if(strstr($match,".:")) {
81e8c4dcc1Snico            resolve_pageid(getNS($id),$match,$exists);
821a05a48bSMichael Klier        }
83df3d88adSMichael Klier
8439718802SMark Prins        return (array($match, $includeNS));
85df3d88adSMichael Klier    }
86df3d88adSMichael Klier
87df3d88adSMichael Klier    /**
88df3d88adSMichael Klier     * Handles the actual output creation.
892287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::render()
90df3d88adSMichael Klier     */
91c5d4ac8eSAndreas Gohr    function render($mode, Doku_Renderer $renderer, $data) {
92154ef50cSMichael Klier        global $lang;
93df3d88adSMichael Klier
94df3d88adSMichael Klier        if($mode == 'xhtml'){
95df3d88adSMichael Klier            $renderer->info['cache'] = false;
96df3d88adSMichael Klier
97af390d34SMichael Klier            @require_once(DOKU_INC.'inc/fulltext.php');
98af390d34SMichael Klier            $backlinks = ft_backlinks($data[0]);
99af390d34SMichael Klier
100*52fa4f27SMark Prins            dbglog($backlinks, "backlinks: all backlinks to: $data[0]");
101*52fa4f27SMark Prins
102154ef50cSMichael Klier            $renderer->doc .= '<div id="plugin__backlinks">' . DW_LF;
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);
108*52fa4f27SMark Prins                    dbglog($filterNS, "backlinks: exluding all of namespace: $filterNS");
10939718802SMark Prins                    $backlinks= array_filter($backlinks, function($ns) use($filterNS) {
11039718802SMark Prins                        return stripos($ns, $filterNS, 0) !== 0;
11139718802SMark Prins                    });
11239718802SMark Prins                } else {
113*52fa4f27SMark Prins                    dbglog($filterNS, "backlinks: including namespace: $filterNS only");
11439718802SMark Prins                    $backlinks= array_filter($backlinks, function($ns) use($filterNS) {
11539718802SMark Prins                        return stripos($ns, $filterNS, 0) === 0;
11639718802SMark Prins                    });
11739718802SMark Prins                }
11839718802SMark Prins            }
11939718802SMark Prins
120*52fa4f27SMark Prins            dbglog($backlinks, "backlinks: all backlinks to be rendered");
121*52fa4f27SMark Prins
122df3d88adSMichael Klier            if(!empty($backlinks)) {
123df3d88adSMichael Klier
124df3d88adSMichael Klier                $renderer->doc .= '<ul class="idx">';
125df3d88adSMichael Klier
126df3d88adSMichael Klier                foreach($backlinks as $backlink){
127cef58d31SMichael Klier                    $name = p_get_metadata($backlink, 'title');
128af390d34SMichael Klier                    if(empty($name)) $name = $backlink;
129df3d88adSMichael Klier                    $renderer->doc .= '<li><div class="li">';
130*52fa4f27SMark Prins                    //$renderer->doc .= html_wikilink(':'.$backlink, $name);
131*52fa4f27SMark Prins                    $renderer->doc .= '<a href="'.wl(':'.$backlink).'">'.$name.'</a>';
132df3d88adSMichael Klier                    $renderer->doc .= '</div></li>';
133df3d88adSMichael Klier                }
134df3d88adSMichael Klier
135df3d88adSMichael Klier                $renderer->doc .= '</ul>';
136154ef50cSMichael Klier            } else {
137154ef50cSMichael Klier                $renderer->doc .= "<strong>Plugin Backlinks: " . $lang['nothingfound'] . "</strong>";
138df3d88adSMichael Klier            }
139df3d88adSMichael Klier
140154ef50cSMichael Klier            $renderer->doc .= '</div>' . DW_LF;
141154ef50cSMichael Klier
142df3d88adSMichael Klier            return true;
143df3d88adSMichael Klier        }
144df3d88adSMichael Klier        return false;
145df3d88adSMichael Klier    }
146df3d88adSMichael Klier}
147