summary refs log tree commit diff
path: root/doc/build-aux/pandoc-filters/docbook-writer/labelless-link-is-xref.lua
blob: fa97729a28bcff6a85463c9c9c727d844672f11d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
--[[
Converts Link AST nodes with empty label to DocBook xref elements.

This is a temporary script to be able use cross-references conveniently
using syntax taken from MyST, while we still use docbook-xsl
for generating the documentation.

Reference: https://myst-parser.readthedocs.io/en/latest/using/syntax.html#targets-and-cross-referencing
]]

local function starts_with(start, str)
  return str:sub(1, #start) == start
end

local function escape_xml_arg(arg)
  amps = arg:gsub('&', '&')
  amps_quotes = amps:gsub('"', '"')
  amps_quotes_lt = amps_quotes:gsub('<', '&lt;')

  return amps_quotes_lt
end

function Link(elem)
  has_no_content = #elem.content == 0
  targets_anchor = starts_with('#', elem.target)
  has_no_attributes = elem.title == '' and elem.identifier == '' and #elem.classes == 0 and #elem.attributes == 0

  if has_no_content and targets_anchor and has_no_attributes then
    -- xref expects idref without the pound-sign
    target_without_hash = elem.target:sub(2, #elem.target)

    return pandoc.RawInline('docbook', '<xref linkend="' .. escape_xml_arg(target_without_hash) .. '" />')
  end
end