I’m experimenting with a render hook render-link.html that adds attributes to external links and resolves internal references to relative permalinks. If an internal reference points to a non-existing file then I raise a warning, and also if there is neither a path nor a fragment.
{{ $link := .Destination -}}
{{ $url := urls.Parse $link -}}
{{ $isRemote := ne $url.Scheme "" -}}
{{ if not $isRemote -}}
{{ if $url.Path -}}
{{ $fragment := "" -}}
{{ with $url.Fragment }}{{ $fragment = printf "#%s" . }}{{ end -}}
{{ $page := .Page.GetPage $url.Path -}}
{{ if $page -}}
{{ $link = printf "%s%s" $page.RelPermalink $fragment -}}
{{ else -}}
{{ warnf "Internal link in '%v' points to non-existing file: '%v'" .Page.File.Path $link -}}
{{ end -}}
{{ else if not $url.Fragment -}}
{{ warnf "Internal link without path and fragment encountered in '%v', URL: '%v'" .Page.File.Path $link -}}
{{ end -}}
{{ end -}}
<a href="{{ $link | safeURL }}"{{ with .Title }} title="{{ . }}"{{ end }}{{ if $isRemote }} target="_blank" rel="noopenr noreferrer"{{ end }}>{{ .Text | safeHTML }}</a>
{{- /* whitespace control */ -}}
This is basically doing what I want, I can write plain Markdown links like [Label](page.md) and it gets transformed properly. However, in certain cases I would like to use the shortcode relref still. If I use it like this in a content file:
[Label]({{< relref "page" >}})
… then I run into the known HAHAHUGOSHORTCODE problem:
Internal link in ‘docs\_index.md’ points to non-existing file: ‘HAHAHUGOSHORTCODE-s0-HBHB’
So I changed it to the recommended:
[Label]({{% relref "page" %}})
The problem now is that relref translates the argument to /docs/page/ and the render hook receives this relative permalink, but .GetPage cannot fetch the corresponding page, leading to this warning:
Internal link in ‘docs\_index.md’ points to non-existing file: ‘/docs/page/’
I could remove the check whether .GetPage was successful but would thereby lose the validation for plain Markdown links. Is there any way to extend the validation to relref links or at least to ignore these links? Something like a pathExists function? A workaround to tell plain and relref links apart?