barby 0.5.1 → 0.6.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 +7 -0
- data/CHANGELOG +5 -0
- data/lib/barby/barcode/code_128.rb +190 -33
- data/lib/barby/version.rb +2 -2
- metadata +15 -24
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eebdb2eff35d0984c66ce11079fd6a524c95ae08
|
4
|
+
data.tar.gz: 03d708dff70b1b71f0117e9c23e6bbd1c00f5915
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5bfe166db311575c6da4f69d95135443f47529b5eef5f23bdb947fd7076e60f77495e54f7559a3fce24bd7c062db2eb344b6b2f354915974ecc238f23763a019
|
7
|
+
data.tar.gz: e183f8086780beb20e4c0220024262a93d1f3bccb6e522cf7633bfb66831702051d61e17a727e3314b85f73c3ffbe365aeab5e46d9dcb21c0cab2275874ce892
|
data/CHANGELOG
CHANGED
@@ -20,6 +20,21 @@ module Barby
|
|
20
20
|
# Code128A.new("ABC123\306def\3074567")
|
21
21
|
class Code128 < Barcode1D
|
22
22
|
|
23
|
+
FNC1 = "\xc1"
|
24
|
+
FNC2 = "\xc2"
|
25
|
+
FNC3 = "\xc3"
|
26
|
+
FNC4 = "\xc4"
|
27
|
+
CODEA = "\xc5"
|
28
|
+
CODEB = "\xc6"
|
29
|
+
CODEC = "\xc7"
|
30
|
+
SHIFT = "\xc8"
|
31
|
+
STARTA = "\xc9"
|
32
|
+
STARTB = "\xca"
|
33
|
+
STARTC = "\xcb"
|
34
|
+
|
35
|
+
STOP = '11000111010'
|
36
|
+
TERMINATE = '11'
|
37
|
+
|
23
38
|
ENCODINGS = {
|
24
39
|
0 => "11011001100", 1 => "11001101100", 2 => "11001100110",
|
25
40
|
3 => "10010011000", 4 => "10010001100", 5 => "10001001100",
|
@@ -93,10 +108,10 @@ module Barby
|
|
93
108
|
87 => "\027", 88 => "\030", 89 => "\031",
|
94
109
|
90 => "\032", 91 => "\e", 92 => "\034",
|
95
110
|
93 => "\035", 94 => "\036", 95 => "\037",
|
96
|
-
96 =>
|
97
|
-
99 =>
|
98
|
-
102 =>
|
99
|
-
105 =>
|
111
|
+
96 => FNC3, 97 => FNC2, 98 => SHIFT,
|
112
|
+
99 => CODEC, 100 => CODEB, 101 => FNC4,
|
113
|
+
102 => FNC1, 103 => STARTA, 104 => STARTB,
|
114
|
+
105 => STARTC
|
100
115
|
}.invert,
|
101
116
|
|
102
117
|
'B' => {
|
@@ -116,9 +131,9 @@ module Barby
|
|
116
131
|
78 => "n", 79 => "o", 80 => "p", 81 => "q", 82 => "r", 83 => "s",
|
117
132
|
84 => "t", 85 => "u", 86 => "v", 87 => "w", 88 => "x", 89 => "y",
|
118
133
|
90 => "z", 91 => "{", 92 => "|", 93 => "}", 94 => "~", 95 => "\177",
|
119
|
-
96 =>
|
120
|
-
101 =>
|
121
|
-
105 =>
|
134
|
+
96 => FNC3, 97 => FNC2, 98 => SHIFT, 99 => CODEC, 100 => FNC4,
|
135
|
+
101 => CODEA, 102 => FNC1, 103 => STARTA, 104 => STARTB,
|
136
|
+
105 => STARTC,
|
122
137
|
}.invert,
|
123
138
|
|
124
139
|
'C' => {
|
@@ -138,28 +153,23 @@ module Barby
|
|
138
153
|
78 => "78", 79 => "79", 80 => "80", 81 => "81", 82 => "82", 83 => "83",
|
139
154
|
84 => "84", 85 => "85", 86 => "86", 87 => "87", 88 => "88", 89 => "89",
|
140
155
|
90 => "90", 91 => "91", 92 => "92", 93 => "93", 94 => "94", 95 => "95",
|
141
|
-
96 => "96", 97 => "97", 98 => "98", 99 => "99", 100 =>
|
142
|
-
102 =>
|
156
|
+
96 => "96", 97 => "97", 98 => "98", 99 => "99", 100 => CODEB, 101 => CODEA,
|
157
|
+
102 => FNC1, 103 => STARTA, 104 => STARTB, 105 => STARTC
|
143
158
|
}.invert
|
144
159
|
}
|
145
160
|
|
146
|
-
|
147
|
-
FNC2 = "\xc2"
|
148
|
-
FNC3 = "\xc3"
|
149
|
-
FNC4 = "\xc4"
|
150
|
-
CODEA = "\xc5"
|
151
|
-
CODEB = "\xc6"
|
152
|
-
CODEC = "\xc7"
|
153
|
-
|
154
|
-
STOP = '11000111010'
|
155
|
-
TERMINATE = '11'
|
161
|
+
CONTROL_CHARACTERS = VALUES['A'].invert.values_at(*(64..95).to_a)
|
156
162
|
|
157
163
|
attr_reader :type
|
158
164
|
|
159
|
-
|
160
|
-
def initialize(data, type)
|
161
|
-
|
162
|
-
|
165
|
+
|
166
|
+
def initialize(data, type=nil)
|
167
|
+
if type
|
168
|
+
self.type = type
|
169
|
+
self.data = "#{data}"
|
170
|
+
else
|
171
|
+
self.type, self.data = self.class.determine_best_type_for_data("#{data}")
|
172
|
+
end
|
163
173
|
raise ArgumentError, 'Data not valid' unless valid?
|
164
174
|
end
|
165
175
|
|
@@ -350,14 +360,7 @@ module Barby
|
|
350
360
|
end
|
351
361
|
|
352
362
|
def class_for(character)
|
353
|
-
|
354
|
-
when 'A' then Code128A
|
355
|
-
when 'B' then Code128B
|
356
|
-
when 'C' then Code128C
|
357
|
-
when CODEA then Code128A
|
358
|
-
when CODEB then Code128B
|
359
|
-
when CODEC then Code128C
|
360
|
-
end
|
363
|
+
self.class.class_for(character)
|
361
364
|
end
|
362
365
|
|
363
366
|
#Is the data in this barcode valid? Does a lookup of every character
|
@@ -371,8 +374,16 @@ module Barby
|
|
371
374
|
VALUES[type]
|
372
375
|
end
|
373
376
|
|
377
|
+
def start_character
|
378
|
+
case type
|
379
|
+
when 'A' then STARTA
|
380
|
+
when 'B' then STARTB
|
381
|
+
when 'C' then STARTC
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
374
385
|
def start_num
|
375
|
-
values[
|
386
|
+
values[start_character]
|
376
387
|
end
|
377
388
|
|
378
389
|
def start_encoding
|
@@ -380,7 +391,153 @@ module Barby
|
|
380
391
|
end
|
381
392
|
|
382
393
|
|
383
|
-
|
394
|
+
|
395
|
+
CTRL_RE = /#{CONTROL_CHARACTERS.join('|')}/
|
396
|
+
LOWR_RE = /[a-z]/
|
397
|
+
DGTS_RE = /\d{4,}/
|
398
|
+
|
399
|
+
class << self
|
400
|
+
|
401
|
+
|
402
|
+
def class_for(character)
|
403
|
+
case character
|
404
|
+
when 'A' then Code128A
|
405
|
+
when 'B' then Code128B
|
406
|
+
when 'C' then Code128C
|
407
|
+
when CODEA then Code128A
|
408
|
+
when CODEB then Code128B
|
409
|
+
when CODEC then Code128C
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
|
414
|
+
#Insert code shift and switch characters where appropriate to get the
|
415
|
+
#shortest encoding possible
|
416
|
+
def apply_shortest_encoding_for_data(data)
|
417
|
+
extract_codec(data).map do |block|
|
418
|
+
if possible_codec_segment?(block)
|
419
|
+
"#{CODEC}#{block}"
|
420
|
+
else
|
421
|
+
if control_before_lowercase?(block)
|
422
|
+
handle_code_a(block)
|
423
|
+
else
|
424
|
+
handle_code_b(block)
|
425
|
+
end
|
426
|
+
end
|
427
|
+
end.join
|
428
|
+
end
|
429
|
+
|
430
|
+
def determine_best_type_for_data(data)
|
431
|
+
data = apply_shortest_encoding_for_data(data)
|
432
|
+
type = case data.slice!(0)
|
433
|
+
when CODEA then 'A'
|
434
|
+
when CODEB then 'B'
|
435
|
+
when CODEC then 'C'
|
436
|
+
end
|
437
|
+
[type, data]
|
438
|
+
end
|
439
|
+
|
440
|
+
|
441
|
+
private
|
442
|
+
|
443
|
+
#Extract all CODEC segments from the data. 4 or more evenly numbered contiguous digits.
|
444
|
+
#
|
445
|
+
# # C A or B C A or B
|
446
|
+
# extract_codec("12345abc678910DEF11") => ["1234", "5abc", "678910", "DEF11"]
|
447
|
+
def extract_codec(data)
|
448
|
+
segments = data.split(/(\d{4,})/).reject(&:empty?)
|
449
|
+
segments.each_with_index do |s,i|
|
450
|
+
if possible_codec_segment?(s) && s.size.odd?
|
451
|
+
if i == 0
|
452
|
+
if segments[1]
|
453
|
+
segments[1].insert(0, s.slice!(-1))
|
454
|
+
else
|
455
|
+
segments[1] = s.slice!(-1)
|
456
|
+
end
|
457
|
+
else
|
458
|
+
segments[i-1].insert(-1, s.slice!(0)) if segments[i-1]
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
segments
|
463
|
+
end
|
464
|
+
|
465
|
+
def possible_codec_segment?(data)
|
466
|
+
data =~ /\A\d{4,}\Z/
|
467
|
+
end
|
468
|
+
|
469
|
+
def control_character?(char)
|
470
|
+
char =~ CTRL_RE
|
471
|
+
end
|
472
|
+
|
473
|
+
def lowercase_character?(char)
|
474
|
+
char =~ LOWR_RE
|
475
|
+
end
|
476
|
+
|
477
|
+
|
478
|
+
#Handle a Code A segment which may contain Code B parts, but may not
|
479
|
+
#contain any Code C parts.
|
480
|
+
def handle_code_a(data)
|
481
|
+
indata = data.dup
|
482
|
+
outdata = CODEA.dup #We know it'll be A
|
483
|
+
while char = indata.slice!(0)
|
484
|
+
if lowercase_character?(char) #Found a lower case character (Code B)
|
485
|
+
if control_before_lowercase?(indata)
|
486
|
+
outdata << SHIFT << char #Control character appears before a new lowercase, use shift
|
487
|
+
else
|
488
|
+
outdata << handle_code_b(char+indata) #Switch to Code B
|
489
|
+
break
|
490
|
+
end
|
491
|
+
else
|
492
|
+
outdata << char
|
493
|
+
end
|
494
|
+
end#while
|
495
|
+
|
496
|
+
outdata
|
497
|
+
end
|
498
|
+
|
499
|
+
|
500
|
+
#Handle a Code B segment which may contain Code A parts, but may not
|
501
|
+
#contain any Code C parts.
|
502
|
+
def handle_code_b(data)
|
503
|
+
indata = data.dup
|
504
|
+
outdata = CODEB.dup #We know this is going to start with Code B
|
505
|
+
while char = indata.slice!(0)
|
506
|
+
if control_character?(char) #Found a control character (Code A)
|
507
|
+
if control_before_lowercase?(indata) #There is another control character before any lowercase, so
|
508
|
+
outdata << handle_code_a(char+indata) #switch over to Code A.
|
509
|
+
break
|
510
|
+
else
|
511
|
+
outdata << SHIFT << char #Can use a shift to only encode this char as Code A
|
512
|
+
end
|
513
|
+
else
|
514
|
+
outdata << char
|
515
|
+
end
|
516
|
+
end#while
|
517
|
+
|
518
|
+
outdata
|
519
|
+
end
|
520
|
+
|
521
|
+
|
522
|
+
#Test str to see if a control character (Code A) appears
|
523
|
+
#before a lower case character (Code B).
|
524
|
+
#
|
525
|
+
#Returns true only if it contains a control character and a lower case
|
526
|
+
#character doesn't appear before it.
|
527
|
+
def control_before_lowercase?(str)
|
528
|
+
ctrl = str =~ CTRL_RE
|
529
|
+
char = str =~ LOWR_RE
|
530
|
+
|
531
|
+
ctrl && (!char || ctrl < char)
|
532
|
+
end
|
533
|
+
|
534
|
+
|
535
|
+
|
536
|
+
end#class << self
|
537
|
+
|
538
|
+
|
539
|
+
|
540
|
+
end#class Code128
|
384
541
|
|
385
542
|
|
386
543
|
class Code128A < Code128
|
data/lib/barby/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: barby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.6.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Tore Darell
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-05-28 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: Barby creates barcodes.
|
15
14
|
email: toredarell@gmail.com
|
@@ -19,8 +18,11 @@ extra_rdoc_files:
|
|
19
18
|
- README
|
20
19
|
files:
|
21
20
|
- CHANGELOG
|
22
|
-
- README
|
23
21
|
- LICENSE
|
22
|
+
- README
|
23
|
+
- bin/barby
|
24
|
+
- lib/barby.rb
|
25
|
+
- lib/barby/barcode.rb
|
24
26
|
- lib/barby/barcode/bookland.rb
|
25
27
|
- lib/barby/barcode/code_128.rb
|
26
28
|
- lib/barby/barcode/code_25.rb
|
@@ -35,7 +37,7 @@ files:
|
|
35
37
|
- lib/barby/barcode/pdf_417.rb
|
36
38
|
- lib/barby/barcode/qr_code.rb
|
37
39
|
- lib/barby/barcode/upc_supplemental.rb
|
38
|
-
- lib/barby/
|
40
|
+
- lib/barby/outputter.rb
|
39
41
|
- lib/barby/outputter/ascii_outputter.rb
|
40
42
|
- lib/barby/outputter/cairo_outputter.rb
|
41
43
|
- lib/barby/outputter/html_outputter.rb
|
@@ -45,50 +47,39 @@ files:
|
|
45
47
|
- lib/barby/outputter/prawn_outputter.rb
|
46
48
|
- lib/barby/outputter/rmagick_outputter.rb
|
47
49
|
- lib/barby/outputter/svg_outputter.rb
|
48
|
-
- lib/barby/outputter.rb
|
49
50
|
- lib/barby/vendor.rb
|
50
51
|
- lib/barby/version.rb
|
51
|
-
- lib/barby.rb
|
52
52
|
- vendor/Pdf417lib-java-0.91/lib/Pdf417lib.jar
|
53
53
|
- vendor/Pdf417lib-java-0.91/lib/Pdf417lib.java
|
54
|
-
- bin/barby
|
55
54
|
homepage: http://toretore.github.com/barby
|
56
55
|
licenses: []
|
57
|
-
|
56
|
+
metadata: {}
|
57
|
+
post_install_message: |2+
|
58
58
|
|
59
59
|
*** NEW REQUIRE POLICY ***"
|
60
|
-
|
61
|
-
Barby no longer require all barcode symbologies by default. You''ll have
|
62
|
-
|
60
|
+
Barby no longer require all barcode symbologies by default. You'll have
|
63
61
|
to require the ones you need. For example, if you need EAN-13,
|
64
|
-
|
65
|
-
require ''barby/barcode/ean_13''; For a full list of symbologies and their
|
66
|
-
|
62
|
+
require 'barby/barcode/ean_13'; For a full list of symbologies and their
|
67
63
|
filenames, see README.
|
68
|
-
|
69
64
|
***
|
70
65
|
|
71
|
-
|
72
|
-
'
|
73
66
|
rdoc_options: []
|
74
67
|
require_paths:
|
75
68
|
- lib
|
76
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
-
none: false
|
78
70
|
requirements:
|
79
|
-
- -
|
71
|
+
- - ">="
|
80
72
|
- !ruby/object:Gem::Version
|
81
73
|
version: '0'
|
82
74
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
75
|
requirements:
|
85
|
-
- -
|
76
|
+
- - ">="
|
86
77
|
- !ruby/object:Gem::Version
|
87
78
|
version: '0'
|
88
79
|
requirements: []
|
89
80
|
rubyforge_project: barby
|
90
|
-
rubygems_version:
|
81
|
+
rubygems_version: 2.2.2
|
91
82
|
signing_key:
|
92
|
-
specification_version:
|
83
|
+
specification_version: 4
|
93
84
|
summary: The Ruby barcode generator
|
94
85
|
test_files: []
|