1128c8fb69
Continuation of https://github.com/NixOS/nixos-search/pull/669
37 lines
1.3 KiB
Lua
37 lines
1.3 KiB
Lua
--[[
|
||
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
|