首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Pandoc格式化div

使用Pandoc格式化div
EN

Stack Overflow用户
提问于 2018-08-04 13:13:44
回答 1查看 2.2K关注 0票数 3

我使用Pandoc将Pandoc文档转换为HTML5文档。在md输入中,我使用特殊的Pandoc语法编写自定义div,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
::: Resources
A nice document
Informative website
:::

得到的HTML如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="Resources">
    <p>A nice document Informative website</p>
</div>

我希望输出是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="Resources">
    <div>A nice document</div>      
    <div>Informative website</div>
</div>

即。我想把这两种资源放在两个不同的容器里。我没有找到任何解决方案来做到这一点( pandoc滤波器有可能做到,但我不太明白如何编写它们)。

非常感谢您的任何帮助。干杯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-05 13:36:40

如果主要目标是拥有单独的资源块,我建议在div中使用列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
::: Resources
- A nice document
- Informative website
:::

这会给

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="Resources">
<ul>
<li>A nice document</li>
<li>Informative website</li>
</ul>
</div>

这还不是你想要的,但我们到了一半。它已经将所有资源标记为单独的块。这简化了我们的任务,通过过滤进一步细化文档结构。下面使用pandoc的Lua过滤器功能;将代码放入文件并通过--lua-filter命令行参数传递给pandoc。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local list_to_resources = {
  BulletList = function (el)
    local resources = {}
    local resource_attr = pandoc.Attr('', {'Resource'}, {})
    for i, item in ipairs(el.content) do
      resources[i] = pandoc.Div(item, resource_attr)
    end
    return resources
  end
}

function Div (el)
  -- return div unaltered unless it is of class "Resources"
  if not el.classes:includes'Resources' then
    return nil
  end
  return pandoc.walk_block(el, list_to_resources)
end

使用此过滤器调用pandoc将产生所需的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="Resources">
<div class="Resource">
A nice document
</div>
<div class="Resource">
Informative website
</div>
</div>

为了完整起见,我还将在字面上处理这个问题时添加一个解决方案。不过,由于种种原因,我不建议使用:

  1. 它远没有那么“伤感”。在Markdown中,只使用换行符来分隔条目是不常见的,并且违背了它的哲学,即没有意外地使用可读的文本。
  2. 必要的代码更加复杂和脆弱。
  3. 您将无法向参考资料div添加额外的信息,因为它总是被筛选器破坏。在前面的解决方案中,只有项目列表才有特殊的含义。

话虽如此,下面的代码是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- table to collect elements in a line
local elements_in_line = {}

-- produce a span from the collected elements
local function line_as_span()
  local span = pandoc.Span(elements_in_line)
  elements_in_line = {}
  return span
end

local lines_to_blocks = {
  Inline = function (el)
    print(el.t)
    if el.t == 'SoftBreak' then
      return line_as_span()
    end
    table.insert(elements_in_line, el)
    return {}
  end,

  Para = function (el)
    local resources = {}
    local content = el.content
    -- last line is not followed by SoftBreak, add it here
    table.insert(content, line_as_span())
    local attr = pandoc.Attr('', {'Resource'})
    for i, line in ipairs(content) do
      resources[i] = pandoc.Div(pandoc.Plain(line.content), attr)
    end
    return resources
  end
}

function Div (el)
  -- return div unaltered unless it is of class "Resources"
  if not el.classes:includes'Resources' then
    return nil
  end
  return pandoc.walk_block(el, lines_to_blocks)
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51689602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文