2

我在 Hugo 中有一些帖子,其中的页面资源是 SVG 文件,我希望在生成的 HTML 中内联包含这些文件。例如,这是一个典型的文件夹结构:

content
+-- posts
    +-- somepost
        +-- index.md
        +-- diagram.svg

在帖子中,我想将diagram.svginline 的内容作为生成的 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。

4

2 回答 2

2

感谢 ruddra 为我指明了正确的方向,完整的答案是:

{{ $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 -}}
于 2020-04-24T13:32:18.800 回答
1

我认为 svg 文件应该在static目录内。但是,如果您想将其与降价文件放在同一目录中,则可能您可以.File.Dir在自定义短代码中使用。像这样:

{{ $svgFile :=  print (.Page.File.Path) (.Get 0) }}
{{- readFile $svgFile | safeHTML -}}
于 2020-04-23T07:17:12.010 回答