Pandoc:在 .md 文件中,如何修改 YAML 元数据块并使用 lua 过滤器将修改后的块放入降价格式
Pandoc: in a .md file, how to modifiy the YAML metadata block and put the modified block in markdown format using a lua filter
我想在将 block-empty .md 文件的 YAML header 中的某些元数据传递给模板文件之前进行转换。也就是说,工作流程是这样的:
source_YAML_md_file -> lua_filter -> transformed_YAML_md_file -> template -> xml_file
lua_filter的意思是对子题项(由3个子题组成:'answer'、'stem'和'key')进行洗牌,然后分配给它们列出订单号(子项目的内容'key')。
我不知道如何做 lua 过滤部分。
- YAML 示例文件:
source_YAML.md
---
category: matching
name: test question
questiontext_header: Test Header
questiontext_body: |
* Blah, blah, blah.
* More stuff.
shuffle: T
keys: T
subquestion:
- key: 1
stem: |
Old:
* MacDonald
+ Had
+ a Farm.
* E-I-E-I-O
answer: |
* And on his farm
* he had a cow
- key: 2
stem: |
With a moo moo here
answer: |
and a moo moo there
- key: 3
stem: |
Twinkle, twinkle,
answer: |
* Little
* Star
- key: 4
stem: |
How I wonder
answer: |
what you are!
---
shuffle_filter.lua
文件:
function shuffle(list)
math.randomseed(os.time())
for i = #list, 2, -1 do
local j = math.random(i)
list[i], list[j] = list[j], list[i]
end
end
local vars = {}
function get_vars (m)
for k, v in pairs(m) do
print(k, v, #v)
if v == m.subquestion and type(v) == 'table' and v.tag == 'MetaList' then
print('SUBQUESTION')
for a, b in pairs(v) do
print('ab___', a, b)
for c, d in pairs(b) do
print('cd______', c, d)
end
end
print('shuffling...')
shuffle(m.subquestion)
print('modified after shuffling:')
for a, b in pairs(m.subquestion) do
print('ab___', a, b.t, b, #b)
for c, d in pairs(b) do
print('__cd____', '', c, d.t, d, #d)
for e, f in pairs(d) do
if f.t == 'Str' then
print('changing "key" index:')
print(' ', 'former index:', '', pandoc.utils.stringify(f))
f = pandoc.MetaInlines(tostring(a))
print('____ef_____', '', '', e, f.t, f, d[e])
print(' ', 'current index:', '', pandoc.utils.stringify(f), '\n\n')
end
end
end
end
end
end
end
-- function replace (el)
-- if vars[el.text] then
-- return pandoc.Span(vars[el.text])
-- else
-- return el
-- end
-- end
--
-- return {{Meta = get_vars}, {Str = replace}}
-- return {Meta = get_vars}
这个可怕的代码是我一直在试验的代码,目的是检查是否可以改组和更改 'key' 内容。看起来他们是,但我的问题是如何将修改后的结果放入修改后的 .md 文件中。 ('code' 基于 https://pandoc.org/lua-filters.html#replacing-placeholders-with-their-metadata-value ;我使用注释替换函数在这里和那里使用 printS 执行“调试”……我认错了!)
我知道 -s 独立选项:
$ pandoc --lua-filter=shuffle_filter.lua -f markdown -t markdown -s source_YAML.md
但这会呈现原始的 YAML 内容,而不是修改后的内容。
在此先感谢您的帮助。
看来这就是我要找的东西:
已更新 shuffle_filter.lua
文件:
function shuffle (m)
-- 1) shuffle subquestions
math.randomseed(os.time())
for i = #m.subquestion, 2, -1 do
local j = math.random(i)
m.subquestion[i], m.subquestion[j] = m.subquestion[j], m.subquestion[i]
end
-- 2) update key index
for i = 1, #m.subquestion, 1 do
m.subquestion[i].key = pandoc.MetaInlines(tostring(i))
end
return m
end
return {{Meta = shuffle}}
将修改后的元数据输出到标准输出(或准备将其通过管道传输到模板中):
$ pandoc --lua-filter=shuffle_filter.lua -s -f markdown -t markdown source_YAML.md
检查修改后的 AST:
$ pandoc --lua-filter=shuffle_filter.lua -s -f markdown -t native source_YAML.md
我想在将 block-empty .md 文件的 YAML header 中的某些元数据传递给模板文件之前进行转换。也就是说,工作流程是这样的:
source_YAML_md_file -> lua_filter -> transformed_YAML_md_file -> template -> xml_file
lua_filter的意思是对子题项(由3个子题组成:'answer'、'stem'和'key')进行洗牌,然后分配给它们列出订单号(子项目的内容'key')。
我不知道如何做 lua 过滤部分。
- YAML 示例文件:
source_YAML.md
---
category: matching
name: test question
questiontext_header: Test Header
questiontext_body: |
* Blah, blah, blah.
* More stuff.
shuffle: T
keys: T
subquestion:
- key: 1
stem: |
Old:
* MacDonald
+ Had
+ a Farm.
* E-I-E-I-O
answer: |
* And on his farm
* he had a cow
- key: 2
stem: |
With a moo moo here
answer: |
and a moo moo there
- key: 3
stem: |
Twinkle, twinkle,
answer: |
* Little
* Star
- key: 4
stem: |
How I wonder
answer: |
what you are!
---
shuffle_filter.lua
文件:
function shuffle(list)
math.randomseed(os.time())
for i = #list, 2, -1 do
local j = math.random(i)
list[i], list[j] = list[j], list[i]
end
end
local vars = {}
function get_vars (m)
for k, v in pairs(m) do
print(k, v, #v)
if v == m.subquestion and type(v) == 'table' and v.tag == 'MetaList' then
print('SUBQUESTION')
for a, b in pairs(v) do
print('ab___', a, b)
for c, d in pairs(b) do
print('cd______', c, d)
end
end
print('shuffling...')
shuffle(m.subquestion)
print('modified after shuffling:')
for a, b in pairs(m.subquestion) do
print('ab___', a, b.t, b, #b)
for c, d in pairs(b) do
print('__cd____', '', c, d.t, d, #d)
for e, f in pairs(d) do
if f.t == 'Str' then
print('changing "key" index:')
print(' ', 'former index:', '', pandoc.utils.stringify(f))
f = pandoc.MetaInlines(tostring(a))
print('____ef_____', '', '', e, f.t, f, d[e])
print(' ', 'current index:', '', pandoc.utils.stringify(f), '\n\n')
end
end
end
end
end
end
end
-- function replace (el)
-- if vars[el.text] then
-- return pandoc.Span(vars[el.text])
-- else
-- return el
-- end
-- end
--
-- return {{Meta = get_vars}, {Str = replace}}
-- return {Meta = get_vars}
这个可怕的代码是我一直在试验的代码,目的是检查是否可以改组和更改 'key' 内容。看起来他们是,但我的问题是如何将修改后的结果放入修改后的 .md 文件中。 ('code' 基于 https://pandoc.org/lua-filters.html#replacing-placeholders-with-their-metadata-value ;我使用注释替换函数在这里和那里使用 printS 执行“调试”……我认错了!)
我知道 -s 独立选项:
$ pandoc --lua-filter=shuffle_filter.lua -f markdown -t markdown -s source_YAML.md
但这会呈现原始的 YAML 内容,而不是修改后的内容。
在此先感谢您的帮助。
看来这就是我要找的东西:
已更新 shuffle_filter.lua
文件:
function shuffle (m)
-- 1) shuffle subquestions
math.randomseed(os.time())
for i = #m.subquestion, 2, -1 do
local j = math.random(i)
m.subquestion[i], m.subquestion[j] = m.subquestion[j], m.subquestion[i]
end
-- 2) update key index
for i = 1, #m.subquestion, 1 do
m.subquestion[i].key = pandoc.MetaInlines(tostring(i))
end
return m
end
return {{Meta = shuffle}}
将修改后的元数据输出到标准输出(或准备将其通过管道传输到模板中):
$ pandoc --lua-filter=shuffle_filter.lua -s -f markdown -t markdown source_YAML.md
检查修改后的 AST:
$ pandoc --lua-filter=shuffle_filter.lua -s -f markdown -t native source_YAML.md