texlive[53683] Master/texmf-dist: barracuda (5feb20)

commits+karl at tug.org commits+karl at tug.org
Wed Feb 5 22:43:35 CET 2020


Revision: 53683
          http://tug.org/svn/texlive?view=revision&revision=53683
Author:   karl
Date:     2020-02-05 22:43:34 +0100 (Wed, 05 Feb 2020)
Log Message:
-----------
barracuda (5feb20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/luatex/barracuda/INSTALL.txt
    trunk/Master/texmf-dist/doc/luatex/barracuda/README.md
    trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda-ga-asm.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda-manual-tool.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/01-barracuda-latex-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/01-barracuda-latex-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/001-code128-test.lua
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/002-code128-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/002-code128-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/001-code39-test.lua
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/002-code39-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/002-code39-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/003-code39-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/003-code39-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/004-code39-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/004-code39-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/006-code39-test.lua
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/001-13-ean-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/001-13-ean-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/002-ean-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/003-ean-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-pdfliteral/001-ga-pdfliteral-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-pdfliteral/001-ga-pdfliteral-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-svg/002-ga-svg-test.lua
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/001-i2of5-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/001-i2of5-test.tex
    trunk/Master/texmf-dist/scripts/barracuda/barracuda.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-barcode.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-code128.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-code39.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-ean.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-i2of5.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-driver.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-drv-pdfliteral.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-drv-svg.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-geo/brcd-gacanvas.lua
    trunk/Master/texmf-dist/scripts/barracuda/lib-geo/brcd-libgeo.lua
    trunk/Master/texmf-dist/tex/luatex/barracuda/barracuda.sty

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/luatex/barracuda/PLANNER.txt
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/02-ord_iter-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.tex
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/ars.svg
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.pdf
    trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.tex

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/luatex/barracuda/TODO.txt

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/INSTALL.txt
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/INSTALL.txt	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/INSTALL.txt	2020-02-05 21:43:34 UTC (rev 53683)
@@ -21,8 +21,8 @@
 
  a. Grab the sources from CTAN or https://github.com/robitex/barracuda .
  b. Unzip it at the root of one or your TDS trees.
- c. You may need to update some filename database after this running `texhash`,
-    see your TeX distribution's manual for details.
+ c. You may need to update some filename database after this running the command
+    `texhash` on a terminal, see your TeX distribution's manual for details.
 
 Any TeX Live documentation files can be easily opened on screen with the
 `texdoc` command line utility (this way is very handy).
@@ -35,3 +35,7 @@
 Manually copy the `src` folder content to a suitable directory of your system
 that is reachable to a Lua interpreter. 
 
+File List
+---------
+
+<filelist>

Added: trunk/Master/texmf-dist/doc/luatex/barracuda/PLANNER.txt
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/PLANNER.txt	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/PLANNER.txt	2020-02-05 21:43:34 UTC (rev 53683)
@@ -0,0 +1,151 @@
+Development Planner and Task History
+====================================
+
+Basic rules
+-----------
+
++ Every new version will be uploaded to CTAN network
++ For each single task there will be a correspomding commit
+
+Hypothetical development task list:
+-----------------------------------
+
+20__-__-__: [dev] TiKz driver
+20__-__-__: [dev] debug driver, ga stream pretty printing
+20__-__-__: [dev] make thing happen: font property for text
+20__-__-__: [dev] develop LaTeX user package
+20__-__-__: [dev] coherent error management
+20__-__-__: [dev] proportional options
+20__-__-__: [dev] a number parameter can be a string? unit measure...
+20__-__-__: [prj] a command line program to print barcodes
+20__-__-__: [dev] guard text in EAN simbology
+20__-__-__: [dev] UPC support
+20__-__-__: [dev] make optional file name in all the Driver methods
+20__-__-__: [prj] test l3build for testing and CTAN files packaging
+20__-__-__: [dev] load barcode parameters from an external file
+20__-__-__: [dev] new Parameter Class
+
+Scheduled task list for Data Matrix 2D simbology implementation:
+----------------------------------------------------------------
+
+2020-__-__: [dmx] data matrix first run
+2020-__-__: [dmx] ecc200 error correction code
+2020-__-__: [svg] opcode for grids
+2020-__-__: [pdf] opcode for grids
+2020-__-__: [gas] ga-asm grid opcode
+2020-__-__: [geo] grid vector object
+2020-__-__: [dev] init source file encoder for Data Matrix
+2020-__-__: [dev] parameter preset
+
+Dev Planner:
+============
+-------------------------------------------------------------------------------
+2020-__-__: [milestone] version <v0.0.11> completed task/commit list
+2020-__-__: [doc] barcode symbologies reference
+2020-__-__: [doc] put ga-asm-spec together with the manual
+2020-__-__: [dev][barcode] new `alias` feature
+2020-__-__: [dev][barcode] new `preset` feature
+2020-__-__: [dev][i2of5] human readeable text for i2of5
+2020-__-__: [dev][libgeo] new `Vbar_group` class
+2020-__-__: [test] update test files with recent changes
+2020-__-__: [dev][libgeo][breaking change] return `ok, err` instead of `err`
+            for canvas methods
+2020-__-__: [dev] new constructor `Barcode:new()`
+2020-__-__: [project][build] make a Lua script to easily create the CTAN upload
+          : compressed files
+2020-__-__: [dev][ean] fix the `ean:checksum()` to include ISBN and ISSN variant
+2020-__-__: [dev][i2of5] `encoder:_init_parse_state()` adoption for ITF14
+          : variant
+2020-__-__: [dev][ean] new function `encoder:_init_parse_state()`, and EAN
+          : family adoption
+2020-__-__: update version number in preparetion of the next version.
+-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+2020-02-04: [milestone] version <v0.0.10> completed task/commit list
+-------------------------------------------------------------------------------
+2020-02-04:*[dev][ean] ISSN support
+2020-02-03: [dev][ean] move out of `_config()` `finalize()` method as in i2of5
+2020-02-02: [dev][i2of5] new ITF14 variant, plan for the next version
+2020-02-01: [dev] new semantic for barcode parameter: alternative family
+          : parameters definition for a variant, via `_par_def_<variant>` field
+2020-02-01: [dev] rewrite code for the filter option in
+          : `Barcode:param_ord_iter()` and execute a test on it
+2020-01-31: [dev] add filter option on `Barcode:param_ord_iter()`
+2020-01-18: [dev][breaking change] rename config() private method to _config(),
+          : encoders can now decide if variant argument is mandatory or not,
+          : update to year 2020 copyright notes
+2020-01-08: [dev][ean family] complete the ISBN support
+2019-12-29: [dev] a new data structure for encoder parameter ordering
+2019-12-29: [dev][ean family] inital ISBN support
+2019-12-28: [api][barcode] new Barcode method `:get_code()`
+2019-12-27: [api][breaking change] rename the `get_barcode_class()` method
+          : to the more simple `barcode()`
+          : [api][breaking change] new encoder naming convention
+          : reuse or create a new encoder object in barracuda:hbox() and
+          : barracuda:save() methods
+
+(*) this commit
+
+Task history and previous version:
+==================================
+
+[🎉] <v0.0.9.1> 2019-12-04: prelude to version v0.1
+09.15: 2019-11-29: [prj] upload to CTAN version v0.0.9.1 (under CTAN rules)
+09.14: 2019-11-29: [prj] upload to CTAN version v0.0.9
+09.13: 2019-11-26: [man] say something about barracuda.sty
+09.12: 2019-11-26: [man] edit the section 'A more deep look' for clearness
+09.11: 2019-11-26: [prj] reformat todo file: no more date at line end
+09.10: 2019-11-26: [svg] take dimensions as scaled point and then mm
+09.09: 2019-11-26: [prj] every dev task ends with a repository commit
+09.08: 2019-11-25: [prj] .gitignore .out file
+09.07: 2019-11-25: [svg] support for text
+09.06: 2019-11-25: [man] time to get an usable manual even if minimal
+09.05: 2019-11-23: [chk] some new test files
+09.04: 2019-11-23: [dev] new barracuda methods save() and hbox()
+09.03: 2019-11-20: [svg] driver first run
+09.02: 2019-11-10: [dev] implement ga opcode for line-join style and line-cap style
+09.01: 2019-11-10: [prj] make lib-parseopt a separated project
+
+<Version 0.0.8> move costructors to the barcode abstract class     🎉 2019-11-09
+Task   8.5: adopted new Barcode costructors in the EAN encoder        2019-11-09
+Task   8.4: adopted new Barcode costructors in the ITF encoder        2019-11-09
+Task   8.3: adopted new Barcode costructors in the Code128 encoder    2019-11-09
+Task   8.2: adopted new Barcode costructors in the Code39 encoder     2019-11-04
+Task   8.1: new costructor method in the barcode superclass           2019-11-04
+
+<Version 0.0.7> code refactoring for ga-canvas                     🎉 2019-11-02
+Task   7.5: recompile all the test files                              2019-11-02
+Task   7.4: new functions canvas:encode_<obj>()                       2019-11-02
+Task   7.3: text position options for Code39 became two indipendent   2019-11-02
+Task   7.2: added a new code39 test file (and bugs fixed)             2019-11-02
+Task   7.1: added subdirectories in the test tree                     2019-11-02
+
+<Version 0.0.6> implement Interleaved 2 of 5 encoder               🎉 2019-07-02
+Task   6.4: test files                                                2019-07-02
+Task   6.3: add bearer bars for itf encoder                           2019-07-02
+Task   6.2: check digit capability for itf 2 of 5 encoder             2019-07-02
+Task   6.1: implement basic Interleaved 2 of 5 encoder                2019-06-29
+
+<Version 0.0.5> implement Code128 and EAN family encoders          🎉 2019-01-27
+Task   5.5: test file                                                 2019-01-27
+Task   5.4: implement EAN2 variant                                    2019-01-26
+Task   5.3: implement EAN5 variant                                    2019-01-26
+Task   5.2: new family encoder concept                                2019-01-25
+Task   5.1: implement EAN13 encoder                                   2019-01-12
+Task   4.4: refactoring param iterator                                2018-12-30
+Task   4.3: test the local system of option set up for Code128        2018-12-30
+Task   4.2: test the local system of option set up for Code39         2018-12-30
+Task   4.1: test for ga-canvas                                        2018-12-29
+Task   3.3: opt in Code 39 and Code 128 symbol constructors           2018-12-24
+Task   3.2: focus on a new constructor in Barcode Class for
+            better encoder implementation                             2018-12-21
+Task   3.1: import and refactoring previous Code128 encoder code      2018-12-16
+
+<Version 0.0.2>                                                    🎉 2018-12-11
+Task   2.5: option text_gap for code39                                2018-12-11
+Task   2.4: resolved the horizontal correction in spaced text         2018-12-11
+Task   2.3: further text option for the Code39 encoder                2018-12-06
+Task   2.2: include minimal text ability to the system
+Task   2.1: design and implement a basic framework
+
+<Version 0.0.1> open 0.0.1 alpha dev master branch                 🎉 2018-11-30


Property changes on: trunk/Master/texmf-dist/doc/luatex/barracuda/PLANNER.txt
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/README.md	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/README.md	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,32 +1,32 @@
 # `barracuda` project
 
-This Lua library is for drawing barcode symbols. The project delivers modules
-to typeset barcode from within a LuaTeX document. Therefore is also possible
-to use `barracuda` with a Lua standalone interpreter to draw barcodes with
-different graphic format such as `SVG` (see an example below).
-This package does not have dependences.
+This a pure Lua library is for drawing barcode symbols. The project components
+are able to typeset barcode from within a LuaTeX document. Therefore is also
+possible to use `barracuda` with a Lua standalone interpreter to draw barcodes
+with different graphic format such as `SVG` (see an example below). This package
+does not have dependences.
 
-![a SVG formatted Code39 symbol](/test/test-ga-svg/test-code39.svg)
+![a Code39 symbol in SVG format](/test/test-ga-svg/test-code39.svg)
 
-Internal modules is structured to ensure good performance and to allow a
+Internal modules are structured to ensure good performance and to give a
 complete user control over barcode symbol parameters :thumbsup: .
 
 Although development is in beta stage, `barracuda` has a good level of
 stability.
 
-## Current version information
+## Current version
 
-Version: v0.0.9.1
-Date: 2019-12-04
+Version: v0.0.10
+Date: 2020-02-04
 
 ## Barcode symbologies list
 
-So far, are supported
+So far, the barcode symbologies included in the package are:
 
 - Code 39
 - Code 128
 - Interleaved 2 of 5
-- EAN family (EAN8, EAN13, and the add-ons EAN5 and EAN2)
+- EAN family (ISBN, ISSN, EAN8, EAN13, and the add-ons EAN5 and EAN2)
 
 Other 1D encoding symbology will be added to the project, then it will be the
 turn of 2D barcode types like Datamatrix, QRCode or PDF417.
@@ -36,7 +36,7 @@
 The LaTeX package `barracuda.sty` under the cover uses Lua code so you need to
 compile your source files with LuaTeX or LuajitTeX with the LaTeX format.
 
-For instance, here there is a minimal example for LuaLaTeX:
+For instance, here is a minimal working example for LuaLaTeX:
 
 ```latex
 % !TeX program = LuaLaTeX
@@ -50,7 +50,7 @@
 ## Documentation
 
 Details and package reference can be found in the manual delivered in the `doc`
-project directory, even if it is very minimal at the moment.
+project directory, even if actually it is very minimal at the moment.
 
 Directory `test` contains files useful also for code examples.
 
@@ -66,7 +66,7 @@
 available and no further action is required. Please, take into account that
 only the tagged version (in the `git` sense) of the package will be sent to
 CTAN. This means that intermediate development version between consecutive
-releases can be found only at https://github.com/robitex/barracuda .
+releases can be found only at <https://github.com/robitex/barracuda> .
 
 TeX Live distribution or Lua interpreter executable are available for a very
 large number of Operating Systems so it is also for `barracuda`.
@@ -76,13 +76,13 @@
 ## Contribute
 
 Contributes are welcome in any form and for any topics. You can contact me
-directly via email at giaconet.mailbox at gmail.com or via a pull request on the
-repository https://github.com/robitex/barracuda or writing a public message
-via the web page https://github.com/robitex/barracuda/issues for todos, bugs,
-feature requests, and more (press the bottom `New issue`).
+directly via email at giaconet.mailbox at gmail.com or via a pull request direct to
+the repository <https://github.com/robitex/barracuda> or writing a public
+message via the web page <https://github.com/robitex/barracuda/issues> for
+todos, bugs, feature requests, and more (press the bottom `New issue`).
 
-Anyway, as a starting point take a look of TODO.txt file for the next
-scheduled development tasks.
+Anyway, as a starting point take a look of PLANNER.txt file for the development
+program.
 
 ## License
 
@@ -89,7 +89,6 @@
 `barracuda` project is released under the
 [GNU GPL v2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
 Please, for more legal details refer to LICENSE.txt file or visit the web page
-https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+<https://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
 
-Copyright (C) 2019 Roberto Giacomelli
-
+Copyright (C) 2020 Roberto Giacomelli

Deleted: trunk/Master/texmf-dist/doc/luatex/barracuda/TODO.txt
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/TODO.txt	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/TODO.txt	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,92 +0,0 @@
-Development Program Task Table
-
-Hypothetical developing tasks list:
-
-__.__: 20__-__-__: [dev] TiKz driver
-__.__: 20__-__-__: [dev] debug driver, ga code pretty printing
-__.__: 20__-__-__: [dev] make thing happen: font property for text
-__.__: 20__-__-__: [dev] develop LaTeX user package
-__.__: 20__-__-__: [dev] coherent error management
-__.__: 20__-__-__: [dev] proportional options
-__.__: 20__-__-__: [dev] a number parameter can be a string? unit measure...
-__.__: 20__-__-__: [prj] a command line program to print barcodes
-__.__: 20__-__-__: [man] put ga-asm-spec together with the manual
-__.__: 2019-__-__: [dev] guard text in EAN simbology
-__.__: 2019-__-__: [dev] ISBN support
-__.__: 2019-__-__: [dev] UPC support
-__.__: 2019-__-__: [dev] make optional file name in all the Driver methods
-__.__: 2019-__-__: [prj] use l3build for testing and CTAN files packaging
-
-Scheduled tasks (What we are working on):
-[  ] <v0.1> 2019-__-__: Data Matrix 2D symbology
-
-__.__: 2019-__-__: [dmx] data matrix first run
-__.__: 2019-__-__: [dmx] ecc200 error correction code
-__.__: 2019-__-__: [svg] opcode for grids
-__.__: 2019-__-__: [pdf] opcode for grids
-__.__: 2019-__-__: [gas] ga-asm grid opcode
-__.__: 2019-__-__: [geo] grid vector object
-_1.__: 2019-__-__: [dev] init source file encoder for Data Matrix
-
-[🎉] <v0.0.9.1> 2019-12-04: prelude to version v0.1
-09.15: 2019-11-29: [prj] upload to CTAN version v0.0.9.1 (CTAN conditions)
-09.14: 2019-11-29: [prj] upload to CTAN version v0.0.9
-09.13: 2019-11-26: [man] say something about barracuda.sty
-09.12: 2019-11-26: [man] edit the section 'A more deep look' for clearness
-09.11: 2019-11-26: [prj] reformat todo file: no more date at line end
-09.10: 2019-11-26: [svg] take dimensions as scaled point and then mm
-09.09: 2019-11-26: [prj] every dev task ends with a repository commit
-09.08: 2019-11-25: [prj] .gitignore .out file
-09.07: 2019-11-25: [svg] support for text
-09.06: 2019-11-25: [man] time to get an usable manual even if minimal
-09.05: 2019-11-23: [chk] some new test files
-09.04: 2019-11-23: [dev] new barracuda methods save() and hbox()
-09.03: 2019-11-20: [svg] driver first run
-09.02: 2019-11-10: [dev] implement ga opcode for line-join style and line-cap style
-09.01: 2019-11-10: [prj] make lib-parseopt a separated project
-
-Completed tasks:
-
-<Version 0.0.8> move costructors to the barcode abstract class     🎉 2019-11-09
-Task   8.5: adopted new Barcode costructors in the EAN encoder        2019-11-09
-Task   8.4: adopted new Barcode costructors in the ITF encoder        2019-11-09
-Task   8.3: adopted new Barcode costructors in the Code128 encoder    2019-11-09
-Task   8.2: adopted new Barcode costructors in the Code39 encoder     2019-11-04
-Task   8.1: new costructor method in the barcode superclass           2019-11-04
-
-<Version 0.0.7> code refactoring for ga-canvas                     🎉 2019-11-02
-Task   7.5: recompile all the test files                              2019-11-02
-Task   7.4: new functions canvas:encode_<obj>()                       2019-11-02
-Task   7.3: text position options for Code39 became two indipendent   2019-11-02
-Task   7.2: added a new code39 test file (and bugs fixed)             2019-11-02
-Task   7.1: added subdirectories in the test tree                     2019-11-02
-
-<Version 0.0.6> implement Interleaved 2 of 5 encoder               🎉 2019-07-02
-Task   6.4: test files                                                2019-07-02
-Task   6.3: add bearer bars for itf encoder                           2019-07-02
-Task   6.2: check digit capability for itf 2 of 5 encoder             2019-07-02
-Task   6.1: implement basic Interleaved 2 of 5 encoder                2019-06-29
-
-<Version 0.0.5> implement Code128 and EAN family encoders          🎉 2019-01-27
-Task   5.5: test file                                                 2019-01-27
-Task   5.4: implement EAN2 variant                                    2019-01-26
-Task   5.3: implement EAN5 variant                                    2019-01-26
-Task   5.2: new family encoder concept                                2019-01-25
-Task   5.1: implement EAN13 encoder                                   2019-01-12
-Task   4.4: refactoring param iterator                                2018-12-30
-Task   4.3: test the local system of option set up for Code128        2018-12-30
-Task   4.2: test the local system of option set up for Code39         2018-12-30
-Task   4.1: test for ga-canvas                                        2018-12-29
-Task   3.3: opt in Code 39 and Code 128 symbol constructors           2018-12-24
-Task   3.2: focus on a new constructor in Barcode Class for
-            better encoder implementation                             2018-12-21
-Task   3.1: import and refactoring previous Code128 encoder code      2018-12-16
-
-<Version 0.0.2>                                                    🎉 2018-12-11
-Task   2.5: option text_gap for code39                                2018-12-11
-Task   2.4: resolved the horizontal correction in spaced text         2018-12-11
-Task   2.3: further text option for the Code39 encoder                2018-12-06
-Task   2.2: include minimal text ability to the system
-Task   2.1: design and implement a basic framework
-
-<Version 0.0.1> open 0.0.1 alpha dev master branch                 🎉 2018-11-30

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda-ga-asm.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda-ga-asm.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda-ga-asm.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,5 +1,5 @@
 % !TeX program = LuaLaTeX
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 
 \documentclass{article}
 

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda-manual-tool.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda-manual-tool.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda-manual-tool.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,7 +1,39 @@
+% an auxiliary package for the manual
+\directlua{
+    barracuda = require "barracuda"
+    local v = barracuda._VERSION
+    local p = v:find(" ")
+    brcd_data = {
+        version = v:sub(p+1),
+        date = barracuda._DATE
+    }
+}
 
+\newcommand{\code}[1]{\texttt{#1}}
+\newcommand{\brcd}{\code{barracuda}}
 
+\newbox\barracudabox
+\newcommand\barracuda[3][_brcd_empty_=true]{\directlua{
+    local enc_name = [[#2]]
+    local data = [[#3]]
+    local opt = {#1};
+    if opt._brcd_empty_ == true then
+        barracuda:hbox(enc_name, data, "barracudabox")
+    else
+        barracuda:hbox(enc_name, data, "barracudabox", opt)
+    end
+}%
+\leavevmode\box\barracudabox
+}
 
+\newcommand{\brcdkey}[1]{\directlua{
+    local key = [===[#1]===]
+    if brcd_data[key] then
+        tex.sprint(brcd_data[key])
+    else
+        error("Key '"..key.."' not found")
+    end
+}}
 
 
 
-

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/doc/barracuda.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,8 +1,8 @@
 % !TeX program = LuaLaTeX
-% Copyright (C) 2019 Roberto Giacomelli
-% Barracuda manual main source file
+% Copyright (C) 2020 Roberto Giacomelli
+% Barracuda manual, main TeX source file
 
-\documentclass[11pt]{article}
+\documentclass[11pt,a4paper]{article}
 \usepackage{fontspec}
 \usepackage{geometry}
 \usepackage{fancyvrb}
@@ -13,40 +13,40 @@
 \input{barracuda-manual-tool}
 
 \hypersetup{
+hidelinks,
+linktoc = all,
 pdfinfo={
-    Title={Barracuda manual},
-	Subject={Barcode printing package},
-	Author={Roberto Giacomelli},
-	Keywords={Barcode EAN Code128 Lua}
+    Title={the Barracuda manual},
+    Subject={Barcode printing package},
+    Author={Roberto Giacomelli},
+    Keywords={Barcode EAN Code128 Lua}
 }}
 
 \setmainfont{Libertinus Serif}
-\setmonofont{IBM Plex Sans Condensed}
+\setmonofont[Scale=0.82]{Fira Mono}
 \fvset{
     fontsize=\small,
     frame=single,
     labelposition=topline,
-    framesep=6pt
+    framesep=5pt
 }
 \geometry{
     left=32mm,
     right=40mm,
-    top=28mm,
+    top=22mm,
     bottom=28mm
 }
-\newcommand{\code}[1]{\texttt{#1}}
-\newcommand{\brcd}{\code{barracuda}}
 
 \author{Roberto Giacomelli\\\small email: \url{giaconet.mailbox at gmail.com}}
-\title{\code{barracuda} manual\\[1ex]
+\title{the \code{barracuda} manual\\[1ex]
 \small \url{https://github.com/robitex/barracuda}}
-\date{\small 2019-12-04\\Version v0.0.9.1}
+\date{\small Date \brcdkey{date} --- Version \brcdkey{version} --- Beta stage}
 
 \begin{document}
 \maketitle
 
 \abstract{%
-Welcome to the \brcd{} software project devoted to barcodes printing.
+Welcome to the \brcd{} software project devoted to barcode printing.
 
 This manual shows you how to print barcodes in your \TeX{} documents and how to
 export such graphic content to an external file, using \brcd{}.
@@ -55,9 +55,16 @@
 under the GPL 2 License.%
 }
 
+\tableofcontents
+\newpage
 
-\section{Introduction}
 
+\section{Getting started}
+\label{secStart}
+
+\subsection{Introduction}
+\label{secIntro}
+
 Barcode symbols are usually a sequence of vertical lines representing encoded
 data that can be retrived with special laser scanner or more simpler with a
 smartphone running dedicated apps. Almost every store item has a label with a
@@ -67,80 +74,117 @@
 \begin{itemize}
 	\item Code 39,
 	\item Code 128,
-	\item EAN family (EAN 8, EAN 13, and the add-ons EAN 2 and EAN 5),
+	\item EAN family (ISBN, ISSN, EAN 8, EAN 13, and the add-ons EAN 2 and EAN 5),
 	\item ITF 2of5, interleaved Two of Five.
 \end{itemize}
 
-The package provides drivers for different graphic format, at the moment are:
+The package provides different output graphic format. At the moment they are:
 \begin{itemize}
-	\item PDF Portable Document Format (require a modern \TeX{} engine),
+	\item PDF Portable Document Format (a modern \TeX{} engine is required),
 	\item SVG Scalable Vector Graphic.
 \end{itemize}
 
-The name \brcd{} is an assonance with the name Barcode. I started the project
-back in 2016 for getting barcode in my \TeX{} generated PDF documents, studying
-the Lua\TeX{} technology.
+The name \brcd{} is an assonance to the name Barcode. I started the project back
+in 2016 for getting barcode in my \TeX{} generated PDF documents, studying the
+Lua\TeX{} technology such as direct \emph{pdfliteral node} creation.
 
+At the moment \brcd{} is in \emph{beta} stage. In this phase the Lua API can
+change respect to the result of development research.
 
+
 \subsection{Manual Content}
 
-The manual is divided into three parts. At section~\ref{secEnter} the first look
-gives to the user a proof of concept to how to use and how works the package
-while the next parts present details like how to change the \emph{module} width
-of a EAN-13 barcode or how to implement a barcode symbology not already included
-in the package.
+The manual is divided into five part. In part~\ref{secIntro} introduces the
+package and gives to the user a proof of concept to how to use it. The next
+parts present detailed information about option parameter of each barcode
+symbology and methods description to change the \emph{module} width of a EAN-13
+barcode. It's also detailed how the Lua code works internally and how to
+implement a barcode symbology not already included in the package.
 
 The plan of the manual is (but some sections are not completed yet):
 \begin{description}
-\item[Part 1:] Get started
+\item[Part 1:] Getting started
 \begin{itemize}
-	\item print your first barcode \( \to \) \ref{secEnter}
-	\item installing \brcd{} on your system \( \to \) \ref{secInstall}
-	\item \brcd{} \LaTeX{} package \( \to \) \ref{secLaTeXPkg}
+	\item general introduction \( \to \) \pageref{secIntro}
+	\item print your first barcode \( \to \) \pageref{secEnter}
+	\item installing \brcd{} on your system \( \to \) \pageref{secInstall}
 \end{itemize}
-\item[Part 2:] Advanced Work with \brcd{}
+
+\item[Part 2:] \LaTeX{} packages
 \begin{itemize}
-	\item Lua framework description \( \to \) \ref{secFramework}
-	\item working example and use cases \( \to \) \ref{secExample}
+	\item \brcd{} \LaTeX{} package \( \to \) \pageref{secLaTeXPkg}
 \end{itemize}
-\item[Part 3:] Reference and parameters
+
+\item[Part 3:] Barcode Reference and Parameters
 \begin{itemize}
-	\item barcode symbology reference \( \to \) \ref{secBcRef}
-	\item \code{ga} specification
-	\item API reference \( \to \) \ref{secAPI}
+	\item encoder identification rule \( \to \) \pageref{secEncName}
+	\item barcode symbologies reference \( \to \) \pageref{secBcRef}
 \end{itemize}
+
+\item[Part 4:] Advanced Work with \brcd{}
+\begin{itemize}
+	\item Lua framework description \( \to \) \pageref{secFramework}
+	\item API reference \( \to \) \pageref{secAPI}
+	\item \code{ga} specification \( \to \) \pageref{secGA}
+\end{itemize}
+
+\item[Part 5:] Real examples
+\begin{itemize}
+	\item working example and use cases \( \to \) \pageref{secExample}
+\end{itemize}
 \end{description}
 
+
 \subsection{Required knowledge and useful resources}
 
-The \brcd{} is a Lua package that can be executed by any Lua interpreter. To use
-it, it's necessary some knowledge of Lua programming language and a certain
-ability with the terminal of your computer system in order to accomplish command
-tasks or software installations.
+\brcd{} is a Lua package that can be executed by any Lua interpreter. To use it,
+it's necessary a minimal knowledge of Lua programming language and a certain
+ability with the terminal of your computer system in order to run command line
+task or make software installation.
 
-It's also possible to run \brcd{} directly from within a \TeX{} source file,
-compiled with a suitable typesetting engine like Lua\TeX{}. To do so a minimal
-\TeX{} system knowledge is required. As an example of this workflow you simply
-can look to this manual because itself is typesetted with LuaLa\TeX{}, running
-\brcd{} to include barcodes as a vector graphic object.
+It's also possible to run \brcd{} directly within a \TeX{} source file, and
+compile it with a suitable typesetting engine like Lua\TeX{}. In this case a
+minimal \TeX{} system knowledge is required. As an example of this workflow you
+simply can look to this manual because itself is typesetted with LuaLa\TeX{},
+running \brcd{} to include barcodes as a vector graphic object.
 
-Here is a collection of useful learning resources\dots
+A third way is to use the \LaTeX{} package \code{barracuda.sty} with its high
+level macros. A minimal knowledge of the \LaTeX{} format is obviously required.
 
-%
-%
-%
-%
+Here is a collection of useful learning resources:
+\begin{description}
+\item[Lua:] to learn Lua the main reference is the book called PIL, Programming
+in Lua from one of the language's Author Roberto Ierusalimschy.
+\item[\LaTeX:] \dots
+\item[Lua\TeX:] \dots
+\end{description}
 
 
-\section{Get Started with Barracuda}
+\subsection{Running Barracuda}
 \label{secEnter}
 
 The starting point to work with \brcd{} is always a plain text file with some
-code, late processed by a command line program with a Lua interpreter.
+code processed by a command line program with a Lua interpreter.
 
-As a practical example producing an EAN-13 barcode, in a text editor of your
-choice on a empty file called \code{first-run.lua}, type the following two lines
-of code:
+The paradigm of \brcd{} is the Object Oriented Programming. Generally speaking
+every object must be created with a function called \emph{costructor} and every
+action must be run calling a \emph{method} of it.
+
+In this section you'll take a taste of \brcd{} coding in three different
+execution context: a Lua script, a Lua\TeX{} document and a \LaTeX{} source file
+using the macro package \code{barracuda.sty} providing an high level interface
+to Lua code.
+
+High level package like \code{barracuda.sty} make to write Lua code unnecessary.
+It will be always possible return to Lua code in order to resolve complex
+barcode requirements.
+
+
+\subsubsection{A Lua script}
+
+As a practical example to produce an EAN~13 barcode, open a text editor of your
+choice on an empty file and save it as \code{first-run.lua} with the content of
+the following two lines of code:
 \medskip
 \begin{Verbatim}[label=\footnotesize\code{first-run.lua}]
 local barracuda = require "barracuda"
@@ -148,97 +192,127 @@
 \end{Verbatim}
 
 What you have done is to write a \emph{script}. If you have installed a Lua
-interpreter and \brcd{}, open a terminal and run the command:
+interpreter along with \brcd{}, open a terminal and run it with the command:
 \begin{Verbatim}
 $ lua first-run.lua
 \end{Verbatim}
 
-You will see in the same directory of your script, appearing the new file
+You will see in the same directory of your script, appearing a new file called
 \code{my\_barcode.svg} with the drawing:
 \begin{center}
 \includegraphics{image/8006194056290}
 \end{center}
 
-Coming back to the script \code{first-run.lua}, first of all, it's necessary to
-load the library with the standard statement \code{require()}. What that Lua
-function returns is an object---more precisely a table reference---where are
-stored every package features.
+Coming back to the script first of all, it's necessary to load the library
+\brcd{} with the standard Lua function \code{require()} that returns an
+object---more precisely a reference to a table where are stored all the
+package machinery.
 
-We can now produce the EAN-13 barcode using the method \code{save()} of the
-\brcd{} object. The \code{save()} method takes in order the barcode symbology
-identifier, the data to be encoded as a string or also a whole number, the
-output file name and the optional output format.
+With the second line of code, an EAN~13 barcode is saved as
+\code{my\_barcode.svg} using the method \code{save()} of the \brcd{} object. The
+\code{save()} method takes in order the barcode symbology identifier called
+\emph{treename}, an argument as a string or as a whole number that represents
+data to be encoded, the output file name and the optional output format. With a
+fifth optional argument we can pass options to the barcode encoder as a Lua
+table.
 
+Each encoder has an own identifier called treename explained at
+section~\ref{secEncName}. In short, in \brcd{} we can build more encoders of the
+same symbology with different parameters.
 
-\subsection{Running Lua\TeX}
 
-Barracuda can also running inside Lua\TeX{} and the others Lua powered \TeX{}
-engine. The text source file is a bit difference respect to a Lua script: Lua
-code have to bring place as the argument of directlua primitive... we must use
-a box register of type horizontal...
+\subsubsection{A Lua\TeX{} source file}
 
+\brcd{} can also runs with Lua\TeX{} and any others Lua powered \TeX{}
+engines. The source file is a bit difference respect to the previuos script: the
+Lua code lives inside the argument of a \verb=\directlua= primitive, moreover we
+must use an horizontal box register as output destination.
 \begin{Verbatim}
 % !TeX program = LuaTeX
-\nopagenumbers
 \newbox\mybox
 \directlua{
 	local require "barracuda"
 	barracuda:hbox("ean-13", "8006194056290", "mybox")
-}\box\mybox
+}\leavevmode\box\mybox
 \bye
 \end{Verbatim}
 
-The method \code{hbox()} works only with Lua\TeX{}.
+The method \code{hbox()} works only with Lua\TeX{}. It takes three\footnote{A
+fourth argment is optional as a table with user defined barcode parameters.}
+arguments: encoder \emph{treename}, encoding data as a string, the \TeX{}
+horizontal box name.
 
 
+\subsubsection{A Lua\LaTeX{} source file}
+
+\LaTeX{} working minimal example would be:
+\begin{Verbatim}
+% !TeX program = LuaLaTeX
+\documentclass{article}
+\usepackage{barracuda}
+\begin{document}
+\barracuda{ean-13}{8006194056290}
+\end{document}
+\end{Verbatim}
+
+
 \subsection{A more deep look}
 
-Barracuda is designed to be modular and flexible. For example it is possible
-to draw different barcodes on the same canvas or tune barcode parameters. 
+\brcd{} is designed to be modular and flexible. For example it is possible to
+draw different barcodes on the same canvas or tune barcode parameters. 
 
 The main workflow to draw a barcode object reveals more details on internal
-structure. In fact, to draw an EAN-13 barcode we must do at least the following
+structure. In fact, to draw an EAN~13 barcode we must do at least the following
 steps:
 \begin{enumerate}
 \item load the library,
-\item get a reference to the \code{Barcode} class,
-\item build an EAN encoder,
-\item build an EAN symbol passing data to a costructor,
+\item get a reference to the \code{Barcode} abstract class,
+\item build an \code{ean} encoder of the variant \code{13},
+\item build an EAN~13 symbol passing data to a costructor,
 \item get a reference to a new canvas object,
-\item draw barcode on canvas,
-\item get a reference of driver object,
-\item address canvas toward a driver.
+\item draw barcode on the canvas object,
+\item get a reference of the driver object,
+\item print the graphic material saving an external \code{svg} file.
 \end{enumerate}
 
-Follow that step by step procedure the corresponding code is in the next
-listing:
+Following that step by step procedure the corresponding code is translated in
+the next listing:
 \begin{Verbatim}
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+-- lua script
+local barracuda = require "barracuda" -- step 1
+local barcode = barracuda:barcode() -- step 2
 
-local ean13, err_enc = barcode:new_encoder("ean-13")
+local ean13, err_enc = barcode:new_encoder("ean-13") -- step 3
 assert(ean13, err_enc)
 
-local symb, err_symb = ean13:from_string("8006194056290")
+local symb, err_symb = ean13:from_string("8006194056290") -- step 4
 assert(symb, err_symb)
 
-local canvas = barracuda:new_canvas()
-symb:append_ga(canvas)
+local canvas = barracuda:new_canvas() -- step 5
+symb:append_ga(canvas) -- step 6
 
-local driver = barracuda:get_driver()
-local ok, err_out = driver:save("svg", canvas, "my_barcode", "svg")
+local driver = barracuda:get_driver() -- step 7
+local ok, err_out = driver:save("svg", canvas, "my_barcode") -- step 8
 assert(ok, err_out)
 \end{Verbatim}
 
+Late the manual will give objects and methods references at
+section~\ref{secAPI}.
 
-\section{Installing}
+
+\subsection{Installing}
 \label{secInstall}
 
-\subsection{Installing `barracuda` for TeX Live}
+\subsubsection{Installing for Lua}
 
-If you have TeX Live installed from CTAN or from DVD TeX Collection, check
-before any modification to your system if the package is already installed
-looking for \emph{installed} key in the output of the command:
+Manually copy \code{src} folder content to a suitable directory of your system
+that is reachable to the system Lua interpreter.
+
+\subsubsection{Installing for TeX Live}
+
+If you have TeX Live installed from CTAN or from DVD TeX Collection, before any
+modification to your system check if the package is already installed looking
+for \emph{installed} key in the output of the command:
 \begin{Verbatim}
 $ tlmgr show barracuda
 \end{Verbatim}
@@ -249,22 +323,17 @@
 \end{Verbatim}
 
 If you have installed TeX Live via Linux OS repository try your distribution's
-package management system.
+package management system running a software update.
 
-It's also possible a manual installation:
+It's also possible to install the package manually:
 \begin{enumerate}
 \item Grab the sources from CTAN or \url{https://github.com/robitex/barracuda}.
-\item Unzip it at the root of one or your TDS trees.
+\item Unzip it at the root of one or your TDS trees (local or personal).
 \item You may need to update some filename database after this, see your \TeX{}
 distribution's manual for details.
 \end{enumerate}
 
-\subsection{Installing for Lua}
 
-Manually copy \code{src} folder content to a suitable directory of your system
-that is reachable to Lua interpreter.
-
-
 \section{Barracuda \LaTeX{} Package}
 \label{secLaTeXPkg}
 
@@ -282,49 +351,62 @@
 \end{document}
 \end{Verbatim}
 
-Every macro \verb=\barracuda= typesets a barcode symbol represented with the
-encoder defined in the first argument, the information defined by the second.
+Every macro \verb=\barracuda= typesets a barcode symbol with the encoder defined
+in the first argument, encoding data defined by the second.
 
 
-\section{The Barracuda Framework}
+\section{Barcode parameters}
+\label{secBarcodeReference}
+
+\subsection{Encoder treename}
+\label{secEncName}
+
+TODO
+
+\subsection{Barcode Reference}
+\label{secBcRef}
+
+TODO
+
+\section{Developer zone}
+
+\subsection{The Barracuda Framework}
 \label{secFramework}
 
-The \brcd{} package framework consists in indipendet modules: a barcode class
+The \brcd{} package framework consists in indipendent modules: a barcode class
 hierarchy encoding a text into a barcode symbology; a geometrical library called
-\code{libgeo} representing several graphic object; an encoding library for the
-\code{ga} format (graphic assembler) several driver to "print" a ga stream
-into a file or a \TeX{} hbox register.
+\code{libgeo} representing several graphic objects; an encoding library for the
+\code{ga} format (graphic assembler) and several driver to \emph{print} a ga
+stream into a file or a \TeX{} hbox register.
 
-To implement a barcode encoder you need to write a component called
-\emph{encoder} defining every parameters and producing the encoder class, while
-a driver must understand ga opcode stream and print the corresponding graphic
-object.
+To implement a barcode encoder you have to write a component called
+\emph{encoder} defining every parameters and implementing the encoder builder,
+while a driver must understand ga opcode stream and print the corresponding
+graphic object.
 
 Every barcode encoder come with a set of parameters, some of them can be
-reserved and can be setting up by the user only through the encoder.
+reserved and can't be edit after the encoder was build. So, you can create many
+instances of the same encoder for a single barcode type, with its own parameter
+set.
 
-So, you can create many instances of the same encoder for a single barcode
-type, with its own parameter set.
+The basic idea is getting faster encoders, for which the user may set up
+paramenters at any level: barcode abstract class, encoder globally, down to a
+single symbol object.
 
-The basic idea is getting faster encoder, for which the user may set up
-paramenters at any level: barcode abstract class, encoder, down to a single
-symbol.
+The Barcode class is completely indipendent from the ouput driver and viceversa.
 
-Barcode class is completely indipendent from the ouput driver and viceversa.
+\subsection{Lua API reference}
+\label{secAPI}
 
-
-\section{Example and use cases}
-\label{secExample}
-
 TODO
 
-\section{Barcode Reference}
-\label{secBcRef}
+\subsection{\code{ga} specification}
+\label{secGA}
 
 TODO
 
-\section{API reference}
-\label{secAPI}
+\section{Example and use cases}
+\label{secExample}
 
 TODO
 

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/01-barracuda-latex-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/01-barracuda-latex-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/01-barracuda-latex-test.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/01-barracuda-latex-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,5 +1,5 @@
 % !TeX program = LuaLaTeX
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 
 % test file: make a Code39 barcodes in a LaTeX document
 
@@ -8,6 +8,8 @@
 
 \begin{document}
 A\barracuda{code39}{123QWE}A
+
+B\barracuda[text_vpos='top']{code39}{123QWE}B
 \end{document}
 
 

Added: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/02-ord_iter-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/02-ord_iter-test.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/02-ord_iter-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -0,0 +1,73 @@
+% !TeX program = LuaTeX
+% Copyright (C) 2020 Roberto Giacomelli
+
+\directlua{
+local barracuda = require "barracuda"
+local c39 = assert(barracuda:barcode():new_encoder("code39"))
+print()
+print([[Code39: no filter argument:]])
+for _, tpar in c39:param_ord_iter() do
+    local pid = tpar.pname
+    print(pid, [[ = ]], c39[pid])
+end
+
+print()
+print([[Code39: filter == '*all':]])
+for _, tpar in c39:param_ord_iter([[*all]]) do
+    local pid = tpar.pname
+    print(pid, [[ = ]], c39[pid])
+end
+
+print()
+print([[Code39: filter == '*super':]])
+for _, tpar in c39:param_ord_iter([[*super]]) do
+    local pid = tpar.pname
+    print(pid, [[ = ]], c39[pid])
+end
+
+print()
+print([[Code39: filter == '*enc':]])
+for _, tpar in c39:param_ord_iter([[*enc]]) do
+    local pid = tpar.pname
+    print(pid, [[ = ]], c39[pid])
+end
+
+print()
+local isbn = assert(barracuda:barcode():new_encoder("ean-isbn"))
+
+print([[ISBN: No filter argument:]])
+for _, tpar in isbn:param_ord_iter() do
+    local pid = tpar.pname
+    print(pid, [[ = ]], isbn[pid])
+end
+
+print()
+print([[ISBN: filter == '*all':]])
+for _, tpar in isbn:param_ord_iter([[*all]]) do
+    local pid = tpar.pname
+    print(pid, [[ = ]], isbn[pid])
+end
+
+print()
+print([[ISBN: filter == '*super':]])
+for _, tpar in isbn:param_ord_iter([[*super]]) do
+    local pid = tpar.pname
+    print(pid, [[ = ]], isbn[pid])
+end
+
+print()
+print([[ISBN: filter == '*enc':]])
+for _, tpar in isbn:param_ord_iter([[*enc]]) do
+    local pid = tpar.pname
+    print(pid, [[ = ]], isbn[pid])
+end
+
+local c128 = assert(barracuda:barcode():new_encoder([[code128]]))
+print()
+print([[Code128: filter == '*enc':]])
+for _, tpar in c128:param_ord_iter([[*enc]]) do
+    local pid = tpar.pname
+    print(pid, [[ = ]], c128[pid])
+end
+}
+\bye


Property changes on: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-barracuda-package/02-ord_iter-test.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/001-code128-test.lua
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/001-code128-test.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/001-code128-test.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,7 +1,7 @@
--- Copyright (C) 2018 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 
 local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local c128, err = barcode:new_encoder("code128")
 assert(not err, err)
 

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/002-code128-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/002-code128-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/002-code128-test.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code128/002-code128-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,5 +1,5 @@
 % !TeX program = LuaTeX
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 
 \newbox\mybox
 \nopagenumbers
@@ -13,7 +13,7 @@
 }
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 
 local c128, err = barcode:new_encoder("code128")
 assert(not err, err)
@@ -34,7 +34,7 @@
 the second one takes anchors from itself:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ok, err = barcode:set_param{ax = 1, ay = 1} % super class set up
 assert(ok, err)
 assert(barcode.ax == 1, "barcode ax is "..tostring(barcode.ax))
@@ -63,8 +63,9 @@
 be aligned to the top:
 
 \directlua{
-local c128, err = barracuda:get_barcode_class()
-                           :enc_by_name "code128"; assert(c128, err)
+local c128, err = barracuda:barcode()
+                           :enc_by_name "code128";
+assert(c128, err)
 
 local s, err = c128:from_string("123456"); assert(s, err)
 local canvas = barracuda:new_canvas()
@@ -84,7 +85,7 @@
 and locally to 1.0:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 % set ay globally to 0.0
 local ok, err = barcode:set_param("ay", 0); assert(ok, err)
 
@@ -108,8 +109,9 @@
 Test 5: uint() costructor and save a file with PDF literal code:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
-local c128, err = barcode:enc_by_name("code128"); assert(c128, err)
+local barcode = barracuda:barcode()
+local c128, err = barcode:enc_by_name("code128");
+assert(c128, err)
 local s, e = c128:from_uint(1234567890); assert(s, e)
 local canvas = barracuda:new_canvas()
 local _, errc = s:append_ga(canvas); assert(not errc, errc)
@@ -118,7 +120,7 @@
 drv:save("native", canvas, "02-05-pdfliteral")
 }\box\mybox
 
-That's all folk!
+That's all folks!
 
 \bye
 

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/001-code39-test.lua
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/001-code39-test.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/001-code39-test.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,4 +1,4 @@
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 -- test Code 39 encoder
 
 local barracuda = require "barracuda"
@@ -7,7 +7,7 @@
     print(k,v)
 end
 
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 
 local c39, err = barcode:new_encoder("code39")
 assert(not err, err)
@@ -27,7 +27,7 @@
 local symb = c39:from_string("123")
 
 print("print internal representation of chars")
-for _, c in ipairs(symb.code) do
+for _, c in ipairs(symb._code_data) do
     print(c)
 end
 print()

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/002-code39-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/002-code39-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/002-code39-test.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/002-code39-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,14 +1,17 @@
 % !TeX program = LuaTeX
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 
 \newbox\mybox
 \nopagenumbers
 
+\directlua{
+barracuda = require "barracuda"
+}
+
 Test 1: Code 39 symbol with default parameters:
 
 \directlua{
-local barracuda = require "barracuda"
-local c39, err = barracuda:get_barcode_class()
+local c39, err = barracuda:barcode()
                           :new_encoder("code39")
 assert(not err, err)
 
@@ -19,17 +22,15 @@
 symbol:append_ga(canvas)
 local drv = barracuda:get_driver()
 drv:ga_to_hbox(canvas, "mybox")
-}
-\box\mybox
+}\box\mybox
 
 Test 2: get the reference of the previous encoder and typeset two
 Code 39 symbols on the same canvas, one above to the other:
 
 \directlua{
-local barracuda = require "barracuda"
-local c39, err = barracuda:get_barcode_class()
+local c39, err = barracuda:barcode()
                           :enc_by_name("code39")
-                           assert(c39, err)
+assert(c39, err)
 
 local s1, err = c39:from_string("ZKPQJ31"); assert(s1, err)
 local s2, err = c39:from_string("RTFG746", {text_vpos="top"}); assert(s2, err)
@@ -41,17 +42,15 @@
 s2:append_ga(canvas, 0.0, h2 + tex.sp "5pt")
 local drv = barracuda:get_driver()
 drv:ga_to_hbox(canvas, "mybox")
-}
-\box\mybox
+}\box\mybox
 
 Test 3: with the same encoder print a symbol, change globally the height,
 and reprint the same symbol again on the same canvas:
 
 \directlua{
-local barracuda = require "barracuda"
-local c39, err = barracuda:get_barcode_class()
+local c39, err = barracuda:barcode()
                           :enc_by_name("code39")
-                           assert(c39, err)
+assert(c39, err)
 
 local s1, err  = c39:from_string("ZKPQJ31"); assert(s1, err)
 
@@ -66,17 +65,15 @@
 
 local drv = barracuda:get_driver()
 drv:ga_to_hbox(canvas, "mybox")
-}
-\box\mybox
+}\box\mybox
 
 Test 4: do the same in test 3 but change locally parameters as
 height and text properties:
 
 \directlua{
-local barracuda = require "barracuda"
-local c39, err = barracuda:get_barcode_class()
+local c39, err = barracuda:barcode()
                           :enc_by_name("code39")
-                           assert(c39, err)
+assert(c39, err)
 
 local s1, err  = c39:from_string("0123456789"); assert(s1, err)
 
@@ -95,16 +92,14 @@
 
 local drv = barracuda:get_driver()
 drv:ga_to_hbox(canvas, "mybox")
-}
-\box\mybox
+}\box\mybox
 
 Test 5: create a new encoder with a large module value:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 
-local c39, err = barcode:new_encoder("code39", "e2", {module = tex.sp "0.5mm"})
+local c39, err = barcode:new_encoder("code39:e2", {module = tex.sp "0.5mm"})
 assert(c39, err)
 
 local s1, err  = c39:from_string("02040608"); assert(s1, err)
@@ -114,7 +109,6 @@
 
 local drv = barracuda:get_driver()
 drv:ga_to_hbox(canvas, "mybox")
-}
-\box\mybox
+}\box\mybox
 
 \bye

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/003-code39-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/003-code39-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/003-code39-test.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/003-code39-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,20 +1,18 @@
 % !TeX program = LuaTeX
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 
 \newbox\mybox
 \nopagenumbers
 
-Test 3: the same Code 39 symbol drawing multiple time on the same canvas
+Test 1: the same Code 39 symbol drawing multiple time on the same canvas
 
 \directlua{
 local barracuda = require "barracuda"
-local c39, err = barracuda:get_barcode_class()
-                          :new_encoder("code39")
-assert(not err, err)
-local err
-local symbol
-symbol, err = c39:from_string("ABCDEF12QJ31+")
-assert(not err, err)
+local c39 = assert(
+    barracuda:barcode()
+        :new_encoder("code39")
+)
+local symbol = assert(c39:from_string("ABCDEF12QJ31+"))
 
 local ok, err = c39:set_param("text_vpos", "top")
 assert(ok, err)
@@ -46,8 +44,7 @@
 
 local drv = barracuda:get_driver()
 drv:ga_to_hbox(canvas, "mybox")
-}
-\box\mybox
+}\box\mybox
 \bye
 
 

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/004-code39-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/004-code39-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/004-code39-test.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/004-code39-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,14 +1,14 @@
 % !TeX program = LuaTeX
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 
 \newbox\mybox
 \nopagenumbers
 
-Test 4: check uint costructor:
+Test 1: check uint costructor:
 
 \directlua{
 barracuda = require "barracuda"
-local c39, err = barracuda:get_barcode_class()
+local c39, err = barracuda:barcode()
                           :new_encoder("code39")
 assert(not err, err)
 local err
@@ -21,11 +21,10 @@
 
 local drv = barracuda:get_driver()
 drv:ga_to_hbox(canvas, "mybox")
-}
-\box\mybox
+}\box\mybox
 
 \directlua{
-local c39, err = barracuda:get_barcode_class()
+local c39, err = barracuda:barcode()
                           :enc_by_name("code39")
 assert(c39, err)
 local e
@@ -38,9 +37,6 @@
 
 local drv = barracuda:get_driver()
 drv:ga_to_hbox(canvas, "mybox")
-}
-\box\mybox
+}\box\mybox
 
 \bye
-
-

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/006-code39-test.lua
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/006-code39-test.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-code39/006-code39-test.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -2,7 +2,7 @@
 local cm = 1864679.8110236 -- sp
 
 local barracuda = require "barracuda"
-local c39, err = barracuda:get_barcode_class()
+local c39, err = barracuda:barcode()
                           :new_encoder("code39")
 assert(not err, err)
 local err

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/001-13-ean-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/001-13-ean-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/001-13-ean-test.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/001-13-ean-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,5 +1,5 @@
 % !TeX program = LuaTeX
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 
 \newbox\mybox
 \nopagenumbers
@@ -9,8 +9,8 @@
 Test 1: one simple barcode EAN13 with default parameter:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+barracuda = require "barracuda"
+local barcode = barracuda:barcode()
 
 local ean13, err = barcode:new_encoder("ean-13")
 assert(not err, err)
@@ -30,8 +30,7 @@
 Test 2: one simple EAN8 barcode with default parameter:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 
 local ean8, err = barcode:new_encoder("ean-8")
 assert(not err, err)
@@ -51,8 +50,7 @@
 Test 3: one simple EAN5 barcode with default parameter:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ean5, err = barcode:new_encoder("ean-5")
 assert(not err, err)
 local symbo, err = ean5:from_string("54495")
@@ -68,8 +66,7 @@
 Test 4: one simple EAN2 barcode with default parameter:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ean2, err = barcode:new_encoder("ean-2")
 assert(not err, err)
 local symbo, err = ean2:from_string("53")
@@ -85,13 +82,11 @@
 Test 5: EAN13 + EAN5 barcode with default parameter:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ean, err = barcode:new_encoder("ean-13+5"); assert(not err, err)
 local n = 123456789012
-local c = ean:checksum(n)
-local s = n .. c
-local symbo, err = ean:from_string(s.."12345")
+local c = assert(ean:checksum(n))
+local symbo, err = ean:from_string(n..c.."12345")
 assert(not err, err)
 local canvas = barracuda:new_canvas()
 symbo:append_ga(canvas)
@@ -104,8 +99,7 @@
 Test 6: EAN13 + EAN2 barcode with default parameter:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ean, err = barcode:new_encoder("ean-13+2"); assert(not err, err)
 local n = 123456789012
 local c = ean:checksum(n)
@@ -123,8 +117,7 @@
 Test 7: EAN8 + EAN5 barcode with default parameter:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ean, err = barcode:new_encoder("ean-8+5"); assert(not err, err)
 local n = 1234567
 local c = ean:checksum(n)
@@ -142,8 +135,7 @@
 Test 8: EAN8 + EAN2 barcode with default parameter:
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ean, err = barcode:new_encoder("ean-8+2"); assert(not err, err)
 local n = 7865431
 local c = ean:checksum(n)
@@ -167,8 +159,7 @@
 \smallskip
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ean, err = barcode:enc_by_name("ean-13"); assert(not err, err)
 local n = 818571884348
 local c = ean:checksum(n)
@@ -194,8 +185,7 @@
 \smallskip
 
 \directlua{
-local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local ean, err = barcode:enc_by_name("ean-13"); assert(not err, err)
 local ok, err  = ean:set_param("height", tex.sp "5mm"); assert(ok, err)
 local n = 758458535897; local c = ean:checksum(n); local s = n .. c
@@ -213,7 +203,7 @@
 \vrule Test 10\vrule\box\mybox \vrule Test 10\vrule
 
 \medskip
-That's all folk!
+That's all folks!
 
 \bye
 

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/002-ean-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/003-ean-test.pdf
===================================================================
(Binary files differ)

Added: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.pdf	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.pdf	2020-02-05 21:43:34 UTC (rev 53683)

Property changes on: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -0,0 +1,45 @@
+% !TeX program = LuaTeX
+\nopagenumbers
+% load package and store it in a global Lua variable
+\directlua{barracuda = require "barracuda"}
+\newbox\mybox
+
+ISBN test:
+\vskip10pt
+
+\leavevmode
+\directlua{barracuda:hbox("ean-isbn", "978-88-8154-348-9", "mybox")}
+\box\mybox
+\directlua{barracuda:hbox("ean-isbn", "978 88 8154 348 9", "mybox")}
+\box\mybox
+
+\vskip10pt
+\directlua{barracuda:hbox("ean-isbn+5", "978 88 8154 348 9-80026", "mybox")}%
+\box\mybox
+
+\vskip10pt
+ISBN 10 test, the 10-digits code is automatically converted in an ISBN 13 code:
+\vskip10pt
+\directlua{barracuda:hbox("ean-isbn", "1-78474-140-X", "mybox")}%
+\box\mybox
+
+\vskip10pt
+\directlua{barracuda:hbox("ean-isbn+5", "1-78474-140-X 12345", "mybox")}%
+\box\mybox
+
+\vskip10pt
+\directlua{barracuda:hbox("ean-isbn+2", "1-78474-140-X 99", "mybox")}%
+\box\mybox
+
+\vskip5pt
+ISBN Test: the value 'auto' for 'text\_isbn\_enabled' option means that
+the text above the symbol isn't printed if in the provided code does not
+have group chars or the length is not 10:
+\vskip5pt
+\leavevmode
+\directlua{barracuda:hbox("ean-isbn", "9788881543489", "mybox")}
+\box\mybox
+\directlua{barracuda:hbox("ean-isbn", "978-8881543489", "mybox")}
+\box\mybox
+
+\bye
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/005-isbn-test.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.pdf	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.pdf	2020-02-05 21:43:34 UTC (rev 53683)

Property changes on: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -0,0 +1,57 @@
+% !TeX program = LuaTeX
+\nopagenumbers
+% load package and store it in a global Lua variable
+\directlua{barracuda = require "barracuda"}
+\newbox\mybox
+
+ISSN test:
+
+\vskip10pt
+\leavevmode
+\directlua{barracuda:hbox("ean-issn", "9778881543480", "mybox")}
+\box\mybox
+
+\vskip10pt
+\leavevmode
+\directlua{barracuda:hbox("ean-issn+5", "977888154348000028", "mybox")}
+\box\mybox
+
+\vskip10pt
+\leavevmode
+\directlua{
+local ars_issn = {
+    online  = "9771828236001",
+    print = "9771828235004",
+}
+
+barracuda:hbox("ean-issn+5", ars_issn.online.."00028", "mybox")
+}
+\box\mybox
+
+\vskip10pt
+\leavevmode
+\directlua{barracuda:hbox("ean-issn", "1828-2350", "mybox")}
+\box\mybox
+
+\vskip10pt
+\leavevmode
+\directlua{barracuda:hbox("ean-issn", "1828-2350 [01]", "mybox")}
+\box\mybox
+
+\vskip10pt
+\leavevmode
+\directlua{barracuda:hbox("ean-issn+5", "1828-2350 [01] 00028", "mybox")}
+\box\mybox
+
+\vskip10pt
+\leavevmode
+\directlua{
+barracuda:hbox("ean-issn+2", "1828-2350 [01] 22", "mybox")
+barracuda:save("ean-issn+2", "1828-2350 [01] 22", "ars")
+}
+\box\mybox
+
+
+\bye
+
+


Property changes on: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/006-issn-test.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/ars.svg
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/ars.svg	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ean/ars.svg	2020-02-05 21:43:34 UTC (rev 53683)
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Barracuda package (https://github.com/robitex/barracuda) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg"
+  version="1.1"
+  width="47.189752mm" height="28.039875mm"
+  viewBox="-3.629981 -27.259868 47.189752 28.039875"
+>
+  <g stroke="black">
+    <path d="M0.164999 -24.499871V-0.000000" style="stroke-width:0.329998"/>
+    <path d="M0.824996 -24.499871V-0.000000" style="stroke-width:0.329998"/>
+  </g>
+  <g stroke="black">
+    <path d="M1.814990 -24.499871V-1.649991" style="stroke-width:0.989995"/>
+    <path d="M2.969984 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+  </g>
+  <g stroke="black">
+    <path d="M4.124978 -24.499871V-1.649991" style="stroke-width:0.329998"/>
+    <path d="M5.444971 -24.499871V-1.649991" style="stroke-width:0.329998"/>
+  </g>
+  <g stroke="black">
+    <path d="M6.269967 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+    <path d="M7.589960 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+  </g>
+  <g stroke="black">
+    <path d="M8.579955 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+    <path d="M9.734949 -24.499871V-1.649991" style="stroke-width:0.989995"/>
+  </g>
+  <g stroke="black">
+    <path d="M11.219941 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+    <path d="M12.209936 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+  </g>
+  <g stroke="black">
+    <path d="M13.199931 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+    <path d="M14.354924 -24.499871V-1.649991" style="stroke-width:0.989995"/>
+  </g>
+  <g stroke="black">
+    <path d="M15.344919 -24.499871V-0.000000" style="stroke-width:0.329998"/>
+    <path d="M16.004916 -24.499871V-0.000000" style="stroke-width:0.329998"/>
+  </g>
+  <g stroke="black">
+    <path d="M16.829911 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+    <path d="M17.819906 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+  </g>
+  <g stroke="black">
+    <path d="M18.974900 -24.499871V-1.649991" style="stroke-width:0.329998"/>
+    <path d="M20.624891 -24.499871V-1.649991" style="stroke-width:0.329998"/>
+  </g>
+  <g stroke="black">
+    <path d="M21.284888 -24.499871V-1.649991" style="stroke-width:0.329998"/>
+    <path d="M22.604881 -24.499871V-1.649991" style="stroke-width:0.989995"/>
+  </g>
+  <g stroke="black">
+    <path d="M23.924874 -24.499871V-1.649991" style="stroke-width:0.989995"/>
+    <path d="M25.244867 -24.499871V-1.649991" style="stroke-width:0.329998"/>
+  </g>
+  <g stroke="black">
+    <path d="M26.069863 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+    <path d="M27.389856 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+  </g>
+  <g stroke="black">
+    <path d="M28.379851 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+    <path d="M29.699844 -24.499871V-1.649991" style="stroke-width:0.659997"/>
+  </g>
+  <g stroke="black">
+    <path d="M30.524839 -24.499871V-0.000000" style="stroke-width:0.329998"/>
+    <path d="M31.184836 -24.499871V-0.000000" style="stroke-width:0.329998"/>
+  </g>
+  <text x="-3.629981" y="0.780007" font-family="Verdana" font-size="2.877000">
+  9  </text>
+  <text y="0.780007" font-family="Verdana" font-size="2.877000" text-anchor="middle">
+  <tspan x="2.043326">7</tspan>
+  <tspan x="4.459979">7</tspan>
+  <tspan x="6.876631">1</tspan>
+  <tspan x="9.293284">8</tspan>
+  <tspan x="11.709936">2</tspan>
+  <tspan x="14.126589">8</tspan>
+  </text>
+  <text y="0.780007" font-family="Verdana" font-size="2.877000" text-anchor="middle">
+  <tspan x="17.223246">2</tspan>
+  <tspan x="19.639899">3</tspan>
+  <tspan x="22.056551">5</tspan>
+  <tspan x="24.473204">0</tspan>
+  <tspan x="26.889856">1</tspan>
+  <tspan x="29.306509">1</tspan>
+  </text>
+  <text x="15.674918" y="-25.159868" font-family="Verdana" font-size="2.877000" text-anchor="middle">
+  ISSN 1828-2350  </text>
+  <g stroke="black">
+    <path d="M34.814817 -20.824890V-0.000000" style="stroke-width:0.329998"/>
+    <path d="M35.639812 -20.824890V-0.000000" style="stroke-width:0.659997"/>
+  </g>
+  <g stroke="black">
+    <path d="M36.959806 -20.824890V-0.000000" style="stroke-width:0.659997"/>
+    <path d="M37.949800 -20.824890V-0.000000" style="stroke-width:0.659997"/>
+  </g>
+  <g stroke="black">
+    <path d="M38.774796 -20.824890V-0.000000" style="stroke-width:0.329998"/>
+  </g>
+  <g stroke="black">
+    <path d="M39.764791 -20.824890V-0.000000" style="stroke-width:0.329998"/>
+    <path d="M40.919785 -20.824890V-0.000000" style="stroke-width:0.659997"/>
+  </g>
+  <text y="-21.154889" font-family="Verdana" font-size="2.877000" text-anchor="middle">
+  <tspan x="36.445645">2</tspan>
+  <tspan x="39.453955">2</tspan>
+  </text>
+</svg>
+

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-pdfliteral/001-ga-pdfliteral-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-pdfliteral/001-ga-pdfliteral-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-pdfliteral/001-ga-pdfliteral-test.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-pdfliteral/001-ga-pdfliteral-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,7 +1,7 @@
 % !TeX program = LuaTeX
 % test for ga-canvas pdfliteral driver
 %
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 % see LICENSE.txt file
 
 ---ga--- is a binary format as an istruction set similar to

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-svg/002-ga-svg-test.lua
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-svg/002-ga-svg-test.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-ga-svg/002-ga-svg-test.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,7 +1,7 @@
 -- test SVG driver output
 
 local barracuda = require "barracuda"
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local driver = barracuda:get_driver()
 
 local opt = {module = 15 * 0.0254 * 186467, height = 12 * 186467}

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/001-i2of5-test.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/001-i2of5-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/001-i2of5-test.tex	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/001-i2of5-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,5 +1,5 @@
 % !TeX program = LuaTeX
-% Copyright (C) 2019 Roberto Giacomelli
+% Copyright (C) 2020 Roberto Giacomelli
 
 \newbox\mybox
 \nopagenumbers
@@ -11,7 +11,7 @@
 Test 1: one simple barcode with default parameters:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 
 local enc, err = barcode:new_encoder("i2of5"); assert(not err, err)
 local symbo, err = enc:from_uint(54654681); assert(not err, err)
@@ -25,7 +25,7 @@
 Test 2: one simple barcode with default parameter:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 local symbo, err = enc:from_uint(1234567895); assert(not err, err)
 local canvas = barracuda:new_canvas(); symbo:append_ga(canvas)
@@ -57,7 +57,7 @@
     5317837,
     4117698,
 }
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 for _, n in ipairs(code) do
     local smbl, err = enc:from_uint(n, {check_digit_policy="verify"})
@@ -86,7 +86,7 @@
     ["531783"] = 7,
     ["411769"] = 8,
 }
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 for sc, ck in pairs(code) do
     local n = tonumber(sc)
@@ -100,7 +100,7 @@
 Test 3: one simple barcode with check digit automatically added:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 local symbo, err = enc:from_uint(454473, {check_digit_policy="add"})
 assert(not err, err)
@@ -114,7 +114,7 @@
 Test 4: a second simple barcode with check digit automatically added:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 local symbo, err = enc:from_uint(74223, {check_digit_policy="add"})
 assert(not err, err)
@@ -128,7 +128,7 @@
 Test 5: a symbol with native check digits:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 local symbo, err = enc:from_uint(121891259, {check_digit_policy="verify"})
 assert(not err, err)
@@ -142,7 +142,7 @@
 Test 6: bearer bars please:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 local symbo, err = enc:from_uint(747867239, {bearer_bars_enabled = true})
 assert(not err, err)
@@ -156,7 +156,7 @@
 Test 7: bearer bars all around the symbol:
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 local symbo, err = enc:from_uint(986790868, {bearer_bars_enabled = true, bearer_bars_layout="frame"})
 assert(not err, err)
@@ -170,7 +170,7 @@
 Test 8: bearer bars all around the symbol (with string costructor):
 
 \directlua{
-local barcode = barracuda:get_barcode_class()
+local barcode = barracuda:barcode()
 local enc, err = barcode:enc_by_name("i2of5"); assert(not err, err)
 local symbo, err = enc:from_string("986790868", {bearer_bars_enabled = true, bearer_bars_layout="frame"})
 assert(not err, err)

Added: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.pdf	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.pdf	2020-02-05 21:43:34 UTC (rev 53683)

Property changes on: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.tex
===================================================================
--- trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.tex	2020-02-05 21:43:34 UTC (rev 53683)
@@ -0,0 +1,53 @@
+% !TeX program = LuaTeX
+% Copyright (C) 2020 Roberto Giacomelli
+
+\newbox\mybox
+\nopagenumbers
+
+\directlua{barracuda = require "barracuda"}
+
+
+Test 2: Interleaved 2 of 5 encoder test for ITF14 variant.
+
+\directlua{
+local barcode = barracuda:barcode()
+local enc = assert(barcode:new_encoder("i2of5-ITF14"))
+local s1 = assert(enc:from_uint(1234567890123))
+
+local canvas = barracuda:new_canvas()
+s1:append_ga(canvas)
+local drv = barracuda:get_driver()
+drv:ga_to_hbox(canvas, "mybox")
+}
+\vskip 10pt
+12345678901231 is \vrule A\vrule\box\mybox \vrule A\vrule
+
+\directlua{
+local barcode = barracuda:barcode()
+local enc = assert(barcode:enc_by_name("i2of5-ITF14"))
+local s1 = assert(enc:from_string("1234567890123"))
+
+local canvas = barracuda:new_canvas()
+s1:append_ga(canvas)
+local drv = barracuda:get_driver()
+drv:ga_to_hbox(canvas, "mybox")
+}
+\vskip 10pt
+12345678901231 is \vrule A\vrule\box\mybox \vrule A\vrule
+
+\directlua{
+local barcode = barracuda:barcode()
+local enc = assert(barcode:enc_by_name("i2of5-ITF14"))
+local s1 = assert(enc:from_string("(12) 34 56 78 90 12 3"))
+
+local canvas = barracuda:new_canvas()
+s1:append_ga(canvas)
+local drv = barracuda:get_driver()
+drv:ga_to_hbox(canvas, "mybox")
+}
+\vskip 10pt
+12345678901231 is \vrule A\vrule\box\mybox \vrule A\vrule
+
+\bye
+
+


Property changes on: trunk/Master/texmf-dist/doc/luatex/barracuda/test/test-i2of5/002-ITF14-test.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/scripts/barracuda/barracuda.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/barracuda.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/barracuda.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -2,7 +2,7 @@
 --
 -- Encode a message into a barcode symbol, in Lua or within a LuaTeX source file
 --
--- Copyright (C) 2019 Roberto Giacomelli
+-- 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
@@ -19,14 +19,15 @@
 -- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 -- Basic Conventions:
--- fields that start with an undercore are private
+-- 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 = {
-    _VERSION     = "barracuda v0.0.9.1",
     _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",
@@ -40,13 +41,20 @@
 local Barcode = Barracuda._barcode
 Barcode._libgeo = Barracuda._libgeo
 
--- encoder builder
-function Barracuda:get_barcode_class() --> Barcode class object
+-- return a reference of Barcode abstract class
+function Barracuda:barcode() --> Barcode class object
     return self._barcode
 end
 
--- where we place output driver library
-function Barracuda:get_driver() --> Driver object, err
+-- 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
@@ -63,54 +71,83 @@
 -- panic on error
 
 -- save barcode as a graphic external file
-function Barracuda:save(bc_type, data, filename, id_drv)
-    local barcode = self:get_barcode_class()
-    local enc, err = barcode:new_encoder(bc_type)
-    assert(enc, err)
+-- '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)
-    local symb
     if arg_data == "number" then
         local err_data
         symb, err_data = enc:from_uint(data)
-        asser(symb, err_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 'data' type")
+        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, out_err = driver:save(id_drv, canvas, filename)
-    assert(ok, out_err)
+    local ok, err = driver:save(id_drv, canvas, filename)
+    assert(ok, err)
 end
 
 -- this is a only LuaTeX method
-function Barracuda:hbox(bc_type, data, box_name)
-    local barcode = self:get_barcode_class()
-    local enc, err = barcode:new_encoder(bc_type)
-    assert(enc, err)
+-- '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)
-    local symb
     if arg_data == "number" then
         local err_data
         symb, err_data = enc:from_uint(data)
-        asser(symb, err_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 'data' type")
+        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_hbox = driver:ga_to_hbox(canvas, box_name)
-    assert(ok, err_hbox)
+    local ok, err = driver:ga_to_hbox(canvas, box_name)
+    assert(ok, err)
 end
 
 return Barracuda

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-barcode.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-barcode.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-barcode.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,6 +1,6 @@
 
--- Barcode abstract class
--- Copyright (C) 2019 Roberto Giacomelli
+-- Barcode Abstract Class
+-- Copyright (C) 2020 Roberto Giacomelli
 -- Please see LICENSE.TXT for any legal information about present software
 
 local Barcode = {
@@ -18,11 +18,15 @@
     i2of5   = "lib-barcode.brcd-i2of5",   -- Interleaved 2 of 5
 }
 Barcode._builder_instances = {} -- encoder builder instances repository
+Barcode._encoder_instances = {} -- encoder instances repository
 
 -- common parameters to all the barcode objects
+Barcode._super_par_order = {
+    "ax",
+    "ay",
+}
 Barcode._super_par_def = {}
 local pardef = Barcode._super_par_def
-
 -- set an Anchor point (ax, ay) relatively to the barcode bounding box
 -- without considering any text object
 -- ax = 0, ay = 0 is the lower left corner of the symbol
@@ -32,7 +36,6 @@
     default = 0.0,
     unit = "sp", -- scaled point
     isReserved = false,
-    order = 1,
     fncheck = function (self, ax, _) --> boolean, err
         if ax >= 0.0 and ax <= 1.0 then return true, nil end
         return false, "[OutOfRange] 'ax' out of [0, 1] interval"
@@ -43,7 +46,6 @@
     default = 0.0,
     unit = "sp", -- scaled point
     isReserved = false,
-    order = 2,
     fncheck = function (self, ay, _) --> boolean, err
         if ay >= 0.0 and ay <= 1.0 then return true, nil end
         return false, "[OutOfRange] 'ay' out of [0, 1] interval"
@@ -54,121 +56,204 @@
 
 -- Barcode methods
 
--- stateless iterator troughtout the ordered parameters collection
-local function p_iter(state, i)
-    i = i + 1
-    local t = state[i]
-    if t then
-        return i, t
+-- extract id from an encoder 'tree name'
+local function parse_treename(treename) --> fam, var, name, err
+    if not type(treename) == "string" then
+        return nil, nil, nil, "[ArgErr] 'treename' arg must be a string"
     end
+    if treename:find(" ") then
+        return nil, nil, nil,
+            "[ArgErr] spaces are not allowed in an encoder identifier"
+    end
+    local fam, var, name
+    -- family name extraction
+    local idash = treename:find("-")
+    local icolon = treename:find(":")
+    if idash then
+        fam = treename:sub(1, idash - 1)
+    else
+        if icolon then
+            fam = treename:sub(1, icolon - 1)
+        else
+            fam = treename
+        end
+    end
+    if fam == "" then
+        return nil, nil, nil, "[ArgErr] empty encoder id"
+    end
+    if idash then
+        if icolon then
+            var = treename:sub(idash + 1, icolon - 1)
+        else
+            var = treename:sub(idash + 1)
+        end
+        if var == "" then
+            return nil, nil, nil, "[ArgErr] empty 'variant' encoder id"
+        end
+    end
+    if icolon then
+        name = treename:sub(icolon + 1)
+        if name == "" then
+            return nil, nil, nil, "[ArgErr] empty 'name' after colon"
+        end
+        if name:find("-") then
+            return nil, nil, nil, "[ArgErr] the name mustn't contain a dash"
+        end
+        if name:find(":") then
+            return nil, nil, nil, "[ArgErr] the name mustn't contain a colon"
+        end
+    end
+    return fam, var, name, nil
 end
 
 -- main iterator on parameter definitions
-function Barcode:param_ord_iter()
+-- optional argument 'filter' eventually excludes some parameters
+-- "*all" -> encoder and Barcode parameters
+-- "*enc" -> only encoder parameters
+-- "*super" -> only Barcode superclass paramenters
+function Barcode:param_ord_iter(filter)
+    local is_iter_enc, is_iter_super = true, true
+    if filter then
+        if type(filter) ~= "string" then
+            error("[param_ord_iter] 'filter' is not a string")
+        elseif filter == "*enc" then
+            is_iter_super = false
+        elseif filter == "*super" then
+            is_iter_enc = false
+        elseif filter ~= "*all" then
+            error("[param_ord_iter] 'filter' enumeration '"..filter.."' not found")
+        end
+    end
     local state = {}
-    -- append family parameter
-    local p2_family  = self._par_def -- base family parameters
-    local fam_len = 0
-    if p2_family then
-        for pname, pdef in pairs(p2_family) do
-            state[pdef.order] = {
-                pname   = pname,
-                pdef    = pdef,
-                isSuper = false,
-            }
-            fam_len = fam_len + 1
+    local ordkey = {}
+    if is_iter_enc then
+        local var = self._variant
+        local p2_family  = self._par_def -- base family parameters
+        local p2_family_var
+        if var then
+            local pvar = "_par_def_"..var
+            p2_family_var = self[pvar] -- variant specific family parameters
         end
-        assert(fam_len == #state)
+        local p2_idlist = self._par_order
+        if p2_idlist then -- family parameters
+            for i, pid in ipairs(p2_idlist) do
+                if ordkey[pid] then
+                    error("[Ops] duplicated entry in parameter ordered list")
+                end
+                ordkey[pid] = true
+                local pdef -- parameter definition
+                if var and p2_family_var then
+                    pdef = p2_family_var[pid]
+                end
+                pdef = pdef or p2_family[pid]
+                assert(pdef, "[Ops] parameter definition for option '"..pid.."' not found")
+                state[i] = {
+                    pname   = pid,
+                    pdef    = pdef,
+                    isSuper = false,
+                }
+            end
+        end
+        -- append variant parameters
+        if var and self._par_def_variant then
+            local p2_variant = self._par_def_variant[var]
+            if p2_variant then
+                local p2_idlist_var = self._par_variant_order[var] -- parameters' list
+                if p2_idlist_var then
+                    for _, pid in ipairs(p2_idlist_var) do
+                        if ordkey[pid] then
+                            error("[Ops] duplicated entry in variant parameter ordered list")
+                        end
+                        ordkey[pid] = true
+                        local pdef = p2_variant[pid] -- parameter definition
+                        assert(pdef, "[Ops] parameter definition for option '"..pid.."' not found")
+                        state[#state + 1] = {
+                            pname   = pid,
+                            pdef    = pdef,
+                            isSuper = false,
+                        }
+                    end
+                end
+            end
+        end
     end
-    -- append the variant parameters
-    local var_len = 0
-    local var = self._variant
-    if var then -- specific variant parameters
-        local p2_variant = assert(self._par_def_variant[var])
-        for pname, pdef in pairs(p2_variant) do
-            if state[pname] then
-                error("[InternalErr] overriding paramenter '"..pname.."'")
+    if is_iter_super then
+        -- append the super class parameter to the iterator state
+        local p1_idlist_super = self._super_par_order
+        local p1_super = self._super_par_def
+        for _, pid in ipairs(p1_idlist_super) do
+            if ordkey[pid] then
+                error("[Ops] duplicated entry in superclass parameter ordered list")
             end
-            state[pdef.order + fam_len] = {
-                pname   = pname,
+            ordkey[pid] = true
+            local pdef = p1_super[pid] -- parameter definition
+            assert(pdef, "[Ops] parameter definition for option '"..pid.."' not found")
+            state[#state + 1] = {
+                pname   = pid,
                 pdef    = pdef,
-                isSuper = false,
+                isSuper = true,
             }
-            var_len = var_len + 1
         end
-        assert(fam_len + var_len == #state)
     end
-    -- append the super class parameter to the iterator state
-    local p1 = self._super_par_def
-    local super_len = 0
-    for pname, pdef in pairs(p1) do
-        if state[pname] then
-            error("[InternalError] overriding paramenter name '"..pname.."'")
+    -- stateless iterator troughtout the ordered parameters collection
+    local p_iter = function (st, i)
+        i = i + 1
+        local t = st[i]
+        if t then
+            return i, t
         end
-        state[fam_len + var_len + pdef.order] = {
-            pname = pname,
-            pdef  = pdef,
-            isSuper = true,
-        }
-        super_len = super_len + 1
     end
-    assert(super_len + fam_len + var_len == #state)
     return p_iter, state, 0
 end
 
 -- encoder costructor
 -- Symbology can be a family with many variants. This is represented by the
--- first argument 'bc_type' formatted as <family>-<variant>.
---     in more details:
---     <family id><dash char><variant id> if there are variants
---     <encoder id> if not
--- i.e. when 'bc_type' is the string "ean-13", "ean" is the barcode family and
+-- first argument 'tree_name' formatted as <family>-<variant>:<id>.
+-- i.e. when 'tree_name' is the string "ean-13", "ean" is the barcode family and
 -- "13" is its variant name.
--- For whose barcodes that do not have variants, 'bc_type' is simply the endoder id
--- such as "code128".
--- 'id_enc' is an optional identifier useful to retrive an encoder reference later
--- 'opt'    is an optional table with the user-defined parameters setting up encoders
---
-function Barcode:new_encoder(bc_type, id_enc, opt) --> object, err
+-- For whose barcodes that do not have variants, 'treename' is simply the
+-- encoder id such as in the case of "code128".
+-- <id> is an optional identifier useful if there are more than one encoders of
+-- the same type
+-- 'opt' is an optional table with the user-defined parameters setting up
+-- encoders
+function Barcode:new_encoder(treename, opt) --> object, err
     -- argument checking
-    if type(bc_type) ~= "string" then
-        return nil, "[ArgErr] 'bc_type' is not a string"
+    local family, variant, enc_name, err = parse_treename(treename)
+    if err then
+        return err
     end
-    local pdash = string.find(bc_type, "-")
-    local family, variant
-    if pdash then
-        family  = string.sub(bc_type, 1, pdash - 1)
-        variant = string.sub(bc_type, pdash + 1)
-    else
-        family = bc_type
-    end
     local av_enc = self._available_enc
-    if not av_enc[family] then -- is the barcode type a real module?
-        return nil, "[Err] barcode type '"..family.."' not found"
+    local mod_path = av_enc[family]
+    -- check family identifier
+    if not mod_path then
+        return nil, "[ArgErr] barcode family '"..family.."' not found"
     end
-    if id_enc == nil then
-        id_enc = (variant or "") .. "_noname"
-    elseif type(id_enc) ~= "string" then
-        return nil, "[ArgErr] provided 'id_enc' is not a string"
-    end
-    if type(opt) == "table" or opt == nil then
-        opt = opt or {}
-    else
-        return nil, "[ArgErr] provided 'opt' is wrong"
-    end
+    -- retrive/load the builder
+    local builder
     local tenc = self._builder_instances
-    local builder;
     if tenc[family] then -- is the encoder builder already loaded?
         builder = tenc[family]
-    else -- loading the encoder builder
-        local mod_path = av_enc[family]
+    else -- load the encoder builder
         builder = require(mod_path)
-        tenc[family] = assert(builder, "[InternalErr] module not found!")
-        builder._enc_instances = {}
+        tenc[family] = builder
     end
-    if builder._enc_instances[id_enc] then
-        return nil, "[Err] 'id_enc' already present"
+    -- check the variant identifier
+    local av_var = builder._id_variant
+    if av_var and variant and (not av_var[variant]) then
+        local fmt = "[ArgErr] family '%s' does not have '%s' variant"
+        return nil, string.format(fmt, family, variant)
     end
+    -- check unique encoder identifier
+    local enc_archive = self._encoder_instances
+    if enc_archive[treename] then
+        return nil, "[Err] encoder name '"..treename.."' already exists"
+    end
+    if type(opt) == "table" or opt == nil then
+        opt = opt or {}
+    else
+        return nil, "[ArgErr] provided 'opt' is not a table"
+    end
     local enc = {} -- the new encoder
     enc.__index = enc
     enc._variant = variant
@@ -180,8 +265,8 @@
             return self[k]
         end
     })
-    builder._enc_instances[id_enc] = enc
-    -- param defition
+    enc_archive[treename] = enc
+    -- parameters definition
     for _, tpar in enc:param_ord_iter() do
         local pname   = tpar.pname
         local pdef    = tpar.pdef
@@ -188,11 +273,11 @@
         local isSuper = tpar.isSuper
         local val = opt[pname] -- param = val
         if val ~= nil then
-            local ok, err = pdef:fncheck(val, enc)
+            local ok, perr = pdef:fncheck(val, enc)
             if ok then
                 enc[pname] = val
-            else -- error!
-                return nil, err
+            else -- parameter error!
+                return nil, perr
             end
         else
             -- load the default value of <pname>
@@ -206,49 +291,30 @@
             end
         end
     end
-    if enc.config then -- this must be called after the parameter definition
-        enc:config(variant)
+    if enc._config then -- this must be called after the parameter definition
+        enc:_config()
     end
     return enc, nil
 end
 
--- retrive encoder object already created
--- 'name' is optional in case you didn't assign one to the encoder
-function Barcode:enc_by_name(bc_type, name) --> <encoder object>, <err>
-    if type(bc_type) ~= "string" then
-        return nil, "[ArgErr] 'bc_type' must be a string"
+-- retrive an encoder object already created
+-- 'trename' is the special identifier of the encoder
+function Barcode:enc_by_name(treename) --> <encoder object>, <err>
+    -- argument checking
+    local _family, _variant, _enc_name, err = parse_treename(treename)
+    if err then
+        return nil, err
     end
-    local pdash = string.find(bc_type, "-")
-    local family, variant
-    if pdash then
-        family  = string.sub(bc_type, 1, pdash - 1)
-        variant = string.sub(bc_type, pdash + 1)
+    local enc = self._encoder_instances[treename]
+    if enc then
+        return enc, nil
     else
-        family = bc_type
+        return nil, "[Err] encoder '"..treename.."' not found"
     end
-    local av_enc = self._available_enc
-    if not av_enc[family] then -- is the barcode type a real module?
-        return nil, "[Err] barcode type '"..family.."' not found"
-    end
-    local builder = self._builder_instances[family]
-    if builder == nil then
-        return nil, "[Err] enc builder '"..family.."' not loaded, use 'new_encoder()' method"
-    end
-    if name == nil then
-        name = (variant or "") .. "_noname"
-    elseif type(name) ~= "string" then
-        return nil, "[ArgErr] 'name' must be a string"
-    end
-    local repo = builder._enc_instances
-    local enc = repo[name]
-    if enc == nil then
-        return nil, "[Err] encoder '"..name.."' not found"
-    else
-        return enc, nil
-    end
 end
 
--- base constructors common to all the encoders
+-- base methods common to all the encoders
+
 -- for numeric only simbology
 function Barcode:_check_char(c) --> elem, err
     if type(c) ~= "string" or #c ~= 1 then
@@ -260,12 +326,13 @@
     end
     return n, nil
 end
+--
 function Barcode:_check_digit(n) --> elem, err
     if type(n) ~= "number" then
-        return nil, "[InternalErr] not a number"
+        return nil, "[ArgErr] not a number"
     end
     if n < 0 or n > 9 then
-        return nil, "[InternalErr] not a digit"
+        return nil, "[ArgErr] not a digit"
     end
     return n, nil
 end
@@ -272,7 +339,6 @@
 
 -- not empty string --> Barcode object
 function Barcode:from_string(symb, opt) --> object, err
-    assert(self._check_char, "[InternalErr] undefined _check_char() method")
     if type(symb) ~= "string" then
         return nil, "[ArgErr] 'symb' is not a string"
     end
@@ -281,11 +347,12 @@
     end
     local chars = {}
     local len = 0
+    local parse_state = {}
     for c in string.gmatch(symb, ".") do
-        local elem, err = self:_check_char(c)
+        local elem, err = self:_check_char(c, parse_state)
         if err then
             return nil, err
-        else
+        elseif elem then
             chars[#chars+1] = elem
             len = len + 1
         end
@@ -307,7 +374,7 @@
         end
     end
     if o._finalize then
-        local ok, e = o:_finalize()
+        local ok, e = o:_finalize(parse_state)
         if not ok then return nil, e end
     end
     return o, nil
@@ -315,9 +382,12 @@
 
 -- positive integer --> Barcode object
 function Barcode:from_uint(n, opt) --> object, err
-    assert(self._check_digit, "[InternalErr] undefined _check_digit() method")
-    if type(n) ~= "number" then return nil, "[ArgErr] 'n' is not a number" end
-    if n < 0 then return nil, "[ArgErr] 'n' must be a positive integer" end
+    if type(n) ~= "number" then
+        return nil, "[ArgErr] 'n' is not a number"
+    end
+    if n < 0 then
+        return nil, "[ArgErr] 'n' must be a positive integer"
+    end
     if n - math.floor(n) ~= 0 then
         return nil, "[ArgErr] 'n' is not an integer"
     end
@@ -325,23 +395,28 @@
         return nil, "[ArgErr] 'opt' is not a table"
     end
     local digits = {}
+    local parse_state = {}
     local i = 0
     if n == 0 then
-        local elem, err = self:_check_digit(0)
+        local elem, err = self:_check_digit(0, parse_state)
         if err then
             return nil, err
         end
-        digits[1] = elem
-        i = 1
+        if elem then
+            digits[1] = elem
+            i = 1
+        end
     else
         while n > 0 do
             local d = n % 10
-            i = i + 1
-            local elem, err = self:_check_digit(d)
+            local elem, err = self:_check_digit(d, parse_state)
             if err then
                 return nil, err
             end
-            digits[i] = elem
+            if elem then
+                i = i + 1
+                digits[i] = elem
+            end
             n = (n - d) / 10
         end
         for k = 1, i/2  do -- reverse the array
@@ -368,7 +443,7 @@
         end
     end
     if o._finalize then
-        local ok, e = o:_finalize()
+        local ok, e = o:_finalize(parse_state)
         if not ok then return nil, e end
     end
     return o, nil
@@ -458,20 +533,29 @@
         param       = {},
     }
     local tpar   = info.param
-    for _, pardef in self:param_ord_iter() do
-        local id   = pardef.pname
-        local pdef = pardef.pdef
+    for _, pdef in self:param_ord_iter() do
+        local id   = pdef.pname
+        local def = pdef.pdef
         tpar[#tpar + 1] = {
             name       = id,
             descr      = nil, -- TODO:
             value      = self[id],
-            isReserved = pdef.isReserved,
-            unit       = pdef.unit,
+            isReserved = def.isReserved,
+            unit       = def.unit,
         }
     end
     return info
 end
 
+-- return the code being represented as a string
+-- or nil if the method is called from Barcode abstract class
+function Barcode:get_code() --> string|nil
+    local code = self._code_data
+    if code then
+        return table.concat(code)
+    end
+end
+
 -- make accessible by name parameter values
 -- id: parameter identifier
 function Barcode:get_param(id) --> value, err
@@ -509,11 +593,10 @@
     else
         return false, "[ArgErr] param name must be a string"
     end
-    -- preparing to the checking process
+    -- preparing the check process
     local cktab  = {}
     local ckparam = {}
-    -- checking process
-    for _, tpar in self:param_ord_iter() do
+    for _, tpar in self:param_ord_iter() do -- checking process
         local pname = tpar.pname
         local pdef  = tpar.pdef
         local val = targ[pname] -- par = val

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-code128.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-code128.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-code128.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,5 +1,5 @@
 -- Code128 barcode generator module
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 --
 -- All dimension must be in scaled point (sp)
 -- every fields that starts with an undercore sign are intended as private
@@ -41,6 +41,11 @@
 }
 
 -- parameters definition
+Code128._par_order = {
+    "xdim",
+    "ydim",
+    "quietzone_factor",
+}
 Code128._par_def = {}
 local pardef = Code128._par_def
 
@@ -49,7 +54,6 @@
     default    = 0.21 * 186467, -- X dimension
     unit       = "sp", -- scaled point
     isReserved = true,
-    order      = 1, -- the one first to be modified
     fncheck    = function (self, x, _) --> boolean, err
         if x >= self.default then
             return true, nil
@@ -63,7 +67,6 @@
     default    = 10 * 186467, -- Y dimension
     unit       = "sp",
     isReserved = false,
-    order      = 2,
     fncheck    = function (self, y, tpar) --> boolean, err
         local xdim = tpar.xdim
         if y >= 10*xdim then
@@ -78,7 +81,6 @@
     default    = 10,
     unit       = "absolute-number",
     isReserved = false,
-    order      = 3,
     fncheck    = function (self, z, _) --> boolean, err
         if z >= 10 then
             return true, nil
@@ -89,7 +91,7 @@
 }
 
 -- create vbar objects
-function Code128:config() --> ok, err
+function Code128:_config() --> ok, err
     -- build Vbar object for the start/stop symbol
     local mod = self.xdim
     local sc = self._codeset.stopChar -- build the stop char

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-code39.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-code39.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-code39.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,5 +1,5 @@
 -- Code39 barcode encoder implementation
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 --
 -- All dimensions must be in scaled point (sp)
 -- every fields that starts with an undercore sign are intended as private
@@ -30,6 +30,18 @@
 Code39._star_def  = 112121121 -- '*' start/stop character
 
 -- parameters definition
+Code39._par_order = {
+    "module",
+    "ratio",
+    "quietzone",
+    "interspace",
+    "height",
+    "text_enabled",
+    "text_vpos",
+    "text_hpos",
+    "text_gap",
+    "text_star",
+}
 Code39._par_def = {}
 local pardef = Code39._par_def
 
@@ -45,7 +57,6 @@
     default    = 7.5 * 0.0254 * 186467, -- 7.5 mils (sp) unit misure,
     unit       = "sp", -- scaled point
     isReserved = true,
-    order      = 1, -- the one first to be modified
     fncheck    = function (self, mod, _) --> boolean, err
         if mod >= self.default then return true, nil end
         return false, "[OutOfRange] too small value for module"
@@ -62,7 +73,6 @@
     default    = 2.0, -- the minimum
     unit       = "absolute-number",
     isReserved = true,
-    order      = 2,
     fncheck    = function (self, ratio, tparcheck) --> boolean, err
         local mils = 0.0254 * 186467
         local mod = tparcheck.module
@@ -85,7 +95,6 @@
     default    = 2.54 * 186467, -- 0.1 inches equal to 100*mils
     unit       = "sp", -- scaled point
     isReserved = false,
-    order      = 3,
     fncheck    = function (self, qz, tparcheck) --> boolean, err
         local mils = 0.0254 * 186467
         local mod = tparcheck.module
@@ -109,7 +118,6 @@
     default    = 7.5 * 0.0254 * 186467, -- 1 module, for quality printer
     unit       = "sp", -- scaled point
     isReserved = false,
-    order      = 4,
     fncheck    = function (self, igw, tparcheck) --> boolean, err
         local mod = tparcheck.module
         if igw >= mod then return true, nil end
@@ -128,7 +136,6 @@
     default    = 8 * 186467, -- 8 mm -- TODO: better assessment for symbol length
     unit       = "sp", -- scaled point
     isReserved = false,
-    order      = 5,
     fncheck = function (self, h, _) --> boolean, err
         local mils = 0.0254 * 186467
         if h >= 250*mils then return true, nil end
@@ -141,7 +148,6 @@
     -- enable/disable a text label upon the barcode symbol
     default    = true,
     isReserved = false,
-    order      = 6,
     fncheck    = function (self, flag, _) --> boolean, err
         if type(flag) == "boolean" then
             return true, nil
@@ -155,7 +161,6 @@
 pardef.text_vpos = { -- enumeration
     default    = "bottom",
     isReserved = false,
-    order      = 7,
     policy_enum = {
         top    = true, -- place text at the top of symbol
         bottom = true, -- place text under the symbol
@@ -175,7 +180,6 @@
 pardef.text_hpos = { -- enumeration
     default    = "left",
     isReserved = false,
-    order      = 8,
     policy_enum = {
         left = true,
         center = true,
@@ -197,7 +201,6 @@
 pardef.text_gap = {
     default    = 2.2 * 65536, -- 2.2 pt
     isReserved = false,
-    order      = 9,
     unit       = "em", --> TODO: please put this under further analisys asap
     fncheck    = function(self, g, _) --> boolean, err
         if type(g) == "number" then
@@ -216,8 +219,7 @@
 pardef.text_star = {
     default    = false,
     isReserved = false,
-    order      = 10,
-    fncheck    = function(self, flag, _) --> boolean, err
+    fncheck    = function(_self, flag, _) --> boolean, err
         if type(flag) == "boolean" then
             return true, nil
         else
@@ -227,7 +229,7 @@
 }
 
 -- configuration function
-function Code39:config() --> ok, err
+function Code39:_config() --> ok, err
     -- build Vbar object for the start/stop symbol
     local mod, ratio = self.module, self.ratio
     local n_star = self._star_def
@@ -239,7 +241,7 @@
 -- overriding Barcode method
 function Code39:_check_char(c) --> elem, err
     if type(c) ~= "string" or #c ~= 1 then
-        return nil, "[InternalErr] invalid char"
+        return nil, "[ArgErr] invalid char"
     end
     local symb_def = self._symb_def
     local n = symb_def[c]
@@ -253,12 +255,12 @@
 -- overriding Barcode method
 function Code39:_check_digit(n) --> elem, err
     if type(n) ~= "number" then
-        return nil, "[InteranlErr] not a number"
+        return nil, "[ArgErr] not a number"
     end
     if n < 0 or n > 9 then
-        return nil, "[InternalErr] not a digit"
+        return nil, "[ArgErr] not a digit"
     end
-    return tostring(n), nil
+    return string.char(n + 48), nil
 end
 
 function Code39:_finalize() --> ok, err

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-ean.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-ean.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-ean.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,24 +1,31 @@
 -- EAN family barcode generator
 --
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 -- see LICENSE.txt file
---
--- variant identifiers of the EAN family barcodes:
--- "13"   EAN13
--- "8"    EAN8
--- "5"    EAN5 add-on
--- "2"    EAN2 add-on
--- "13+5" EAN13 with EAN5 add-on
--- "13+2" EAN13 with EAN2 add-on
--- "8+5"  EAN8 with EAN5 add-on
--- "8+2"  EAN8 with EAN2 add-on
 
 local EAN = {
-    _VERSION     = "ean v0.0.5",
+    _VERSION     = "ean v0.0.6",
     _NAME        = "ean",
     _DESCRIPTION = "EAN barcode encoder",
 }
 
+EAN._id_variant = {
+    ["13"]   = true, -- EAN13
+    ["8"]    = true, -- EAN8
+    ["5"]    = true, -- EAN5 add-on
+    ["2"]    = true, -- EAN2 add-on
+    ["13+5"] = true, -- EAN13 with EAN5 add-on
+    ["13+2"] = true, -- EAN13 with EAN2 add-on
+    ["8+5"]  = true, -- EAN8 with EAN5 add-on
+    ["8+2"]  = true, -- EAN8 with EAN2 add-on
+    ["isbn"] = true, -- ISBN 13 digits
+    ["isbn+2"] = true, -- ISBN 13 digits with an EAN2 add-on
+    ["isbn+5"] = true, -- ISBN 13 digits with an EAN2 add-on
+    ["issn"] = true, -- ISSN 13 digits
+    ["issn+2"] = true, -- ISSN 13 digits with an EAN2 add-on
+    ["issn+5"] = true, -- ISSN 13 digits with an EAN2 add-on
+}
+
 EAN._codeset_seq = {-- 1 -> A, 2 -> B, 3 -> C
 [0]={1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3},
     {1, 1, 2, 1, 2, 2, 3, 3, 3, 3, 3, 3},
@@ -58,17 +65,26 @@
 EAN._start = {111, true}
 EAN._stop  = {11111, false}
 
--- family parameters
+-- common family parameters
+EAN._par_order = {
+    "mod",
+    "height",
+    "quietzone_left_factor",
+    "quietzone_right_factor",
+    "bars_depth_factor",
+    "text_enabled",
+    "text_ygap_factor",
+    "text_xgap_factor",
+}
+EAN._par_def = {}
+local pardef = EAN._par_def
 
-EAN._par_def = {}; local pardef = EAN._par_def
-
 -- standard module is 0.33 mm but it can vary from 0.264 to 0.66mm
 pardef.mod = {
     default    = 0.33 * 186467, -- (mm to sp) X dimension (original value 0.33)
     unit       = "sp", -- scaled point
     isReserved = true,
-    order      = 1, -- the one first to be modified
-    fncheck    = function (self, x, _) --> boolean, err
+    fncheck    = function (_self, x, _) --> boolean, err
         local mm = 186467
         local min, max = 0.264 * mm, 0.660 * mm
         if x < min then
@@ -84,7 +100,6 @@
     default    = 22.85 * 186467, -- 22.85 mm
     unit       = "sp",
     isReserved = false,
-    order      = 2,
     fncheck    = function (self, h, _) --> boolean, err
         if h > 0 then
             return true, nil
@@ -98,8 +113,7 @@
     default    = 11,
     unit       = "absolute-number",
     isReserved = false,
-    order      = 3,
-    fncheck    = function (self, qzf, _) --> boolean, err
+    fncheck    = function (_self, qzf, _) --> boolean, err
         if qzf > 0 then
             return true, nil
         else
@@ -112,8 +126,7 @@
     default    = 7,
     unit       = "absolute-number",
     isReserved = false,
-    order      = 4,
-    fncheck    = function (self, qzf, _) --> boolean, err
+    fncheck    = function (_self, qzf, _) --> boolean, err
         if qzf > 0 then
             return true, nil
         else
@@ -126,8 +139,7 @@
     default    = 5,
     unit       = "absolute-number",
     isReserved = false,
-    order      = 5,
-    fncheck    = function (self, b, _) --> boolean, err
+    fncheck    = function (_self, b, _) --> boolean, err
         if b >= 0 then
             return true, nil
         else
@@ -140,8 +152,7 @@
 pardef.text_enabled = { -- boolean type
     default    = true,
     isReserved = false,
-    order      = 6,
-    fncheck    = function (self, flag, _) --> boolean, err
+    fncheck    = function (_self, flag, _) --> boolean, err
         if type(flag) == "boolean" then
             return true, nil
         else
@@ -154,8 +165,7 @@
     default    = 1.0,
     unit       = "absolute-number",
     isReserved = false,
-    order      = 7,
-    fncheck    = function (self, t, _) --> boolean, err
+    fncheck    = function (_self, t, _) --> boolean, err
         if t >= 0 then
             return true, nil
         else
@@ -168,8 +178,7 @@
     default    = 0.75,
     unit       = "absolute-number",
     isReserved = false,
-    order      = 8,
-    fncheck    = function (self, t, _) --> boolean, err
+    fncheck    = function (_self, t, _) --> boolean, err
         if t >= 0 then
             return true, nil
         else
@@ -179,7 +188,44 @@
 }
 
 -- variant parameters
-
+EAN._par_variant_order = {
+    ["13"]   = {}, -- EAN13
+    ["8"]    = {}, -- EAN8
+    ["5"]    = {}, -- add-on EAN5
+    ["2"]    = {}, -- add-on EAN2
+    ["isbn"] = { -- ISBN 13 digits
+        "text_isbn_enabled",
+        "text_isbn_ygap_factor",
+    },
+    ["13+5"] = {"addon_xgap_factor",}, -- EAN13 with EAN5 add-on
+    ["13+2"] = {"addon_xgap_factor",}, -- EAN13 with EAN2 add-on
+    ["8+5"]  = {"addon_xgap_factor",}, -- EAN8 with EAN5 add-on
+    ["8+2"]  = {"addon_xgap_factor",}, -- EAN8 with EAN2 add-on
+    ["isbn+2"] = { -- ISBN 13 digits with an EAN2 add-on
+        "text_isbn_enabled",
+        "text_isbn_ygap_factor",
+        "addon_xgap_factor",
+    },
+    ["isbn+5"] = { -- ISBN 13 digits with an EAN2 add-on
+        "text_isbn_enabled",
+        "text_isbn_ygap_factor",
+        "addon_xgap_factor",
+    },
+    ["issn"] = { -- ISSN 13 digits, International Standard Serial Number
+        "text_issn_enabled",
+        "text_issn_ygap_factor",
+    },
+    ["issn+2"] = { -- ISSN 13 digits with an EAN2 add-on
+        "text_issn_enabled",
+        "text_issn_ygap_factor",
+        "addon_xgap_factor",
+    },
+    ["issn+5"] = { -- ISSN 13 digits with an EAN2 add-on
+        "text_issn_enabled",
+        "text_issn_ygap_factor",
+        "addon_xgap_factor",
+    },
+}
 EAN._par_def_variant = {
     ["13"]   = {}, -- EAN13
     ["8"]    = {}, -- EAN8
@@ -189,17 +235,23 @@
     ["13+2"] = {}, -- EAN13 with EAN2 add-on
     ["8+5"]  = {}, -- EAN8 with EAN5 add-on
     ["8+2"]  = {}, -- EAN8 with EAN2 add-on
+    -- ISBN
+    ["isbn"] = {}, -- ISBN 13 digits
+    ["isbn+2"] = {}, -- ISBN 13 digits with an EAN2 add-on
+    ["isbn+5"] = {}, -- ISBN 13 digits with an EAN2 add-on
+    -- ISSN
+    ["issn"] = {}, -- ISBN 13 digits
+    ["issn+2"] = {}, -- ISBN 13 digits with an EAN2 add-on
+    ["issn+5"] = {}, -- ISBN 13 digits with an EAN2 add-on
 }
+local par_def_var = EAN._par_def_variant
 
--- ean13_pardef.text_ISBN parameter -- TODO:
-
--- EAN 13/8 + add-on parameters
-local addon_xgap_factor = {-- distance between symbol
+-- EAN ISBN/ISSN/13/8 + add-on parameters
+local addon_xgap_factor = {-- distance between main and add-on symbol
     default    = 10,
     unit       = "absolute-number",
     isReserved = false,
-    order      = 1,
-    fncheck    = function (self, t, _) --> boolean, err
+    fncheck    = function (_self, t, _) --> boolean, err
         if t >= 7 then
             return true, nil
         else
@@ -207,11 +259,79 @@
         end
     end,
 }
-EAN._par_def_variant["13+5"].addon_xgap_factor = addon_xgap_factor
-EAN._par_def_variant["13+2"].addon_xgap_factor = addon_xgap_factor
-EAN._par_def_variant["8+5"].addon_xgap_factor = addon_xgap_factor
-EAN._par_def_variant["8+2"].addon_xgap_factor = addon_xgap_factor
+par_def_var["13+5"].addon_xgap_factor = addon_xgap_factor
+par_def_var["13+2"].addon_xgap_factor = addon_xgap_factor
+par_def_var["8+5"].addon_xgap_factor = addon_xgap_factor
+par_def_var["8+2"].addon_xgap_factor = addon_xgap_factor
+-- ISBN
+par_def_var["isbn+5"].addon_xgap_factor = addon_xgap_factor
+par_def_var["isbn+2"].addon_xgap_factor = addon_xgap_factor
+-- ISSN
+par_def_var["issn+5"].addon_xgap_factor = addon_xgap_factor
+par_def_var["issn+2"].addon_xgap_factor = addon_xgap_factor
 
+-- text_ISBN_* parameter
+-- enable/disable a text ISBN label upon the barcode symbol
+-- if it is "auto" the isbn text appears or not and depends by input code
+local isbn_text_enabled = { -- boolean type
+    default    = "auto",
+    isReserved = false,
+    fncheck    = function (_self, flag, _) --> boolean, err
+        if type(flag) == "boolean" or
+            (type(flag) == "string" and flag == "auto") then
+            return true, nil
+        else
+            return false, "[TypeErr] not a boolean or 'auto' for text_isbn_enabled"
+        end
+    end,
+}
+-- ISBN
+par_def_var["isbn+5"].text_isbn_enabled = isbn_text_enabled
+par_def_var["isbn+2"].text_isbn_enabled = isbn_text_enabled
+par_def_var["isbn"].text_isbn_enabled = isbn_text_enabled
+
+-- text_ISSN_* parameter
+-- enable/disable a text ISBN label upon the barcode symbol
+-- if it is "auto" the isbn/issn text appears or not and depends by input code
+local issn_text_enabled = { -- boolean type
+    default    = true,
+    isReserved = false,
+    fncheck    = function (_self, flag, _) --> boolean, err
+        if type(flag) == "boolean" then
+            return true, nil
+        else
+            return false, "[TypeErr] not a boolean value for text_issn_enabled"
+        end
+    end,
+}
+
+-- ISSN
+par_def_var["issn+5"].text_issn_enabled = issn_text_enabled
+par_def_var["issn+2"].text_issn_enabled = issn_text_enabled
+par_def_var["issn"].text_issn_enabled = issn_text_enabled
+
+-- ISBN text vertical distance
+local text_ygap_factor = {
+    default    = 2.0,
+    unit       = "absolute-number",
+    isReserved = false,
+    fncheck    = function (_self, t, _) --> boolean, err
+        if t >= 0 then
+            return true, nil
+        else
+            return false, "[OutOfRange] non positive value for text_isbn_ygap_factor"
+        end
+    end,
+}
+-- ISBN
+par_def_var["isbn+5"].text_isbn_ygap_factor = text_ygap_factor
+par_def_var["isbn+2"].text_isbn_ygap_factor = text_ygap_factor
+par_def_var["isbn"].text_isbn_ygap_factor = text_ygap_factor
+-- ISSN
+par_def_var["issn+5"].text_issn_ygap_factor = text_ygap_factor
+par_def_var["issn+2"].text_issn_ygap_factor = text_ygap_factor
+par_def_var["issn"].text_issn_ygap_factor = text_ygap_factor
+
 -- configuration functions
 
 -- utility for generic configuration of full symbol, add-on included
@@ -229,7 +349,7 @@
     ean._is_last_checksum = true
 end
 
-EAN._config_variant = {
+local config_variant = {
     ["13"] = function (ean13, Vbar, mod)
         ean13._main_len = 13
         ean13._is_last_checksum = true
@@ -278,7 +398,6 @@
         for c = 1, 2 do
             tvbar[c] = {}
             local tcs = tvbar[c]
-            local isbar = false
             local sb = symbols[c]
             for i = 0, 9 do
                 tcs[i] = Vbar:from_int(sb[i], mod, false)
@@ -296,7 +415,6 @@
         for c = 1, 2 do
             tvbar[c] = {}
             local tcs = tvbar[c]
-            local isbar = false
             local sb = symbols[c]
             for i = 0, 9 do
                 tcs[i] = Vbar:from_int(sb[i], mod, false)
@@ -316,28 +434,21 @@
         config_full(ean, Vbar, mod, 8, 2)
     end,
 }
+-- ISBN
+config_variant["isbn"] = config_variant["13"]
+config_variant["isbn+2"] = config_variant["13+2"]
+config_variant["isbn+5"] = config_variant["13+5"]
+-- ISSN
+config_variant["issn"] = config_variant["13"]
+config_variant["issn+2"] = config_variant["13+2"]
+config_variant["issn+5"] = config_variant["13+5"]
+EAN._config_variant = config_variant
 
--- config function
--- create all the possible VBar object
-function EAN:config(variant) --> ok, err
-    if not type(variant) == "string" then
-        return false, "[ArgErr] incorrect type for 'variant', string expected"
-    end
-    local fnconfig = self._config_variant[variant]
-    if not fnconfig then
-        return false, "[Err] EAN variant '".. variant .."' not found"
-    end
-    local Vbar = self._libgeo.Vbar -- Vbar class
-    local mod = self.mod
-    fnconfig(self, Vbar, mod)
-    return true, nil
-end
-
 -- utility function
 
 -- the checksum of EAN8 or EAN13 code
 -- 'data' is an array of digits
-local function checksum_8_13(data, stop_index)
+local function checksum_8_13(data, stop_index) --> checksum
     local s1 = 0; for i = 2, stop_index, 2 do
         s1 = s1 + data[i]
     end
@@ -369,6 +480,445 @@
     end
 end
 
+-- ISBN utility function
+
+-- return the ISBN 10 digits checksum
+local function isbn_checksum(isbn)
+    local sum = 0
+    for w = 1, 9 do
+        sum = sum + w * isbn[w]
+    end
+    return sum % 11
+end
+
+-- group char for readibility '-' or ' '
+-- char won't be inserted in the top isbn code
+local function isbn_check_char(_, c, parse_state) --> elem, err
+    if type(c) ~= "string" or #c ~= 1 then
+        return nil, "[InternalErr] invalid char"
+    end
+    if parse_state.isbncode == nil then parse_state.isbncode = {} end
+    local code = parse_state.isbncode
+    if parse_state.isspace == nil then parse_state.isspace = false end
+    if parse_state.isdash == nil then parse_state.isdash = false end
+    if parse_state.isbn_len == nil then parse_state.isbn_len = 0 end
+    local isbn_len = parse_state.isbn_len
+    if c == "-" then
+        if isbn_len == 0 then
+            return nil, "[ArgErr] an initial dash is not allowed"
+        end
+        if parse_state.isdash then
+            return nil, "[ArgErr] two consecutive dash char found"
+        end
+        parse_state.isdash = true
+        return nil, nil
+    elseif c == " " then
+        if isbn_len == 0 then
+            return nil, "[ArgErr] an initial space is not allowed"
+        end
+        parse_state.isspace = true
+        return nil, nil
+    elseif c == "X" then -- ISBN-10 checksum for 10
+        code[#code + 1] = c
+        isbn_len = isbn_len + 1
+        parse_state.isbn_len = isbn_len
+        if isbn_len ~= 10 then
+            return nil, "[ArgErr] found a checksum 'X' in a wrong position"
+        end
+        return 10, nil
+    else -- c is at this point eventually a digit
+        local n = string.byte(c) - 48
+        if n < 0 or n > 9 then
+            return nil, "[ArgErr] found a not digit or a not grouping char"
+        end
+        if parse_state.isdash then -- close a group
+            code[#code + 1] = "-"
+            parse_state.isdash = false
+            parse_state.isspace = false
+        elseif parse_state.isspace then
+            code[#code + 1] = " "
+            parse_state.isspace = false
+        end
+        code[#code + 1] = c
+        isbn_len = isbn_len + 1
+        parse_state.isbn_len = isbn_len
+        return n, nil
+    end
+end
+
+-- overriding function called every time an input ISBN code has been completely
+-- parsed
+local function isbn_finalize(enc, parse_state) --> ok, err
+    local var = enc._variant
+    local code_len = enc._code_len
+    local isbn_len = parse_state.isbn_len
+    local l1, l2
+    if var == "isbn" then
+        if isbn_len == 10 then
+            l1 = 10
+        elseif isbn_len == 13 then
+            l1 = 13
+        else
+            return false, "[ArgErr] unsuitable ISBN code length"
+        end
+        assert(l1 == code_len)
+    elseif var == "isbn+5" then
+        assert(enc._addon_len == 5)
+        if isbn_len == 15 then
+            l1, l2 = 10, 5
+        elseif isbn_len == 18 then
+            l1, l2 = 13, 5
+        else
+            return false, "[ArgErr] unsuitable ISBN+5 code length"
+        end
+        assert(l1 + l2 == code_len)
+    elseif var == "isbn+2" then
+        assert(enc._addon_len == 2)
+        if isbn_len == 12 then
+            l1, l2 = 10, 2
+        elseif isbn_len == 15 then
+            l1, l2 = 13, 2
+        else
+            return false, "[ArgErr] unsuitable ISBN+2 code length"
+        end
+        assert(l1 + l2 == code_len)
+    else
+        error("[InternalErr] unexpected ISBN variant code")
+    end
+    local code_data = enc._code_data
+    local isbn_auto = false
+    if l1 == 10 then -- isbn 10 to 13 conversion
+        local ck = isbn_checksum(code_data)
+        if ck ~= code_data[10] then
+            return false, "[ArgErr] unmatched ISBN 10 checksum"
+        end
+        for i = l1 + (l2 or 0), 1, -1 do -- code_data sliding
+            code_data[i + 3] = code_data[i]
+        end
+        code_data[1] = 9
+        code_data[2] = 7
+        code_data[3] = 8
+        code_data[13] = checksum_8_13(code_data, 12)
+        isbn_auto = true
+    else
+        local ck = checksum_8_13(code_data, 12)
+        if code_data[13] ~= ck then
+            return false, "[ArgErr] unmatched ISBN 13 checksum"
+        end
+    end
+    local isbncode = parse_state.isbncode
+    if l2 then -- nils the add-on digits
+        local i = #isbncode
+        while l2 > 0 do
+            local c = isbncode[i]
+            isbncode[i] = nil
+            i = i - 1
+            if not (c == " " or c == "-") then
+                l2 = l2 - 1
+            end
+        end
+        local c = isbncode[i]
+        if c == " " or c == "-" then isbncode[i] = nil end
+    end
+    -- check group number
+    local g = 0
+    for _, c in ipairs(isbncode) do
+        if c == "-" or c == " " then
+            g = g + 1
+        end
+    end
+    if g > 4 then
+        return false, "[ArgErr] too many groups found in the ISBN code"
+    end
+    if g > 0 then isbn_auto = true end
+    enc._isbncode = isbncode
+    enc._isbntxt_on = isbn_auto
+    return true, nil
+end
+
+-- ISSN utility fucntion
+
+-- return the ISSN checksum
+local function issn_checksum(issn)
+    local sum = 0
+    for i = 1, 7 do
+        sum = sum + (9 - i) * issn[i]
+    end
+    local r = sum % 11
+    if r == 0 then
+        return 0
+    else
+        return 11 - r
+    end
+end
+
+local function to_n(c) --> n, err
+    local n = string.byte(c) - 48
+    if n < 0 or n > 9 then
+        return nil, true
+    end
+    return n, false
+end
+
+-- ISSN dddd-dddx[dd] or 13-long array
+-- spaces is always ignored
+local function issn_check_char(enc, c, parse_state) --> elem, err
+    if (type(c) ~= "string") or (#c ~= 1) then
+        return nil, "[InternalErr] invalid char"
+    end
+    if parse_state.is_dash == nil then parse_state.is_dash = false end
+    if parse_state.is_group_open == nil then parse_state.is_group_open = false end
+    if parse_state.is_group_close == nil then parse_state.is_group_close = false end
+    if parse_state.ed_var_len == nil then parse_state.ed_var_len = 0 end
+    if parse_state.ed_var_arr == nil then parse_state.ed_var_arr = {} end
+    if parse_state.code_len == nil then parse_state.code_len = 0 end
+    if parse_state.addon_len == nil then parse_state.addon_len = 0 end
+    local addon_len = enc._addon_len
+    -- edition variant part
+    if c == " " then
+        return nil, nil -- ignore all spaces
+    end
+    if parse_state.is_group_close then
+        if addon_len then
+            if parse_state.addon_len == enc._addon_len then
+                return nil, "[ArgErr] too many chars in the ISSN input code"
+            end
+            local n, e = to_n(c)
+            if e then
+                return nil, "[ArgErr] non digit char after a edition variant group"
+            end
+            parse_state.addon_len = parse_state.addon_len + 1
+            return n, nil
+        else
+            return nil, "[ArgErr] too many chars in the ISSN input code"
+        end
+    end
+    -- code part
+    if c == "-" then
+        if parse_state.is_dash then
+            return nil, "[ArgErr] two or more dash char in the input code"
+        end
+        if parse_state.code_len ~= 4 then
+            return nil, "[ArgErr] incorrect position for a dash sign"
+        end
+        parse_state.is_dash = true
+        return nil, nil
+    elseif c == "[" then -- two digits edition variant group opening
+        if parse_state.code_len ~= 8 then
+            return nil, "[ArgErr] not a 8 digits long code for the ISSN input"
+        end
+        parse_state.is_group_open = true
+        return nil, nil
+    elseif c == "]" then -- two digits edition variant closing
+        if not parse_state.is_group_open then
+            return nil, "[ArgErr] found a ']' without a '['"
+        end
+        if parse_state.ed_var_len ~= 2 then
+            return nil, "[ArgErr] edition variant group must be two digits long"
+        end
+        parse_state.is_group_open = false
+        parse_state.is_group_close = true
+        return nil, nil
+    elseif c == "X" then -- 8th ISSN checksum digit
+        if parse_state.code_len ~= 7 then
+            return nil, "[ArgErr] incorrect position for checksum digit 'X'"
+        end
+        parse_state.code_len = 8
+        return 10, nil
+    else -- at this point 'c' can be only a digit
+        local n, e = to_n(c)
+        if e then
+            return nil, "[ArgErr] found a non digit in code part"
+        end
+        if parse_state.is_group_open then
+            if parse_state.ed_var_len == 2 then
+                return nil, "[ArgErr] group digits are more than two"
+            end
+            parse_state.ed_var_len = parse_state.ed_var_len + 1
+            local t = parse_state.ed_var_arr
+            t[#t + 1] = n
+            return nil, nil
+        end
+        if parse_state.is_dash then
+            if addon_len then
+                if parse_state.code_len < 8 then
+                    parse_state.code_len = parse_state.code_len + 1
+                else
+                    if parse_state.addon_len == addon_len then
+                        return nil, "[ArgErr] too many digits for a 8 + "..addon_len.." ISSN input code"
+                    end
+                    parse_state.addon_len = parse_state.addon_len + 1
+                end
+            else
+                if parse_state.code_len == 8 then
+                    return nil, "[ArgErr] too many digits found for a 8 digits long ISSN input code"
+                end
+                parse_state.code_len = parse_state.code_len + 1
+            end
+        else
+            if addon_len then
+                if parse_state.code_len == (13 + addon_len) then
+                    return nil, "[ArgErr] too many digits in ISSN input code"
+                end
+            else
+                if parse_state.code_len == 13 then
+                    return nil, "[ArgErr] too many digits in a 13 digits long ISSN input code"
+                end
+            end
+            parse_state.code_len = parse_state.code_len + 1
+        end
+        return n, nil
+    end
+end
+
+-- translate an ISSN 8 in an EAN 13
+local function issn8_to_13(issn, ed_var_1, ed_var_2) --> i13, i8, err
+    local r13, r8 = {9, 7, 7}, {}
+    for i = 1, 7 do
+        r8[i]  = issn[i]
+        r13[i + 3] = issn[i]
+    end
+    local issn_cs = issn_checksum(r8)
+    if issn_cs ~= issn[8] then
+        return nil, nil, "[Err] unmatch ISSN 8 checksum"
+    end
+    for i = 1, 7 do
+        r8[i] = string.char(r8[i] + 48)
+    end
+    if issn_cs == 10 then
+        r8[8] = "X"
+    else
+        r8[8] = string.char(issn_cs + 48)
+    end
+    r13[11] = ed_var_1
+    r13[12] = ed_var_2
+    r13[13] = checksum_8_13(r13, 12)
+    return r13, r8, nil
+end
+
+-- translate an EAN 13 to an ISSN 8 input code
+local function ean13_to_issn8(ean)
+    local res = {}
+    for i = 4, 10 do
+        res[i - 3] = ean[i]
+    end
+    local issn_cs = issn_checksum(res)
+    for i = 1, 7 do
+        res[i] = string.char(res[i] + 48)
+    end
+    if issn_cs == 10 then
+        res[8] = "X"
+    else
+        res[8] = string.char(issn_cs + 48)
+    end
+    return res
+end
+
+-- finalize the ISSN input code
+-- new field 'enc._issn_is_short_input' -- the input code was 8 digits long
+-- new filed 'enc._issn_is_dash'        -- the 8 digits long input code contained a dash
+local function issn_finalize(enc, parse_state) --> ok, err
+    if parse_state.is_group_open then
+        return false, "[ArgErr] unclosed edition variant group in ISSN input code"
+    end
+    local data = enc._code_data
+    local code_len = enc._code_len
+    local addon_len = enc._addon_len
+    local main_len = code_len - (addon_len or 0)
+    if main_len == 8 then
+        -- make the 8 long array for human readable text
+        local ev1, ev2 = 0, 0
+        if parse_state.ed_var_len > 0 then
+            local edvar = parse_state.ed_var_arr
+            ev1, ev2 = edvar[1], edvar[2]
+        end
+        local issn13, issn8, err = issn8_to_13(data, ev1, ev2)
+        if err then return false, err end
+        if addon_len then
+            for i = 9, 9 + addon_len do
+                issn13[i + 5] = data[i] -- save addon digits
+            end
+        end
+        enc._code_data = issn13
+        enc._code_text = issn8
+        enc._issn_is_short_input = true
+        enc._issn_is_dash = parse_state.is_dash
+    elseif main_len == 13 then
+        local ck = checksum_8_13(data, 12) -- check EAN checksum
+        if ck ~= data[13] then
+            return false, "[Err] wrong checksum digit"
+        end
+        -- make 8 long array for human readable text
+        enc._code_text = ean13_to_issn8(data)
+        enc._issn_is_short_input = false
+    else
+        return nil, "[ArgErr] incorrect digits number of "..main_len.." in input ISSN code"
+    end
+    return true, nil
+end
+
+-- finalize for basic encoder
+local function basic_finalize(enc) --> ok, err
+    local l1 = enc._main_len
+    local l2 = enc._addon_len
+    local ok_len = l1 + (l2 or 0)
+    local symb_len = enc._code_len
+    if symb_len ~= ok_len then
+        return false, "[ArgErr] not a "..ok_len.."-digit long array"
+    end
+    if enc._is_last_checksum then -- is the last digit ok?
+        local data = enc._code_data
+        local ck = checksum_8_13(data, l1 - 1)
+        if ck ~= data[l1] then
+            return false, "[Err] wrong checksum digit"
+        end
+    end
+    return true, nil
+end
+
+-- config function called at the moment of encoder construction
+-- create all the possible VBar object
+function EAN:_config() --> ok, err
+    local variant = self._variant
+    if not variant then
+        return false, "[Err] variant is mandatory for EAN family"
+    end
+    local plus = variant:find("+")
+    local v1
+    if plus then
+        v1 = variant:sub(1, plus - 1)
+        self._sub_variant_1 = v1
+        self._sub_variant_2 = variant:sub(plus + 1)
+    else
+        v1 = variant
+        self._sub_variant_1 = v1
+    end
+    local fnconfig = self._config_variant[variant]
+    local VbarClass = self._libgeo.Vbar -- Vbar class
+    local mod = self.mod
+    fnconfig(self, VbarClass, mod)
+    if v1 == "isbn" then
+        self._check_char = isbn_check_char
+    elseif v1 == "issn" then
+        self._check_char = issn_check_char
+    end
+    return true, nil
+end
+
+-- internal methods for Barcode costructors
+
+-- function called every time an input EAN code has been completely parsed
+function EAN:_finalize(parse_state) --> ok, err
+    local v1 = self._sub_variant_1
+    if v1 == "isbn" then
+        return isbn_finalize(self, parse_state) --> ok, err
+    elseif v1 == "issn" then
+        return issn_finalize(self, parse_state) --> ok, err
+    else
+        return basic_finalize(self) --> ok, err
+    end
+end
+
 -- public methods
 
 -- return the checksum digit of the argument or an error
@@ -381,7 +931,7 @@
             return nil, "[ArgErr] number must be a positive integer"
         end
         if n - math.floor(n) > 0 then
-            return nil, "[ArgErr] 'n' is not an integer"
+            return nil, "[ArgErr] 'n' argument is not an integer"
         end
         arr = {}
         local i = 0
@@ -388,14 +938,14 @@
         while n > 0 do
             i = i + 1
             arr[i] = n % 10
-            n = (n - arr[i]) / 10
+            n = math.floor((n - arr[i]) / 10)
         end
         -- array reversing
         local len = #arr + 1
-        for i = 1, #arr/2 do
-            local dt = arr[i]
-            arr[i] = arr[len - i]
-            arr[len - i] = dt
+        for k = 1, #arr/2 do
+            local dt = arr[k]
+            arr[k] = arr[len - k]
+            arr[len - k] = dt
         end
     elseif type(n) == "table" then
         if not #n > 0 then return nil, "[ArgErr] empty array" end
@@ -430,32 +980,6 @@
     end
 end
 
-function EAN:get_code() --> string
-    local var = self._variant
-    local code = self.code13 -- TODO:
-    return table.concat(code)
-end
-
--- internal methods for Barcode costructors
-
-function EAN:_finalize() --> ok, err
-    local l1 = self._main_len
-    local l2 = self._addon_len
-    local ok_len = l1 + (l2 or 0)
-    local symb_len = self._code_len
-    if symb_len ~= ok_len then
-        return false, "[ArgErr] not a "..ok_len.."-digits long array"
-    end
-    if self._is_last_checksum then -- is the last digit ok?
-        local data = self._code_data
-        local ck = checksum_8_13(data, l1 - 1)
-        if ck ~= data[l1] then
-            return false, "[Err] wrong checksum digit"
-        end
-    end
-    return true, nil
-end
-
 -- drawing functions
 
 EAN._append_ga_variant = {}
@@ -506,7 +1030,7 @@
     -- bounding box set up
     local qzl = ean.quietzone_left_factor * mod
     local qzr = ean.quietzone_right_factor * mod
-    local err = canvas:stop_bbox_group(x0 - qzl, y0, x1 + qzr, y1)
+    err = canvas:stop_bbox_group(x0 - qzl, y0, x1 + qzr, y1)
     assert(not err, err)
     if ean.text_enabled then -- human readable text
         local Text  = ean._libgeo.Text
@@ -515,7 +1039,6 @@
         local txt_3 = Text:from_digit_array(code, 8, 13)
         local y_bl = ys - ean.text_ygap_factor * mod
         local mx = ean.text_xgap_factor
-        local err
         err = canvas:encode_Text(txt_1, x0 - qzl, y_bl, 0, 1)
         assert(not err, err)
         local x2_1 = x0 + (3+mx)*mod
@@ -526,6 +1049,45 @@
         local x3_2 = x0 + (92-mx)*mod
         err = canvas:encode_Text_xwidth(txt_3, x3_1, x3_2, y_bl, 1)
         assert(not err, err)
+        local istxt = false
+        if ean.text_isbn_enabled then
+            if ean.text_isbn_enabled == "auto" then
+                if ean._isbntxt_on == true then
+                    istxt = true
+                end
+            else
+                istxt = true
+            end
+        end
+        if istxt then
+            local isbn = assert(ean._isbncode, "[InternalErr] ISBN text not found")
+            local descr = {"I", "S", "B", "N", " ",}
+            for _, d in ipairs(isbn) do
+                descr[#descr + 1] = d
+            end
+            local isbn_txt = Text:from_chars(descr)
+            local x_isbn = x0 + 47.5 * mod
+            local y_isbn = y1 + ean.text_isbn_ygap_factor * mod
+            err = canvas:encode_Text(isbn_txt, x_isbn, y_isbn, 0.5, 0)
+            assert(not err, err)
+        end
+        -- issn text
+        if ean.text_issn_enabled then
+            local hri = {"I", "S", "S", "N", " "}
+            local txt = assert(ean._code_text, "[IternalErr] _code_text not found")
+            for i = 1, 4 do
+                hri[i + 5] = txt[i]
+            end
+            hri[10] = "-"
+            for i = 5, 8 do
+                hri[i + 6] = txt[i]
+            end
+            local issn_txt = Text:from_chars(hri)
+            local x_issn = x0 + 47.5 * mod
+            local y_issn = y1 + ean.text_issn_ygap_factor * mod
+            err = canvas:encode_Text(issn_txt, x_issn, y_issn, 0.5, 0)
+            assert(not err, err)
+        end
     end
 end
 
@@ -574,7 +1136,7 @@
     -- bounding box set up
     local qzl = ean.quietzone_left_factor * mod
     local qzr = ean.quietzone_right_factor * mod
-    local err = canvas:stop_bbox_group(x0 - qzl, y0, x1 + qzr, y1)
+    err = canvas:stop_bbox_group(x0 - qzl, y0, x1 + qzr, y1)
     assert(not err, err)
     if ean.text_enabled then -- human readable text
         local Text  = ean._libgeo.Text
@@ -640,7 +1202,7 @@
     -- bounding box set up
     local qzl = ean.quietzone_left_factor * mod
     local qzr = ean.quietzone_right_factor * mod
-    local err = canvas:stop_bbox_group(x0 - qzl, y0, x1 + qzr, y1)
+    err = canvas:stop_bbox_group(x0 - qzl, y0, x1 + qzr, y1)
     assert(not err, err)
     if ean.text_enabled then -- human readable text
         local Text = ean._libgeo.Text
@@ -703,7 +1265,7 @@
     -- bounding box set up
     local qzl = ean.quietzone_left_factor * mod
     local qzr = ean.quietzone_right_factor * mod
-    local err = canvas:stop_bbox_group(x0 - qzl, y0, x1 + qzr, y1)
+    err = canvas:stop_bbox_group(x0 - qzl, y0, x1 + qzr, y1)
     assert(not err, err)
     if ean.text_enabled then -- human readable text
         local Text  = ean._libgeo.Text
@@ -776,6 +1338,15 @@
     fn_2(ean, canvas, x1, y0, 1, 0, 0.85 * h)
 end
 
+-- ISBN
+fn_append_ga_variant["isbn"] = fn_append_ga_variant["13"]
+fn_append_ga_variant["isbn+5"] = fn_append_ga_variant["13+5"]
+fn_append_ga_variant["isbn+2"] = fn_append_ga_variant["13+2"]
+-- ISSN
+fn_append_ga_variant["issn"] = fn_append_ga_variant["13"]
+fn_append_ga_variant["issn+5"] = fn_append_ga_variant["13+5"]
+fn_append_ga_variant["issn+2"] = fn_append_ga_variant["13+2"]
+
 -- Drawing into the provided channel geometrical data
 -- tx, ty is the optional translation vector
 -- the function return the canvas reference to allow call chaining

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-i2of5.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-i2of5.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-barcode/brcd-i2of5.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,14 +1,18 @@
 -- Interleaved 2 of 5 (ITF) barcode generator
 --
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 -- see LICENSE.txt file
 
 local ITF = { -- main container
-    _VERSION     = "ITF v0.0.1",
-    _NAME        = "ITF",
+    _VERSION     = "i2of5 v0.0.1",
+    _NAME        = "i2of5",
     _DESCRIPTION = "Interleaved 2 of 5 barcode encoder",
 }
 
+ITF._id_variant = {
+    ITF14 = true, -- ITF 14 GS1 specification
+}
+
 ITF._start = 111 -- nnnn
 ITF._stop = 112 -- Wnn (integer must be in reverse order)
 
@@ -26,6 +30,17 @@
 }
 
 -- define parameters
+ITF._par_order = {
+    "module",
+    "ratio",
+    "height",
+    "quietzone",
+    "check_digit_policy",
+    "check_digit_method",
+    "bearer_bars_enabled",
+    "bearer_bars_thickness",
+    "bearer_bars_layout",
+}
 ITF._par_def = {}
 local pardef = ITF._par_def
 
@@ -37,8 +52,7 @@
     default    = 7.5 * 0.0254 * 186467, -- 7.5 mils (sp) unit misure,
     unit       = "sp", -- scaled point
     isReserved = true,
-    order      = 1, -- the one first to be modified
-    fncheck    = function (self, mod, _) --> boolean, err
+    fncheck    = function (self, mod, _t_opt) --> boolean, err
         if mod >= self.default then return true, nil end
         return false, "[OutOfRange] too small lenght for X-dim"
     end,
@@ -53,10 +67,9 @@
     default    = 3.0,
     unit       = "absolute-number",
     isReserved = true,
-    order      = 2,
-    fncheck    = function (_, ratio, tpardef) --> boolean, err
-        local mils = 0.0254 * 186467
-        local mod = tpardef.module
+    fncheck    = function (_self, ratio, t_opt) --> ok, err
+        local mils = 0.0254 * 186467 -- sp
+        local mod = t_opt.module
         local minr; if mod < 20*mils then minr = 2.2 else minr = 2.0 end
         if ratio < minr then
             return false, "[OutOfRange] too small ratio (the min is "..minr..")"
@@ -73,9 +86,8 @@
     default    = 15 * 186467, -- 15mm -- TODO: better assessment for symbol length
     unit       = "sp", -- scaled point
     isReserved = false,
-    order      = 3,
-    fncheck = function (_self, h, _opt) --> boolean, err
-        local mils = 0.0254 * 186467
+    fncheck = function (_self, h, _t_opt) --> boolean, err
+        local mils = 0.0254 * 186467 -- scaled point (sp)
         if h >= 250*mils then
             return true, nil
         end
@@ -89,16 +101,14 @@
     default    = 250 * 0.0254 * 186467, -- 0.25 inch (250 mils)
     unit       = "sp", -- scaled point
     isReserved = false,
-    order      = 4,
-    fncheck    = function (self, qz, _opt) --> boolean, err
+    fncheck    = function (self, qz, _t_opt) --> boolean, err
         local mils = 0.0254 * 186467
         local mod = self.module
         local min = math.max(10*mod, 250*mils)
-        if qz >= min then
-            return true, nil
-        else
+        if qz < min then
             return false, "[OutOfRange] quietzone too small"
         end
+        return true, nil
     end,
 }
 
@@ -110,8 +120,7 @@
         verify = true, -- check the last digit of the symbol as check digit
         none   = true, -- do nothing
     },
-    order      = 5,
-    fncheck    = function (self, e, _) --> boolean, err
+    fncheck    = function (self, e, _t_opt) --> boolean, err
         if type(e) ~= "string" then return false, "[TypeError] not a string" end
         local keys = self.policy_enum
         if keys[e] == true then
@@ -126,11 +135,10 @@
     -- determine the algorithm for the check digit calculation
     default       = "mod_10",
     isReserved    = false,
-    order         = 6,
     method_enum = {
         mod_10 = true, -- MOD 10 check digits method
     },
-    fncheck       = function (self, e, _) --> boolean, err
+    fncheck = function (self, e, _t_opt) --> boolean, err
         if type(e) ~= "string" then return false, "[TypeError] not a string" end
         local keys = self.method_enum
         if keys[e] == true then
@@ -145,8 +153,7 @@
     -- enable/disable Bearer bars around the barcode symbol
     default    = false,
     isReserved = false,
-    order      = 7,
-    fncheck    = function (_, flag, _) --> boolean, err
+    fncheck    = function (_self, flag, _t_opt) --> boolean, err
         if type(flag) == "boolean" then
             return true, nil
         else
@@ -159,26 +166,162 @@
     default    = 37.5 * 0.0254 * 186467, -- 5 modules
     unit       = "sp", -- scaled point
     isReserved = false,
-    order      = 8,
-    fncheck = function (_self, thick, tpardef) --> boolean, err
-        local module = tpardef.module
+    fncheck = function (_self, thick, t_opt) --> boolean, err
+        local module = t_opt.module
         if thick >= 2*module then
             return true, nil
         end
-        return false, "[OutOfRange] thickness too small"
+        return false, "[OutOfRange] too small bearer bar thickness"
     end,
 }
 
 pardef.bearer_bars_layout = { -- enumeration
-    -- determine the algorithm for the check digit calculation
+    -- horizontal/frame bearer bars
     default       = "hbar",
     isReserved    = false,
-    order         = 9,
     method_enum = {
         frame = true, -- a rectangle around the symbol
+        hbar = true, -- only top and bottom horizontal bars
+    },
+    fncheck = function (self, e, _t_opt) --> boolean, err
+        if type(e) ~= "string" then return false, "[TypeError] not a string" end
+        local keys = self.method_enum
+        if keys[e] == true then
+            return true, nil
+        else
+            return false, "[Err] enum value not found"
+        end
+    end,
+}
+
+-- ITF14: variant based on GS1 specification, see
+-- https://www.gs1.org/sites/default/files/docs/barcodes/GS1_General_Specifications.pdf
+-- GS1 ITF14 parameters vary in range and preferred value on the specific
+-- application. Default are chosen for better suite the majority of cases
+
+-- ITF14 variant parameters as family parameters alternative
+ITF._par_def_ITF14 = {}
+local itf14_pdef = ITF._par_def_ITF14
+
+itf14_pdef.module = { -- module main parameter
+    -- Narrow element X-dimension is the width of the smallest element.
+    -- The module width must follow GS1 specification
+    default    = 0.495 * 186467, -- 0.495 mm
+    unit       = "sp", -- scaled point
+    isReserved = true,
+    fncheck    = function (_self, mod, _t_opt) --> boolean, err
+        local mod_mm = mod * 186467 -- mm
+        if (mod_mm < 0.264) or (mod_mm > 0.660) then
+            return false, "[OutOfRange] X-dim is out of [0.264mm, 0.660mm]"
+        end
+        return true, nil
+    end,
+}
+
+itf14_pdef.ratio = {
+    -- The "wide" element is a multiple of the "narrow" element that can
+    -- range between 2.25 and 3.0.
+    default    = 2.5,
+    unit       = "absolute-number",
+    isReserved = true,
+    fncheck    = function (_self, ratio, _t_opt) --> boolean, err
+        if (ratio < 2.25) or (ratio > 3.0) then
+            return false, "[OutOfRange] wide-to-narrow ratio is out of [2.25, 3.0]"
+        end
+        return true, nil
+    end,
+}
+
+itf14_pdef.height = {
+    -- The height should be at least 5.08 mm. Target value is 12.70 mm
+    -- except in retail pharmacy and general distribution or non-retail pharmacy
+    -- and general distribution
+    default    = 12.70 * 186467, -- mm
+    unit       = "sp", -- scaled point
+    isReserved = false,
+    fncheck = function (_self, h, _t_opt) --> boolean, err
+        if h < 5.08 * 186467 then
+            return false, "[OutOfRange] height is too small"
+        end
+        return true, nil
+    end,
+}
+
+itf14_pdef.quietzone = {
+    -- Quiet zones must be at least 10 times the module width
+    default    = 10,
+    unit       = "absolute-number", -- scaled point
+    isReserved = false,
+    fncheck    = function (_self, qz, _t_opt) --> boolean, err
+        if qz < 10 then
+            return false, "[OutOfRange] quietzone factor is too small (min 10x)"
+        else
+            return true, nil
+        end
+    end,
+}
+
+itf14_pdef.check_digit_policy = { -- enumeration
+    default    = "check_or_add",
+    isReserved = false,
+    policy_enum = {
+        check_or_add = true,
+        add    = true, -- add a check digit to the symbol
+        verify = true, -- check the last digit of the symbol as check digit
+    },
+    fncheck    = function (self, e, _t_opt) --> boolean, err
+        if type(e) ~= "string" then return false, "[TypeError] not a string" end
+        local keys = self.policy_enum
+        if keys[e] == true then
+            return true, nil
+        else
+            return false, "[Err] enum value '"..e.."' not found"
+        end
+    end,
+}
+
+-- itf14_pdef.check_digit_method = {} the same as the basic parameter
+
+itf14_pdef.bearer_bars_enabled = { -- boolean type
+    -- enable/disable Bearer bars around the barcode symbol
+    default    = true,
+    isReserved = false,
+    fncheck    = function (_self, flag, _t_opt) --> boolean, err
+        if type(flag) == "boolean" then
+            return true, nil
+        else
+            return false, "[TypeErr] not a boolean value"
+        end
+    end,
+}
+
+-- from GS1 spec:
+-- For printing methods that do not require printing plates, the bearer bar
+-- SHALL be a minimum of twice the width of a narrow bar (dark bar) and need
+-- only appear at the top and bottom of the symbol, butting directly against
+-- the top and bottom of the symbol bars (dark bars).
+pardef.bearer_bars_thickness = { -- dimension
+    default    = 5 * 0.495 * 186467, -- 5 modules
+    unit       = "sp", -- scaled point
+    isReserved = false,
+    fncheck = function (_self, thick, t_opt) --> boolean, err
+        local module = t_opt.module
+        if thick >= 2*module then
+            return true, nil
+        end
+        return false, "[OutOfRange] too small bearer bar thickness"
+    end,
+}
+
+itf14_pdef.bearer_bars_layout = { -- enumeration
+    -- horizontal/frame bearer bars
+    default       = "frame",
+    isReserved    = false,
+    method_enum = {
+        frame = true, -- a rectangle around the symbol
         hbar = true, -- top and bottom horizontal bars
     },
-    fncheck       = function (self, e, _) --> boolean, err
+    fncheck = function (self, e, _) --> boolean, err
         if type(e) ~= "string" then return false, "[TypeError] not a string" end
         local keys = self.method_enum
         if keys[e] == true then
@@ -224,18 +367,15 @@
     t[1] = 0
 end
 
-
-local function check_mod10(t, last)
-    local sum = 0
-    local w = true
-    for i = last, 1, -1 do
-        if w then
-            sum = sum + 3*t[i]
-        else
-            sum = sum + t[i]
-        end
-        w = not w
+-- for general i2of5 symbols
+local function check_mod10(data, last)
+    local s3 = 0; for i = last, 1, -2 do
+        s3 = s3 + data[i]
     end
+    local s1 = 0; for i = last - 1, 1, -2 do
+        s1 = s1 + data[i]
+    end
+    local sum = s1 + 3 * s3
     local m = sum % 10
     if m == 0 then return 0 else return 10 - m end
 end
@@ -244,13 +384,60 @@
     if method == "mod_10" then
         return check_mod10(t, last)
     else
-        assert(false, "[InternalErr] unknow method")
-    end 
+        error("[InternalErr] unknow checksum method '"..method.."'")
+    end
 end
 
+-- group char for readibility '(' or ')' or ' '
+local function itf14_check_char(enc, c, parse_state) --> elem, err
+    if type(c) ~= "string" or #c ~= 1 then
+        return nil, "[InternalErr] invalid char"
+    end
+    if parse_state.itf14_code == nil then parse_state.itf14_code = {} end
+    local code = parse_state.itf14_code
+    if parse_state.is_space == nil then parse_state.is_space = false end
+    if parse_state.is_popen == nil then parse_state.is_popen = false end
+    if parse_state.itf14_len == nil then parse_state.itf14_len = 0 end
+    local itf14_len = parse_state.itf14_len
+    -- parsing
+    if c == " " then
+        if itf14_len == 0 then -- ignore initial spaces
+            return nil, nil
+        end
+        parse_state.is_space = true
+        return nil, nil
+    elseif c == "(" then
+        if parse_state.is_popen then
+            return nil, "[Err] a parenthesis group is already open"
+        end
+        parse_state.is_popen = true
+        code[#code + 1] = c
+        return nil, nil
+    elseif c == ")" then
+        if not parse_state.is_popen then
+            return nil, "[Err] found a closing parenthesis without an opening one"
+        end
+        parse_state.is_popen = false
+        code[#code + 1] = c
+        return nil, nil
+    else -- c is at this point eventually a digit
+        local n = string.byte(c) - 48
+        if n < 0 or n > 9 then
+            return nil, "[ArgErr] found a not digit or a not grouping char"
+        end
+        if parse_state.is_space then
+            code[#code + 1] = " "
+            parse_state.is_space = false
+        end
+        code[#code + 1] = c
+        itf14_len = itf14_len + 1
+        parse_state.itf14_len = itf14_len
+        return n, nil
+    end
+end
 
 -- configuration function
-function ITF:config() --> ok, err
+function ITF:_config() --> ok, err
     -- init Vbar objects
     local narrow = self.module
     local wide = narrow * self.ratio
@@ -258,7 +445,6 @@
     local Vbar = self._libgeo.Vbar -- Vbar class
     self._vbar_start = Vbar:from_int_revpair(self._start, narrow, wide)
     self._vbar_stop = Vbar:from_int_revpair(self._stop, narrow, wide)
-
     -- build every possible pair of digits from 00 to 99
     self._vbar_data = {}
     local vbar = self._vbar_data
@@ -271,28 +457,66 @@
             vbar[n] = Vbar:from_two_tab(t1, t2, narrow, wide)
         end
     end
+    local variant = self._variant
+    if variant == "ITF14" then
+        self._check_char = itf14_check_char
+    end
     return true, nil
 end
 
--- public functions
+-- internal methods for constructors
 
-function ITF:get_checkdigit(n, method)
-    if type(n) ~= "number" then return nil, "[ArgErr] 'n' is not a number" end
-    if n < 0 then return nil, "[ArgErr] found a negative number" end
-    if n - math.floor(n) ~= 0 then return nil, "[ArgErr] found a float number" end
-    method = method or self.check_digit_method
-    local last, t = n_to_arr(n)
-    return checkdigit(t, last, method)
+-- input code post processing for ITF14 variant
+local function itf14_finalize(enc) --> ok, err
+    -- check digit action
+    local policy = enc.check_digit_policy
+    local slen = enc._code_len
+    local digits = enc._code_data
+    local is_add
+    if policy == "verify" then
+        if slen ~= 14 then
+            return nil, "[DataErr] incorrect input lenght of "..slen..
+                " respect to 14 (checksum policy 'verify')" 
+        end
+        is_add = false
+    elseif policy == "add" then
+        if slen ~= 13 then
+            return nil, "[DataErr] incorrect input lenght of "..slen..
+                " respect to 13 (checksum policy 'add')" 
+        end
+        is_add = true
+    elseif policy == "check_or_add" then
+        if slen == 14 then
+            is_add = false
+        elseif slen == 13 then
+            is_add = true
+        else
+            return nil, "[DataErr] incorrect input lenght of "..slen..
+                " respect to the policy '"..policy.."'"
+        end
+    else
+        return false, "[InternalErr] incorrect policy enum value '"..policy.."'"
+    end
+    assert(type(is_add) == "boolean")
+    local cs = checkdigit(digits, 13, enc.check_digit_method)
+    if is_add then
+        digits[14] = cs
+        enc._code_len = 14
+    else
+        if cs ~= digits[14] then
+            return false, "[DataErr] last digit is not equal to checksum"
+        end
+    end
+    return true, nil
 end
 
--- internal methods for constructors
-
-function ITF:_finalize() --> ok, err
+-- input code post processing for basic i2of5
+local function basic_finalize(enc) --> ok, err
     -- check digit action
-    local policy = self.check_digit_policy
-    local slen = self._code_len
+    local policy = enc.check_digit_policy
+    local slen = enc._code_len
     local is_even = (slen % 2 == 0)
-    local digits = self._code_data
+    local digits = enc._code_data
     if policy == "none" then
         if not is_even then
             rshift(digits) -- add a heading zero for padding
@@ -303,7 +527,7 @@
             rshift(digits) -- add a heading zero for padding
             slen = slen + 1
         end
-        local c = checkdigit(digits, slen, self.check_digit_method)
+        local c = checkdigit(digits, slen, enc.check_digit_method)
         digits[#digits + 1] = c
     elseif policy == "verify" then
         if not is_even then
@@ -310,7 +534,7 @@
             rshift(digits)
             slen = slen + 1
         end
-        local c = checkdigit(digits, slen - 1, self.check_digit_method)
+        local c = checkdigit(digits, slen - 1, enc.check_digit_method)
         if c ~= digits[slen] then
             return false, "[DataErr] wrong check digit"
         end
@@ -317,10 +541,32 @@
     else
         return false, "[InternalError] wrong enum value"
     end
-    self._code_len = slen
+    enc._code_len = slen
     return true, nil
 end
 
+-- input code post processing
+function ITF:_finalize() --> ok, err
+    local var = self._variant
+    if var then
+        assert(var == "ITF14")
+        return itf14_finalize(self)
+    else
+        return basic_finalize(self)
+    end
+end
+
+-- public functions
+
+function ITF:get_checkdigit(n, method) --> checksum, err
+    if type(n) ~= "number" then return nil, "[ArgErr] 'n' is not a number" end
+    if n < 0 then return nil, "[ArgErr] found a negative number" end
+    if math.floor(n) ~= n then return nil, "[ArgErr] found a not integer number" end
+    method = method or self.check_digit_method
+    local last, t = n_to_arr(n)
+    return checkdigit(t, last, method)
+end
+
 -- drawing function
 -- tx, ty is an optional translator vector
 function ITF:append_ga(canvas, tx, ty) --> canvas
@@ -352,6 +598,9 @@
     -- bounding box setting
     local x1 = xpos + (2 + ratio)*xdim
     local qz = self.quietzone
+    if self._variant then
+        qz = qz * xdim
+    end
     local b1x,  b1y = x0 - qz, y0
     local b2x,  b2y = x1 + qz, y1
     if self.bearer_bars_enabled then

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-driver.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-driver.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-driver.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,6 +1,6 @@
 --
 -- ga Intermediate Graphic Language for barcode drawing
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 --
 -- Basic driver interface
 -- drawing elementary vector shape

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-drv-pdfliteral.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-drv-pdfliteral.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-drv-pdfliteral.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,7 +1,7 @@
 --
 -- ga graphic assembler or
 -- Intermediate Graphic Language for barcode drawing
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 --
 -- All dimensions are in scaled point (sp)
 -- ga LuaTeX Driver (native implementation node+pdfliteral)
@@ -13,6 +13,10 @@
     _DESCRIPTION = "A LuaTeX native pdfliteral driver for ga graphic stream",
 }
 
+local tex = assert(tex, "This require a Lua powered TeX engine")
+local node = assert(node, "This require a Lua powered TeX engine")
+local font = assert(font, "This require a Lua powered TeX engine")
+
 PDFnative.ext = "txt" -- file extension
 PDFnative.buf_sep = "\n" -- separation string for buffer concat
 

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-drv-svg.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-drv-svg.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-driver/brcd-drv-svg.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,7 +1,7 @@
 --
 -- ga Intermediate Graphic Language for barcode drawing
 -- SVG library
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 --
 -- All dimension in the ga stream are scaled point (sp)
 -- 1 pt = 65536 sp

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-geo/brcd-gacanvas.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-geo/brcd-gacanvas.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-geo/brcd-gacanvas.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,5 +1,5 @@
 -- class gaCanvas
--- Copyright (C) 2019 Roberto Giacomelli
+-- Copyright (C) 2020 Roberto Giacomelli
 
 -- ga -- basic function
 

Modified: trunk/Master/texmf-dist/scripts/barracuda/lib-geo/brcd-libgeo.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/barracuda/lib-geo/brcd-libgeo.lua	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/scripts/barracuda/lib-geo/brcd-libgeo.lua	2020-02-05 21:43:34 UTC (rev 53683)
@@ -70,7 +70,7 @@
         is_bar = not is_bar
     end
     local o = {
-        _yline = yl,   -- [<xcenter>, <width>, ...] flat array
+        _yline = yl, -- [<xcenter>, <width>, ...] flat array
         _x_lim = x0, -- right external coordinate
     }
     setmetatable(o, self)
@@ -153,7 +153,7 @@
     return o
 end
 
--- return a Vbar inteleaving to sequence narrow/Wide
+-- return a Vbar interleaving narrow/Wide sequences
 -- tbar, tspace = {boolean sequence}, true -> narrow, false -> Wide
 function Vbar:from_two_tab(tbar, tspace, mod, MOD) --> <vbar object>
     assert(type(tbar) == "table", "tbar must be a table")

Modified: trunk/Master/texmf-dist/tex/luatex/barracuda/barracuda.sty
===================================================================
--- trunk/Master/texmf-dist/tex/luatex/barracuda/barracuda.sty	2020-02-05 21:26:20 UTC (rev 53682)
+++ trunk/Master/texmf-dist/tex/luatex/barracuda/barracuda.sty	2020-02-05 21:43:34 UTC (rev 53683)
@@ -1,21 +1,18 @@
 %
 \NeedsTeXFormat{LaTeX2e}[2009/06/27]
-\ProvidesPackage{barracuda}[2018/12/30 v0.1 a barcode typesetting package]%
-
+\ProvidesPackage{barracuda}[2020/01/15 v0.0.10 a barcode typesetting package]%
 \newbox\barracudabox
-\newcommand\barracuda[2]{\directlua{
+\newcommand\barracuda[3][_brcdempty_=true]{\directlua{
     local barracuda = require "barracuda"
-    local e = [[#1]]
-    local s = [[#2]]
-    local enc, err = barracuda:get_barcode_class():new_encoder(e)
-    assert(enc, err)
-    local symb, err = enc:from_string(s); assert(symb, err)
-    local canvas = barracuda:new_canvas()
-    symb:append_ga(canvas)
-    local drv = barracuda:get_driver()
-    drv:ga_to_hbox(canvas, "barracudabox")
+    local enc_name = [[#2]]
+    local data = [[#3]]
+    local opt = {#1};
+    if opt._brcdempty_ == true then
+        barracuda:hbox(enc_name, data, "barracudabox")
+    else
+        barracuda:hbox(enc_name, data, "barracudabox", opt)
+    end
 }%
 \box\barracudabox
 }
-
 \endinput



More information about the tex-live-commits mailing list.