Как получить полный путь к ресурсу страницы в 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 -}}
Другие вопросы по тегам