1<?php
2
3namespace dokuwiki\plugin\prosemirror\parser;
4
5use dokuwiki\File\PageResolver;
6
7class InternalLinkNode extends LinkNode
8{
9    public function toSyntax()
10    {
11        return $this->getDefaultLinkSyntax($this->attrs['data-inner']);
12    }
13
14    public static function render(\renderer_plugin_prosemirror $renderer, $originalId, $name)
15    {
16        global $ID;
17        $additionalAttributes = [];
18
19        $resolvedAttributes = self::resolveLink($originalId, $ID);
20        $additionalAttributes['data-resolvedTitle'] = $resolvedAttributes['id'];
21        $additionalAttributes['data-resolvedID'] = $resolvedAttributes['id'];
22        if (!is_array($name)) {
23            $additionalAttributes['data-resolvedName'] = $name ?: $resolvedAttributes['heading'];
24            if ($resolvedAttributes['exists']) {
25                $class = 'wikilink1';
26            } else {
27                $class = 'wikilink2';
28            }
29            $additionalAttributes['data-resolvedClass'] = $class;
30        }
31
32        self::renderToJSON(
33            $renderer,
34            'internallink',
35            $originalId,
36            $name,
37            $additionalAttributes
38        );
39    }
40
41    public static function resolveLink($inner, $curId) {
42        $params = '';
43        $parts = explode('?', $inner, 2);
44        $resolvedPageId = $parts[0];
45        if (count($parts) === 2) {
46            $params = $parts[1];
47        }
48        $xhtml_renderer = p_get_renderer('xhtml');
49        $default = $xhtml_renderer->_simpleTitle($parts[0]);
50        $resolver = new PageResolver($curId);
51        $resolvedPageId = $resolver->resolveId($resolvedPageId);
52
53        if (useHeading('content')) {
54            $heading = p_get_first_heading($resolvedPageId);
55        }
56        if (empty($heading)) {
57            $heading = $default;
58        }
59
60        $url = wl($resolvedPageId, $params);
61
62        return [
63            'id' => $resolvedPageId,
64            'exists' => page_exists($resolvedPageId),
65            'heading' => $heading,
66            'url' => $url,
67        ];
68    }
69
70    protected static function getLinkTitle($title, $default, $id)
71    {
72        if (null === $title || trim($title) == '') {
73            if (useHeading('content') && $id) {
74                $heading = p_get_first_heading($id);
75                if (!blank($heading)) {
76                    return hsc($heading);
77                }
78            }
79            return hsc($default);
80        }
81        return hsc($title);
82    }
83}
84