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
|