背景
在XHTML文档中将直引号转换为卷曲引号和撇号。给定具有直引号("
和'
(的文档,执行一些预处理以将直引号转换为其卷曲的语义等价物(“
、”
、‘
、’
和'
(。通常,卷曲字符’
用于结束单引号(’
(和撇号('
(,但这失去了语义的含义,我希望通过使用实体来保留它,以便后续翻译为TeX(例如quote{outer quote{we’re inside quotes} outer}
(。因此:
Markdown -> XHTML (straight) -> XHTML (curled) -> TeX
该代码使用Java的内置文档对象模型(DOM(类。
问题
调用Node
的setTextContent
方法将对任何与号进行双重编码,结果为:
“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.”
通过设置处理指令禁用和启用似乎不起作用。
代码
以下是walk
a树的代码:
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() ) )
);
其中xhtml
是Document
,sConverter
卷曲引号。
问题
您将如何指示DOM接受'
和friends而不重新编码与号?
相关
半相关问题:
- 如何在Java XML中禁用/避免Ampersand Escapeng
- 是否禁用XML中的自动&符号转义
- XML DOM setTextContent
- Java XML解析:避免实体引用解析
- https://stackoverflow.com/a/36097922/59087
更改预处理,将直引号替换为Unicode字符,而不是无效的XML实体。这些实体是由HTML定义的,不是有效的XML。
“
应为“
或u201C
(如果编写为Java文字(- 如果以Java文字形式编写,则
”
应为”
或u201D
- 如果以Java文字形式编写,则
‘
应为‘
或u2018
- 如果以Java文字形式编写,则
’
应为’
或u2019
'
应为'
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文档不能包含自己的引号。(