Как получить полный путь к ресурсу страницы в Hugo?
У меня есть несколько сообщений в Hugo с ресурсами страницы, которые являются файлами SVG, которые я хочу встроить в итоговый HTML. Например, вот типичная структура папок:
content
+-- posts
+-- somepost
+-- index.md
+-- diagram.svg
В этот пост я хотел бы включить содержание diagram.svg
встроенный как часть результирующего HTML. Прочитав другой связанный с этим вопрос, я создал шорткод, который выглядит следующим образом:
{{- readFile (.Get 0) | safeHTML -}}
Однако это означает, что мне нужно указать полный путь к ресурсу SVG, что приводит к моей уценке:
{{< readsvg "content/posts/somepost/diagram.svg" >}}
В идеале я хотел бы, чтобы шорткод находил ресурс страницы, чтобы можно было упростить уценку до:
{{< readsvg "diagram.svg" >}}
Если я использую функции ресурса страницы, я могу получить сам ресурс, выполнив: {{ $svg := $.Page.Resources.GetMatch (.Get 0) }}
но результирующее имя файла относится к пакету ресурсов, а readFile
должен быть относительно вершины проекта. Как я могу получить полный путь к ресурсу, чтобы передать егоreadFile
?
Я пытался использовать absURL
для этого, но это не работает, поскольку у меня есть собственные URL-адреса для сообщений.
2 ответа
Благодаря руддре за то, что она указала мне правильное направление, полный ответ, который сработал, был:
{{ $svgFile := (path.Join (path.Dir .Page.File.Path) (.Get 0)) }}
{{- readFile $svgFile | safeHTML -}}
Если вам нужна большая гибкость в том, как вы указываете ресурс в разметке, вы можете добавить соответствие ресурса к этому решению:
{{ $svgRes := .Page.Resources.GetMatch (.Get 0) }}
{{ $svgFile := (path.Join (path.Dir .Page.File.Path) $svgRes) }}
{{- readFile $svgFile | safeHTML -}}
Я думаю файл svg должен быть внутри static
каталог. Но все же, если вы хотите поместить его в тот же каталог, что и файлы уценки, возможно, вы можете использовать .File.Dir
в пользовательском шорткоде. Нравится:
{{ $svgFile := print (.Page.File.Path) (.Get 0) }}
{{- readFile $svgFile | safeHTML -}}