Ë
    È:ja0  ã                   ó„   — d dl mZmZmZmZ d dlZd dlZd dlZd dlZdZ	dZ
 G d„ d«      Z G d„ de«      Z G d	„ d
e«      Zy)é    )Úunicode_literalsÚdivisionÚabsolute_importÚprint_functionNÚconfigÚ
dictionaryc                   ó<   — e Zd Zd	d„Zd„ Zg fd„Zd„ Zd„ Zd„ Zd„ Z	y)
ÚOpenCCNc                 óö   — d| _         || _        d| _        t        «       | _        t        «       | _        t        «       | _        t        j                  d«      | _
        | j                  �| j                  «        yy)a  
        init OpenCC
        :param conversion: the conversion of usage, options are
         'hk2s', 's2hk', 's2t', 's2tw', 's2twp', 't2hk', 't2s', 't2tw', 'tw2s', 'tw2sp', etc
         check the json file names in config directory
        :return: None
        Ú Fu  (\s+|-|,|\.|\?|!|\*|ã€€|ï¼Œ|ã€‚|ã€�|ï¼›|ï¼š|ï¼Ÿ|ï¼�|â€¦|â€œ|â€�|â€˜|â€™|ã€Ž|ã€�|ã€Œ|ã€�|ï¹�|ï¹‚|â€”|ï¼�|ï¼ˆ|ï¼‰|ã€Š|ã€‹|ã€ˆ|ã€‰|ï½ž|ï¼Ž|ï¼�|ï¼¼|ï¸’|ï¸‘|ï¸”|ï¸“|ï¸¿|ï¹€|ï¸¹|ï¸º|ï¸™|ï¸�|ï¼»|ï¹‡|ï¼½|ï¹ˆ|ï¸•|ï¸–|ï¸°|ï¸³|ï¸´|ï¸½|ï¸¾|ï¸µ|ï¸¶|ï½›|ï¸·|ï½�|ï¸¸|ï¹ƒ|ï¹„|ã€�|ï¸»|ã€‘|ï¸¼)N)Úconversion_nameÚ
conversionÚ_dict_init_doneÚlistÚ_dict_chainÚ_dict_chain_dataÚdictÚ
dict_cacheÚreÚcompileÚsplit_chars_reÚ
_init_dict©Úselfr   s     úb/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/opencc/opencc.pyÚ__init__zOpenCC.__init__$   sk   € ð  "ˆÔØ$ˆŒØ$ˆÔÜ›6ˆÔÜ $£ˆÔÜ›&ˆŒô !Ÿj™jð dóeˆÔà�?‰?Ð&Ø�O‰OÕð 'ó    c                 ón  — | j                   s| j                  «        d| _         g }| j                  j                  |«      }t	        dt        |«      «      D ]M  }|dz  dk(  r/|j                  | j                  ||   | j                  «      «       Œ:|j                  ||   «       ŒO dj                  |«      S )z]
        Convert string from Simplified Chinese to Traditional Chinese or vice versa
        Tr   é   r   )
r   r   r   ÚsplitÚrangeÚlenÚappendÚ_convertr   Újoin)r   ÚstringÚresultÚsplit_string_listÚis        r   ÚconvertzOpenCC.convert9   s«   € ð ×#Ò#Ø�O‰OÔØ#'ˆDÔ àˆà ×/Ñ/×5Ñ5°fÓ=ÐÜ�qœ#Ð/Ó0Ó1ò 	4ˆAØ�1‰u˜Šzð —‘˜dŸm™mÐ,=¸aÑ,@À$×BWÑBWÓXÕYð —‘Ð/°Ñ2Õ3ð	4ð �w‰w�v‹Ðr   c                 óÖ   — t        |«      }|D ];  }|j                  |«       t        dj                  |j                  «       «      «      }Œ= dj                  |j                  «       «      S )av  
        Convert string from Simplified Chinese to Traditional Chinese or vice versa
        If a dictionary is part of a group of dictionaries, stop conversion on a word
        after the first match is found.
        :param string: the input string
        :param dictionary: list of dictionaries to be applied against the string
        :return: converted string
        r   )Ú
StringTreeÚcreate_parse_treer%   Úinorder)r   r&   r   ÚtreeÚc_dicts        r   r$   zOpenCC._convertP   s[   € ô ˜&Ó!ˆØ ò 	7ˆFØ×"Ñ" 6Ô*Ü˜bŸg™g d§l¡l£nÓ5Ó6‰Dð	7ð �w‰w�t—|‘|“~Ó&Ð&r   c                 óæ  — | j                   €t        d«      ‚g | _        | j                   dz   }t        j                  j                  t        j                  j                  t        «      t        |«      }t        |«      5 }t        j                  |«      }ddd«       j                  d«      | _        |j                  d«      D ]-  }| j                  | j                  |j                  d«      «       Œ/ g | _        | j!                  | j                  | j                  «       t#        | j                  «      D ]&  \  }}t%        |t&        «      sŒ|g| j                  |<   Œ( d| _        y# 1 sw Y   ŒÓxY w)zR
        initialize the dict with chosen conversion
        :return: None
        Nzconversion is not setz.jsonÚnameÚconversion_chainr   T)r   Ú
ValueErrorr   ÚosÚpathr%   ÚdirnameÚ__file__Ú
CONFIG_DIRÚopenÚjsonÚloadÚgetr   Ú_add_dict_chainr   Ú_add_dictionariesÚ	enumerateÚ
isinstanceÚtupler   )r   r   Úconfig_fileÚfÚsetting_jsonÚchainÚindexr0   s           r   r   zOpenCC._init_dict_   s:  € ð
 �?‰?Ð"ÜÐ4Ó5Ð5àˆÔØ—‘ 7Ñ*ˆÜ—g‘g—l‘l¤2§7¡7§?¡?´8Ó#<¼jÈ&ÓQˆÜ�+Óð 	( !ÜŸ9™9 Q›<ˆL÷	(ð  ,×/Ñ/°Ó7ˆÔà!×%Ñ%Ð&8Ó9ò 	FˆEØ× Ñ  ×!1Ñ!1°5·9±9¸VÓ3DÕEð	Fð !#ˆÔØ×Ñ˜t×/Ñ/°×1FÑ1FÔGä& t×'<Ñ'<Ó=ò 	7‰MˆE�6Ü˜¤Õ'Ø/5¨hˆt×$Ñ$ UÒ+ð	7ð  $ˆÕ÷	(ð 	(ús   Á?E'Å'E0c                 óR  — |D �]  }t        |t        «      r&g }| j                  ||«       |j                  |«       Œ:|| j                  vr°i }d}d}t        j                  |dd¬«      5 }|D ]\  }	|	j                  «       j                  d«      \  }
}|||
<   t        |
«      |kD  rt        |
«      }t        |
«      |k  sŒRt        |
«      }Œ^ 	 d d d «       |j                  |||f«       |||f| j                  |<   Œø|j                  | j                  |   «       �Œ y # 1 sw Y   ŒRxY w)Né   iè  Úrzutf-8)Úencodingú	)
rA   r   r?   r#   r   Úior:   Ústripr    r"   )r   Ú
chain_listÚ
chain_dataÚitemrF   Úmap_dictÚmax_lenÚmin_lenrD   ÚlineÚkeyÚvalues               r   r?   zOpenCC._add_dictionariesz   s  € Øó 	=ˆDÜ˜$¤Ô%Ø�Ø×&Ñ& t¨UÔ3Ø×!Ñ! %Õ(à˜tŸ™Ñ.Ø!�Hà�Gà"�GÜŸ™  s°WÔ=ð 3ÀØ$%ò 3˜DØ)-¯©«×);Ñ);¸DÓ)A™J˜C Ø,1˜H S™MÜ" 3›x¨'Ò1Ü*-¨c«( Ü" 3›x¨'Ó1Ü*-¨c«(¡ñ3÷3ð ×%Ñ% w°¸Ð&BÔCØ-4°g¸xÐ,H�D—O‘O DÒ)à×%Ñ% d§o¡o°dÑ&;Ö<ñ/	=÷3ð 3ús   Á)ADÂ>DÄD&	c                 óž  — |j                  d«      dk(  r<g }|j                  d«      D ]  }| j                  ||«       Œ |j                  |«       y|j                  d«      dk(  ri|j                  d«      }t        j                  j                  t        j                  j                  t        «      t        |«      }|j                  |«       yy)zœ
        add dict chain
        :param dict_chain: the dict chain to add to
        :param dict_dict: the dict to be added in
        :return: None
        ÚtypeÚgroupÚdictsÚtxtÚfileN)	r=   r>   r#   r5   r6   r%   r7   r8   ÚDICT_DIR)r   Ú
dict_chainÚ	dict_dictrF   Ú	dict_itemÚfilenameÚ	dict_files          r   r>   zOpenCC._add_dict_chain”   s¥   € ð �=‰=˜Ó  GÒ+àˆEØ&Ÿ]™]¨7Ó3ò 7�	Ø×$Ñ$ U¨IÕ6ð7à×Ñ˜eÕ$Ø�]‰]˜6Ó" eÒ+Ø —}‘} VÓ,ˆHÜŸ™Ÿ™¤R§W¡W§_¡_´XÓ%>ÄÈ(ÓSˆIØ×Ñ˜iÕ(ð ,r   c                 ó@   — | j                   |k(  ryd| _        || _         y)a	  
        set conversion
        :param conversion: the conversion of usage, options are
         'hk2s', 's2hk', 's2t', 's2tw', 's2twp', 't2hk', 't2s', 't2tw', 'tw2s', and 'tw2sp'
         check the json file names in config directory
        :return: None
        NF)r   r   r   s     r   Úset_conversionzOpenCC.set_conversion¦   s"   € ð �?‰?˜jÒ(Øà#(ˆDÔ Ø(ˆD�Or   ©N)
Ú__name__Ú
__module__Ú__qualname__r   r*   r$   r   r?   r>   re   © r   r   r
   r
   #   s*   „ óò*ð. -/ó 'ò$ò6=ò4)ó$)r   r
   c                   ó4   — e Zd ZdZdZd	d„Zd„ Zd„ Zd„ Zd„ Z	y)
ÚTreeNoder   rI   Nc                 ó@   — d d g| _         || _        d| _        || _        y )NF)ÚbranchrW   ÚmatchedÚlength_hint)r   rW   Úhints      r   r   zTreeNode.__init__º   s#   € Ø˜T�lˆŒØˆŒ
ØˆŒØˆÕr   c                 ó   — || _         y rf   )ro   )r   ro   s     r   Úset_matchedzTreeNode.set_matchedÀ   s	   € Øˆ�r   c                 ó   — || _         y rf   )rW   )r   rW   s     r   Ú	set_valuezTreeNode.set_valueÃ   s	   € Øˆ�
r   c                 ó"   — || j                   |<   y rf   )rn   )r   rn   Únodes      r   Ú
set_branchzTreeNode.set_branchÆ   s   € Ø"ˆ�‰�FÒr   c                 ó   — || _         y rf   )rp   )r   rq   s     r   Úset_hintzTreeNode.set_hintÉ   s
   € ØˆÕr   rf   )
rg   rh   ri   ÚLEFTÚRIGHTr   rs   ru   rx   rz   rj   r   r   rl   rl   ¶   s%   „ Ø€DØ€Eó òòò#ó r   rl   c                   ó&   — e Zd Zd„ Zd„ Zd„ Zdd„Zy)r,   c                 ó$   — t        |«      | _        y rf   )rl   Úroot)r   r&   s     r   r   zStringTree.__init__Í   s   € Ü˜VÓ$ˆ�	r   c                 ó^  — | j                   g}g }|D �]  }|�r|j                  «       }| j                  |j                  ||j                  «      \  }}}}	|r²|j                  |«       |j                  d«       |j                  d«       |r=t        ||	«      }
|j                  |
«       |j                  t        j                  |
«       |rVt        ||	«      }
|j                  |
«       |j                  t        j                  |
«       n|j                  |«       d|_        |r�Œ|}|}|}�Œ y)a²  
        Compare smaller and smaller sub-strings going from left to
        rightin root node value against a test_dict_list entry. If match is found,
        create tree nodes for remaining left and right string portions and place
        these nodes on a stack for processing.

        :param test_dict_list: a list of tuples of the max key length and dict
                        currently being applied against the string
        NT)r   ÚpopÚ_StringTree__findMatchrW   rp   ru   rz   rs   rl   r#   rx   r{   r|   )r   Útest_dict_listÚworking_stackÚunmatched_stackÚ	test_dictÚcurrrW   ÚlstringÚrstringÚtest_lenrw   Útemps               r   r-   zStringTree.create_parse_treeÐ   s  € ð Ÿ™˜ˆØˆð (ó 	#ˆIÚØ$×(Ñ(Ó*�Ø48×4DÑ4DÀTÇZÁZÐQZÐ\`×\lÑ\lÓ4mÑ1��w ¨ÙØ—N‘N 5Ô)Ø—M‘M $Ô'Ø×$Ñ$ TÔ*ÙÜ'¨°Ó:˜Ø%×,Ñ,¨TÔ2ØŸ™¬¯©°tÔ<ÙÜ'¨°Ó:˜Ø%×,Ñ,¨TÔ2ØŸ™¬¯©¸Õ=à#×*Ñ*¨4Ô0Ø'+�DÔ$ó#  ð& !ˆDØ+ˆMØ"ŠOñ-	#r   c                 ó(  — g }g }| j                   }	 |r1|j                  |«       |j                  t        j                     }|rŒ1|rI|j                  «       }|j                  |j                  «       |j                  t        j                     }n	 |S Œ‚)zd
        Do a non-recursive inorder traversal of the tree.
        :return: list of strings
        )r   r#   rn   rl   r{   r�   rW   r|   )r   Ú
return_valÚstackr‡   s       r   r.   zStringTree.inorder÷   s‚   € ð
 ˆ
ØˆØ�y‰yˆàÙØ—‘˜TÔ"Ø—{‘{¤8§=¡=Ñ1�ò ñ Ø—y‘y“{�Ø×!Ñ! $§*¡*Ô-Ø—{‘{¤8§>¡>Ñ2‘àØÐð r   Nc                 ó�  — t        |«      }d}d}t        ||d   «      }|rt        ||«      }|d   }||k\  r�t        d||z
  dz   «      D ]p  }	||	|	|z    |d   v sŒ|	dkD  r|d|	 }|	|z   |k  r||	|z   d }|d   ||	|	|z       }
t        |
j                  d«      «      dkD  r|
j                  d«      d   }
|
|||fc S  |dz  }||k\  rŒ�y)a8  
        Compare smaller and smaller sub-strings going from left to
        right against test_dict. If an entry is found, return it as well
        as the remaining string(s) and the test length.

        :param cstring:  the string to find a match
        :param test_dict: a tuple of the max key length and dict currently being
                          applied against the string
        :return: the new matched value, old string to left of the match, old string to right
                of the match (may be all None if no match found), last test length
        Nr   rI   r   ú )NNNN)r"   Úminr!   r    )r   r&   r†   rq   Ú
string_lenrˆ   r‰   rŠ   rT   r)   rW   s              r   Ú__findMatchzStringTree.__findMatch  s  € ô ˜“[ˆ
ØˆØˆÜ˜
 I¨a¡LÓ1ˆÙÜ˜H dÓ+ˆHØ˜A‘,ˆØ˜'Ò!ä˜1˜j¨8Ñ3°aÑ7Ó8ò =�Ø˜!˜A˜h™JÐ'¨9°Q©<Ò7à˜1’uà"(¨¨! *˜Ø˜(™
 jÒ0à"(¨¨8©¨Ð"5˜à% a™L¨°°!°H±*Ð)=Ñ>�EÜ˜5Ÿ;™; sÓ+Ó,¨qÒ0à %§¡¨CÓ 0°Ñ 3˜Ø  '¨7°HÐ<Ò<ð=ð ˜‰MˆHð# ˜'Ó!ð& &r   rf   )rg   rh   ri   r   r-   r.   r‚   rj   r   r   r,   r,   Ì   s   „ ò%ò%#òNô,&&r   r,   )Ú
__future__r   r   r   r   rM   r5   r;   r   r9   r^   r
   Úobjectrl   r,   rj   r   r   ú<module>r–      sN   ð÷(ó (ó0 
Û 	Û Û 	à€
Ø€÷O)ñ O)ôf ˆvô  ô,g&�õ g&r   