Thanks to Taco, the solution was to simply use:

function doubleQuotableEscapedConTeXtString( str)
  local rep = {
      [1] =  { '{', '{\\textbraceleft}' },
      [2] =  { '}', '{\\textbraceright}' },
      [3] =  { '#', '{\\texthash}' },
      [4] =  { '$', '{\\textdollar}' },
      [5] =  { '&', '{\\textampersand}' },
      [6] =  { '%', '{\\textpercent}' },
      [7] =  { '\\','{\\textbackslash}' },
      [8] =  { '|', '{\\textbar}' },
      [9] =  { '_', '{\\textunderscore}' },
      [10] = { '~', '{\\textasciitilde}' },
      [11] = { '^', '{\\textasciicircum}' },
      [12] = { '"', "\"&ditto&\"" },
  }
  return lpeg.replacer(rep):match(str)
end

And the string becomes something that can safely be given toi METAPOST and 
safely handled by TeX when called from METAPOST via textext()

G


> On 2 Apr 2020, at 14:05, Gerben Wierda <gerben.wie...@rna.nl> wrote:
> 
> Here is a minimum example of a problem that I have in getting curly braces 
> printed in METAPOST in code that is generated by lua.
> 
> Any help is welcome.
> 
> \usemodule[scite]
> \setupxml
>  [entities=yes]
> 
> 
> \startluacode
> 
> function warn( ... )
>   texio.write_nl("-----> " .. string.format(...))
> end
> 
> local function mpLabelString( xmlLabelString)
>   -- Returns a string where each " is replaced by a METAPOST compatible 
> result, except for outer double quotes"
>   rep = {
>       [1] = { "\"", "\"&ditto&\""   },
>       -- DOESN'T WORK: [2] = { "\\", "\\\\" },
>   }
>   local tmpString = string.formatters( "%!tex!", xmlLabelString)
>   warn( "STRING.FORMAT XML \"%s\"", xmlLabelString)
>   warn( "STRING.FORMAT TeX-ed \"%s\"", tmpString)
>   warn( "STRING.FORMAT Replaced \"%s\"", lpeg.replacer(rep):match(tmpString))
>   return lpeg.replacer(rep):match(tmpString)
> end
> 
> function warnAndConTeXt( ...)
>   warn( ...)
>   context( ...)
> end
> 
> function moduledata.test( filename)
>   local labelString
>   context( "The string to typeset is:\\par\\type-{Label} \"a\" [Text]!-")
>   context( "\\par The attempts are:")
>   context( "\\par1. \\type-Label Text-")
>   context( "\\par2. \\type-Label [Text]!-")
>   context( "\\par3. \\type-Label \"a\" [Text]!-")
>   context( "\\par4. \\type-{Label} [Text]!-")
>   context( "\\par5. \\type-{Label} \"a\" [Text]!-")
>   context.startMPpage { instance = "doublefun" }
>   context( "picture pic;")
>   labelString = "1. Label Text OK"
>   warnAndConTeXt( "pic := Foo( 0, 0, 150, 50, \"%s\");", mpLabelString( 
> labelString))
>   labelString = "2. Label [Text]! OK"
>   warnAndConTeXt( "pic := Foo( 0, -75, 150, 50, \"%s\");", mpLabelString( 
> labelString))
>   labelString = "3. Label \"a\" [Text]! OK"
>   warnAndConTeXt( "pic := Foo( 0, -150, 150, 50, \"%s\");", mpLabelString( 
> labelString))
>   labelString = "4. {Label} [Text]! MISSING curly braces"
>   warnAndConTeXt( "pic := Foo( 0, -225, 150, 50, \"%s\");", mpLabelString( 
> labelString))
>   labelString = "5. {Label} \"a\" [Text]! MISSING curly braces"
>   warnAndConTeXt( "pic := Foo( 0, -300, 150, 50, \"%s\");", mpLabelString( 
> labelString))
>   context( "drawdot (0,0) withpen pencircle scaled 4 withcolor red;")
>   context.stopMPpage()
> end
> \stopluacode
> 
> \usemodule[article-basic]
> %\enabletrackers[metapost.tracingall,metapost.lua,metapost.runs,metapost.textexts,metapost.scrintersectionPoints,metapost.runs,metapost.graphics,metapost.terminal]
> 
> \starttext
> 
> \definefontfamily[mainface][rm][Optima]
> \setupbodyfont[mainface,10pt]
> 
> \startMPinclusions[+]{doublefun}
> 
> \stopMPinclusions
> 
> \startMPdefinitions{doublefun}
> vardef makeTeXLabel( expr w, h, name) =
>   show "NAME makeTeXLabel:", name;
>   save p; picture p ;
>   save s; string s;
>   s := "\framed{" & name & "}"; % Curly braces will be missing. I need this 
> to work.
>   % s := "\type-" & name & "-"; % Curly braces are displayed, but this must 
> become a vbox in the end, so can't use it
>   show "SCAN:", s;
>   p := textext( s);
>   p
> enddef;
> 
> vardef Foo( expr xpos, ypos, width, height, str) =
>   show "NAME Foo:", str; % Backslashes are already gone here
>   save pic; picture pic;
>   pic := makeTeXLabel( width, height, str) shifted (xpos, ypos);
>   draw pic;
>   pic
> enddef;
> 
> \stopMPdefinitions
> 
> \ctxlua{moduledata.test("My ArchiMate Model Export BES.xml")}
> \typefile[option=TEX]{test11.tex}
> 
> \stoptext
> 
> The question is: how can I get this to work? The strings that have to be 
> printed inside the METAPOST picture come from an XML and can contain about 
> anything. But in the end that string will have to be vertically typeset as a 
> paragraph, hence I cannot use \type (which works).
> 
> <test11.tex>
> 
> ___________________________________________________________________________________
> If your question is of interest to others as well, please add an entry to the 
> Wiki!
> 
> maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
> webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
> archive  : https://bitbucket.org/phg/context-mirror/commits/
> wiki     : http://contextgarden.net
> ___________________________________________________________________________________

___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

Reply via email to