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