o
    TiM                     @   sH  d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZmZmZmZ edZd7d
dZdd Zd8ddZd8ddZd9ddZd:ddZd9ddZ				d;ddZ				d;ddZd7ddZd8dd Zd8d!d"Zd7d#d$Zd%d& Z d7d'd(Z!d7d)d*Z"d+d, Z#d7d-d.Z$d7d/d0Z%d1d2 Z&d7d3d4Z'd5d6 Z(dS )<    )unicode_literalsN)phonetic_symbol)right_mark_index)RE_TONE3RE_TONE2)	converter)get_initialsreplace_symbol_to_no_symbol
get_finalsreplace_symbol_to_numberz\dFc                 C   s"   t | dd}t|}t| ||dS )ut  将 :py:attr:`~pypinyin.Style.TONE`、
    :py:attr:`~pypinyin.Style.TONE2` 或
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE`、
                   :py:attr:`~pypinyin.Style.TONE2` 或
                   :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :return: :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_normal
      >>> to_normal('zhōng')
      'zhong'
      >>> to_normal('zho1ng')
      'zhong'
      >>> to_normal('zhong1')
      'zhong'
      >>> to_normal('lüè')
      'lve'
      >>> to_normal('lüè', v_to_u=True)
      'lüe'
    Tv_to_u)tone_to_tone2tone2_to_normal_fix_v_u)pinyinr   s r   P/home/ubuntu/.local/lib/python3.10/site-packages/pypinyin/style/_tone_convert.py	to_normal   s   r   c                 C   s.   |  dd} t| s| S t| }t|}|S )u  将 :py:attr:`~pypinyin.Style.TONE2` 或
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE2` 或
                   :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :return: :py:attr:`~pypinyin.Style.TONE` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_tone
      >>> to_tone('zho1ng')
      'zhōng'
      >>> to_tone('zhong1')
      'zhōng'
    v   ü)replace
_re_numbersearchr   tone2_to_tone)r   r   r   r   r   to_tone1   s   
r   c                 K   F   | dddur|d }| dd} t| d|d}t|}t| ||S )ul  将 :py:attr:`~pypinyin.Style.TONE` 或
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE2` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE` 或
                   :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :param neutral_tone_with_five: 是否使用 ``5`` 标识轻声
    :param kwargs: 用于兼容老版本的 ``neutral_tone_with_5`` 参数，当传入
                   ``neutral_tone_with_5`` 参数时，
                   将覆盖 ``neutral_tone_with_five`` 的值。
    :return: :py:attr:`~pypinyin.Style.TONE2` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_tone2
      >>> to_tone2('zhōng')
      'zho1ng'
      >>> to_tone2('zhong1')
      'zho1ng'
      >>> to_tone2('shang')
      'shang'
      >>> to_tone2('shang', neutral_tone_with_five=True)
      'sha5ng'
      >>> to_tone2('lüè')
      'lve4'
      >>> to_tone2('lüè', v_to_u=True)
      'lüe4'
    neutral_tone_with_5N5 Tr   neutral_tone_with_five)getr   tone_to_tone3tone3_to_tone2r   r   r   r"   kwargsr   r   r   r   to_tone2K      r(   c                 K   r   )ul  将 :py:attr:`~pypinyin.Style.TONE` 或
    :py:attr:`~pypinyin.Style.TONE2` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE` 或
                   :py:attr:`~pypinyin.Style.TONE2` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :param neutral_tone_with_five: 是否使用 ``5`` 标识轻声
    :param kwargs: 用于兼容老版本的 ``neutral_tone_with_5`` 参数，当传入
                   ``neutral_tone_with_5`` 参数时，
                   将覆盖 ``neutral_tone_with_five`` 的值。
    :return: :py:attr:`~pypinyin.Style.TONE2` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_tone3
      >>> to_tone3('zhōng')
      'zhong1'
      >>> to_tone3('zho1ng')
      'zhong1'
      >>> to_tone3('shang')
      'shang'
      >>> to_tone3('shang', neutral_tone_with_five=True)
      'shang5'
      >>> to_tone3('lüè')
      'lve4'
      >>> to_tone3('lüè', v_to_u=True)
      'lüe4'
    r   Nr   r    Tr!   )r#   r   r   tone2_to_tone3r   r&   r   r   r   to_tone3s   r)   r+   Tc                 C   s   t | |dS )u(  将 :py:attr:`~pypinyin.Style.TONE`、
    :py:attr:`~pypinyin.Style.TONE2` 、
    :py:attr:`~pypinyin.Style.TONE3` 或
    :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.INITIALS` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE`、
                   :py:attr:`~pypinyin.Style.TONE2` 、
                   :py:attr:`~pypinyin.Style.TONE3` 或
                   :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音
    :param strict: 返回结果是否严格遵照《汉语拼音方案》来处理声母和韵母，
                   详见 :ref:`strict`
    :return: :py:attr:`~pypinyin.Style.INITIALS` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_initials
      >>> to_initials('zhōng')
      'zh'

    strict)r   )r   r-   r   r   r   to_initials   s   r.   c                 C   s,   t | dd}t||d}t|||}|S )u  将 :py:attr:`~pypinyin.Style.TONE`、
    :py:attr:`~pypinyin.Style.TONE2` 、
    :py:attr:`~pypinyin.Style.TONE3` 或
    :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.FINALS` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE`、
                   :py:attr:`~pypinyin.Style.TONE2` 、
                   :py:attr:`~pypinyin.Style.TONE3` 或
                   :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音
    :param strict: 返回结果是否严格遵照《汉语拼音方案》来处理声母和韵母，
                   详见 :ref:`strict`
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :return: :py:attr:`~pypinyin.Style.FINALS` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_finals
      >>> to_finals('zhōng')
      'ong'

    r   r   r,   )r	   r   r
   r   )r   r-   r   
new_pinyinfinalsr   r   r   	to_finals   s   r1   c                 C   s   t | |d}t|}|S )u  将 :py:attr:`~pypinyin.Style.TONE`、
    :py:attr:`~pypinyin.Style.TONE2` 或
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.FINALS_TONE` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE`、
                   :py:attr:`~pypinyin.Style.TONE2` 或
                   :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :param strict: 返回结果是否严格遵照《汉语拼音方案》来处理声母和韵母，
                   详见 :ref:`strict`
    :return: :py:attr:`~pypinyin.Style.FINALS_TONE` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_finals_tone
      >>> to_finals_tone('zhōng')
      'ōng'

    r,   )to_finals_tone2r   )r   r-   r0   r   r   r   to_finals_tone   s   r3   c                 C   s,   |  dd} t| |||d}t||d}|S )u  将 :py:attr:`~pypinyin.Style.TONE`、
    :py:attr:`~pypinyin.Style.TONE2` 或
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.FINALS_TONE2` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE`、
                   :py:attr:`~pypinyin.Style.TONE2` 或
                   :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :param strict: 返回结果是否严格遵照《汉语拼音方案》来处理声母和韵母，
                   详见 :ref:`strict`
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :param neutral_tone_with_five: 是否使用 ``5`` 标识轻声
    :return: :py:attr:`~pypinyin.Style.FINALS_TONE2` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_finals_tone2
      >>> to_finals_tone2('zhōng')
      'o1ng'

    r   r    )r-   r   r"   r   )r   to_finals_tone3r%   )r   r-   r   r"   r0   r   r   r   r2      s   r2   c                 C   sX   |  dd} t| ||d}|s|S tt| }|s"|r dg}n|S |d }|| }|S )u  将 :py:attr:`~pypinyin.Style.TONE`、
    :py:attr:`~pypinyin.Style.TONE2` 或
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.FINALS_TONE3` 风格的拼音

    :param pinyin: :py:attr:`~pypinyin.Style.TONE`、
                   :py:attr:`~pypinyin.Style.TONE2` 或
                   :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :param strict: 返回结果是否严格遵照《汉语拼音方案》来处理声母和韵母，
                   详见 :ref:`strict`
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :param neutral_tone_with_five: 是否使用 ``5`` 标识轻声
    :return: :py:attr:`~pypinyin.Style.FINALS_TONE3` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import to_finals_tone3
      >>> to_finals_tone3('zhōng')
      'ong1'

    r   r    )r-   r   r   )r   r1   r   findallr   )r   r-   r   r"   r0   numbersnumberr   r   r   r4     s   r4   c                 C   s"   t | |d}td|}t||S )un  将 :py:attr:`~pypinyin.Style.TONE` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音

    :param tone: :py:attr:`~pypinyin.Style.TONE` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :return: :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone_to_normal
      >>> tone_to_normal('zhōng')
      'zhong'
      >>> tone_to_normal('lüè')
      'lve'
      >>> tone_to_normal('lüè', v_to_u=True)
      'lüe'
    r   r    )r   r   sub_v_to_u)toner   r   r   r   r   tone_to_normal8  s   
r;   c                 K   s8   | dddur|d }t| ||d}t|}t||S )u  将 :py:attr:`~pypinyin.Style.TONE` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE2` 风格的拼音

    :param tone: :py:attr:`~pypinyin.Style.TONE` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :param neutral_tone_with_five: 是否使用 ``5`` 标识轻声
    :param kwargs: 用于兼容老版本的 ``neutral_tone_with_5`` 参数，当传入
                   ``neutral_tone_with_5`` 参数时，
                   将覆盖 ``neutral_tone_with_five`` 的值。
    :return: :py:attr:`~pypinyin.Style.TONE2` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone_to_tone2
      >>> tone_to_tone2('zhōng')
      'zho1ng'
      >>> tone_to_tone2('shang')
      'shang'
      >>> tone_to_tone2('shang', neutral_tone_with_5=True)
      'sha5ng'
      >>> tone_to_tone2('lüè')
      'lve4'
      >>> tone_to_tone2('lüè', v_to_u=True)
      'lüe4'
    r   Nr!   )r#   r$   r%   r9   r:   r   r"   r'   tone3r   r   r   r   r   P  s   
r   c                 K   s8   | dddur|d }t| }t||d}t||S )u  将 :py:attr:`~pypinyin.Style.TONE` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音

    :param tone: :py:attr:`~pypinyin.Style.TONE` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :param neutral_tone_with_five: 是否使用 ``5`` 标识轻声
    :param kwargs: 用于兼容老版本的 ``neutral_tone_with_5`` 参数，当传入
                   ``neutral_tone_with_5`` 参数时，
                   将覆盖 ``neutral_tone_with_five`` 的值。
    :return: :py:attr:`~pypinyin.Style.TONE3` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone_to_tone3
      >>> tone_to_tone3('zhōng')
      'zhong1'
      >>> tone_to_tone3('shang')
      'shang'
      >>> tone_to_tone3('shang', neutral_tone_with_five=True)
      'shang5'
      >>> tone_to_tone3('lüè')
      'lve4'
      >>> tone_to_tone3('lüè', v_to_u=True)
      'lüe4'
    r   N)r"   )r#   r   r+   _improve_tone3r9   r<   r   r   r   r$   s  s
   

r$   c                 C   $   t d| }t||}t| ||dS )u`  将 :py:attr:`~pypinyin.Style.TONE2` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音

    :param tone2: :py:attr:`~pypinyin.Style.TONE2` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :return: Style.NORMAL 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone2_to_normal
      >>> tone2_to_normal('zho1ng')
      'zhong'
      >>> tone2_to_normal('lüe4')
      'lve'
      >>> tone2_to_normal('lüe4', v_to_u=True)
      'lüe'
    r    r   r   r8   r9   r   )tone2r   r   r   r   r   r        
r   c                    sV   t tjdd}tj | dddddd} fdd}|||ddS )	uc  将 :py:attr:`~pypinyin.Style.TONE2` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE` 风格的拼音

    :param tone2: :py:attr:`~pypinyin.Style.TONE2` 风格的拼音
    :return: Style.TONE 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone2_to_tone
      >>> tone2_to_tone('zho1ng')
      'zhōng'
    $r    r   r   r   0c                    s   |  d} |p|S Nr   )groupr#   )mr   dr   r   _replace  s   
ztone2_to_tone.<locals>._replace)recompiler   patternr   r   phonetic_symbol_reverser8   )rA   regexstringrJ   r   rH   r   r     s
   r   c                 C   s   t d| }t| ||dS )ur  将 :py:attr:`~pypinyin.Style.TONE2` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE3` 风格的拼音

    :param tone2: :py:attr:`~pypinyin.Style.TONE2` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :return: :py:attr:`~pypinyin.Style.TONE3` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone2_to_tone3
      >>> tone2_to_tone3('zho1ng')
      'zhong1'
      >>> tone2_to_tone3('lüe4')
      'lve4'
      >>> tone2_to_tone3('lüe4', v_to_u=True)
      'lüe4'
    z\1\3\2r   )r   r8   r   )rA   r   r=   r   r   r   r*     s   r*   c                 C   r?   )uu  将 :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音

    :param tone3: :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :return: :py:attr:`~pypinyin.Style.NORMAL` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone3_to_normal
      >>> tone3_to_normal('zhong1')
      'zhong'
      >>> tone3_to_normal('lüe4')
      'lve'
      >>> tone3_to_normal('lüe4', v_to_u=True)
      'lüe'
    r    r   r@   )r=   r   r   r   r   r   tone3_to_normal  rB   rQ   c                 C   s   t | dd}t|S )ux  将 :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE` 风格的拼音

    :param tone3: :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :return: :py:attr:`~pypinyin.Style.TONE` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone3_to_tone
      >>> tone3_to_tone('zhong1')
      'zhōng'
    Tr   )r%   r   )r=   rA   r   r   r   tone3_to_tone  s   rR   c                 C   st   t | }t|}|du rt|d }|d|d  }||d d }t| }|du r,| S d|||}t| ||dS )ur  将 :py:attr:`~pypinyin.Style.TONE3` 风格的拼音转换为
    :py:attr:`~pypinyin.Style.TONE2` 风格的拼音

    :param tone3: :py:attr:`~pypinyin.Style.TONE3` 风格的拼音
    :param v_to_u: 是否使用 ``ü`` 代替原来的 ``v``，
                   当为 False 时结果中将使用 ``v`` 表示 ``ü``
    :return: :py:attr:`~pypinyin.Style.TONE2` 风格的拼音

    Usage::

      >>> from pypinyin.contrib.tone_convert import tone3_to_tone2
      >>> tone3_to_tone2('zhong1')
      'zho1ng'
      >>> tone3_to_tone2('lüe4')
      'lve4'
      >>> tone3_to_tone2('lüe4', v_to_u=True)
      'lüe4'
    N   z{}{}{}r   )rQ   r   len_get_number_from_pinyinformatr   )r=   r   no_number_tone3
mark_indexbeforeafterr7   r   r   r   r   r%     s   r%   c                 C   s*   t | }|d u r|r| dkrd| } | S )Nr    z{}5)rU   rV   )r=   r"   r7   r   r   r   r>   '  s   
r>   c                 C   s"   t | }|r|d }|S d }|S rE   )r   r5   )r   r6   r7   r   r   r   rU   .  s   
rU   c                 C   s   |s| S |  ddS )Nr   r   r   )r   r   r   r   r   r9   7  s   r9   c                 C   s   |s| ddS t|ddS )Nr   r   Tr[   )r   r9   )	origin_pynew_pyr   r   r   r   r   =  s   r   )F)FF)T)TF)TFF))
__future__r   rK   pypinyinr   pypinyin.style._tone_ruler   pypinyin.style._constantsr   r   pypinyin.style.toner   pypinyin.style._utilsr   r	   r
   r   rL   r   r   r   r(   r+   r.   r1   r3   r2   r4   r;   r   r$   r   r   r*   rQ   rR   r%   r>   rU   r9   r   r   r   r   r   <module>   sD   

 

(
(


!

*

#
"



"
	