%D \module
%D   [       file=meta-imp-kaktovik,
%D        version=2023.04.18,
%D          title=\METAPOST\ Graphics,
%D       subtitle=Kaktovik Numbers,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D Just a quick hack for Hraban (after a post on the mailing list).

\startMPcalculation{simplefun}

    path kaktovik_glyphs[] ;

    def InitializeKaktovik =

        save p, d, u ;

        pair p[] ; numeric d ; d := .1 ; numeric u ; u := .15 ;

      % d := getparameterdefault "mpsfont" "d" .10 ;
      % u := getparameterdefault "mpsfont" "u" .15 ;

        p[0] := (0,1) ;
        p[1] := (1,0) ;
        p[2] := (2,1 -  d) ;
        p[3] := (3,0) ;
        p[4] := (4,1 - 2d) ;

        p[5] := (4,1 +  u) ;
        p[6] := (0,1 + 2u) ;
        p[7] := (4,1 + 4u) ;

        kaktovik_glyphs[0] := (1,1)  { right } .. { left } (2,1/2) { left } .. { right } (3,1);

        for i= 1 upto 4 :
            kaktovik_glyphs[i] := p[0] for j=1 upto i : -- p[j] endfor ;
        endfor ;

        kaktovik_glyphs[ 5] := p[5] -- p[0] ;                for i= 6 upto  9 : kaktovik_glyphs[i] := p[5] -- kaktovik_glyphs[i-5] ; endfor ;
        kaktovik_glyphs[10] := p[6] -- kaktovik_glyphs[ 5] ; for i=11 upto 14 : kaktovik_glyphs[i] := p[6] -- kaktovik_glyphs[i-5] ; endfor ;
        kaktovik_glyphs[15] := p[7] -- kaktovik_glyphs[10] ; for i=16 upto 19 : kaktovik_glyphs[i] := p[7] -- kaktovik_glyphs[i-5] ; endfor ;

    enddef ;

    vardef Kaktovik(expr i) =
        draw image (
            draw kaktovik_glyphs[i]
                xscaled (10/20 -1/20)
                yscaled (25/20 -2/20)
                withpen (pencircle xscaled 1/20 yscaled 5/20) rotated -(2*20)
              % withpen (pencircle xscaled 1/40 yscaled 5/40) rotated -(2*20)
              % withpen (pencircle xscaled 2.5/40 yscaled 5/40) rotated -(2*20)
            ;
        ) shifted (2/20,2/20)
    enddef ;

    lmt_registerglyphs [
        name     = "kaktovik",
        units    = 2,
        usecolor = true,
        width    = 2,
        height   = 2,
        depth    = 0,
        preamble = "InitializeKaktovik"
    ] ;

    for i=0 upto 19 :
        lmt_registerglyph [
            category = "kaktovik",
            unicode  = 119488 + i, % "0x1D2C0"
            code     = "Kaktovik(" & decimal i & ")"
        ] ;
    endfor ;

\stopMPcalculation

\startluacode
    local kaktovik      = moduledata.kaktovik or { }
    moduledata.kaktovik = kaktovik

    local tonumber  = tonumber
    local load      = load
    local reverse   = table.reverse
    local utfchar   = utf.char
    local gsub      = string.gsub
    local concat    = table.concat
    local utfvalues = string.utfvalues
    local lpegmatch = lpeg.match

    function kaktovik.tointeger(s)
        local n = 0
        for b in utfvalues(s) do
            local k = b - 0x1D2C0
            n = n * 20 + k
        end
        return n
    end

--    function kaktovik.tostring(n)
--        local digits = { }
--        local count  = 1
--        while true do
--            digits[count] = utfchar(0x1D2C0 + (n % 20))
--            n = n // 20
--            if n == 0 then
--                break;
--            end
--            count = count + 1
--        end
--        return concat(reverse(digits))
--    end

    local f = string.formatters["%N"]

    function kaktovik.tostring(n)
        if n >= 0 and n <= 19 then
            return utfchar(0x1D2C0 + n)
        else
            -- no need to optimize
            local result = gsub(f(n),"(%d+)",function(s)
                local digits = { }
                local count  = 1
                local n      = tonumber(s)
                while true do
                    digits[count] = utfchar(0x1D2C0 + (n % 20))
                    n = n // 20
                    if n == 0 then
                        break;
                    end
                    count = count + 1
                end
                return concat(reverse(digits))
            end)
            return result
        end
    end

    do

        local k = { }
        local n = 0
        for i=0x1D2C0,0x1D2C0+19 do
            k[utf.char(i)] = n
            n = n + 1
        end

        local p = lpeg.Cs (
            lpeg.Cc("return ")
          * (
                lpeg.utfchartabletopattern(k) / k
              + lpeg.P(1)
            )^0
        )

        local t = setmetatable({ },{ __index = math })

        function kaktovik.calculate(old)
            local new = lpegmatch(p,old)
            if new then
                new = load(new,nil,nil,t)
                if type(new) == "function" then
                    new = new()
                    if new then
                        return new
                    end
                end
            end
            return old
        end

    end

    interfaces.implement {
        name      = "kaktoviknumerals",
        arguments = "integer",
        actions   = { kaktovik.tostring, context }
    }

    interfaces.implement {
        name      = "kaktovikcalculate",
        public    = true,
        arguments = "string",
        actions   = { kaktovik.calculate, kaktovik.tostring, context }
    }
\stopluacode

\unprotect

\permanent\def\kaktoviknumerals#1{\clf_kaktoviknumerals\numexpr#1\relax}

\defineconversion [kaktoviknumerals] [\kaktoviknumerals]
\defineconversion [K]                [\kaktoviknumerals]

\definefontfeature
  [kaktovik]
  [metapost=kaktovik]

\protect

\continueifinputfile{meta-imp-kaktovik.mkxl}

\startbuffer

\definefontfeature
  [default]
  [default]
  [metapost=kaktovik]
% [metapost={category=kaktovik,u=.25,d=.20,x=}]

\setupbodyfont[dejavu]

% \nopdfcompression

\start
    \showglyphs
    KAKTOVIK
    \dostepwiserecurse{0}{19}{1}{\kaktoviknumerals{#1}\space }
\stop

kaktovik \start
    \red\glyphxscale 700
    \dostepwiserecurse{0}{19}{1}{\kaktoviknumerals{#1}\space }
\stop

\startitemize[packed,K][color=orange,stopper=]
    \startitem first  \stopitem
    \startitem second \stopitem
    \startitem third  \stopitem
\stopitemize

KAKTOVIK \start
    \red  \kaktoviknumerals{2023} --
    \green\kaktoviknumerals{4}    --
    \blue \kaktoviknumerals{18}
\stop

KAKTOVIK

𝋂 + 𝋂 = \kaktovikcalculate{𝋂 + 𝋂} = \kaktoviknumerals{4}

\protected\def\ForWilli#1{#1 = \kaktovikcalculate{#1}}

\ForWilli{(𝋂 + 𝋂) ^ (𝋂 + 𝋂)}

\ForWilli{(sin ( 𝋂𝋓 ) )}

\stopbuffer

\starttext

\startTEXpage[offset=1ts,width=3es]
    \getbuffer
\stopTEXpage

\setuplayout[tight]

\usemodule[scite]

\typebuffer[option=TEX]

\stoptext
