[NTG-context] removing word in filtered XML

Pablo Rodriguez oinos at gmx.es
Thu Aug 20 12:23:33 CEST 2020

On 8/20/20 11:08 AM, Taco Hoekwater wrote:
> [...]
> There is pretty much always ‘a way’, but I do not know of a ’nice’ way.
> Your problem is that lxml.flush() and friends do not return a value,
> they just do a direct context(‘xxxx’) call behind the scenes with no
> return string for you to modify.

Many thanks for your explanation, Taco.

> Also, the special (catcode, space handling) rules for setups and \cldcontext
> do not help you.
> That does not mean it can’t be done. As I don’t know a of a nice way,
> here is a low-level ‘ugly' way:
> \startluacode
> function filter(a)
>     local div = lxml.getid(a)
>     process(div)
>     lxml.flush(div)
> end
> function process(div)
>     for c=1,#div.dt do
>         if type(div.dt[c]) == 'string' then
>             div.dt[c] = string.gsub(div.dt[c], " of the ", "")
>         else
>             process(div.dt[c])
>         end
>     end
> end
> \stopluacode
>  \startxmlsetups xml:special
>    \ctxlua{filter([[#1]])}
>  \stopxmlsetups
> process() is recursive because your xml:special gets the whole <div>.
> Not sure if you intended it that way. And if it can be done nicer, I
> am sure someone will correct me :)

You’re right, my xml:special wasn’t intended to get the whole <div>. I
was tinkering with a previous sample. And I removed an \xmlfilter. Since
I got no output, I didn’t see what I was missing.

Many thanks for your help,


More information about the ntg-context mailing list