防止使用 Node 的 setTextContent 方法重新编码与号



背景

在XHTML文档中将直引号转换为卷曲引号和撇号。给定具有直引号("'(的文档,执行一些预处理以将直引号转换为其卷曲的语义等价物(“”‘’'(。通常,卷曲字符用于结束单引号(’(撇号('(,但这失去了语义的含义,我希望通过使用实体来保留它,以便后续翻译为TeX(例如quote{outer quote{we’re inside quotes} outer}(。因此:

Markdown -> XHTML (straight) -> XHTML (curled) -> TeX

该代码使用Java的内置文档对象模型(DOM(类。

问题

调用NodesetTextContent方法将对任何与号进行双重编码,结果为:

“I reckon, I'm 'bout dat.”
“Elizabeth Davenport;” she said ‘Elizabeth’ to be dignified, “and really my father owns the place.”

而不是:

“I reckon, I'm 'bout dat.”
“Elizabeth Davenport;” she said ‘Elizabeth’ to be dignified, “and really my father owns the place.”

通过设置处理指令禁用和启用似乎不起作用。

代码

以下是walka树的代码:

public static void walk(
final Document document, final String xpath,
final Consumer<Node> consumer ) {
assert document != null;
assert consumer != null;
try {
final var expr = lookupXPathExpression( xpath );
final var nodes = (NodeList) expr.evaluate( document, NODESET );
if( nodes != null ) {
for( int i = 0, len = nodes.getLength(); i < len; i++ ) {
consumer.accept( nodes.item( i ) );
}
}
} catch( final Exception ex ) {
clue( ex );
}
}

以下是用卷曲的等价物替换引号的代码:

walk(
xhtml,
"//*[normalize-space( text() ) != '']",
node -> node.setTextContent( sConverter.apply( node.getTextContent() ) )
);

其中xhtmlDocumentsConverter卷曲引号。

问题

您将如何指示DOM接受&apos;和friends而不重新编码与号?

相关

半相关问题:

  • 如何在Java XML中禁用/避免Ampersand Escapeng
  • 是否禁用XML中的自动&符号转义
  • XML DOM setTextContent
  • Java XML解析:避免实体引用解析
  • https://stackoverflow.com/a/36097922/59087

更改预处理,将直引号替换为Unicode字符,而不是无效的XML实体。这些实体是由HTML定义的,不是有效的XML。

  • &ldquo;应为u201C(如果编写为Java文字(
  • 如果以Java文字形式编写,则&rdquo;应为u201D
  • 如果以Java文字形式编写,则&lsquo;应为u2018
  • 如果以Java文字形式编写,则&rsquo;应为u2019
  • &apos;应为'

XML处理器可以自由地将字符和字符实体视为可互换的,因此尝试使用字符实体来指示语义注定会失败。

我会使用标记。我怀疑自定义处理指令是"悄悄"添加语义的好方法:

<text>"She told me, 'Don't forget the bread.'"</text>

会变成:

<text><?q?>“She told me, <?q?>‘Don’t forget the bread.<?q?>’<?q?>”</text>

其中,<?q?>处理指令是如下代码点作为引号具有语义含义的信号。

当然,如果你想的话,你可以有多个自定义处理指令:

<text><?quote-start?>“She told me, <?quote-start?>‘Don't forget the bread.<?quote-end?>’<?quote-end?>”</text>

值得一提的是,XHTML定义了自己的<quote>元素来处理这种情况。

(普通HTML有一个<q>元素,该元素在语义上相似,但它也告诉浏览器自动呈现引号,这意味着使用<q>的HTML文档不能包含自己的引号。(

相关内容

  • 没有找到相关文章

最新更新