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