o
    
jf                     @   sH   d dl Z d dlZddedefddZdefdd	Zd
edefddZdS )    NFTnumreturnc                    s  t | }tt|dkrtdd|v rtd|rdnd}|r"d}|r3|r(dnd	 d
}|r0dnd}n|r7dnd d}|rD|rAdnd}nd}|rJdnd}	dd }
t | }g }|d dkrd||d  n|d dkrq||d  d|v r|dd\}n|dd}tr^fddtt	dd D }g }t
|D ]\}}t|dkr| d  q|dkrt|d!kr|||	|d    qg }|d"}t
t|D ]^\}}|d#kr|r| d  q|dkr| t|  q|dkr|d$kr|d d#kr||d  q|dkr&|d%kr&||||d    q| t| ||d    q|
|}|dkrE|| q|||	|d    q||
| d  n| d  |r~||d!  |d& fd'd(|D  d&|S ))u  Convert numerical arabic numbers (0->9) to chinese hanzi numbers (〇 -> 九)

    Args:
        num (str): arabic number to convert
        big (bool, optional): use financial characters. Defaults to False.
        simp (bool, optional): use simplified characters instead of tradictional characters. Defaults to True.
        o (bool, optional): use 〇 for 'zero'. Defaults to False.
        twoalt (bool, optional): use 两/兩 for 'two' when appropriate. Defaults to False.

    Raises:
        ValueError: if number is more than 1e48
        ValueError: if 'e' exposent in number

    Returns:
        str: converted number as hanzi characters
    gsȡ1Iznumber out of rangeez$scientific notation is not supportedu	   正负点u	   正負點Fu   零壹贰叁肆伍陆柒捌玖u   零壹貳參肆伍陸柒捌玖u	   拾佰仟u   贰u   貳u   〇一二三四五六七八九u   零一二三四五六七八九u	   十百千u   两u   兩u   二u!   万亿兆京垓秭穰沟涧正载u!   萬億兆京垓秭穰溝澗正載c                 S   s   d dd tt| D S )N c                 s   s    | ]\}}|V  qd S N ).0kgr   r   ^/home/kuhnn/.local/lib/python3.10/site-packages/TTS/tts/utils/text/chinese_mandarin/numbers.py	<genexpr>3   s    z1_num2chinese.<locals>.<lambda>.<locals>.<genexpr>)join	itertoolsgroupbyreversed)lr   r   r   <lambda>3   s    z_num2chinese.<locals>.<lambda>r   +-   .z+-Nc                    s"   g | ]} t |d  d| qS )   r   )max)r   i)integerr   r   
<listcomp>?   s   " z _num2chinese.<locals>.<listcomp>   r   012r   c                 3   s    | ]	} t | V  qd S r   )int)r   ch)c_basicr   r   r   d   s    z_num2chinese.<locals>.<genexpr>)strabsfloat
ValueErrorappendlstripsplitr!   rangelen	enumeratezfillr   stripr   )r   bigsimpotwoaltndc_symbolc_unit1c_twoaltc_unit2revuniqresult	remaindersplitted	intresultnuunitulistncr"   ustrr   )r#   r   r   _num2chinese   s|   

" 

rC   c                 C   s   |   }t|S )zfunction to apply in a match, transform all numbers in a match by chinese characters

    Args:
        match (re.Match): numbers regex matches

    Returns:
        str: replaced characters for the numbers
    )grouprC   )match	match_strr   r   r   _number_replaceh   s   	rG   textc                 C   s   t dt| } | S )zReplace all arabic numbers in a text by their equivalent in chinese characters (simplified)

    Args:
        text (str): input text to transform

    Returns:
        str: output text
    z[0-9]+)resubrG   )rH   r   r   r   %replace_numbers_to_characters_in_textu   s   	rK   )FTFF)r   rI   r$   rC   rG   rK   r   r   r   r   <module>   s
   \