xref: /plugin/backlinks/syntax.php (revision 7a3c4628f6b25eb88346a444601248b983ff2ac7)
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 */
1663597158SScrutinizer Auto-Fixerif (!defined('DOKU_INC')) {
1763597158SScrutinizer Auto-Fixer    die();
1863597158SScrutinizer Auto-Fixer}
19df3d88adSMichael Klier
2063597158SScrutinizer Auto-Fixerif (!defined('DOKU_PLUGIN')) {
2163597158SScrutinizer Auto-Fixer    define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
2263597158SScrutinizer Auto-Fixer}
2363597158SScrutinizer Auto-Fixerif (!defined('DW_LF')) {
2463597158SScrutinizer Auto-Fixer    define('DW_LF', "\n");
2563597158SScrutinizer Auto-Fixer}
26df3d88adSMichael Klier
27df3d88adSMichael Klierrequire_once(DOKU_PLUGIN.'syntax.php');
28cef58d31SMichael Klierrequire_once(DOKU_INC.'inc/parserutils.php');
29df3d88adSMichael Klier
30df3d88adSMichael Klier/**
31df3d88adSMichael Klier * All DokuWiki plugins to extend the parser/rendering mechanism
32df3d88adSMichael Klier * need to inherit from this class
33df3d88adSMichael Klier */
34df3d88adSMichael Klierclass syntax_plugin_backlinks extends DokuWiki_Syntax_Plugin {
35df3d88adSMichael Klier    /**
362287a730SMark Prins     * Syntax Type.
37df3d88adSMichael Klier     *
38df3d88adSMichael Klier     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
392287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getType()
40df3d88adSMichael Klier     */
41df3d88adSMichael Klier    function getType() { return 'substition'; }
422287a730SMark Prins
432287a730SMark Prins    /**
442287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getPType()
452287a730SMark Prins     */
46df3d88adSMichael Klier    function getPType() { return 'block'; }
472287a730SMark Prins
482287a730SMark Prins    /**
492287a730SMark Prins     * @see Doku_Parser_Mode::getSort()
502287a730SMark Prins     */
51df3d88adSMichael Klier    function getSort() { return 304; }
52df3d88adSMichael Klier
53df3d88adSMichael Klier    /**
542287a730SMark Prins     * Connect pattern to lexer.
552287a730SMark Prins     * @see Doku_Parser_Mode::connectTo()
56df3d88adSMichael Klier     */
57df3d88adSMichael Klier    function connectTo($mode) {
58df3d88adSMichael Klier        $this->Lexer->addSpecialPattern('\{\{backlinks>.+?\}\}', $mode, 'plugin_backlinks');
59df3d88adSMichael Klier    }
60df3d88adSMichael Klier
61df3d88adSMichael Klier    /**
622287a730SMark Prins     * Handler to prepare matched data for the rendering process.
632287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
64df3d88adSMichael Klier     */
65c5d4ac8eSAndreas Gohr    function handle($match, $state, $pos, Doku_Handler $handler) {
66b3014541SMark Prins        // strip {{backlinks> from start and }} from end
67b3014541SMark Prins        $match = substr($match, 12, -2);
6839718802SMark Prins
6939718802SMark Prins        if (strstr($match, "#")) {
7039718802SMark Prins            $includeNS = substr(strstr($match, "#", FALSE), 1);
7139718802SMark Prins            $match = strstr($match, "#", TRUE);
7239718802SMark Prins        }
7339718802SMark Prins
7439718802SMark Prins        return (array($match, $includeNS));
75df3d88adSMichael Klier    }
76df3d88adSMichael Klier
77df3d88adSMichael Klier    /**
78df3d88adSMichael Klier     * Handles the actual output creation.
792287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::render()
80df3d88adSMichael Klier     */
81c5d4ac8eSAndreas Gohr    function render($mode, Doku_Renderer $renderer, $data) {
82154ef50cSMichael Klier        global $lang;
83*7a3c4628SDirk Melchers        global $INFO;
84*7a3c4628SDirk Melchers        global $ID;
85*7a3c4628SDirk Melchers
86*7a3c4628SDirk Melchers	$id = $ID;
87*7a3c4628SDirk Melchers        // If it's a sidebar, get the original id.
88*7a3c4628SDirk Melchers        if ($INFO != null) {
89*7a3c4628SDirk Melchers            $id = $INFO['id'];
90*7a3c4628SDirk Melchers        }
91*7a3c4628SDirk Melchers	$match = $data[0];
92*7a3c4628SDirk Melchers	$match = ($match == '.') ? $id : $match;
93*7a3c4628SDirk Melchers        if (strstr($match, ".:")) {
94*7a3c4628SDirk Melchers            resolve_pageid(getNS($id), $match, $exists);
95*7a3c4628SDirk Melchers	}
96df3d88adSMichael Klier
97df3d88adSMichael Klier        if ($mode == 'xhtml') {
98df3d88adSMichael Klier            $renderer->info['cache'] = false;
99df3d88adSMichael Klier
100af390d34SMichael Klier            @require_once(DOKU_INC.'inc/fulltext.php');
101*7a3c4628SDirk Melchers            $backlinks = ft_backlinks($match);
102af390d34SMichael Klier
103*7a3c4628SDirk Melchers            dbglog($backlinks, "backlinks: all backlinks to: $match");
10452fa4f27SMark Prins
105154ef50cSMichael Klier            $renderer->doc .= '<div id="plugin__backlinks">'.DW_LF;
106154ef50cSMichael Klier
10739718802SMark Prins            $filterNS = $data[1];
10839718802SMark Prins            if (!empty($backlinks) && !empty($filterNS)) {
10939718802SMark Prins                if (stripos($filterNS, "!", 0) === 0) {
11039718802SMark Prins                    $filterNS = substr($filterNS, 1);
11152fa4f27SMark Prins                    dbglog($filterNS, "backlinks: exluding all of namespace: $filterNS");
11239718802SMark Prins                    $backlinks = array_filter($backlinks, function($ns) use($filterNS) {
11339718802SMark Prins                        return stripos($ns, $filterNS, 0) !== 0;
11439718802SMark Prins                    });
11539718802SMark Prins                } else {
11652fa4f27SMark Prins                    dbglog($filterNS, "backlinks: including namespace: $filterNS only");
11739718802SMark Prins                    $backlinks = array_filter($backlinks, function($ns) use($filterNS) {
11839718802SMark Prins                        return stripos($ns, $filterNS, 0) === 0;
11939718802SMark Prins                    });
12039718802SMark Prins                }
12139718802SMark Prins            }
12239718802SMark Prins
12352fa4f27SMark Prins            dbglog($backlinks, "backlinks: all backlinks to be rendered");
12452fa4f27SMark Prins
125df3d88adSMichael Klier            if (!empty($backlinks)) {
126df3d88adSMichael Klier
127df3d88adSMichael Klier                $renderer->doc .= '<ul class="idx">';
128df3d88adSMichael Klier
129df3d88adSMichael Klier                foreach ($backlinks as $backlink) {
130cef58d31SMichael Klier                    $name = p_get_metadata($backlink, 'title');
1317ce29d5aSScrutinizer Auto-Fixer                    if (empty($name)) {
1327ce29d5aSScrutinizer Auto-Fixer                        $name = $backlink;
1337ce29d5aSScrutinizer Auto-Fixer                    }
134df3d88adSMichael Klier                    $renderer->doc .= '<li><div class="li">';
135b3014541SMark Prins                    $renderer->doc .= html_wikilink(':'.$backlink, $name);
136c3465203SMark Prins                    $renderer->doc .= '</div></li>'.DW_LF;
137df3d88adSMichael Klier                }
138df3d88adSMichael Klier
139c3465203SMark Prins                $renderer->doc .= '</ul>'.DW_LF;
140154ef50cSMichael Klier            } else {
141c3465203SMark Prins                $renderer->doc .= "<strong>Plugin Backlinks: ".$lang['nothingfound']."</strong>".DW_LF;
142df3d88adSMichael Klier            }
143df3d88adSMichael Klier
144154ef50cSMichael Klier            $renderer->doc .= '</div>'.DW_LF;
145154ef50cSMichael Klier
146df3d88adSMichael Klier            return true;
147df3d88adSMichael Klier        }
148df3d88adSMichael Klier        return false;
149df3d88adSMichael Klier    }
150df3d88adSMichael Klier}
151