1df3d88adSMichael Klier<?php 2*fe957bb7Sgithub-actions[bot] 3*fe957bb7Sgithub-actions[bot]use dokuwiki\Extension\SyntaxPlugin; 4*fe957bb7Sgithub-actions[bot] 5df3d88adSMichael Klier/** 652fa4f27SMark Prins * DokuWiki Syntax Plugin Backlinks. 7df3d88adSMichael Klier * 8e70bf163SMichael Klier * Shows a list of pages that link back to a given page. 9e70bf163SMichael Klier * 1052fa4f27SMark Prins * Syntax: {{backlinks>[pagename][#filterNS|!#filterNS]}} 11e70bf163SMichael Klier * 1252fa4f27SMark Prins * [pagename] - a valid wiki pagename or a . for the current page 1339718802SMark Prins * [filterNS] - a valid,absolute namespace name, optionally prepended with ! to exclude 14e70bf163SMichael Klier * 15df3d88adSMichael Klier * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 16df3d88adSMichael Klier * @author Michael Klier <chi@chimeric.de> 172287a730SMark Prins * @author Mark C. Prins <mprins@users.sf.net> 18df3d88adSMichael Klier */ 19df3d88adSMichael Klier/** 20df3d88adSMichael Klier * All DokuWiki plugins to extend the parser/rendering mechanism 21d2570a6cSMark Prins * need to inherit from this class. 22df3d88adSMichael Klier */ 23*fe957bb7Sgithub-actions[bot]class syntax_plugin_backlinks extends SyntaxPlugin 24*fe957bb7Sgithub-actions[bot]{ 25df3d88adSMichael Klier /** 262287a730SMark Prins * Syntax Type. 27df3d88adSMichael Klier * 28d2570a6cSMark Prins * Needs to return one of the mode types defined in $PARSER_MODES in parser.php. 29d2570a6cSMark Prins * 302287a730SMark Prins * @see DokuWiki_Syntax_Plugin::getType() 31df3d88adSMichael Klier */ 32*fe957bb7Sgithub-actions[bot] public function getType() 33*fe957bb7Sgithub-actions[bot] { 34d2570a6cSMark Prins return 'substition'; 35d2570a6cSMark Prins } 362287a730SMark Prins 372287a730SMark Prins /** 382287a730SMark Prins * @see DokuWiki_Syntax_Plugin::getPType() 392287a730SMark Prins */ 40*fe957bb7Sgithub-actions[bot] public function getPType() 41*fe957bb7Sgithub-actions[bot] { 42d2570a6cSMark Prins return 'block'; 43d2570a6cSMark Prins } 442287a730SMark Prins 452287a730SMark Prins /** 462287a730SMark Prins * @see Doku_Parser_Mode::getSort() 472287a730SMark Prins */ 48*fe957bb7Sgithub-actions[bot] public function getSort() 49*fe957bb7Sgithub-actions[bot] { 50d2570a6cSMark Prins return 304; 51d2570a6cSMark Prins } 52df3d88adSMichael Klier 53df3d88adSMichael Klier /** 542287a730SMark Prins * Connect pattern to lexer. 55d2570a6cSMark Prins * 562287a730SMark Prins * @see Doku_Parser_Mode::connectTo() 57df3d88adSMichael Klier */ 58*fe957bb7Sgithub-actions[bot] public function connectTo($mode) 59*fe957bb7Sgithub-actions[bot] { 60df3d88adSMichael Klier $this->Lexer->addSpecialPattern('\{\{backlinks>.+?\}\}', $mode, 'plugin_backlinks'); 61df3d88adSMichael Klier } 62df3d88adSMichael Klier 63df3d88adSMichael Klier /** 642287a730SMark Prins * Handler to prepare matched data for the rendering process. 65d2570a6cSMark Prins * 662287a730SMark Prins * @see DokuWiki_Syntax_Plugin::handle() 67df3d88adSMichael Klier */ 68*fe957bb7Sgithub-actions[bot] public function handle($match, $state, $pos, Doku_Handler $handler) 69*fe957bb7Sgithub-actions[bot] { 70b3014541SMark Prins // strip {{backlinks> from start and }} from end 71b3014541SMark Prins $match = substr($match, 12, -2); 7239718802SMark Prins 73d2570a6cSMark Prins $includeNS = ''; 7439718802SMark Prins if (strstr($match, "#")) { 751ed0f63eSMark Prins $includeNS = substr(strstr($match, "#", false), 1); 761ed0f63eSMark Prins $match = strstr($match, "#", true); 7739718802SMark Prins } 7839718802SMark Prins 79*fe957bb7Sgithub-actions[bot] return ([$match, $includeNS]); 80df3d88adSMichael Klier } 81df3d88adSMichael Klier 82df3d88adSMichael Klier /** 83df3d88adSMichael Klier * Handles the actual output creation. 84d2570a6cSMark Prins * 852287a730SMark Prins * @see DokuWiki_Syntax_Plugin::render() 86df3d88adSMichael Klier */ 87*fe957bb7Sgithub-actions[bot] public function render($format, Doku_Renderer $renderer, $data) 88*fe957bb7Sgithub-actions[bot] { 89154ef50cSMichael Klier global $lang; 907a3c4628SDirk Melchers global $INFO; 917a3c4628SDirk Melchers global $ID; 927a3c4628SDirk Melchers 937a3c4628SDirk Melchers $id = $ID; 947a3c4628SDirk Melchers // If it's a sidebar, get the original id. 957a3c4628SDirk Melchers if ($INFO != null) { 967a3c4628SDirk Melchers $id = $INFO['id']; 977a3c4628SDirk Melchers } 987a3c4628SDirk Melchers $match = $data[0]; 997a3c4628SDirk Melchers $match = ($match == '.') ? $id : $match; 1007a3c4628SDirk Melchers if (strstr($match, ".:")) { 1017a3c4628SDirk Melchers resolve_pageid(getNS($id), $match, $exists); 1027a3c4628SDirk Melchers } 103df3d88adSMichael Klier 104d5c4cf25SMark Prins if ($format == 'xhtml') { 105df3d88adSMichael Klier $renderer->info['cache'] = false; 106df3d88adSMichael Klier 1077a3c4628SDirk Melchers $backlinks = ft_backlinks($match); 108af390d34SMichael Klier 1097a3c4628SDirk Melchers dbglog($backlinks, "backlinks: all backlinks to: $match"); 11052fa4f27SMark Prins 111d2570a6cSMark Prins $renderer->doc .= '<div id="plugin__backlinks">' . "\n"; 112154ef50cSMichael Klier 11339718802SMark Prins $filterNS = $data[1]; 11439718802SMark Prins if (!empty($backlinks) && !empty($filterNS)) { 11539718802SMark Prins if (stripos($filterNS, "!", 0) === 0) { 11639718802SMark Prins $filterNS = substr($filterNS, 1); 11752fa4f27SMark Prins dbglog($filterNS, "backlinks: exluding all of namespace: $filterNS"); 1181ed0f63eSMark Prins $backlinks = array_filter( 119*fe957bb7Sgithub-actions[bot] $backlinks, 120*fe957bb7Sgithub-actions[bot] static fn($ns) => stripos($ns, $filterNS, 0) !== 0 1211ed0f63eSMark Prins ); 12239718802SMark Prins } else { 12352fa4f27SMark Prins dbglog($filterNS, "backlinks: including namespace: $filterNS only"); 1241ed0f63eSMark Prins $backlinks = array_filter( 125*fe957bb7Sgithub-actions[bot] $backlinks, 126*fe957bb7Sgithub-actions[bot] static fn($ns) => stripos($ns, (string) $filterNS, 0) === 0 1271ed0f63eSMark Prins ); 12839718802SMark Prins } 12939718802SMark Prins } 13039718802SMark Prins 13152fa4f27SMark Prins dbglog($backlinks, "backlinks: all backlinks to be rendered"); 13252fa4f27SMark Prins 133df3d88adSMichael Klier if (!empty($backlinks)) { 134df3d88adSMichael Klier $renderer->doc .= '<ul class="idx">'; 135df3d88adSMichael Klier 136df3d88adSMichael Klier foreach ($backlinks as $backlink) { 137cef58d31SMichael Klier $name = p_get_metadata($backlink, 'title'); 1387ce29d5aSScrutinizer Auto-Fixer if (empty($name)) { 1397ce29d5aSScrutinizer Auto-Fixer $name = $backlink; 1407ce29d5aSScrutinizer Auto-Fixer } 141df3d88adSMichael Klier $renderer->doc .= '<li><div class="li">'; 142b3014541SMark Prins $renderer->doc .= html_wikilink(':' . $backlink, $name); 143d2570a6cSMark Prins $renderer->doc .= '</div></li>' . "\n"; 144df3d88adSMichael Klier } 145df3d88adSMichael Klier 146d2570a6cSMark Prins $renderer->doc .= '</ul>' . "\n"; 147154ef50cSMichael Klier } else { 148d2570a6cSMark Prins $renderer->doc .= "<strong>Plugin Backlinks: " . $lang['nothingfound'] . "</strong>" . "\n"; 149df3d88adSMichael Klier } 150df3d88adSMichael Klier 151d2570a6cSMark Prins $renderer->doc .= '</div>' . "\n"; 152154ef50cSMichael Klier 153df3d88adSMichael Klier return true; 154df3d88adSMichael Klier } 155df3d88adSMichael Klier return false; 156df3d88adSMichael Klier } 157df3d88adSMichael Klier} 158