summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/barracuda/src/barracuda.lua
blob: d8eae3521656d64672bd6efa3c0b9fa16ad1fef7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
-- Welcome to the 'barracuda' barcode library
--
-- Encode a message into a barcode symbol, in Lua or within a LuaTeX source file
--
-- Copyright (C) 2020 Roberto Giacomelli
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 2 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

-- Basic Conventions:
-- fields that start with an undercore must be considered as private
-- class name follows the snake case naming convention
-- the 'barracuda' table is the only global object to access every package
-- modules.

local Barracuda = {
    _NAME        = "barracuda",
    _VERSION     = "barracuda v0.0.10",
    _DATE        = "2020-02-04",
    _DESCRIPTION = "Lua library for barcode printing",
    _URL         = "https://github.com/robitex/barracuda",
    _LICENSE     = "GNU GENERAL PUBLIC LICENSE, Version 2, June 1991",
}

-- essential sub-module loading
Barracuda._libgeo   = require "lib-geo.brcd-libgeo"      -- basic vectorial objects
Barracuda._gacanvas = require "lib-geo.brcd-gacanvas"    -- ga stream library
Barracuda._barcode  = require "lib-barcode.brcd-barcode" -- barcode abstract class

local Barcode = Barracuda._barcode
Barcode._libgeo = Barracuda._libgeo

-- return a reference of Barcode abstract class
function Barracuda:barcode() --> Barcode class object
    return self._barcode
end

-- encoder costructor (a bridge to Barcode class method)
function Barracuda:new_encoder(treename, opt) --> object, err
    local barcode = self._barcode
    local enc, err = barcode:new_encoder(treename, opt) --> object, err
    return enc, err
end

-- where we place the output driver library
function Barracuda:get_driver() --> Driver object
    if not self._lib_driver then
        self._lib_driver = require "lib-driver.brcd-driver"
    end
    return self._lib_driver
end

function Barracuda:new_canvas() --> driver
    local gacanvas = self._gacanvas
    return gacanvas:new()
end

-- high level barcode functions
-- only default options
-- panic on error

-- save barcode as a graphic external file
-- 'treename' mandatory encoder identifier <family>-<variant>:<name>
-- 'data' mandatory the object string or integer being encoded
-- 'filename' mandatory output filename
-- 'id_drv' optional driver identifier, defualt 'svg'
-- 'opt' optional table for symbol parameters
function Barracuda:save(treename, data, filename, id_drv, opt)
    local barcode = self._barcode
    local enc_archive = barcode._encoder_instances
    local enc = enc_archive[treename]
    if not enc then
        local err
        enc, err = barcode:new_encoder(treename)
        assert(enc, err)
    end
    -- make symbol
    local symb
    local arg_data = type(data)
    if arg_data == "number" then
        local err_data
        symb, err_data = enc:from_uint(data)
        assert(symb, err_data)
    elseif arg_data == "string" then
        local err_data
        symb, err_data = enc:from_string(data)
        assert(symb, err_data)
    else
        error("[ArgErr] unsupported type for 'data'")
    end
    if opt then
        local ok, err = symb:set_param(opt)
        assert(ok, err)
    end
    local canvas = self:new_canvas()
    symb:append_ga(canvas)
    local driver = self:get_driver()
    id_drv = id_drv or "svg"
    local ok, err = driver:save(id_drv, canvas, filename)
    assert(ok, err)
end

-- this is a only LuaTeX method
-- 'treename' mandatory encoder identifier <family>-<variant>:<name>
-- 'data' mandatory the object string or integer being encoded
-- 'box_name' mandatory TeX hbox name
-- 'opt' optional table for symbol parameters
function Barracuda:hbox(treename, data, box_name, opt)
    local barcode = self._barcode
    local enc_archive = barcode._encoder_instances
    local enc = enc_archive[treename]
    if not enc then
        local err
        enc, err = barcode:new_encoder(treename)
        assert(enc, err)
    end
    -- make symbol
    local symb
    local arg_data = type(data)
    if arg_data == "number" then
        local err_data
        symb, err_data = enc:from_uint(data)
        assert(symb, err_data)
    elseif arg_data == "string" then
        local err_data
        symb, err_data = enc:from_string(data)
        assert(symb, err_data)
    else
        error("[ArgErr] unsupported type for 'data'")
    end
    if opt then
        local ok, err = symb:set_param(opt)
        assert(ok, err)
    end
    local canvas = self:new_canvas()
    symb:append_ga(canvas)
    local driver = self:get_driver()
    local ok, err = driver:ga_to_hbox(canvas, box_name)
    assert(ok, err)
end

return Barracuda