dmtx 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +32 -1
- data/lib/dmtx/data_matrix.rb +51 -16
- data/lib/dmtx/version.rb +1 -1
- data/lib/dmtx.rb +1 -0
- metadata +7 -7
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9aedbfc3b9bdc27d443dd1e2d65783af65da3ffb05c5a55060a04747a0ffab6f
         | 
| 4 | 
            +
              data.tar.gz: 34069b336ce07010638aabccb0b5523ccc448ff31b4a5902ad061d1bb2d9d18b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7f126e2e555695137c8720f304cd9f87caea35fc38d6c6714420b6d1e62ee7ae172cf2ae39c13ee7190b0143f3e2d372a80a228e8deb47a09091025353830295
         | 
| 7 | 
            +
              data.tar.gz: a40eb8a839564b6877665d92c0f8c5f7117ad9ff379594648586170547d3d1108e9dd3ea68bd1af81760e5aa336a3e34dd54e0a6c1d4d31c9d1567d1d04ee7cf
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,3 +1,6 @@ | |
| 1 | 
            +
            [](https://badge.fury.io/rb/dmtx)
         | 
| 2 | 
            +
            [](https://github.com/mtgrosser/dmtx/actions/workflows/build.yml)
         | 
| 3 | 
            +
             | 
| 1 4 | 
             
            # dmtx
         | 
| 2 5 | 
             
            Pure Ruby Data Matrix generator
         | 
| 3 6 |  | 
| @@ -39,6 +42,13 @@ dmtx.width | |
| 39 42 | 
             
            dmtx.height
         | 
| 40 43 | 
             
            => 16
         | 
| 41 44 |  | 
| 45 | 
            +
            dmtx.encoding
         | 
| 46 | 
            +
            => :ascii
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            dmtx.encoded_message
         | 
| 49 | 
            +
            => [68, 105, 118, 111, 108, 122, 33, 67, 98, 100, 112, 111,
         | 
| 50 | 
            +
                62, 103, 49, 93, 99, 53, 117, 202, 250, 186, 232, 14]
         | 
| 51 | 
            +
             | 
| 42 52 | 
             
            # Generate SVG
         | 
| 43 53 | 
             
            dmtx.to_svg
         | 
| 44 54 | 
             
            => "<svg xmlns= ..."
         | 
| @@ -63,4 +73,25 @@ dmtx.to_i | |
| 63 73 |  | 
| 64 74 | 
             
            # Binary representation
         | 
| 65 75 | 
             
            dmtx.to_i.to_s(2)
         | 
| 66 | 
            -
            => " | 
| 76 | 
            +
            => "1010101010101010
         | 
| 77 | 
            +
                1011101010000011
         | 
| 78 | 
            +
                1101011111110110
         | 
| 79 | 
            +
                1001101011101001
         | 
| 80 | 
            +
                1001100101001110
         | 
| 81 | 
            +
                1011101111110011
         | 
| 82 | 
            +
                1001011001001000
         | 
| 83 | 
            +
                1000100001110101
         | 
| 84 | 
            +
                1011000110111100
         | 
| 85 | 
            +
                1011001001101011
         | 
| 86 | 
            +
                1100000111111100
         | 
| 87 | 
            +
                1010110110101011
         | 
| 88 | 
            +
                1001101001000000
         | 
| 89 | 
            +
                1111001010001101
         | 
| 90 | 
            +
                1010111001110010
         | 
| 91 | 
            +
                1111111111111111"
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            # Choose encoding
         | 
| 94 | 
            +
            Dmtx::DataMatrix.new('Chunky Bacon', encoding: :txt)
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            # GS1 DataMatrix
         | 
| 97 | 
            +
            Dmtx::DataMatrix.new("\x1d01095011010209171719050810ABCD1234\x1d2110", encoding: :gs1)
         | 
    
        data/lib/dmtx/data_matrix.rb
    CHANGED
    
    | @@ -6,7 +6,7 @@ require 'chunky_png' | |
| 6 6 |  | 
| 7 7 | 
             
            module Dmtx
         | 
| 8 8 | 
             
              class DataMatrix
         | 
| 9 | 
            -
                attr_reader :width, :height
         | 
| 9 | 
            +
                attr_reader :width, :height, :encoded_message, :encoding
         | 
| 10 10 |  | 
| 11 11 | 
             
                C40 = [230,
         | 
| 12 12 | 
             
                       31, 0, 0,
         | 
| @@ -43,16 +43,26 @@ module Dmtx | |
| 43 43 | 
             
                       64, 8,  0,
         | 
| 44 44 | 
             
                       90, 9, 51,
         | 
| 45 45 | 
             
                       255, 8,  0]
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                 | 
| 46 | 
            +
                
         | 
| 47 | 
            +
                # See https://www.gs1.org/standards/gs1-datamatrix-guideline/25
         | 
| 48 | 
            +
                FNC1 = 29
         | 
| 49 | 
            +
                FNC1_CODEWORD = 232
         | 
| 50 | 
            +
                
         | 
| 51 | 
            +
                DEFAULT_ENCODINGS = %i[ascii c40 txt x12 edifact base gs1].freeze
         | 
| 52 | 
            +
                ENCODINGS = (%i[gs1] + DEFAULT_ENCODINGS).freeze
         | 
| 53 | 
            +
                
         | 
| 54 | 
            +
                def initialize(msg, rect: false, encoding: nil)
         | 
| 48 55 | 
             
                  @m = []
         | 
| 49 56 | 
             
                  @width = 0
         | 
| 50 57 | 
             
                  @height = 0
         | 
| 51 | 
            -
                   | 
| 58 | 
            +
                  raise ArgumentError, "illegal encoding #{encoding.inspect}" if encoding && !ENCODINGS.include?(encoding)
         | 
| 59 | 
            +
                  @encoding, @encoded_message = encode_message(msg, encoding)
         | 
| 60 | 
            +
                  raise EncodingError, "illegal payload" unless @encoded_message
         | 
| 61 | 
            +
                  encode(@encoded_message, rect)
         | 
| 52 62 | 
             
                end
         | 
| 53 63 |  | 
| 54 64 | 
             
                def inspect
         | 
| 55 | 
            -
                  "#<#{self.class.name}:0x#{object_id.to_s(16)} #{width}x#{height}>"
         | 
| 65 | 
            +
                  "#<#{self.class.name}:0x#{object_id.to_s(16)} #{width}x#{height}@#{encoding}>"
         | 
| 56 66 | 
             
                end
         | 
| 57 67 |  | 
| 58 68 | 
             
                def to_i
         | 
| @@ -76,7 +86,6 @@ module Dmtx | |
| 76 86 | 
             
                  y = height
         | 
| 77 87 | 
             
                  while y > 0
         | 
| 78 88 | 
             
                    y -= 1
         | 
| 79 | 
            -
                    d = 0
         | 
| 80 89 | 
             
                    x = width
         | 
| 81 90 | 
             
                    while x > 0
         | 
| 82 91 | 
             
                      x -= 1
         | 
| @@ -139,6 +148,23 @@ module Dmtx | |
| 139 148 | 
             
                  end
         | 
| 140 149 | 
             
                  result
         | 
| 141 150 | 
             
                end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                def gs1_encode(t)
         | 
| 153 | 
            +
                  bytes, result = t.bytes, []
         | 
| 154 | 
            +
                  while c = bytes.shift
         | 
| 155 | 
            +
                    if !bytes.empty? && c > 47 && c < 58 && bytes.first > 47 && bytes.first < 58
         | 
| 156 | 
            +
                      result << (c - 48) * 10 + bytes.shift + 82
         | 
| 157 | 
            +
                    elsif c > 127
         | 
| 158 | 
            +
                      result << 235
         | 
| 159 | 
            +
                      result << ((c - 127) & 255)
         | 
| 160 | 
            +
                    elsif c == FNC1
         | 
| 161 | 
            +
                      result << FNC1_CODEWORD
         | 
| 162 | 
            +
                    else
         | 
| 163 | 
            +
                      result << c + 1
         | 
| 164 | 
            +
                    end
         | 
| 165 | 
            +
                  end
         | 
| 166 | 
            +
                  result
         | 
| 167 | 
            +
                end
         | 
| 142 168 |  | 
| 143 169 | 
             
                def base_encode(t)
         | 
| 144 170 | 
             
                  bytes, result = t.bytes, [231]
         | 
| @@ -204,18 +230,27 @@ module Dmtx | |
| 204 230 | 
             
                  result.concat ascii_encode(bytes[(i - cc)..-1].to_a.pack('C*')) if cc > 0 || i < l
         | 
| 205 231 | 
             
                  result
         | 
| 206 232 | 
             
                end
         | 
| 207 | 
            -
             | 
| 208 | 
            -
                def  | 
| 209 | 
            -
                   | 
| 210 | 
            -
             | 
| 211 | 
            -
             | 
| 212 | 
            -
             | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 233 | 
            +
                
         | 
| 234 | 
            +
                def c40_encode(t)
         | 
| 235 | 
            +
                  text_encode(t, C40)
         | 
| 236 | 
            +
                end
         | 
| 237 | 
            +
                
         | 
| 238 | 
            +
                def txt_encode(t)
         | 
| 239 | 
            +
                  text_encode(t, TEXT)
         | 
| 240 | 
            +
                end
         | 
| 241 | 
            +
                
         | 
| 242 | 
            +
                def x12_encode(t)
         | 
| 243 | 
            +
                  text_encode(t, X12)
         | 
| 244 | 
            +
                end
         | 
| 245 | 
            +
                
         | 
| 246 | 
            +
                def encode_message(msg, encoding)
         | 
| 247 | 
            +
                  (encoding ? [encoding] : DEFAULT_ENCODINGS)
         | 
| 248 | 
            +
                    .map { |name| [name, send("#{name}_encode", msg)] }
         | 
| 249 | 
            +
                    .reject { |_, encoded| encoded.empty? }
         | 
| 250 | 
            +
                    .min_by { |_, encoded| encoded.size }
         | 
| 215 251 | 
             
                end
         | 
| 216 252 |  | 
| 217 | 
            -
                def encode( | 
| 218 | 
            -
                  enc = encodings(text).values.reject(&:empty?).min_by(&:size)
         | 
| 253 | 
            +
                def encode(enc, rct)
         | 
| 219 254 | 
             
                  el = enc.size
         | 
| 220 255 | 
             
                  nc = nr = 1
         | 
| 221 256 | 
             
                  j = -1
         | 
    
        data/lib/dmtx/version.rb
    CHANGED
    
    
    
        data/lib/dmtx.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: dmtx
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Matthias Grosser
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2024-02-11 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: builder
         | 
| @@ -38,7 +38,7 @@ dependencies: | |
| 38 38 | 
             
                - - ">="
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 40 | 
             
                    version: '0'
         | 
| 41 | 
            -
            description: | 
| 41 | 
            +
            description:
         | 
| 42 42 | 
             
            email:
         | 
| 43 43 | 
             
            - mtgrosser@gmx.net
         | 
| 44 44 | 
             
            executables: []
         | 
| @@ -56,7 +56,7 @@ homepage: https://github.com/mtgrosser/dmtx | |
| 56 56 | 
             
            licenses:
         | 
| 57 57 | 
             
            - MIT
         | 
| 58 58 | 
             
            metadata: {}
         | 
| 59 | 
            -
            post_install_message: | 
| 59 | 
            +
            post_install_message:
         | 
| 60 60 | 
             
            rdoc_options: []
         | 
| 61 61 | 
             
            require_paths:
         | 
| 62 62 | 
             
            - lib
         | 
| @@ -71,8 +71,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 71 71 | 
             
                - !ruby/object:Gem::Version
         | 
| 72 72 | 
             
                  version: '0'
         | 
| 73 73 | 
             
            requirements: []
         | 
| 74 | 
            -
            rubygems_version: 3. | 
| 75 | 
            -
            signing_key: | 
| 74 | 
            +
            rubygems_version: 3.1.4
         | 
| 75 | 
            +
            signing_key:
         | 
| 76 76 | 
             
            specification_version: 4
         | 
| 77 77 | 
             
            summary: Pure Ruby Datamatrix Generator
         | 
| 78 78 | 
             
            test_files: []
         |