我怎样才能仅使用 Lua 接口编写类似以下转换器的东西?
\startbuffer[test]
<html>
<body>
<p>Some stuff</p>
<p>More stuff, with <em>emphasis</em></p>
</body>
</html>
\stopbuffer
\startxmlsetups xml:test:*
\xmlsetsetup{\xmldocument}{*}{-}
\xmlsetsetup{\xmldocument}{html|body|p|em}{xml:test:*}
\stopxmlsetups
\xmlregisterdocumentsetup{testxml}{xml:test:setup}
\startxmlsetups xml:test:html
\xmlflush{#1}
\stopxmlsetups
\startxmlsetups xml:test:body
\xmlflush{#1}
\stopxmlsetups
\startxmlsetups xml:test:p
\xmlflush{#1}\endgraf
\stopxmlsetups
\startxmlsetups xml:test:em
{\em\xmlflush{#1}}
\stopxmlsetups
\starttext
\xmlprocessbuffer{testxml}{test}{}
\stoptext
我可以让其他东西与context.whatever
或一起工作lxml.whatever
;唯一阻碍我的是命令(start/stop)xmlsetups
,所以我无法替换,例如,
\startxmlsetups xml:test:html
\xmlflush{#1}
\stopxmlsetups
和
\startluacode
context.startxmlsetups('xml:test:html')
lxml.flush('#1')
context.stopxmlsetups()
\stopluacode
我尝试过、、、context.startxmlsetups(xml:test:html)
和;它们似乎都不起作用或给出有关的错误。宏定义似乎在中,但我无法理解。有没有办法从 Lua 调用这些命令,或者完全避免它们?context.delayed.startxmlsetups(xml:test:html)
context.nested.startxmlsetups(xml:test:html)
function() context.startxmlsetups(xml:test:html) end
function() context.startxmlsetups(xml:test:html) return true end
\csname
core-env.mkiv
start/stopxmlsetups
编辑(2018年7月9日):
我曾尝试在环境之外使用#1
和'#1'
作为 Lua 函数的参数xmlsetups
,但它们似乎没有任何用处。这有效:
\startxmlsetups xml:test:html
\ctxlua{lxml.flush('#1')}
\stopxmlsetups
但\ctxlua{lxml.flush('#1')}
单独使用时则不行,或者\ctxlua{lxml.flush(#1)}
,或者\ctxlua{lxml.flush('xml:test:html')}
。甚至\ctxlua{lxml.flush('testxml::2')}
无法执行任何操作。 (是在该特定环境内testxml::2
调用的结果。有趣的是,在环境之外,给出了;我不知道这是否有任何意义,但标准 Lua 解释器不会那样做。)print('#1')
xmlsetups
print('#1')
##1
我还尝试了以下操作:
\def\setupxmlwith[#xml][#luafunction]%
{\startxmlsetups{#xml}\xmlfunction{#1}{#luafunction}\endcsname\stopxmlsetups}
\startluacode
function xml.functions.test()
lxml.flush('#1')
end
\stopluacode
\setupxmlwith[xml:test:html][test]
其结果是:
Missing \endcsname inserted
<to be read again>
\stopxmlsetups
\syst_setups_start_xml_indeed ...me \??setup #1:#2
\expandafter \endcsname \e...
当我在宏定义\endcsname
之前添加时,我得到了。\stopxmlsetups
Parameters must be named consecutively