2021-07-12 13:54:14 +00:00
|
|
|
|
--[[
|
|
|
|
|
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.
|
2023-01-03 01:14:10 +00:00
|
|
|
|
-- 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
|
2021-07-12 13:54:14 +00:00
|
|
|
|
second.attributes['role'] = role
|
|
|
|
|
second.classes:insert('interpreted-text')
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return inlines
|
|
|
|
|
end
|