1<?php 2/** 3 * Action module for yatp plugin: Handles backlink indexing at page indexing time 4 */ 5 6use dokuwiki\Extension\ActionPlugin; 7use dokuwiki\Extension\EventHandler; 8use dokuwiki\Indexer\Indexer; 9 10require_once(DOKU_INC . 'inc/indexer.php'); 11 12class action_plugin_yatp_indexer extends ActionPlugin 13{ 14 public function register(EventHandler $controller) 15 { 16 $controller->register_hook('INDEXER_PAGE_ADD', 'BEFORE', $this, 'handle_indexer', ['priority' => 100]); 17 } 18 19 public function handle_indexer(Doku_Event $event, $param) 20 { 21 $pageId = $event->data['page']; 22 $helper = plugin_load('helper', 'yatp'); 23 $text = rawWiki($pageId); 24 25 if (!preg_match_all('/\{\{template>([^#|}]+)(?:\|([^#}]*))?(?:#([^\}]+))?\}\}/', $text, $matches, PREG_SET_ORDER)) { 26 return; 27 } 28 29 $metadata = p_get_metadata($pageId, 'relation'); 30 $existingRefs = isset($metadata['references']) ? $metadata['references'] : []; 31 32 foreach ($matches as $match) { 33 $templateName = $match[1]; 34 $templateId = $helper->getTemplateFile($templateName); 35 if (!$templateId) continue; 36 37 $rawFile = $helper->getTemplate($templateId); 38 if (!$rawFile) continue; 39 40 $replacers = $helper->messageReplacers(explode('|', $match[2])); 41 42 if(!empty($replacers['keys']) && !empty($replacers['vals'])) { 43 $rawFile = str_replace($replacers['keys'], $replacers['vals'], $rawFile); 44 } 45 46 $instr = p_get_instructions($rawFile); 47 48 foreach ($instr as $instruction) { 49 list($cmd, $params) = $instruction; 50 51 if ($cmd === 'internallink') { 52 $linkID = cleanID($params[0]); 53 if (!$linkID) continue; 54 55 $existingRefs[$linkID] = page_exists($linkID); 56 } 57 } 58 } 59 p_set_metadata($pageId, [ 60 'relation' => [ 61 'references' => $existingRefs 62 ] 63 ], true, true); 64 idx_get_indexer()->addMetaKeys($pageId, 'relation references', $existingRefs); 65 } 66} 67