U
    '1e<                     @   sv   d dl mZ dZdZd dlmZ d dlmZ dd ZG dd	 d	eZ	d
d Z
dd Zdd Zdd Zedkrre  dS )    )print_functionz3.3.0)USPS_4State)Barcode)asNativec                 C   s>   t | }|dd |dd   }|dr:|dd }|S )znormalized hexN   l)hexlowerendswith)ir r   E/tmp/pip-unpacked-wheel-109iniqw/reportlab/graphics/barcode/usps4s.pynhex
   s
    
 r   c                   @   sF  e Zd ZdZdZdZdZdZedddddZ	edd	dd	d
Z
edddddZd[ddZdd Zdd ZeeZdd Zedd eZdd Zedd eZdd  Zed!d eZd"d# Zed$d eZd%d& Zed'd eZd(d) Zed*d eZd+d, ZeeZd-d. ZeeZd/d0 ZeeZd1d2 ZeeZd3d4 ZeeZd5d6 ZeeZd7Zd8Zed9d Zed:d Z ed;d< Z!e!j"d=d< Z!ed>d? Z#e#j"d@d? Z#edAdB Z$e$j"dCdB Z$edDd Z%edEd Z&dFdG Z'ee'Z'dHdI Z(ee(Z(dJdK Z)dLdM Z*d\dNdOZ+dPdQ Z,dRdS Z-ee-dTd Z-dUdV Z.d]dXdYZ/dZS )^r   zC USPS 4-State OneView (TM) barcode. All info from USPS-B-3200A
          r   )g      ?gQ?)g+?gv/?)FTAD)g      gQ)g+gv/)r   r   r   r   )gQ?g?)g_L?g?)      ?r   )y&1?r   )widthpitchhczvcz01234567094987654321 c                 K   s   |    t|trt|nt|}|s`t|dkrN|d d |dd   }}q|tdt| nt|dkr|tdt| || _|| _| j	f | d S )N)            r   z;value+routing length must be 20, 25, 29 or 31 digits not %d)   	   r   z/routing length must be 5, 9 or 11 digits not %d)
_init
isinstanceintstrr   len
ValueError	_tracking_routingZ_setKeywords)selfvalueroutingZkwdr   r   r   __init__?   s    zUSPS_4State.__init__c                 C   s   d | _ d | _d | _d | _d S N)_bvalue
_codewords_characters	_barcodesr-   r   r   r   r%   N   s    zUSPS_4State._initc                 C   s(   ||  }d|d d|  ||d    S )NH   r   r   r   )kindr   sVr   r   r   scaleT   s    zUSPS_4State.scalec                 C   s   |    || _d S r1   )r%   r+   )r-   trackingr   r   r   r<   Y   s    zUSPS_4State.trackingc                 C   s   | j S r1   )r+   r6   r   r   r   <lambda>\       zUSPS_4State.<lambda>c                 C   s   |    || _d S r1   )r%   r,   )r-   r/   r   r   r   r/   ^   s    zUSPS_4State.routingc                 C   s   | j S r1   )r,   r6   r   r   r   r=   a   r>   c                 C   s   d | _ ttd|d| _d S )Nr   r   )_sizedminmax
_widthSizer-   r.   r   r   r   	widthSizec   s    zUSPS_4State.widthSizec                 C   s   | j S r1   )rB   r6   r   r   r   r=   f   r>   c                 C   s   d | _ || _d S r1   )r?   _heightSizerC   r   r   r   
heightSizeh   s    zUSPS_4State.heightSizec                 C   s   | j S r1   )rE   r6   r   r   r   r=   k   r>   c                 C   s   d | _ || _d S r1   )r?   	_fontSizerC   r   r   r   fontSizem   s    zUSPS_4State.fontSizec                 C   s   | j S r1   )rG   r6   r   r   r   r=   p   r>   c                 C   s   d | _ || _d S r1   )r?   _humanReadablerC   r   r   r   humanReadabler   s    zUSPS_4State.humanReadablec                 C   s   | j S r1   )rI   r6   r   r   r   r=   u   r>   c           
   	   C   s~  | j }|sz| j}t|}zX|dkr*d}nF|dkr@t|d }n0|dkrVt|d }n|dkrlt|d }ntW n   td| Y nX | j}|dd	 }z4|d
9 }|t|d 7 }|d9 }|t|d 7 }W n   td| Y nX d	}dD ]~\}}|}	||7 }||	| }z>t||kr(tt|D ]}	|d
9 }|t||	 7 }q0W q   td|||f Y qX q|| _ |S )a  convert the 4 state string values to binary
        >>> print(nhex(USPS_4State('01234567094987654321','').binary))
        0x1122103b5c2004b1
        >>> print(nhex(USPS_4State('01234567094987654321','01234').binary))
        0xd138a87bab5cf3804b1
        >>> print(nhex(USPS_4State('01234567094987654321','012345678').binary))
        0x202bdc097711204d21804b1
        >>> print(nhex(USPS_4State('01234567094987654321','01234567891').binary))
        0x16907b2a24abc16a2e5c004b1
        r   r#   r   r$   i r   iP;z@Problem converting %s, routing code must be 0, 5, 9 or 11 digitsr   
   z:Problem converting %s, barcode identifier must be 2 digits))zspecial services   )zcustomer identifier   )zsequence numberr$   z+Problem converting %s, %s must be %d digits)r2   r/   r)   r'   r*   r<   range)
r-   r.   r/   nr<   Zsvaluer   nameZndjr   r   r   binaryw   sP     zUSPS_4State.binaryc                 C   s  | j s| j}t|d\}}t|d\}}t|d\}}t|d\}}t|d\}}t|d\}}t|d\}}	t|d\}}
t|d\}}d|  krdksn tdtt||f t|| _| jd@ r|d7 }|d9 }tt	t|||
|	||||||f
| _ | j S )	zconvert binary value into codewords
        >>> print(USPS_4State('01234567094987654321','01234567891').codewords)
        (673, 787, 607, 1022, 861, 19, 816, 1294, 35, 602)
        i|  iU  r   i  z.improper value %s passed to _2codewords A-->%s   i  r   )
r3   rR   divmodAssertionErrorr	   r'   _crc11_fcstuplemap)r-   r.   r   JIHGr   Er   CBr   r   r   	codewords   s$    .

 $zUSPS_4State.codewordsc                 C   s   t dd| j_| jjS )Nr#     )_initNof13Table	__class__table1r6   r   r   r   re      s    zUSPS_4State.table1c                 C   s   t dd| j_| jjS )Nr   N   )rc   rd   table2r6   r   r   r   rg      s    zUSPS_4State.table2c           
      C   s   | j s| j}| j}g }|j}| j}| j}tdD ]H}|| }|dkrN|| }	n||d  }	||? d@ rp|	 d@ }	||	 q0t|| _ | j S )z convert own codewords to characters
        >>> print(' '.join(hex(c)[2:] for c in USPS_4State('01234567094987654321','01234567891').characters))
        dcb 85c 8e4 b06 6dd 1740 17c6 1200 123f 1b2b
        rK   i  rb   r   i  )r4   ra   rW   appendre   rg   rN   rX   )
r-   ra   fcsr_   ZaCre   rg   r   Zcwcr   r   r   
characters   s"    



zUSPS_4State.charactersc           	      C   sn   | j sh| j}g }|j}| j}| jD ]8\}}}}|||| |? d@ d|| |? d@     q"d|| _ | j S )zGet 4 state bar codes for current routing and tracking
        >>> print(USPS_4State('01234567094987654321','01234567891').barcodes)
        AADTFFDFTDADTAADAATFDTDDAAADDTDTTDAFADADDDTFFFDDTTTADFAAADFTDAADA
        r   r   r   )r5   rk   rh   
_bits2barstable4join)	r-   r_   r`   ZaBZ	bits2barsdcdbacabr   r   r   barcodes   s    .zUSPS_4State.barcodes)A)   r      rL   )r   rK   r   r   )r$      r      )r#   r#   rM   r   )rw   r$   rL   r   )r   r   r#   rv   )r   r#   r   rw   )ru   ru   r$   r   )rM   rL   rw   rK   )rL   r$   rt   rM   )r#   r   r   ru   )rw   r#   r   rv   )r$   rK   r   r   )rt   r   rM   rt   )rL   rM   ru   r$   )r   rL   rw   rM   )rM   ru   r   rt   )r   r   r$   r$   )rt   rK   r#   r   )ru   r   rL   rw   )rM   r   r   ru   )rw   r   r   r   )r$   rw   rL   rv   )r   rM   rt   rt   )r#   r   ru   rK   )r   rv   rM   r$   )rt   rL   rw   r   )r#   rw   r$   rt   )ru   rM   r   rK   )rL   ru   r   r#   )rw   ru   r#   rt   )rt   r   r   r$   )rM   r   r$   rM   )r   rM   ru   rw   )r   r   rL   r   )r#   r$   rw   rv   )ru   r   rM   r   )r$   r#   rt   ru   )rL   rL   r   r   )r   rt   r   r   )r   rL   ru   r   )rM   rK   rL   r#   )rw   rt   r$   ru   )r   r   r#   rM   )r   rw   rt   rv   )ru   r   rw   r   )r#   rK   rL   r   )r$   rL   r   r$   )rM   r#   r   ru   )rt   rw   r   rt   )r#   r   ru   r#   )r   rL   r   rK   )rM   rv   r$   r   )rL   r   r   rM   )rw   rw   rt   r$   )r#   ru   r   r   )r   r#   r   r   )r$   r   ru   rv   )rw   rL   rM   rM   )rt   r   rL   rt   )ru   rt   rt   r#   )r   rv   r   r   )r   r$   r$   r   )rM   rw   r#   rL   )rL   rK   rw   r   r   r   r   r   c                 C   s   |  d| j| jS )Nr   )r;   
dimensions
widthScaler6   r   r   r   r=     r>   c                 C   s   |  d| j| jS )Nr   )r;   ry   heightScaler6   r   r   r   r=     r>   c                 C   s&   d| j kr| j d S | d| j| jS )N	_barWidthr   __dict__r;   ry   rz   r6   r   r   r   barWidth  s    

zUSPS_4State.barWidthc                 C   s0   | j d \}}dtt|d || | jd< d S )Nr   r7         R@r|   ry   r@   rA   r~   r-   r.   rO   xr   r   r   r     s    c                 C   s&   d| j kr| j d S | d| j| jS )N_pitchr   r}   r6   r   r   r   r     s    

zUSPS_4State.pitchc                 C   s0   | j d \}}dtt|d || | jd< d S )Nr   r7   r   r   r   r   r   r   r   r   !  s    c                 C   s8   d| j kr| j d S | d| j| j| d| j| j S )N
_barHeightr   )r~   r;   topsr{   bottomsr6   r   r   r   	barHeight&  s    

zUSPS_4State.barHeightc                 C   sp   | j d d | jd d  }| j d d | jd d  }dtt|d ||  }| jd< || ||  | _d S )Nr   r   r   r7   r   r   )r   r   r@   rA   r~   rF   r   r   r   r   r   ,  s    "c                 C   s   t dtd| jS Nr   r   )r@   rA   rD   r6   r   r   r   r=   3  r>   c                 C   s   t dtd| jS r   )r@   rA   rF   r6   r   r   r   r=   4  r>   c                 C   s   |    | jS r1   )computeSize_widthr6   r   r   r   r   6  s    zUSPS_4State.widthc                 C   s   |    | jS r1   )r   _heightr6   r   r   r   height;  s    zUSPS_4State.heightc                 C   s   t | dd s~| j}| j}| j}| j}| j}| j}| j}d| | d|  | _d| | | _	| j
rx|  j	| jd | 7  _	d| _d S )Nr?   r   @   g333333?T)getattrrz   r{   r   r   r   horizontalClearZoneverticalClearZoner   r   rJ   rH   r?   )r-   wshsr   r   r   r   r   r   r   r   r   @  s    zUSPS_4State.computeSizec                 C   s   |    | j| jfS r1   )r   r   r   )r-   ZaWZaHr   r   r   wrapO  s    zUSPS_4State.wrapc                 C   sL   i }| j }dD ]8}| || j|| }|| || j|| | f||< q|S )Nrx   )r{   r;   r   r   )r-   y0vInfor   byr   r   r   _getBarVInfoS  s    "zUSPS_4State._getBarVInfoc                 C   sx   |    | j}| j}| j}|}|| jd  }| j}| |}| jD ](}|| \}	}
| ||	||
 ||7 }qB| 	  d S )Ng      ?)
r   r   r   r   r   r   r   rs   ZrectdrawHumanReadable)r-   r   r   Zbwr   r   Zdwr   r   ZybZhbr   r   r   draw[  s    


zUSPS_4State.drawc                 C   sP   | j }| j}|r|fpd}d|dd |dd |dd |dd  f| S )Nr    r   r   r#   r   )r<   r/   rn   )r-   r<   r/   r   r   r   r.   j  s    zUSPS_4State.valuec                 C   s   | j d|S )Nr<   )r~   __setitem__rC   r   r   r   r=   o  r>   c                 C   sL   | j rH| j}| j}| j}| j}| jd|  d|  }| ||| j|| d S )Nr   g?)rJ   r   r   fontNamerH   r   annotater.   )r-   r   r   r   rH   r   r   r   r   r   q  s    zUSPS_4State.drawHumanReadablemiddlec              	   C   s   t j| |||||dd d S )Nstart)anchor)r   r   )r-   r   r   textr   rH   r   r   r   r   r   z  s    zUSPS_4State.annotateN)r   r   )r   )r   )0__name__
__module____qualname____doc__rB   rE   rG   rI   dictr   r   ry   r0   r%   r;   staticmethodr<   propertyr/   rD   rF   rH   rJ   rR   ra   re   rg   rk   rs   rm   rl   r   r   r   setterr   r   rz   r{   r   r   r   r   r   r   r.   r   r   r   r   r   r   r      s   
5






	r   c                 C   s   t t| dd }ddt|  | }d}d}t|dd dd> }tdd	D ]6}||A d
@ rn|d> |A }n|d> }|dM }|dK }qPtdddD ]^}t|||d  dd> }td	D ]6}||A d
@ r|d> |A }n|d> }|dM }|dK }qq|S )aV  
    >>> usps = [USPS_4State('01234567094987654321',x).binary for x in ('','01234','012345678','01234567891')]
    >>> print(' '.join(nhex(x) for x in usps))
    0x1122103b5c2004b1 0xd138a87bab5cf3804b1 0x202bdc097711204d21804b1 0x16907b2a24abc16a2e5c004b1
    >>> print(' '.join(nhex(_crc11(x)) for x in usps))
    0x51 0x65 0x606 0x751
    r   N0   i5  i     r#   rw   rS   r   rL   )r   r'   r)   rN   )r.   hexbytesZgpri   datar   r   r   r   r   rV   }  s(    
rV   c                 C   s2   d}t dD ] }|dK }|| d@ O }| dL } q|S )zureverse unsigned 13 bit number
    >>> print(_ru13(7936), _ru13(31), _ru13(47), _ru13(7808))
    31 7936 7808 47
    r      r   )rN   )r   r   r   r   r   r   _ru13  s    
r   c           	      C   s   |dg }d}|d }t dD ]}d}t dD ]}||d|> @ dk7 }q.|| krRqt|}||k rdq||kr~|||< |d8 }q|||< |d7 }|||< |d7 }q||d kstd|d || f |S )a,  create and return table of 13 bit values with N bits on
    >>> T = _initNof13Table(5,1287)
    >>> print(' '.join('T[%d]=%d' % (i, T[i]) for i in (0,1,2,3,4,1271,1272,1284,1285,1286)))
    T[0]=31 T[1]=7936 T[2]=47 T[3]=7808 T[4]=55 T[1271]=6275 T[1272]=6211 T[1284]=856 T[1285]=744 T[1286]=496
    Nr   r   i    r   z!u+1(%d)!=l(%d) for %d of 13 table)rN   r   rU   )	NZlenTr   r   urj   Zbcr   r   r   r   r   rc     s*    
  

"rc   c                  C   s   dd l } |  S )Nr   )doctesttestmod)r   r   r   r   _test  s    r   __main__N)
__future__r   __version____all__Z!reportlab.graphics.barcode.commonr   Zreportlab.lib.utilsr   r   r   rV   r   rc   r   r   r   r   r   r   <module>   s     n 