1<?php 2/** 3 * DokuWiki Syntax Plugin Backlinks. 4 * 5 * Shows a list of pages that link back to a given page. 6 * 7 * Syntax: {{backlinks>[pagename][#filterNS|!#filterNS]}} 8 * 9 * [pagename] - a valid wiki pagename or a . for the current page 10 * [filterNS] - a valid,absolute namespace name, optionally prepended with ! to exclude 11 * 12 * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 13 * @author Michael Klier <chi@chimeric.de> 14 * @author Mark C. Prins <mprins@users.sf.net> 15 */ 16if (!defined('DOKU_INC')) die(); 17 18if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); 19if (!defined('DW_LF')) define('DW_LF', "\n"); 20 21require_once(DOKU_PLUGIN.'syntax.php'); 22require_once(DOKU_INC.'inc/parserutils.php'); 23 24/** 25 * All DokuWiki plugins to extend the parser/rendering mechanism 26 * need to inherit from this class 27 */ 28class syntax_plugin_backlinks extends DokuWiki_Syntax_Plugin { 29 /** 30 * Syntax Type. 31 * 32 * Needs to return one of the mode types defined in $PARSER_MODES in parser.php 33 * @see DokuWiki_Syntax_Plugin::getType() 34 */ 35 function getType() { return 'substition'; } 36 37 /** 38 * @see DokuWiki_Syntax_Plugin::getPType() 39 */ 40 function getPType() { return 'block'; } 41 42 /** 43 * @see Doku_Parser_Mode::getSort() 44 */ 45 function getSort() { return 304; } 46 47 /** 48 * Connect pattern to lexer. 49 * @see Doku_Parser_Mode::connectTo() 50 */ 51 function connectTo($mode) { 52 $this->Lexer->addSpecialPattern('\{\{backlinks>.+?\}\}', $mode, 'plugin_backlinks'); 53 } 54 55 /** 56 * Handler to prepare matched data for the rendering process. 57 * @see DokuWiki_Syntax_Plugin::handle() 58 */ 59 function handle($match, $state, $pos, Doku_Handler $handler){ 60 61 // Take the id of the source 62 // It can be a rendering of a sidebar 63 global $INFO; 64 global $ID; 65 $id = $ID; 66 // If it's a sidebar, get the original id. 67 if ($INFO != null) { 68 $id = $INFO['id']; 69 } 70 71 // strip {{backlinks> from start and }} from end 72 $match = substr($match,12,-2); 73 74 if(strstr($match, "#")){ 75 $includeNS = substr(strstr($match, "#", FALSE), 1); 76 $match= strstr($match, "#", TRUE); 77 } 78 79 $match = ($match == '.') ? $id : $match; 80 81 if(strstr($match,".:")) { 82 resolve_pageid(getNS($id),$match,$exists); 83 } 84 85 return (array($match, $includeNS)); 86 } 87 88 /** 89 * Handles the actual output creation. 90 * @see DokuWiki_Syntax_Plugin::render() 91 */ 92 function render($mode, Doku_Renderer $renderer, $data) { 93 global $lang; 94 95 if($mode == 'xhtml'){ 96 $renderer->info['cache'] = false; 97 98 @require_once(DOKU_INC.'inc/fulltext.php'); 99 $backlinks = ft_backlinks($data[0]); 100 101 dbglog($backlinks, "backlinks: all backlinks to: $data[0]"); 102 103 $renderer->doc .= '<div id="plugin__backlinks">' . DW_LF; 104 105 $filterNS = $data[1]; 106 if(!empty($backlinks) && !empty($filterNS)) { 107 if (stripos($filterNS, "!", 0) === 0) { 108 $filterNS = substr($filterNS, 1); 109 dbglog($filterNS, "backlinks: exluding all of namespace: $filterNS"); 110 $backlinks= array_filter($backlinks, function($ns) use($filterNS) { 111 return stripos($ns, $filterNS, 0) !== 0; 112 }); 113 } else { 114 dbglog($filterNS, "backlinks: including namespace: $filterNS only"); 115 $backlinks= array_filter($backlinks, function($ns) use($filterNS) { 116 return stripos($ns, $filterNS, 0) === 0; 117 }); 118 } 119 } 120 121 dbglog($backlinks, "backlinks: all backlinks to be rendered"); 122 123 if(!empty($backlinks)) { 124 125 $renderer->doc .= '<ul class="idx">'; 126 127 foreach($backlinks as $backlink){ 128 $name = p_get_metadata($backlink, 'title'); 129 if(empty($name)) $name = $backlink; 130 $renderer->doc .= '<li><div class="li">'; 131 $renderer->doc .= html_wikilink(':'.$backlink, $name); 132 $renderer->doc .= '</div></li>' . DW_LF; 133 } 134 135 $renderer->doc .= '</ul>' . DW_LF; 136 } else { 137 $renderer->doc .= "<strong>Plugin Backlinks: " . $lang['nothingfound'] . "</strong>" . DW_LF; 138 } 139 140 $renderer->doc .= '</div>' . DW_LF; 141 142 return true; 143 } 144 return false; 145 } 146} 147