about summary refs log tree commit diff
path: root/nixpkgs/doc/build-aux/pandoc-filters/myst-reader/roles.lua
blob: f4ef6d390b40b67015b4164812db33498ad1cc87 (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
35
36
--[[
Replaces Str AST nodes containing {role}, followed by a Code node
by a Code node with attrs that would be produced by rST reader
from the role syntax.

This is to emulate MyST syntax in Pandoc.
(MyST is a CommonMark flavour with rST features mixed in.)

Reference: https://myst-parser.readthedocs.io/en/latest/syntax/syntax.html#roles-an-in-line-extension-point
]]

function Inlines(inlines)
  for i = #inlines-1,1,-1 do
    local first = inlines[i]
    local second = inlines[i+1]
    local correct_tags = first.tag == 'Str' and second.tag == 'Code'
    if correct_tags then
      -- docutils supports alphanumeric strings separated by [-._:]
      -- We are slightly more liberal for simplicity.
      -- Allow preceding punctuation (eg '('), otherwise '({file}`...`)'
      -- does not match. Also allow anything followed by a non-breaking space
      -- since pandoc emits those after certain abbreviations (e.g. e.g.).
      local prefix, role = first.text:match('^(.*){([-._+:%w]+)}$')
      if role ~= nil and (prefix == '' or prefix:match("^.*[%p ]$") ~= nil) then
        if prefix == '' then
          inlines:remove(i)
        else
          first.text = prefix
        end
        second.attributes['role'] = role
        second.classes:insert('interpreted-text')
      end
    end
  end
  return inlines
end