On 2/18/2021 12:22 AM, Bruce Horrocks wrote:

On 17 Feb 2021, at 17:40, Fabrice Couvreur <fabrice1.couvr...@gmail.com> wrote:

Hi, The code works, but is it possible to make it shorter ?
OK, here is my take, based on earlier posts, bringing together some 'technologies':

(1) make a document function which isolatees the code
(2) then call it where needed
(3) use the built in conversion code
(4) use so called unique mp graphics (smaller files, faster run)
(5) use symbols to get the baseline right
(6) use a little abstraction in the table setup

watch how we can pass a table instead of a string, so

context.startxtable { align = "middle,lohi", width = "0.8cm", offset = "0.8ex", bodyfont = "9pt", framecolor = "cyan" }

is ok, but anm abstraction is even better. Now, who will wikify it ...

%%%%%%%%%%% code %%%%%%%%%%%

\setupbodyfont[pagella]

\starttext

\definextable
  [MyTable]
  [align={middle,lohi},
   width=0.8cm,
   offset=0.8ex,
   bodyfont=9pt,
   framecolor=cyan]

\startluacode
    function document.MyTable(specification)

        local pattern    = specification.pattern
        local action     = specification.action
        local conversion = specification.conversion or "Characters"

        local n = #pattern

-- context.startxtable { align = "middle,lohi", width = "0.8cm", offset = "0.8ex", bodyfont = "9pt", framecolor = "cyan" }
        context.startxtable { "MyTable" }
            context.startxrow()
                context.startxcell { frame = "off" }
                    context()
                context.stopxcell()
                for i=1,n do
                    context.startxcell()
                        context.convertnumber(conversion,i)
                    context.stopxcell()
                end
            context.stopxrow()
            for i=1,n do
                context.startxrow()
                    context.startxcell()
                        context.convertnumber(conversion,i)
                    context.stopxcell()
                for j=1,n do
                    context.startxcell { align = "middle" }
                        action(string.sub(pattern[i],j,j))
                    context.stopxcell()
                end
                context.stopxrow()
            end
        context.stopxtable()

    end
\stopluacode

\startuniqueMPgraphic{cross}{width,height,depth,color,line}
    draw image (
        draw (\MPvar{depth},\MPvar{height}) -- (\MPvar{width},0) ;
        draw (\MPvar{depth},0) -- (\MPvar{width},\MPvar{height}) ;
    )
        withpen pencircle scaled \MPvar{line}
        withcolor \MPvar{color} ;
\stopuniqueMPgraphic

\definesymbol
  [MyRedCross]

[\uniqueMPgraphic{cross}{width=1em,height=1ex,depth=.5ex,color=red,line=.2ex}]

\definesymbol
  [MyGreenCross]

[\uniqueMPgraphic{cross}{width=1em,height=1ex,depth=.5ex,color=green,line=.2ex}]

\startluacode
    document.MyTable {
        action = function(value)
            context(value == "X" and 1 or 0)
        end,
        conversion = "Characters",
        pattern = {
            ".XXX..XX",
            "X...XXX.",
            "X..X.XXX",
            "X.X.X..X",
            ".X.X.XX.",
            ".XX.X...",
            "XXX.X...",
            "X.XX...."
        }
    }
\stopluacode

\startluacode
    document.MyTable {
        action = function(value)
            context(value == "X" and 1 or 0)
        end,
        conversion = "Greek",
        pattern = {
            ".XXX..XX",
            "X...XXX.",
            "X..X.XXX",
            "X.X.X..X",
        }
    }
\stopluacode

\startluacode
    document.MyTable {
        action = function(value)
            if value == "X" then
                context.symbol { "MyRedCross" }
            end
        end,
        conversion = "Romannumerals",
        pattern = {
            ".XXX..XX",
            "X...XXX.",
            "X..X.XXX",
            "X.X.X..X",
            ".X.X.XX.",
            ".XX.X...",
            "XXX.X...",
            "X.XX...."
        }
    }
\stopluacode

\startluacode
    document.MyTable {
        action = function(value)
context.symbol { value == "X" and "MyRedCross" or "MyGreenCross" }
        end,
        conversion = "Romannumerals",
        pattern = {
            "X.X.X..X",
            ".X.X.XX.",
            ".XX.X...",
            "XXX.X...",
            "X.XX...."
        }
    }
\stopluacode

\stoptext


-----------------------------------------------------------------
                                          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
___________________________________________________________________________________

Reply via email to