<div dir="ltr"><div>Just following up on my own question in case anybody else is interested, I realised that the logic of my preprocessor code wasn't the problem, it was just my ignorance of lua and character escaping. Both ? and * are special characters in string.gsub expressions, so they need to be escaped with the lua escape character which is % (which sends my editor haywire because it thinks I am putting in a TeX comment, but never mind!).</div><div><br></div><div>So my now working code to translate historic processing instructions into directives without a separate pass is:</div><div><br></div><div>\startluacode<br>function lxml.preprocessor(data)<br> data = string.gsub(data, '<%?capdm %*force_line_stop%?>', '<?context-directive injector newline ?>')<br> return data<br>end<br>\stopluacode<br><br>\startsetups xml:directive:injector:newline<br> \crlf<br>\stopsetups<br></div><div><br></div><div>Duncan</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 2 May 2022 at 09:24, Duncan Hothersall <<a href="mailto:dh@capdm.com">dh@capdm.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div>Many thanks Denis. Very useful tip on the injectors and generalised command usage. That will definitely come in useful.<div dir="auto"><br></div><div dir="auto">My problem is that I already have a lot of XML data with the existing processing instructions in it. I know I could use an external preprocess in something like Python to change them into injectors before they are fed into ConTeXt, but I was hoping there was a way to handle them directly as part of the ConTeXt / lua process.</div><div dir="auto"><br></div><div dir="auto">Thanks again though.</div><div dir="auto"><br></div><div dir="auto">Duncan<br><div dir="auto"><br></div><div dir="auto"><br></div></div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 2 May 2022, 08:48 , <<a href="mailto:denis.maier@unibe.ch" rel="noreferrer noreferrer" target="_blank">denis.maier@unibe.ch</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="DE-CH" style="overflow-wrap: break-word;">
<div>
<p class="MsoNormal"><span>That was too quick, sorry.<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">Hi Duncan,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">I have used context’s own injectors for this :<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><?context-directive injector addlinetopage ?><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">\startsetups xml:directive:injector:addlinetopage<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">  \adaptlayout[lines=+1]<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">\stopsetups<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">Or, for your line break example :<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><?context-directive injector newline ?><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">\startsetups xml:directive:injector:newline<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">  \crlf<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">\stopsetups<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">Also, I have learned that you can just use arbitrary context code in xml:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">\def\xmltexdirective#1#2{\doif{#1}{command}{#2}}<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">\xmlinstalldirective{tex}{xmltexdirective}<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">         <?context-directive tex command \inframed{xxx} ?><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">         <?context-directive tex command \page ?><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH">         <?context-directive tex command \crlf ?><u></u><u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span>Best,<u></u><u></u></span></p>
<p class="MsoNormal"><span>Denis<u></u><u></u></span></p>
<p class="MsoNormal"><span><u></u> <u></u></span></p>
<div style="border-top:none;border-right:none;border-bottom:none;border-left:1.5pt solid blue;padding:0cm 0cm 0cm 4pt">
<div>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0cm 0cm">
<p class="MsoNormal"><b><span lang="DE">Von:</span></b><span lang="DE"> Maier, Denis Christian (UB)
<br>
<b>Gesendet:</b> Montag, 2. </span><span lang="FR-CH">Mai 2022 09:45<br>
<b>An:</b> 'mailing list for ConTeXt users' <<a href="mailto:ntg-context@ntg.nl" rel="noreferrer noreferrer noreferrer" target="_blank">ntg-context@ntg.nl</a>><br>
<b>Cc:</b> Duncan Hothersall <<a href="mailto:dh@capdm.com" rel="noreferrer noreferrer noreferrer" target="_blank">dh@capdm.com</a>><br>
<b>Betreff:</b> AW: [NTG-context] XML processing instructions<u></u><u></u></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<div style="border-top:none;border-right:none;border-bottom:none;border-left:1.5pt solid blue;padding:0cm 0cm 0cm 4pt">
<div>
<div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0cm 0cm">
<p class="MsoNormal"><b><span lang="DE">Von:</span></b><span lang="DE"> ntg-context <</span><a href="mailto:ntg-context-bounces@ntg.nl" rel="noreferrer noreferrer noreferrer" target="_blank"><span lang="DE">ntg-context-bounces@ntg.nl</span></a><span lang="DE">>
<b>Im Auftrag von </b>Duncan Hothersall via ntg-context<br>
<b>Gesendet:</b> Montag, 2. </span><span lang="FR-CH">Mai 2022 09:20<br>
<b>An:</b> mailing list for ConTeXt users <</span><a href="mailto:ntg-context@ntg.nl" rel="noreferrer noreferrer noreferrer" target="_blank"><span lang="FR-CH">ntg-context@ntg.nl</span></a><span lang="FR-CH">><br>
<b>Cc:</b> Duncan Hothersall <</span><a href="mailto:dh@capdm.com" rel="noreferrer noreferrer noreferrer" target="_blank"><span lang="FR-CH">dh@capdm.com</span></a><span lang="FR-CH">><br>
<b>Betreff:</b> [NTG-context] XML processing instructions<u></u><u></u></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
<div>
<div>
<p class="MsoNormal"><span lang="FR-CH">I have a big set of existing XML books (held in a derivative of DocBook) which I'm looking to start processing directly with ConTeXt. (Up to now I have a system which converts the XML into ConTeXt code which is then processed,
 but this is inefficient and lots of the code is now unsupported.)<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="FR-CH">I've had some success producing output, but my first real sticking point has come with processing instructions. The existing XML contains lots of processing instructions of the form <u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="FR-CH"><?capdm whatever?>, some of which can be conditional and introduce new data etc. But I'd be happy at this stage if I could just process the most basic one of them, which is used to introduce a line stop in a running paragraph
 of text.<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="FR-CH">My best guess at how to do this was to use the lxml.preprocessor function to convert the processing instruction into an element, and then process the element as normal.
</span>But (a) my attempt didn't work, and (b) there may well be a better way.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><span lang="FR-CH">Minimal working example below, except that obviously the processing instruction bit doesn't work!<u></u><u></u></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="FR-CH"><u></u> <u></u></span></p>
</div>
<div>
<p class="MsoNormal">Thanks for any help or insights.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Duncan<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">MWE:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">------<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">\startbuffer[demo]<br>
<book><br>
  <para>A paragraph with<?capdm force_line_stop?>a processing instruction.</para><br>
</book><br>
\stopbuffer<br>
<br>
\startxmlsetups xml:demo:base<br>
 \xmlsetsetup{#1}{*}{xml:demo:*}<br>
\stopxmlsetups<br>
\xmlregisterdocumentsetup{demo}{xml:demo:base}<br>
<br>
\startxmlsetups xml:demo:book<br>
 \xmlflush{#1}<br>
\stopxmlsetups<br>
<br>
\startxmlsetups xml:demo:para<br>
 \xmlflush{#1}\endgraf<br>
\stopxmlsetups<br>
<br>
\startluacode<br>
 function lxml.preprocessor(data,settings)<br>
  return string.find(data,"<?capdm *force_line_stop?>")<br>
   and string.gsub(data,"<?capdm *force_line_stop?>","<capdmlinestop></capdmlinestop/>")<br>
   or data<br>
 end<br>
\stopluacode<br>
<br>
\startxmlsetups xml:demo:capdmlinestop<br>
 \crlf<br>
 \xmlflush{#1}<br>
\stopxmlsetups<br>
<br>
\setupbodyfont[modern]<br>
\starttext<br>
\xmlprocessbuffer{demo}{demo}{}<br>
\stoptext<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">------<u></u><u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>

</blockquote></div>
</div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><span style="font-size:12.8px">Duncan Hothersall, Operations Director</span><br></div><div><span style="font-size:12.8px">CAPDM Limited - Online Program Enablers</span><br></div><div>0131 677 2400  <span style="font-size:12.8px"><a href="http://www.capdm.com" target="_blank">www.capdm.com</a></span></div><div><span style="font-size:12.8px">Registered in Scotland: SC168970       VAT: 682 846 983</span><br style="font-size:12.8px"><span style="font-size:12.8px">Registered address: </span><a href="https://maps.google.com/?q=22+Forth+Street,+Edinburgh,+EH1+3LH,+UK&entry=gmail&source=g" style="color:rgb(17,85,204);font-size:12.8px" target="_blank">20 Forth Street Edinburgh EH1 3LH UK</a><br></div><div><br></div><div>Capture, author, publish, deliver and manage your learning materials.</div><div><br></div><div><b><a href="http://eepurl.com/bqzBQn" target="_blank">Sign up to the CAPDM newsletter here<br></a></b></div></div></div></div></div></div></div></div></div></div></div></div>