Re: [NTG-context] Solved: Minimum example of problem getting curly braces printed in METAPOST

2020-04-05 Thread Hans Hagen

On 4/3/2020 5:36 PM, Gerben Wierda wrote:

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()

more efficient

local rep = lpeg.replacer {
  { '{', '{\\textbraceleft}' },
  { '}', '{\\textbraceright}' },
  { '#', '{\\texthash}' },
  { '$', '{\\textdollar}' },
  { '&', '{\\textampersand}' },
  { '%', '{\\textpercent}' },
  { '\\','{\\textbackslash}' },
  { '|', '{\\textbar}' },
  { '_', '{\\textunderscore}' },
  { '~', '{\\textasciitilde}' },
  { '^', '{\\textasciicircum}' },
  { '"', "\"&\"" },
}

function doubleQuotableEscapedConTeXtString( str)
return rep:match(str)
end

this is probably also ok:

local rep = {
["\""] = "\\char34 ",
["#"]  = "\\char35 ",
["$"]  = "\\char36 ",
["%"]  = "\\char37 ",
["&"]  = "\\char38 ",
["\\"] = "\\char92 ",
["^"]  = "\\char94 ",
["_"]  = "\\char95 ",
["{"]  = "\\char123 ",
["|"]  = "\\char124 ",
["}"]  = "\\char125 ",
["~"]  = "\\char126 ",
}

function doubleQuotableEscapedConTeXtString(str)
return (string.gsub(str,".",rep))
end


-
  Hans Hagen | PRAGMA ADE
  Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
   tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-
___
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
___


[NTG-context] Solved: Minimum example of problem getting curly braces printed in METAPOST

2020-04-03 Thread Gerben Wierda
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  :