xref: /plugin/backlinks/syntax.php (revision 2287a730389f2c5b69d09b9f9db99f6bb34800bc)
1df3d88adSMichael Klier<?php
2df3d88adSMichael Klier/**
31d513eb6SMichael Klier * DokuWiki Syntax Plugin Backlinks
4df3d88adSMichael Klier *
5e70bf163SMichael Klier * Shows a list of pages that link back to a given page.
6e70bf163SMichael Klier *
7e70bf163SMichael Klier * Syntax:  {{backlinks>[pagename]}}
8e70bf163SMichael Klier *
9e70bf163SMichael Klier *   [pagename] - a valid wiki pagename
10e70bf163SMichael Klier *
11df3d88adSMichael Klier * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
12df3d88adSMichael Klier * @author  Michael Klier <chi@chimeric.de>
13*2287a730SMark Prins * @author  Mark C. Prins <mprins@users.sf.net>
14df3d88adSMichael Klier */
154d4aa292SMichael Klierif(!defined('DOKU_INC')) die();
16df3d88adSMichael Klier
17df3d88adSMichael Klierif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
18df3d88adSMichael Klierif(!defined('DW_LF')) define('DW_LF',"\n");
19df3d88adSMichael Klier
20df3d88adSMichael Klierrequire_once(DOKU_PLUGIN.'syntax.php');
21cef58d31SMichael Klierrequire_once(DOKU_INC.'inc/parserutils.php');
22df3d88adSMichael Klier
23df3d88adSMichael Klier/**
24df3d88adSMichael Klier * All DokuWiki plugins to extend the parser/rendering mechanism
25df3d88adSMichael Klier * need to inherit from this class
26df3d88adSMichael Klier */
27df3d88adSMichael Klierclass syntax_plugin_backlinks extends DokuWiki_Syntax_Plugin {
28df3d88adSMichael Klier    /**
29*2287a730SMark Prins     * Syntax Type.
30df3d88adSMichael Klier     *
31df3d88adSMichael Klier     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
32*2287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getType()
33df3d88adSMichael Klier     */
34df3d88adSMichael Klier    function getType()  { return 'substition'; }
35*2287a730SMark Prins
36*2287a730SMark Prins    /**
37*2287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::getPType()
38*2287a730SMark Prins     */
39df3d88adSMichael Klier    function getPType() { return 'block'; }
40*2287a730SMark Prins
41*2287a730SMark Prins    /**
42*2287a730SMark Prins     * @see Doku_Parser_Mode::getSort()
43*2287a730SMark Prins     */
44df3d88adSMichael Klier    function getSort()  { return 304; }
45df3d88adSMichael Klier
46df3d88adSMichael Klier    /**
47*2287a730SMark Prins     * Connect pattern to lexer.
48*2287a730SMark Prins     * @see Doku_Parser_Mode::connectTo()
49df3d88adSMichael Klier     */
50df3d88adSMichael Klier    function connectTo($mode) {
51df3d88adSMichael Klier        $this->Lexer->addSpecialPattern('\{\{backlinks>.+?\}\}', $mode, 'plugin_backlinks');
52df3d88adSMichael Klier    }
53df3d88adSMichael Klier
54df3d88adSMichael Klier    /**
55*2287a730SMark Prins     * Handler to prepare matched data for the rendering process.
56*2287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::handle()
57df3d88adSMichael Klier     */
58df3d88adSMichael Klier    function handle($match, $state, $pos, &$handler){
59df3d88adSMichael Klier        global $ID;
60df3d88adSMichael Klier
61b3ce3c89SMichael Klier        $match = substr($match,12,-2); //strip {{backlinks> from start and }} from end
621a05a48bSMichael Klier        $match = ($match == '.') ? $ID : $match;
63df3d88adSMichael Klier
641a05a48bSMichael Klier        if(strstr($match,".:")) {
651a05a48bSMichael Klier            resolve_pageid(getNS($ID),$match,$exists);
661a05a48bSMichael Klier        }
67df3d88adSMichael Klier
68b3ce3c89SMichael Klier        return (array($match));
69df3d88adSMichael Klier    }
70df3d88adSMichael Klier
71df3d88adSMichael Klier    /**
72df3d88adSMichael Klier     * Handles the actual output creation.
73*2287a730SMark Prins     * @see DokuWiki_Syntax_Plugin::render()
74df3d88adSMichael Klier     */
75af390d34SMichael Klier    function render($mode, &$renderer, $data) {
76154ef50cSMichael Klier        global $lang;
77df3d88adSMichael Klier
78df3d88adSMichael Klier        if($mode == 'xhtml'){
79df3d88adSMichael Klier            $renderer->info['cache'] = false;
80df3d88adSMichael Klier
81af390d34SMichael Klier            @require_once(DOKU_INC.'inc/fulltext.php');
82af390d34SMichael Klier            $backlinks = ft_backlinks($data[0]);
83af390d34SMichael Klier
84154ef50cSMichael Klier            $renderer->doc .= '<div id="plugin__backlinks">' . DW_LF;
85154ef50cSMichael Klier
86df3d88adSMichael Klier            if(!empty($backlinks)) {
87df3d88adSMichael Klier
88df3d88adSMichael Klier                $renderer->doc .= '<ul class="idx">';
89df3d88adSMichael Klier
90df3d88adSMichael Klier                foreach($backlinks as $backlink){
91cef58d31SMichael Klier                    $name = p_get_metadata($backlink,'title');
92af390d34SMichael Klier                    if(empty($name)) $name = $backlink;
93df3d88adSMichael Klier                    $renderer->doc .= '<li><div class="li">';
9474ec2b5cSMichael Klier                    $renderer->doc .= html_wikilink(':'.$backlink,$name,'');
95df3d88adSMichael Klier                    $renderer->doc .= '</div></li>';
96df3d88adSMichael Klier                }
97df3d88adSMichael Klier
98df3d88adSMichael Klier                $renderer->doc .= '</ul>';
99154ef50cSMichael Klier            } else {
100154ef50cSMichael Klier                $renderer->doc .= "<strong>Plugin Backlinks: " . $lang['nothingfound'] . "</strong>";
101df3d88adSMichael Klier            }
102df3d88adSMichael Klier
103154ef50cSMichael Klier            $renderer->doc .= '</div>' . DW_LF;
104154ef50cSMichael Klier
105df3d88adSMichael Klier            return true;
106df3d88adSMichael Klier        }
107df3d88adSMichael Klier        return false;
108df3d88adSMichael Klier    }
109df3d88adSMichael Klier}
110