背景
用户可以在文本区域中提供其地址信息,按 分隔行Enter。将生成一个 XML 文档,该文档将新行字符替换为\n
,例如在以下文档中:
<html>
<head>
<title>The Mill on the Floss</title>
<meta name="phone" content="" />
<meta name="address" content="221B Baker St.\nLondon, U.K." />
</head>
<body>
...
</body>
</html>
问题
我想根据元数据属性排版地址信息,并遵守换行符。(另外,可以\u000D
直接向属性 [即 ] 发出换行符,但 ConTeXt 在读取 XML 文档时似乎会忽略换行符,因此会提供一个转义值。)
代码
我尝试了多种主题变化来逐字逐句地写出地址:
\startluacode
function xml.functions.address( t )
lxml.attribute( t, "/html/head/meta[@name='address']", "content", "" )
end
\stopluacode
lxml.attribute
用如下尝试替换该行,并结合许多不同的“LPATH”路径:
context( xml.attribute( t, "./", "content", "" ) )
context( t.at[0] )
context( t.at.content )
context( xml.filter( t, "/attribute(label)" ) )
数据存在是因为以下内容可以证明这一点:
for k,v in pairs(t) do context(v) end
——写了很多元素。context( t )
-- 写入文档元数据,如下图所示(\
缺少):
设置如下:
\startxmlsetups xml:address
\gdef\TextAddress{\xmlfunction{#1}{address}}
\stopxmlsetups
用法:
\startsetups document:start
\startstandardmakeup
\startalignment[middle]
\TextAddress
\stopalignment
\stopstandardmakeup
\stopsetups
问题
如何检索 XHTML 的地址元数据内容属性并将其分配给可以写入文档的宏,并尊重所有换行符?
...
或者,您如何构造文档元数据以包含多行地址信息,以便 LMTX 可以处理换行符的排版?
答案1
接下来是一个相当糟糕的解决方案。
在生成地址属性值的代码中,将所有换行符替换为命令\break{}
(\hfil
可能不需要)。例如,在 Java 中:
string.replaceAll( "\n", "\\\\\\break{}" );
这将突破 XHTML 导出器代码中设置的任何实体障碍,但缺点是将文档与 TeX 耦合。(使用\\
或\newline
会将代码与特定的 TeX 实现耦合。)输出文档包含:
<meta name="address" content="221B Baker St.\break{}London, U.K." />
创建一个 Lua 函数,将属性值写入文档。通过at
使用 XHTML 元元素的属性键名(在本例中为content
)取消引用表的值来实现此目的:
\startluacode
function xml.functions.address( t )
context( t.at["content"] )
end
\stopluacode
从那里,像往常一样定义一个新的宏:
\startxmlsetups xml:address
\gdef\TextAddress{\xmlfunction{#1}{address}}
\stopxmlsetups
避免将 TeX 代码与 XHTML 文档耦合的解决方案是将各行导出为枚举地址行。例如:
<meta name="address1" content="221B Baker St." />
<meta name="address2" content="London, U.K." />
这样的解决方案还有其他缺点。