AsciiDoctor:如何添加自定义xmlns'

时间:2018-01-19 09:51:12

标签: asciidoctor

当我使用AsciiDoctor转换asciidoc文件时,如何在输出中添加自定义xmlns

我想在xmlns:xi="http://www.w3.org/2001/XInclude"代码中添加book

目前的实施似乎产生了:

<?xml version="1.0" encoding="UTF-8"?>
<?asciidoc-toc?>
<?asciidoc-numbered?>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xl="http://www.w3.org/1999/xlink" version="5.0" xml:lang="en">
<info>
<title>title</title>
</info>
</book>

来自:

= title
:lang: en

当我跑步时:

$ asciidoctor -b docbook5 -d book -o out.xml source.txt

built-in attribute xmlns,但似乎是docbook 4.5。

我想使用XInclude的原因是包含来自Docinfo filesPassthrough Blocks的一些xml文件

1 个答案:

答案 0 :(得分:1)

通过对 asciidoctor 代码进行一些研究,很快就会发现您想要修改的部分是相当静态的。 有关详细信息,请参阅 asciidoctor/converter/docbook5.rb Line 44

最好的方法是创建一个修改输出的后处理器扩展。下面的例子只是为了展示一个可能的实现。

创建一个包含以下内容的文件并将其命名为 docbook_postprocessor.rb

class Docbook5XiPostprocessor < Asciidoctor::Extensions::Postprocessor
  def process document, output
    if document.basebackend? 'docbook'
      input_regex = %r{^(<.*xmlns:xl="http://www.w3.org/1999/xlink") (version="5.0".*>)}
      replacement = %(\\1 xmlns:xi="http://www.w3.org/2001/XInclude" \\2)
      output = output.sub(input_regex, replacement)
    end
    output
  end
end

Asciidoctor::Extensions.register do
  postprocessor Docbook5XiPostprocessor
end

注意:以上扩展名是为了简洁起见,与名为 source.adoc 的 asciidoctor 源文件放在同一目录中。

使用 -r ./docbook_postprocessor.rb 参数运行 asciidoctor 命令。

$ asciidoctor -r ./docbook_postprocessor.rb -b docbook5 -d book -o - source.adoc  
<?xml version="1.0" encoding="UTF-8"?>
<?asciidoc-toc?>
<?asciidoc-numbered?>
<book
  xmlns="http://docbook.org/ns/docbook"
  xmlns:xl="http://www.w3.org/1999/xlink"
  xmlns:xi="http://www.w3.org/2001/XInclude"
  version="5.0"
  xml:lang="en">
<info>
<title>test</title>
<date>2020-12-19</date>
</info>
</book>

* 以上输出已稍微重新格式化以消除滚动条

使用上述代码创建 ruby​​ gem 以便于分发是留给读者的任务。