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] = { '"', "\"&\"" },
}
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 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] = { "\"", "\"&\"" },
> -- 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).
>
>
>
> ___
> 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 :