
    BPc                         d Z ddlmZmZ ddlmZ 	 ddlmZm	Z	m
Z
 n# e$ r Y nw xY wg dg dgZdZ G d	 d
e          ZdS )z?
Some basic common code shared between EAN and UCP generators.
   )BarcodeTEXT_POS_TOP    )inkex_gettext)OptionalListDict)
0001101001100100100110111101010001101100010101111011101101101110001011)
0100111011001100110110100001001110101110010000101001000100010010010111)
000000001011001101001110010011011001011100010101010110011010c                       e Zd ZdZdZdZg Zi ZdZdZ	dZ
ed             Zeefd            Zed             Zed	             Zed
             Zd Zd ZddZddZd Zd Zd ZdS )
EanBarcodez+Simple base class for all EAN type barcodesN
   20202020c                     d | D             S )z0Convert a string of digits into an array of intsc                 ,    g | ]}t          |          S  int).0is     1/usr/share/inkscape/extensions/barcode/BaseEan.py
<listcomp>z'EanBarcode.intarray.<locals>.<listcomp>X   s    '''1A'''    r/   )numbers    r4   intarrayzEanBarcode.intarrayU   s     ('''''r6   c                     g }t                               ||                    }t          |          D ]9\  }}t          ||                  }|                    |||                             :|S )z+Encode any side of the barcode, interleaved)r)   r8   	enumerateMAPPINGappend)familyr7   famsresultencsetr3   _thismaps           r4   encode_interleavedzEanBarcode.encode_interleavedZ   sl     $$T&\22f%% 	. 	.DAqfQi(GMM'&),----r6   c                 r    g }| D ]1}|                     t          d         |         ddd                    2|S )z5Encode the right side of the barcode, non-interleavedr   Nr<   r;   r7   r?   nums      r4   encode_rightzEanBarcode.encode_rightd   sE      	1 	1CMM'!*S/$$B$/0000r6   c                 `    g }| D ](}|                     t          d         |                    )|S )z4Encode the left side of the barcode, non-interleavedr   rF   rG   s      r4   encode_leftzEanBarcode.encode_leftm   s:      	+ 	+CMM'!*S/****r6   c                      d}| D ]L}t          |t                    r|D ]}|t          |          z  }/t          |t                    r|d|z  z  }M|S )zSpace out an array of numbers  )
isinstanceliststrr1   )spacingr?   spacer3   s       r4   rS   zEanBarcode.spaceu   sv      	& 	&E%&& & % %Ac!ff$FF%E3'' &#+%r6   c                 >    | j         r| j         gS | j        dd         S )z#Return a list of acceptable lengthsN)lengthlengths)selfs    r4   get_lengthszEanBarcode.get_lengths   s&    ; 	!K= |AAAr6   c           
      \   |                     dd                                          }|                    d          }|                    d          }|                                s#|                     |t          d                    S |                                 | j        z   }t          |          |vrk| j	        D ]c}t          |          |z
  }||v rK| 
                    | j	        |         ||d         | j        d| j        z  z   t                     |d|         }dt          |          |vra|                     |t          d                              t          |          d	                    d
 |D                                           S | j        rdt          |          | j        vr|                     |          }n8|                     |          s#|                     |t          d                    S |                     t&                              |          |          S )zEncode any EAN barcoderN   rM   >z%Not a Number, must be digits 0-9 onlyNi  )textxtext_posz"Wrong size {:d}, must be {} digitsz, c                 ,    g | ]}t          |          S r/   )rQ   )r2   rU   s     r4   r5   z%EanBarcode.encode.<locals>.<listcomp>   s    )L)L)L&#f++)L)L)Lr6   z!Checksum failed, omit for new sum)guide)replacestripendswithisdigiterrorrA   rX   checkslenextrasadd_extra_barcodepos_xscaler   formatjoinappend_checksumverify_checksum_encoder)   r8   )rW   r[   coder_   rV   extraseps          r4   encodezEanBarcode.encode   s   ||C$$**,,c""zz#||~~ 	P::dA&M$N$NOOO""$$t{2 t99G## 
& 
&$ii%''>>**E*!#$$Z*sTZ'77!-	 +     :Dt99G##::677>>IItyy)L)LG)L)L)LMM    ; 	P4yy++++D11))$// Pzz$*M(N(NOOO||J//55U|CCCr6   Fc                      t          d          )z
        Write your EAN encoding function, it's passed in an array of int and
        it should return a string on 1 and 0 for black and white parts
        z(_encode should be provided by parent EAN)NotImplementedError)rW   rH   r_   s      r4   ro   zEanBarcode._encode   s    
 ""LMMMr6   r/   c                     | j         g|z   }|                    | j                   |t          |          | j         gz   z  }d                    |          S )zStandard EnclosurerM   )	guard_barr<   
center_barrP   rl   )rW   leftrightpartss       r4   enclosezEanBarcode.enclose   sO     4'T_%%%e///wwu~~r6   c           	          t          d t          |ddd                   D                       }| j        || j        z  z
  }|dk     s|| j        k    rdS t          |          S )z#Generate a UPCA/EAN13/EAN8 Checksumc                 J    g | ] \  }}t          |          d |dz           z  !S ))   r      r0   )r2   r\   ns      r4   r5   z+EanBarcode.get_checksum.<locals>.<listcomp>   s/    MMM1SVVfQUm+MMMr6   NrE   r   0)sumr:   magicrQ   )rW   rH   totalchecksums       r4   get_checksumzEanBarcode.get_checksum   sk     MM	#ddd)8L8LMMMNN:!34a<<8tz1138}}r6   c                 2    ||                      |          z   S )z$Apply the checksum to a short numberr   rW   r7   s     r4   rm   zEanBarcode.append_checksum   s    ))&1111r6   c                 P    |                      |dd                   |d         k    S )zVerify any checksumNrE   r   r   s     r4   rn   zEanBarcode.verify_checksum   s'      --;;r6   )F)r/   )__name__
__module____qualname____doc__rV   rU   re   rg   r   rw   rx   staticmethodr8   FAMILIESrC   rI   rK   rS   rX   rs   ro   r|   r   rm   rn   r/   r6   r4   r)   r)   J   sE       55GFFFEIJ( ( \( 08    \   \   \ 	 	 \	  %D %D %DNN N N N     2 2 2< < < < <r6   r)   N)r   Baser   r   inkex.localizationr   rA   typingr   r   r	   ImportErrorr;   r   r)   r/   r6   r4   <module>r      s   &  ( ' ' ' ' ' ' ' 1 1 1 1 1 1	+++++++++++ 	 	 	D	
    :B< B< B< B< B< B< B< B< B< B<s   
 %%