英文:
Remove Markdown links but keep link text and square brackets for normal citation using Lua filter
问题
我想删除所有的Markdown链接,但保留链接文本和方括号,使用Lua过滤器。例如,原始内容如下:
[@a-local-file, page 15](x-devonthink-item://742BD8FE-B962-422F-98C1-B1K4DQA5A117?page=15)
我想将其转换为:
[@a-local-file, page 15]
我尝试编写Lua过滤器来进行此转换:
function Link(el)
if el.target:find("^x%-devonthink%-item://") then
return el.content
end
end
但是,使用这个Lua过滤器,它只返回链接文本:
@a-local-file, page 15
有一个[相关的问题],但答案对我的问题不够直接。因为我的目的是将[@a-local-file, page 15]
用作NormalCitation
。但如果添加一对方括号,它将被更改为AuthorInText
,这是不希望的。
如何修改代码以保留Pandoc的普通引用中的链接文本和方括号?提前感谢!
英文:
I’d like to remove all markdown links but keep the link text and square bracket using Lua filter. For example, the original content is like:
[@a-local-file, page 15](x-devonthink-item://742BD8FE-B962-422F-98C1-B1K4DQA5A117?page=15)
And I’d like to convert it to:
[@a-local-file, page 15]
I’ve tried to write a Lua filter for this conversion:
function Link(el)
if el.target:find("^x%-devonthink%-item://") then
return el.content
end
end
However, with this Lua filter, it returned only the link text:
@a-local-file, page 15
There is a related question but the answer is not very straightforward to my question. Because my purpose is to use
[@a-local-file, page 15]
as NormalCitation
. But if a pair of
square brackets is added, it will be changed as AuthorInText
,
which is undesirable.
How to modify the code to keep both link text and square brackets for Pandoc’s normal citations? Thanks in advance!
答案1
得分: 2
以下是您要翻译的内容:
A simple trick is to wrap strings into tables, as pandoc will then treat them as pandoc.Inlines
items and allow to concatenate them to the link.content
, which is also of type pandoc.Inlines
.
function Link (link)
if link.target:match '^x%-devonthink%-item://' then
return {'[' .. link.content .. ']'}
end
end
Pandoc will treat this as if we had written
return
pandoc.Inlines{pandoc.Str '[' ..
link.content ..
pandoc.Inlines{pandoc.Str ']'}}
Now, some formats use square brackets as part of their markup, and pandoc will escape them in that case. If the goal is to have unescaped brackets while round-tripping to Markdown, then we'll need to use RawInline
elements instead of Str
:
return raw'[' .. link.content .. raw']';
where raw
is defined as
local function raw (s)
return {pandoc.RawInline('markdown', s)}
end
The content of RawInline
elements is not escaped (if the raw format matches the target format).
Citations
The updated question mentions the desire to have this treated as a normal citation. This isn't quite as straight forward, because citation parsing isn't simple. What we can do, however, is create a Markdown string that looks the way we'd want it to, and then use pandoc.read
to parse it into an AST:
local linkstring = pandoc.utils.stringify(link.contents)
-- alternative:
-- local placeholder = pandoc.Pandoc{pandoc.Plain(link.contents)}
-- local linkstring = pandoc.write(placeholder, 'markdown')
local citationmd = string.format('[%s]', linkstring)
return pandoc.utils.blocks_to_inlines(
pandoc.read(citationmd, 'markdown').blocks
)
Make sure that the filter runs before citeproc
.
英文:
A simple trick is to wrap strings into tables, as pandoc will then treat them as pandoc.Inlines
items and allow to concatenate them to the link.content
, which is also of type pandoc.Inlines
.
function Link (link)
if link.target:match '^x%-devonthink%-item://' then
return {'['} .. link.content .. {']'}
end
end
Pandoc will treat this as if we had written
return
pandoc.Inlines{pandoc.Str '['} ..
link.content ..
pandoc.Inlines{pandoc.Str ']'}
Now, some formats use square brackets as part of their markup, and pandoc will escape them in that case. If the goal is to have unescaped brackets while round-tripping to Markdown, then we'll need to use RawInline
elements instead of Str
:
return raw'[' .. link.content .. raw']'
where raw
is defined as
local function raw (s)
return {pandoc.RawInline('markdown', s)}
end
The content of RawInline
elements is not escaped (if the raw format matches the target format).
Citations
The updated question mentions the desire to have this treated as a normal citation. This isn't quite as straight forward, because citation parsing isn't simple. What we can do, however, is create a Markdown string that looks the way we'd want it to, and then use pandoc.read
to parse it into an AST:
local linkstring = pandoc.utils.stringify(link.contents)
-- alternative:
-- local placeholder = pandoc.Pandoc{pandoc.Plain(link.contents)}
-- local linkstring = pandoc.write(placeholder, 'markdown')
local citationmd = string.format('[%s]', linkstring)
return pandoc.utils.blocks_to_inlines(
pandoc.read(citationmd, 'markdown').blocks
)
Make sure that the filter runs before citeproc
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论