o
    fi %                     @  s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddl	mZ dd	lmZ dd
lmZ ddlmZ erFddlmZ dZdZdZd$ddZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZeZd#S )%zBModule: barcode.codex

:Provided barcodes: Code 39, Code 128, PZN
    )annotations)TYPE_CHECKING)
Collection)Literal)Barcode)code39)code128)BarcodeError)IllegalCharacterError)NumberOfDigitsError)
BaseWriterzrestructuredtext eng?gRQ@codestrnameallowedCollection[str]returnNonec                 C  s@   g }| D ]}||vr| | q|rtdj|d|dd S )Nz:The following characters are not valid for {name}: {wrong}z, )r   wrong)appendr
   formatjoin)r   r   r   r   char r   A/home/ubuntu/.local/lib/python3.10/site-packages/barcode/codex.py
check_code   s   

r   c                      sX   e Zd ZdZdZddddZdddZdddZdd ZdddZ	d fdd	Z
  ZS )Code39zA Code39 barcode implementationzCode 39NTr   r   add_checksumboolr   r   c                 C  sD   |  | _|r|  j|  7  _|p|  | _t| j| jtj dS )z
        :param code: Code 39 string without \* and without checksum.
        :param writer: A ``barcode.writer`` instance used to render the barcode
            (default: SVGWriter).
        :param add_checksum: Add the checksum to code or not
        N)	upperr   calculate_checksumdefault_writerwriterr   r   r   REF)selfr   r"   r   r   r   r   __init__/   s
   
zCode39.__init__c                 C     | j S Nr   r$   r   r   r   __str__=      zCode39.__str__c                 C  r&   )z.:returns: The full code as it will be encoded.r(   r)   r   r   r   get_fullcode@   s   zCode39.get_fullcodec                 C  sD   t dd | jD d }tj D ]\}}||d kr|  S qd S )Nc                 s  s    | ]
}t j| d  V  qdS )r   N)r   MAP).0xr   r   r   	<genexpr>E   s    z,Code39.calculate_checksum.<locals>.<genexpr>+   r   )sumr   r   r-   items)r$   checkkvr   r   r   r    D   s   zCode39.calculate_checksum	list[str]c                 C  sF   t jg}| jD ]}|t j| d  q|t j t j|}|gS N   )r   EDGEr   r   r-   MIDDLEr   )r$   charsr   resultr   r   r   buildK   s   
zCode39.buildc                   &   t td}||p
i  t ||S N)module_width
quiet_zoneMIN_SIZEMIN_QUIET_ZONEupdatesuperrenderr$   writer_optionstextoptions	__class__r   r   rH   S      
zCode39.render)NT)r   r   r   r   r   r   r   r   r   r7   NN)__name__
__module____qualname____doc__r   r%   r*   r,   r    r>   rH   __classcell__r   r   rM   r   r   *   s    


r   c                      s<   e Zd ZdZdZdZdd fddZd	d
 Zdd Z  Z	S )PZN7zInitializes new German number for pharmaceutical products.

    :parameters:
        pzn : String
            Code to render.
        writer : barcode.writer Instance
            The writer to render the barcode (default: SVGWriter).
    Pharmazentralnummer   Nr   r   c                   s~   |d | j  }| stdt|| j kr$td| j  dt| d|| _| |   | _t jd| j |dd d S )NzPZN can only contain numbers.zPZN must have z digits, not .PZN-F)r   )	digitsisdigitr
   lenr   pznr    rG   r%   )r$   r`   r"   rM   r   r   r%   g   s   zPZN7.__init__c                 C  s   d| j  S )Nr\   )r`   r)   r   r   r   r,   s   s   zPZN7.get_fullcodec                 C  s8   t dd t| jddD }|d }|dkrtd|S )Nc                 s  s$    | ]\}}t |t | V  qd S r'   )int)r.   r/   yr   r   r   r0   w   s   " z*PZN7.calculate_checksum.<locals>.<genexpr>   start   
   zChecksum can not be 10 for PZN.)r2   	enumerater`   r	   )r$   sum_checksumr   r   r   r    v   s
   zPZN7.calculate_checksumr'   r   r   )
rS   rT   rU   rV   r   r]   r%   r,   r    rW   r   r   rM   r   rX   Y   s    	rX   c                   @  s   e Zd ZdZdZdS )PZN8zWill be fully added in v0.9.   N)rS   rT   rU   rV   r]   r   r   r   r   rl      s    rl   c                      s   e Zd ZU dZdZded< ded< ded< ded	< d.d/ddZd0ddZed1ddZ	d0ddZ
d2ddZdd Zd3ddZd4d d!Zd5d#d$Zd6d%d&Zd1d'd(Zd7d*d+Zd8 fd,d-	Z  ZS )9Code128a@  Initializes a new Code128 instance. The checksum is added automatically
    when building the bars.

    :parameters:
        code : String
            Code 128 string without checksum (added automatically).
        writer : barcode.writer Instance
            The writer to render the barcode (default: SVGWriter).
    zCode 128Literal['A', 'B', 'C']_charsetr   r   r   r"   bufferNr   r   c                 C  s6   || _ |p|  | _d| _d| _t| j | jtj d S )NC )	r   r!   r"   rp   _bufferr   r   r   ALLr$   r   r"   r   r   r   r%      s
   zCode128.__init__c                 C  r&   r'   r(   r)   r   r   r   r*      r+   zCode128.__str__	list[int]c                 C  s   |   S r'   )_buildr)   r   r   r   encoded   s   zCode128.encodedc                 C  r&   r'   r(   r)   r   r   r   r,      r+   zCode128.get_fullcodewhichc                 C  s^   || j krtd| |dkr| d}n|dkr | d}n	|dkr)| d}|| _ |gS )NzAlready in charset ATO_ABTO_Brr   TO_C)rp   
ValueError_convert)r$   rz   r   r   r   r   _new_charset   s   

zCode128._new_charsetc                 C  s   dS )a  Whether a character is the FNC1 character.

        May be redefined by subclasses if required. FNC1 char is defined in GS1-128
        specification and it is defined just the same for all encodings therefore this
        sign should be treated in a special way.
        Fr   r$   r   r   r   r   _is_char_fnc1_char   s   zCode128._is_char_fnc1_charposra   c                   s,  | j | }| j ||d   d fdd}g }| jdkrV| sV| |r*| js*|S |tjv r5| d}n
|tjv r?| d}t	| jd	krT|
| | jd
  d| _|S | jdkrv| re| d}|S |tjvrt|tjv rt| d}|S | jdkr| r| d}|S |tjvr|tjv r| d}|S )Nrg   r   r   c                    s0   d}  D ]}|  r| d7 } q | dkS | dkS )Nr   r9      )r^   )r]   cnext_r   r   	look_next   s   
z0Code128._maybe_switch_charset.<locals>.look_nextrr   r}   r{   r9   r   rs   )r   r   )r   rp   r^   r   rt   r   r}   r   r{   r_   r   r   )r$   r   r   r   codesr   r   r   _maybe_switch_charset   s:   
	








zCode128._maybe_switch_charsetr   c                 C  s   | j dkr
tj| S | j dkrtj| S | j dkrA|tjv r#tj| S | rA|  j|7  _t| jdkr?t| j}d| _|S d S t	d| d| j  d)	Nr{   r}   rr   rc   rs   z
Character z# could not be converted in charset r[   )
rp   r   r{   r}   rr   r^   rt   r_   ra   RuntimeError)r$   r   valuer   r   r   r      s"   







zCode128._convertry   c                 C  s*   |d t jv rt j|d  g|d d< |S )Nr9   rc   )r   TO)r$   ry   r   r   r   _try_to_optimize   s   zCode128._try_to_optimizec                 C  sB   |d g}t |dd  ddD ]\}}|||  qt|d S )Nr   r9   rd   g   )rh   r   r2   )r$   ry   csicode_numr   r   r   _calculate_checksum   s   
zCode128._calculate_checksumc                 C  s   t j| j g}t| jD ]\}}|| | | |}|d ur&|| qt	| j
dkrD|| d || | j
d  d| _
| |S )Nr9   r}   r   rs   )r   START_CODESrp   rh   r   extendr   r   r   r_   rt   r   r   )r$   ry   r   r   r   r   r   r   rx      s   


zCode128._buildr7   c                 C  sL   |   }|| | d}|D ]	}|tj| 7 }q|tj7 }|d7 }|gS )Nrs   11)rx   r   r   r   CODESSTOP)r$   ry   r   r   r   r   r   r>     s   
zCode128.buildc                   r?   r@   rC   rI   rM   r   r   rH     rO   zCode128.renderr'   )r   r   r   r   rP   )r   rw   )rz   ro   r   rw   )r   ra   r   rw   )r   r   )ry   rw   r   rw   )ry   rw   r   ra   rQ   rR   )rS   rT   rU   rV   r   __annotations__r%   r*   propertyry   r,   r   r   r   r   r   r   rx   r>   rH   rW   r   r   rM   r   rn      s*   
 




	
$




rn   c                      s@   e Zd ZdZdZdZdd fddZ fd	d
Zdd Z  Z	S )Gs1_128z
    following the norm, a gs1-128 barcode is a subset of code 128 barcode,
    it can be generated by prepending the code with the FNC1 character
    https://en.wikipedia.org/wiki/GS1-128
    https://www.gs1-128.info/
    zGS1-128   ñNr   r   c                   s   | j | }t || d S r'   )	FNC1_CHARrG   r%   rv   rM   r   r   r%   )  s   
zGs1_128.__init__c                   s   t   dd  S r8   )rG   r,   r)   rM   r   r   r,   -  s   zGs1_128.get_fullcodec                 C  s
   || j kS r'   )r   r   r   r   r   r   0  s   
zGs1_128._is_char_fnc1_charr'   rk   )
rS   rT   rU   rV   r   r   r%   r,   r   rW   r   r   rM   r   r     s    r   N)r   r   r   r   r   r   r   r   )rV   
__future__r   typingr   r   r   barcode.baser   barcode.charsetsr   r   barcode.errorsr	   r
   r   barcode.writerr   __docformat__rD   rE   r   r   rX   rl   rn   r   PZNr   r   r   r   <module>   s0    
/& 