Contents

Adding a Custom XML Output Format in Hugo

Problem

tl;dr : I want to integrate blog posts in Hugo into a DevOps-Manual that I use as a reference document for programming and system administration activities. The DevOps-Manual is assembled using DocBook.

Approach

Create a new output format for Hugo specifically to produce the DocBook XML that I want. Then I can include that output into other DocBook documents.

Solution - Failed : Generate Via Hugo

Add New Output Format To Config

Call the output format DevOps-Manual. Add the following snippets into the config.toml.

The DevOps-Manual output will be written to public/devops-manual/.

[outputs]
  page = [ "DevOps-Manual", ... ]
[outputFormats.DevOps-Manual]
  mediaType = "application/xml+docbook"
  isPlainText = true
  isHTML = false
  noUgly = false
  path = 'devops-manual'
[mediaTypes]
  [mediaTypes."application/xml+docbook"]
    suffixes = [ "xml" ]

As expected, complains about having no layout for “devops-manual” for kind “page”.

$ hugo
WARN 2022/05/19 11:21:33 found no layout file for "devops-manual" for kind "page": You should create a template file which matches Hugo Layouts Lookup Rules for this combination.

Add New Layout

This layout will produce a DocBook document.

It will expect the content of the page to be included via a file named content.xml.

As an example, the post content/posts/2022/04/11.105912.md produces a file public/devops-manual/2022/04/11/11.105912/index.xml and expects the content of the page to be found in file public/devops-manual/2022/04/11/11.105912/content.xml.

<section>
  <title>{{- .Title -}}</title>

  <info>
    {{- with .Params.tags -}}
      {{ range . }}
      <keyword>{{ . }}</keyword>
      {{- end -}}
    {{- end }}
  </info>

  {{- with .Params.tags -}}
    {{ range . }}
    <indexterm><primary>{{ . }}</primary></indexterm>
    {{- end -}}
  {{- end }}

  <!-- file : {{ .File }} -->

  <xi:include href="content.xml" />

</section>

Conclusion

Hugo can produce HTML content easily and can produce the metadata in any format easily. But I need to produce the content into a new format. That appears beyond the scope of Hugo.

I experimented with trying to make an exec call in the templates or using a short code or just calling pandoc externally to convert from markdown to docbook.

In the end, I think I would need to put a lot of transformation logic into this repo.

I would rather have the DevOps-Manual project be able to read Hugo files and keep the transformation logic in that repo.

See Also