diff options
Diffstat (limited to 'tex/context/base/mkiv/libs-imp-zint.lmt')
| -rw-r--r-- | tex/context/base/mkiv/libs-imp-zint.lmt | 161 | 
1 files changed, 161 insertions, 0 deletions
| diff --git a/tex/context/base/mkiv/libs-imp-zint.lmt b/tex/context/base/mkiv/libs-imp-zint.lmt new file mode 100644 index 000000000..2c346ae7d --- /dev/null +++ b/tex/context/base/mkiv/libs-imp-zint.lmt @@ -0,0 +1,161 @@ +if not modules then modules = { } end modules ['libs-imp-ghostscript'] = { +    version   = 1.001, +    comment   = "companion to luat-lib.mkxl", +    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL", +    copyright = "PRAGMA ADE / ConTeXt Development Team", +    license   = "see context related readme files", +} + +local libname = "zint" +local libfile = "libzint" -- what on unix? +-- local libfile = "/usr/local/lib/libzint.so" + +local zintlib = resolvers.libraries.validoptional(libname) + +if not zintlib then return end + +local function okay() +    if resolvers.libraries.optionalloaded(libname,libfile) then +        okay = function() return true end +    else +        okay = function() return false end +    end +    return okay() +end + +local zint     = utilities.zint or { } +utilities.zint = zint + +local zintlib_execute = zintlib.execute + +local next, type, unpack = next, type, unpack +local lower, gsub = string.lower, string.gsub + +local mapping = { +    ["code 11"]           =  1, ["pharma one-track"]       = 51, ["aztec code"]              =  92, +    ["standard 2of5"]     =  2, ["pzn"]                    = 52, ["daft code"]               =  93, +    ["interleaved 2of5"]  =  3, ["pharma two-track"]       = 53, ["micro qr code"]           =  97, +    ["iata 2of5"]         =  4, ["pdf417"]                 = 55, ["hibc code 128"]           =  98, +    ["data logic"]        =  6, ["pdf417 trunc"]           = 56, ["hibc code 39"]            =  99, +    ["industrial 2of5"]   =  7, ["maxicode"]               = 57, ["hibc data matrix"]        = 102, +    ["code 39"]           =  8, ["qr code"]                = 58, ["hibc qr code"]            = 104, +    ["extended code 39"]  =  9, ["code 128-b"]             = 60, ["hibc pdf417"]             = 106, +    ["ean"]               = 13, ["ap standard customer"]   = 63, ["hibc micropdf417"]        = 108, +    ["ean + check"]       = 14, ["ap reply paid"]          = 66, ["hibc codablock-f"]        = 110, +    ["gs1-128"]           = 16, ["ap routing"]             = 67, ["hibc aztec code"]         = 112, +    ["codabar"]           = 18, ["ap redirection"]         = 68, ["dotcode"]                 = 115, +    ["code 128"]          = 20, ["isbn"]                   = 69, ["han xin code"]            = 116, +    ["leitcode"]          = 21, ["rm4scc"]                 = 70, ["rm mailmark"]             = 121, +    ["identcode"]         = 22, ["data matrix"]            = 71, ["aztec runes"]             = 128, +    ["code 16k"]          = 23, ["ean-14"]                 = 72, ["code 32"]                 = 129, +    ["code 49"]           = 24, ["vin (north america)"]    = 73, ["comp ean"]                = 130, +    ["code 93"]           = 25, ["codablock-f"]            = 74, ["comp gs1-128"]            = 131, +    ["flattermarken"]     = 28, ["nve-18"]                 = 75, ["comp databar omni"]       = 132, +    ["gs1 databar omni"]  = 29, ["japanese post"]          = 76, ["comp databar ltd"]        = 133, +    ["gs1 databar ltd"]   = 30, ["korea post"]             = 77, ["comp databar expom"]      = 134, +    ["gs1 databar expom"] = 31, ["gs1 databar stack"]      = 79, ["comp upc-a"]              = 135, +    ["telepen alpha"]     = 32, ["gs1 databar stack omni"] = 80, ["comp upc-e"]              = 136, +    ["upc-a"]             = 34, ["gs1 databar eso"]        = 81, ["comp databar stack"]      = 137, +    ["upc-a + check"]     = 35, ["planet"]                 = 82, ["comp databar stack omni"] = 138, +    ["upc-e"]             = 37, ["micropdf"]               = 84, ["comp databar eso"]        = 139, +    ["upc-e + check"]     = 38, ["usps onecode"]           = 85, ["channel code"]            = 140, +    ["postnet"]           = 40, ["uk plessey"]             = 86, ["code one"]                = 141, +    ["msi plessey"]       = 47, ["telepen numeric"]        = 87, ["grid matrix"]             = 142, +    ["fim"]               = 49, ["itf-14"]                 = 89, ["upnqr"]                   = 143, +    ["logmars"]           = 50, ["kix code"]               = 90, ["rmqr"]                    = 145, +} + +table.setmetatableindex(mapping,function(t,k) +    local s = gsub(lower(k),"[^a-z0-9]","") +    local v = rawget(t,s) or false +    t[k] = v +    return v +end) + +local report  = logs.reporter("zint") +local context = context +local shown   = false + +----- f_rectangle = string.formatters["%sofill unitsquare xysized (%N,%N) shifted (%N,%N);"] + +local function execute(specification) +    if okay() then +        local code = specification.code +        local text = specification.text +        if code then +            local id = mapping[code] +            if id then +                specification.code = id +                local result = zintlib_execute(specification) +                if result then +                    -- not that fast but if needed we can speed it up +                    context.startMPcode() +                    local rectangles = result.rectangles +                    local hexagons   = result.hexagons +                    local circles    = result.circles +                    local strings    = result.strings +                    if rectangles then +                        local n = #rectangles +                        for i=1,n do +                            local r = rectangles[i] +                            context("%sofill unitsquare xysized (%N,%N) shifted (%N,%N);", +                                i == n and "d" or "n",r[3],r[4],r[1],r[2]) +                         -- rectangles[i] = f_rectangle(i == n and "d" or "n",r[3],r[4],r[1],r[2]) +                        end +                     -- context("% t",rectangles) +                    end +                    if hexagons then +                        local n = #hexagons +                        for i=1,#hexagons do +                            context("%sofill (%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--(%N,%N)--cycle;", +                                i == n and "d" or "n",unpack(hexagons[i])) +                        end +                    end +                    if circles then +                        local n = #circles +                        for i=1,#circles do +                            local c = circles[i] +                            context("%sofill unitcircle scaled %N shifted (%N,%N);", +                                i == n and "d" or "n",c[3],c[1],c[2]) +                        end +                    end +                    if strings then +                        -- We set the font at the encapsulating level. +                        for i=1,#strings do +                            local s = strings[i] +                            context('draw textext("%s") scaled (%N/10) shifted (%N,%N);', +                                s[4],s[3],s[1],s[2]) +                        end +                    end +                    context.stopMPcode() +                end +            else +                report("unknown barcode alternative %a",code) +                if not shown then +                    report("") +                    report("valid barcode alternatives:") +                    report("") +                    local list = table.sortedkeys(mapping) +                    for i=1,#list do +                        report("  %s", list[i]) +                    end +                    report("") +                    shown = true +                end +            end +        end +    end +end + +optional.loaded.zint = { execute = execute } + +interfaces.implement { +    name      = "zint", +    actions   = execute, +    arguments = { +        { +            { "code" }, +            { "text" }, +        } +    } +} | 
