a
     gz%                     @   s0  d Z ddlmZmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 dZdZdd	d
d
ddddddddd	ddddddddddddZeee ddZg dZeedddZeedddZeedd d!Zd.eeeeeed#f ed$d%d&Zd/eeeef eeed#f ed'd(d)Zd0eeed+d,d-Zd#S )1zR
Spell out time as Thai words.

Convert time string or time object to Thai words.
    )datetimetime)Union)	Tokenizernum_to_thaiword)thaiword_to_numz%H:%M:%Sz%H:%M                        	   
               )u   ศูนย์u   หนึ่งu	   สองu	   ยี่u	   สามu	   สี่u	   ห้าu   หกu   เจ็ดu	   แปดu   เก้า	   สิบu   เอ็ด   โมงเช้า   โมงเย็น   บ่าย   บ่ายโมง   ตี   เที่ยงวัน   เที่ยงคืน   เที่ยง   ทุ่ม   นาฬิกา   ครึ่งZnewmm)Zcustom_dictZengine)
r   r   r   	   โมงr!   r    r   r   r   r   )hreturnc                 C   s   d}| dkr|d7 }n| dk r0|dt |  7 }n| dk rN|t | d d 7 }nl| dkr`|d	7 }nZ| d
k r| dkrz|d7 }q|dt | d  d 7 }n&| d
kr|d7 }n|t | d
 d 7 }|S )zThai time (6-hour clock). r   r   r   r   r   r   r   r   r   r   r   r   r#   u   หกโมงเย็นr    r   r$   text r)   =/usr/local/lib/python3.9/dist-packages/pythainlp/util/time.py
_format_6h>   s"    



r+   c                 C   s   d}| dkr|d7 }nx| dk r0|dt |  7 }n^| dk rJ|t | d 7 }nD| dkr\|d7 }n2| d	k rz|t | d d 7 }n|t | d
 d 7 }|S )z"Thai time (modified 6-hour clock).r&   r   r   r   r   r   r#   r      r   r    r   r'   r)   r)   r*   _format_m6hW   s    

r-   c                 C   s   t | d }|S )zThai time (24-hour clock).r!   r   r'   r)   r)   r*   _format_24hk   s    r.   24hN)r$   msfmt	precisionr%   c                 C   s   d}|dkrt | }n2|dkr(t| }n |dkr:t| }ntd| |dv r|dkrz|dksh|d	krz|d
v rz|d7 }q|t|d 7 }|dkr|t|d 7 }nJ|r|dkr|dkr|d
v r|d7 }n|t|d 7 }|r|t|d 7 }|S )Nr&   6hm6hr/   zTime format not supported: )r0   r1   r   r   r0   )r4   r5   r"   u   นาทีr1   u   วินาที)r+   r-   r.   NotImplementedErrorr   )r$   r0   r1   r2   r3   r(   r)   r)   r*   _formatq   s*    


 

r7   )	time_datar2   r3   r%   c                 C   s   d}t | ttfr| }nzt | ts*td| s6tdzt| t}W n6 ty|   zt| t}W n tyv   Y n0 Y n0 |std|  dt	|j
|j|j||}|S )u  
    Spell out time as Thai words.

    :param str time_data: time input, can be a datetime.time object         or a datetime.datetime object         or a string (in H:M or H:M:S format, using 24-hour clock)
    :param str fmt: time output format
        * *24h* - 24-hour clock (default)
        * *6h* - 6-hour clock
        * *m6h* - Modified 6-hour clock
    :param str precision: precision of the spell out time
        * *m* - always spell out at minute level
        * *s* - always spell out at second level
        * None - spell out only non-zero parts
    :return: Time spelled out as Thai words
    :rtype: str

    :Example:
    ::

        time_to_thaiword("8:17")
        # output:
        # แปดนาฬิกาสิบเจ็ดนาที

        time_to_thaiword("8:17", "6h")
        # output:
        # สองโมงเช้าสิบเจ็ดนาที

        time_to_thaiword("8:17", "m6h")
        # output:
        # แปดโมงสิบเจ็ดนาที

        time_to_thaiword("18:30", fmt="m6h")
        # output:
        # หกโมงครึ่ง

        time_to_thaiword(datetime.time(12, 3, 0))
        # output:
        # สิบสองนาฬิกาสามนาที

        time_to_thaiword(datetime.time(12, 3, 0), precision="s")
        # output:
        # สิบสองนาฬิกาสามนาทีศูนย์วินาที
    NzSTime input must be a datetime.time object, a datetime.datetime object, or a string.zTime string cannot be empty.zTime string 'z%' does not match H:M or H:M:S format.)
isinstancer   r   str	TypeError
ValueErrorstrptime_TIME_FORMAT_WITH_SEC_TIME_FORMAT_WITHOUT_SECr7   hourminutesecond)r8   r2   r3   _timer(   r)   r)   r*   time_to_thaiword   s,    1

rD   T)r(   paddingr%   c                 C   s  t t }| dddddd} g d}d}tD ]b}|| v rb|dkrb| ||d } qq8|| v r8|dkr8|D ] }|| v rv| ||d } qqvq8q8d|vrtd|d}~t|d	 }|d
 }	t	|	d
krt|	}	nd	}	d} |d dkr:|d	 |v r:|dd r:| t
td|dd 7 } n|d	 dkrn|d
 |v rn| t
t|d
  7 } n||d dkr|d	 |v rt|d	  dk r| t
t|d	  d 7 } n| t
t|d	  7 } n|d dks|d dkr|d	 dkr| t
t|d
  d 7 } n|d dks.|d dkrV|d	 |v rV| t
t|d	  d 7 } n|d dkrn| d7 } n||d dks|d dkr| d7 } nV|d	 dkr| d7 } n>|d dkrt	|d
kr| d7 } n| t
t|d	  d 7 } | std|rt	| d
krd|  } | d7 } |	rd	}
|	D ]b}||v r*|d krP|
t| 7 }
n:|d krn|
d	krn|
d!9 }
n|d kr*|
d	kr*|
d!7 }
q*|
d	kr|
d"kr| t
|
7 } n| dt
|
 7 } n| d#7 } | S )$u4  
    Convert Thai time in words into time (H:M).

    :param str text: Thai time in words
    :param bool padding: Zero pad the hour if True

    :return: time string
    :rtype: str

    :Example:
    ::

        thaiword_to_time"บ่ายโมงครึ่ง")
        # output:
        # 13:30
    u   กว่าr&   u   ๆ )u   ตีหนึ่งu   ตีสองu   ตีสามu   ตีสี่u   ตีห้าr   |z)Cannot find any Thai word for time affix.r   r	   r!   Nr   r   r   r#   r   r   r   0r   r   Z12r   Z13r    Z19r   z#Cannot find any Thai word for hour.:r   r   r   Z00)list_DICT_THAI_TIMEkeysreplace_THAI_TIME_AFFIXr<   split_THAI_TIME_CUTZword_tokenizelenr:   r   join)r(   rE   Z	keys_dictZ_irC   ZaffixjZ_LIST_THAI_TIMEr@   rA   nr)   r)   r*   thaiword_to_time   s    
*"**






rV   )r/   N)r/   N)T)__doc__r   r   typingr   Zpythainlp.tokenizer   Zpythainlp.util.numtowordr   Zpythainlp.util.wordtonumr   r>   r?   rL   rK   rM   rQ   rO   intr:   r+   r-   r.   r7   rD   boolrV   r)   r)   r)   r*   <module>   st   
  
&  
Q