@@ -43,7 +43,7 @@ class EuropeanArticleNumber13(Barcode):
4343
4444 digits = 12
4545
46- def __init__ (self , ean , writer = None , no_checksum = False ):
46+ def __init__ (self , ean , writer = None , no_checksum = False , guardbar = False ):
4747 ean = ean [: self .digits ]
4848 if not ean .isdigit ():
4949 raise IllegalCharacterError ("EAN code can only contain numbers." )
@@ -64,12 +64,22 @@ def __init__(self, ean, writer=None, no_checksum=False):
6464 )
6565 else :
6666 self .ean = "{}{}" .format (ean , self .calculate_checksum ())
67+
68+ self .guardbar = guardbar
69+ if guardbar :
70+ self .EDGE = _ean .EDGE .replace ("1" , "G" )
71+ self .MIDDLE = _ean .MIDDLE .replace ("1" , "G" )
72+ else :
73+ self .EDGE = _ean .EDGE
74+ self .MIDDLE = _ean .MIDDLE
6775 self .writer = writer or Barcode .default_writer ()
6876
6977 def __str__ (self ):
7078 return self .ean
7179
7280 def get_fullcode (self ):
81+ if self .guardbar :
82+ return self .ean [0 ] + " " + self .ean [1 :7 ] + " " + self .ean [7 :] + " >"
7383 return self .ean
7484
7585 def calculate_checksum (self ):
@@ -92,14 +102,14 @@ def build(self):
92102 :returns: The pattern as string
93103 :rtype: String
94104 """
95- code = _ean .EDGE [:]
105+ code = self .EDGE [:]
96106 pattern = _ean .LEFT_PATTERN [int (self .ean [0 ])]
97107 for i , number in enumerate (self .ean [1 :7 ]):
98108 code += _ean .CODES [pattern [i ]][int (number )]
99- code += _ean .MIDDLE
109+ code += self .MIDDLE
100110 for number in self .ean [7 :]:
101111 code += _ean .CODES ["C" ][int (number )]
102- code += _ean .EDGE
112+ code += self .EDGE
103113 return [code ]
104114
105115 def to_ascii (self ):
@@ -109,7 +119,7 @@ def to_ascii(self):
109119 """
110120 code = self .build ()
111121 for i , line in enumerate (code ):
112- code [i ] = line .replace ("1" , "|" ).replace ("0" , " " )
122+ code [i ] = line .replace ("G" , "|" ). replace ( " 1" , "|" ).replace ("0" , " " )
113123 return "\n " .join (code )
114124
115125 def render (self , writer_options = None , text = None ):
@@ -118,6 +128,14 @@ def render(self, writer_options=None, text=None):
118128 return Barcode .render (self , options , text )
119129
120130
131+ class EuropeanArticleNumber13WithGuard (EuropeanArticleNumber13 ):
132+
133+ name = "EAN-13 with guards"
134+
135+ def __init__ (self , * args , guardbar = True , ** kwargs ):
136+ return super ().__init__ (* args , guardbar = guardbar , ** kwargs )
137+
138+
121139class JapanArticleNumber (EuropeanArticleNumber13 ):
122140 """Initializes JAN barcode.
123141
@@ -154,24 +172,37 @@ class EuropeanArticleNumber8(EuropeanArticleNumber13):
154172
155173 digits = 7
156174
157- def __init__ (self , ean , writer = None ):
158- EuropeanArticleNumber13 .__init__ (self , ean , writer )
175+ def __init__ (self , ean , writer = None , guardbar = False ):
176+ EuropeanArticleNumber13 .__init__ (self , ean , writer , guardbar = guardbar )
159177
160178 def build (self ):
161179 """Builds the barcode pattern from `self.ean`.
162180
163181 :returns: The pattern as string
164182 :rtype: String
165183 """
166- code = _ean .EDGE [:]
184+ code = self .EDGE [:]
167185 for number in self .ean [:4 ]:
168186 code += _ean .CODES ["A" ][int (number )]
169- code += _ean .MIDDLE
187+ code += self .MIDDLE
170188 for number in self .ean [4 :]:
171189 code += _ean .CODES ["C" ][int (number )]
172- code += _ean .EDGE
190+ code += self .EDGE
173191 return [code ]
174192
193+ def get_fullcode (self ):
194+ if self .guardbar :
195+ return "< " + self .ean [:4 ] + " " + self .ean [4 :] + " >"
196+ return self .ean
197+
198+
199+ class EuropeanArticleNumber8WithGuard (EuropeanArticleNumber8 ):
200+
201+ name = "EAN-8 with guards"
202+
203+ def __init__ (self , * args , guardbar = True , ** kwargs ):
204+ return super ().__init__ (* args , guardbar = guardbar , ** kwargs )
205+
175206
176207class EuropeanArticleNumber14 (EuropeanArticleNumber13 ):
177208 """Represents an EAN-14 barcode. See EAN13's __init__ for details.
@@ -204,5 +235,7 @@ def sum_(x, y):
204235# Shortcuts
205236EAN14 = EuropeanArticleNumber14
206237EAN13 = EuropeanArticleNumber13
238+ EAN13_GUARD = EuropeanArticleNumber13WithGuard
207239EAN8 = EuropeanArticleNumber8
240+ EAN8_GUARD = EuropeanArticleNumber8WithGuard
208241JAN = JapanArticleNumber
0 commit comments