AsciiDoctor:如何添加自定义 xmlns'
AsciiDoctor: How can I add custom xmlns'
当我使用 AsciiDoctor 转换 asciidoc 文件时,如何在输出中添加自定义 xmlns
?
我想在顶部 book
标签中添加 xmlns:xi="http://www.w3.org/2001/XInclude"
。
当前的实现似乎生成:
<?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 files and Passthrough Blocks
的一些 xml 文件
通过对 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
以便于分发是留给 reader.
的任务
当我使用 AsciiDoctor 转换 asciidoc 文件时,如何在输出中添加自定义 xmlns
?
我想在顶部 book
标签中添加 xmlns:xi="http://www.w3.org/2001/XInclude"
。
当前的实现似乎生成:
<?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 files and Passthrough Blocks
的一些 xml 文件通过对 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
.
带有 -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
以便于分发是留给 reader.