o
    e>                     @   sz   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r;e  dS 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   QD:\Projects\ConvertPro\env\Lib\site-packages\reportlab/graphics/barcode/usps4s.pynhex
   s   r   c                   @   sH  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dbd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/d0 Zed1d" eZd2d3 ZeeZd4d5 ZeeZd6d7 ZeeZd8d9 ZeeZd:d; ZeeZd<d= ZeeZd>Zd?Zed@d" ZedAd" Z edBdC Z!e!j"dDdC Z!edEdF Z#e#j"dGdF Z#edHdI Z$e$j"dJdI Z$edKd" Z%edLd" Z&dMdN Z'ee'Z'dOdP Z(ee(Z(dQdR Z)dSdT Z*dcdUdVZ+dWdX Z,dYdZ Z-ee-d[d" Z-d\d] Z.ddd_d`Z/daS )er   zC USPS 4-State OneView (TM) barcode. All info from USPS-B-3200A
          r   T)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)gx&?gq=
ףp?)g/$?{Gz?)gx&gq=
ףp)g/$g{Gz)r   r   r   r   )r   r   01234567094987654321 c                 K   s   |    t|trt|nt|}|s/t|dv r'|d d |dd  }}ntdt| t|dvr=tdt| || _|| _| j	di | 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 %dr   )
_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      |    || _d S r2   )r&   r,   )r.   trackingr   r   r   r>   Y      
zUSPS_4State.trackingc                 C      | j S r2   )r,   r7   r   r   r   <lambda>\       zUSPS_4State.<lambda>c                 C   r=   r2   )r&   r-   )r.   r0   r   r   r   r0   ^   r?   zUSPS_4State.routingc                 C   r@   r2   )r-   r7   r   r   r   rA   a   rB   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   r@   r2   )rF   r7   r   r   r   rA   f   rB   c                 C      d | _ || _d S r2   )rC   _heightSizerG   r   r   r   
heightSizeh      
zUSPS_4State.heightSizec                 C   r@   r2   )rJ   r7   r   r   r   rA   k   rB   c                 C   rI   r2   )rC   	_fontSizerG   r   r   r   fontSizem   rL   zUSPS_4State.fontSizec                 C   r@   r2   )rM   r7   r   r   r   rA   p   rB   c                 C   rI   r2   )rC   _humanReadablerG   r   r   r   humanReadabler   rL   zUSPS_4State.humanReadablec                 C   r@   r2   )rO   r7   r   r   r   rA   u   rB   c           
   	   C   sd  | j }|s| j}t|}z,|dkrd}n#|dkrt|d }n|dkr*t|d }n|dkr5t|d }ntW n	   td| | j}|dd	 }z|d
9 }|t|d 7 }|d9 }|t|d 7 }W n	   td| d	}dD ]9\}}|}	||7 }||	| }zt||krtt|D ]}	|d
9 }|t||	 7 }qW qs   td|||f || _ |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)r3   r0   r*   r(   r+   r>   range)
r.   r/   r0   nr>   Zsvaluer   namendjr   r   r   binaryw   sR   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rOdks\n J dtt||f t|| _| jd@ rj|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   )	r4   rY   divmodr	   r(   _crc11_fcstuplemap)r.   r/   r   JIHGr   Er   CBr   r   r   	codewords   s"   .
$zUSPS_4State.codewordsc                 C      t dd| j_| jjS )Nr$     )_initNof13Table	__class__table1r7   r   r   r   rl         zUSPS_4State.table1c                 C   rh   )Nr   N   )rj   rk   table2r7   r   r   r   ro      rm   zUSPS_4State.table2c           
      C   s   | j sB| j}| j}g }|j}| j}| j}tdD ]$}|| }|dkr'|| }	n||d  }	||? d@ r8|	 d@ }	||	 qt|| _ | 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
        rQ   i  ri   r   i  )r5   rg   r]   appendrl   ro   rT   r^   )
r.   rg   fcsre   ZaCrl   ro   r   Zcwcr   r   r   
characters   s"   



zUSPS_4State.charactersc           	      C   sn   | j s4| j}g }|j}| j}| jD ]\}}}}|||| |? 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   )r6   rs   rp   
_bits2barstable4join)	r.   re   rf   ZaBZ	bits2barsZdcdbacabr   r   r   barcodes   s   .zUSPS_4State.barcodes)A)   r      rR   )r   rQ   r   r   )r%      r      )r$   r$   rS   r   )r~   r%   rR   r   )r   r   r$   r}   )r   r$   r   r~   )r|   r|   r%   r   )rS   rR   r~   rQ   )rR   r%   r{   rS   )r$   r   r   r|   )r~   r$   r   r}   )r%   rQ   r   r   )r{   r   rS   r{   )rR   rS   r|   r%   )r   rR   r~   rS   )rS   r|   r   r{   )r   r   r%   r%   )r{   rQ   r$   r   )r|   r   rR   r~   )rS   r   r   r|   )r~   r   r   r   )r%   r~   rR   r}   )r   rS   r{   r{   )r$   r   r|   rQ   )r   r}   rS   r%   )r{   rR   r~   r   )r$   r~   r%   r{   )r|   rS   r   rQ   )rR   r|   r   r$   )r~   r|   r$   r{   )r{   r   r   r%   )rS   r   r%   rS   )r   rS   r|   r~   )r   r   rR   r   )r$   r%   r~   r}   )r|   r   rS   r   )r%   r$   r{   r|   )rR   rR   r   r   )r   r{   r   r   )r   rR   r|   r   )rS   rQ   rR   r$   )r~   r{   r%   r|   )r   r   r$   rS   )r   r~   r{   r}   )r|   r   r~   r   )r$   rQ   rR   r   )r%   rR   r   r%   )rS   r$   r   r|   )r{   r~   r   r{   )r$   r   r|   r$   )r   rR   r   rQ   )rS   r}   r%   r   )rR   r   r   rS   )r~   r~   r{   r%   )r$   r|   r   r   )r   r$   r   r   )r%   r   r|   r}   )r~   rR   rS   rS   )r{   r   rR   r{   )r|   r{   r{   r$   )r   r}   r   r   )r   r%   r%   r   )rS   r~   r$   rR   )rR   rQ   r~   r   r   r   r   r   c                 C      |  d| j| jS )Nr   )r<   
dimensions
widthScaler7   r   r   r   rA         c                 C   r   )Nr   )r<   r   heightScaler7   r   r   r   rA     r   c                 C   &   d| j v r
| j d S | d| j| jS )N	_barWidthr   __dict__r<   r   r   r7   r   r   r   barWidth     

zUSPS_4State.barWidthc                 C   0   | j d \}}dtt|d || | jd< d S )Nr   r8         R@r   r   rD   rE   r   r.   r/   rU   xr   r   r   r        "c                 C   r   )N_pitchr   r   r7   r   r   r   r     r   zUSPS_4State.pitchc                 C   r   )Nr   r8   r   r   r   r   r   r   r   r   !  r   c                 C   s8   d| j v r
| j d S | d| j| j| d| j| j S )N
_barHeightr   )r   r<   topsr   bottomsr7   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   r8   r   r   )r   r   rD   rE   r   rK   r   r   r   r   r   ,  s   "c                 C      t dtd| jS Nr   r   )rD   rE   rH   r7   r   r   r   rA   3  r   c                 C   r   r   )rD   rE   rK   r7   r   r   r   rA   4  r   c                 C      |    | jS r2   )computeSize_widthr7   r   r   r   r   6     zUSPS_4State.widthc                 C   r   r2   )r   _heightr7   r   r   r   height;  r   zUSPS_4State.heightc                 C   s   t | dd sA| j}| j}| j}| j}| j}| j}| j}d| | d|  | _d| | | _	| j
r<|  j	| jd | 7  _	d| _d S d S )NrC   r   @   g333333?T)getattrr   r   r   r   r   horizontalClearZoneverticalClearZoner   r   rP   rN   rC   )r.   wshsr   r   r   r   r   r   r   r   r   @  s   
zUSPS_4State.computeSizec                 C   s   |    | j| jfS r2   )r   r   r   )r.   ZaWZaHr   r   r   wrapO  s   zUSPS_4State.wrapc                 C   sL   i }| j }dD ]}| || j|| }|| || j|| | f||< q|S )Nr   )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 }q!| 	  d S )Ng      ?)
r   r   r   r   r   r   r   rz   rectdrawHumanReadable)r.   r   r   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>   r0   rv   )r.   r>   r0   r   r   r   r/   j  s   6zUSPS_4State.valuec                 C   s   | j d|S )Nr>   )r   __setitem__rG   r   r   r   rA   o  s    c                 C   sP   | j r&| j}| j}| j}| j}| jd|  d|  }| ||| j|| d S d S )Nr   g?)rP   r   r   fontNamerN   r   annotater/   )r.   r   r   r   rN   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   rN   r   r   r   r   r   z  s   zUSPS_4State.annotateN)r   r   )r   )r   )0__name__
__module____qualname____doc__rF   rJ   rM   rO   dictr   r   r   r1   r&   r<   staticmethodr>   propertyr0   rH   rK   rN   rP   rY   rg   rl   ro   rs   rz   ru   rt   r   r   r   setterr   r   r   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 ]}||A d
@ r7|d> |A }n|d> }|dM }|dK }q(tdddD ]/}t|||d  dd> }td	D ]}||A d
@ rl|d> |A }n|d> }|dM }|dK }q]qJ|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$   r~   rZ   r   rR   )r   r(   r*   rT   )r/   Zhexbytesgprq   datar   r   r   r   r   r\   }  s*   

r\   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   )rT   )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r)qt|}||k r2q||kr?|||< |d8 }q|||< |d7 }|||< |d7 }q||d ksaJ 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)rT   r   )	NZlenTr   r   urr   bcr   r   r   r   r   rj     s&   




"rj   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   r\   r   rj   r   r   r   r   r   r   <module>   s      n 
