2014-08-28 48 views
4

Pandoc在整个文档中的连续编号列表中有令人惊叹的扩展example_lists。我们尝试使用自定义编写器来生成html,但编号在结果html中被破坏。请看下面的MD-代码:Pandoc编号示例列表不适用于自定义编写器

1. item 1 
2. item 2 
    header 
3. item 3 

而是使用自定义的作家(我们采取了例如与pandoc --print-default-data-file sample.lua)它产生:

(@) item 1 
(@) item 2 

## header ## 

(@) item 3 

Pandoc默认情况下产生下面的HTML页面

1. item 1 
2. item 2 
    header 
1. item 3 

lua-writer示例包含以下用于有序列表处理的代码:

function OrderedList(items) 
    local buffer = {} 
    for _, item in pairs(items) do 
    table.insert(buffer, "<li>" .. item .. "</li>") 
    end 
    return "<ol>\n" .. table.concat(buffer, "\n") .. "\n</ol>" 
end 

如果对第一元素添加printitems

function OrderedList(items) 
    local buffer = {} 
    for elem, item in pairs(items) do 
    print(elem) 
    table.insert(buffer, "<li>" .. item .. "</li>") 
    end 
    return "<ol>\n" .. table.concat(buffer, "\n") .. "\n</ol>" 
end 

我们看到的只是最后的清单项目的数字:

1 
2 
1 

所以我不认为这个问题是在作家本身。你有什么想法如何解决这个问题?

回答

3

通过pandoc sources寻找自定义写入器(src/Text/Pandoc/Writers/Custom.hs),您可能会发现OrderedList函数实际上有四个参数,其中第三个是列表样式。您应该对Example列表样式感兴趣。因此,您可以相应地更新OrderedList实现:引入用于统计Example -list中的总项目的全局变量,基于列表样式更改功能代码(在Example -list中为ol html标记添加开始属性)。

-- for counting examples (@) 
local ExampleIdx = 1 

function OrderedList(items, num, sty, delim) 
    local buffer = {} 
    for _, item in pairs(items) do 
    table.insert(buffer, "<li>" .. item .. "</li>") 
    end 
    local start = "" 
    if sty == "Example" then 
    if ExampleIdx > 1 then 
     start = ' start="' .. ExampleIdx .. '" ' 
    end 
    ExampleIdx = ExampleIdx + table.getn(items) 
    end 
    return '<ol' .. start .. '>\n' .. table.concat(buffer, "\n") .. "\n</ol>" 
end 
+1

太棒了!谢谢! – juliet 2014-08-28 18:22:29

1

实际上你不需要保留一个ExampleIdx全局变量,就像Artem Pelenitsyn的回答一样。您所要做的就是让列表项编写器对第二个参数(Pelenitsyn代码中的起始编号:num)敏感。请注意,您可以使用pandoc -t native来检查正在传递给作者的AST;你会看到开始号码是由读者适当设置的。

function OrderedList(items, num) 
    local buffer = {} 
    for _, item in pairs(items) do 
    table.insert(buffer, "<li>" .. item .. "</li>") 
    end 
    local start = "" 
    if num > 1 then 
    start = ' start="' .. num .. '" ' 
    end 
    return '<ol' .. start .. '>\n' .. table.concat(buffer, "\n") .. "\n</ol>" 
end