Ë
    #´˜j$  ã                   ó�   — d Z ddlmZ ddlmZ ddddœZdZ G d	„ d
«      Zej                  «        e	dk(  rddl
mZ  edd¬«       yy)zàParenMatch -- for parenthesis matching.

When you hit a right paren, the cursor should move briefly to the left
paren.  Paren here is used generically; the matching applies to
parentheses, square brackets, and curly braces.
é    )ÚHyperParser)ÚidleConfÚ(Ú[Ú{©Ú)Ú]Ú}éd   c                   ó†   — e Zd ZdZdZdZd„ Zed„ «       Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zdd„Zd„ Zd„ Zd„ Zd„ ZeeeedœZd„ Zd„ Zy)Ú
ParenMatcha'  Highlight matching openers and closers, (), [], and {}.

    There are three supported styles of paren matching.  When a right
    paren (opener) is typed:

    opener -- highlight the matching left paren (closer);
    parens -- highlight the left and right parens (opener and closer);
    expression -- highlight the entire expression from opener to closer.
    (For back compatibility, 'default' is a synonym for 'opener').

    Flash-delay is the maximum milliseconds the highlighting remains.
    Any cursor movement (key press or click) before that removes the
    highlight.  If flash-delay is 0, there is no maximum.

    TODO:
    - Augment bell() with mismatch warning in status window.
    - Highlight when cursor is moved to the right of a closer.
      This might be too expensive to check.
    z<<parenmatch-check-restore>>)z
<KeyPress>z<ButtonPress>z<Key-Return>z<Key-BackSpace>c                 ó°   — || _         |j                  | _        |j                  j                  | j                  | j                  «       d| _        d| _        y )Nr   )ÚeditwinÚtextÚbindÚRESTORE_VIRTUAL_EVENT_NAMEÚrestore_eventÚcounterÚis_restore_active)Úselfr   s     ú$lib/python3.12/idlelib/parenmatch.pyÚ__init__zParenMatch.__init__(   sH   € ØˆŒØ—L‘LˆŒ	ð 	�‰×Ñ˜$×9Ñ9Ø×,Ñ,ô	.àˆŒØ!"ˆÕó    c                 ó  — t        j                  dddd¬«      | _        t        j                  ddddd¬	«      | _        t        j                  ddd
dd¬	«      | _        t        j
                  t        j                  «       d«      | _        y )NÚ
extensionsr   ÚstyleÚopener)Údefaultzflash-delayÚintiô  )Útyper   ÚbellÚboolé   Úhilite)r   Ú	GetOptionÚSTYLEÚFLASH_DELAYÚBELLÚGetHighlightÚCurrentThemeÚHILITE_CONFIG)Úclss    r   ÚreloadzParenMatch.reload3   s{   € ä×&Ñ&Ø˜ g°xôAˆŒ	ä"×,Ñ,Ø˜\¨-¸eÈCôQˆŒä×%Ñ%Ø˜\¨&°vÀqôJˆŒä$×1Ñ1´(×2GÑ2GÓ2IØ2:ó<ˆÕr   c                 óš   — | j                   s?| j                  D ](  }| j                  j                  | j                  |«       Œ* d| _         yy)z5Activate mechanism to restore text from highlighting.TN)r   ÚRESTORE_SEQUENCESr   Ú	event_addr   ©r   Úseqs     r   Úactivate_restorezParenMatch.activate_restore>   sB   € à×%Ò%Ø×-Ô-�Ø—	‘	×#Ñ# D×$CÑ$CÀSÕIð .à%)ˆDÕ"ð &r   c                 óš   — | j                   r?| j                  D ](  }| j                  j                  | j                  |«       Œ* d| _         yy)zRemove restore event bindings.FN)r   r0   r   Úevent_deleter   r2   s     r   Údeactivate_restorezParenMatch.deactivate_restoreE   sB   € à×!Ò!Ø×-Ô-�Ø—	‘	×&Ñ& t×'FÑ'FÈÕLð .à%*ˆDÕ"ð "r   c                 ón   — t        | j                  d«      j                  «       }| j                  |«       y)zAHandle editor 'show surrounding parens' event (menu or shortcut).ÚinsertÚbreak)r   r   Úget_surrounding_bracketsÚfinish_paren_event)r   ÚeventÚindicess      r   Úflash_paren_eventzParenMatch.flash_paren_eventL   s/   € ä˜tŸ|™|¨XÓ6ß,Ñ,Ó.ð 	à×Ñ Ô(Ør   c                 óî   — | j                   j                  d«      }|t        vryt        | j                  d«      }|j                  «       sy|j                  t        |   d«      }| j                  |«       y)zHandle user input of closer.z	insert-1cNT)r   ÚgetÚ_openersr   r   Ú
is_in_coder;   r<   )r   r=   ÚcloserÚhpr>   s        r   Úparen_closed_eventzParenMatch.paren_closed_eventS   se   € ð —‘—‘˜{Ó+ˆØœÑ!ØÜ˜Ÿ™ {Ó3ˆØ�}‰}ŒØØ×-Ñ-¬h°vÑ.>ÀÓEˆØ×Ñ Ô(Ør   c                 ó@  — |€'| j                   r| j                  j                  «        y | j                  «         | j                  j                  | j                  | j                  «      | |«        | j                  r| j                  «        y | j                  «        y ©N)r)   r   r"   r4   ÚtagfuncsrA   r'   Úcreate_tag_expressionr(   Úset_timeout_lastÚset_timeout_none©r   r>   s     r   r<   zParenMatch.finish_paren_event`   sy   € Øˆ?˜tŸyšyØ�I‰I�N‰NÔØØ×ÑÔàAˆ�‰×Ñ˜$Ÿ*™* d×&@Ñ&@ÓAÀ$ÈÔPð
2 $×"2Ò"2ˆ×	Ñ	õ 	5Ø ×1Ñ1õ	5r   Nc                 ó„   — | j                   j                  d«       | j                  «        | xj                  dz  c_        y)zRemove effect of doing match.Úparenr$   N)r   Ú
tag_deleter7   r   )r   r=   s     r   r   zParenMatch.restore_eventk   s.   € à�	‰	×Ñ˜WÔ%Ø×ÑÔ!Ø�Š˜ÑŽr   c                 óD   — || j                   k(  r| j                  «        y y rH   )r   r   )r   Útimer_counts     r   Úhandle_restore_timerzParenMatch.handle_restore_timerq   s   € Ø˜$Ÿ,™,Ò&Ø×ÑÕ ð 'r   c                 óŽ   — | j                   j                  d|d   «       | j                   j                  d| j                  «       y)z'Highlight the single paren that matchesrO   r   N)r   Útag_addÚ
tag_configr,   rM   s     r   Úcreate_tag_openerzParenMatch.create_tag_openerx   s4   € à�	‰	×Ñ˜' 7¨1¡:Ô.Ø�	‰	×Ñ˜W d×&8Ñ&8Õ9r   c                 ó  — | j                   j                  |d   «      dv r	|d   dz   }n|d   }| j                   j                  d|d   |d   dz   |dz   |«       | j                   j                  d| j                  «       y)z#Highlight the left and right parensr$   r   ú+1crO   r   z-1cN©r   rA   rU   rV   r,   ©r   r>   Ú
rightindexs      r   Úcreate_tag_parenszParenMatch.create_tag_parens}   sy   € à�9‰9�=‰=˜ ™Ó$¨Ñ7Ø  ™ EÑ)‰Jà  ™ˆJØ�	‰	×Ñ˜' 7¨1¡:¨w°q©z¸%Ñ/?ÀÈEÑAQÐS]Ô^Ø�	‰	×Ñ˜W d×&8Ñ&8Õ9r   c                 óì   — | j                   j                  |d   «      dv r	|d   dz   }n|d   }| j                   j                  d|d   |«       | j                   j                  d| j                  «       y)zHighlight the entire expressionr$   r   rY   rO   r   NrZ   r[   s      r   rJ   z ParenMatch.create_tag_expression†   sf   € à�9‰9�=‰=˜ ™Ó$¨Ñ7Ø  ™ EÑ)‰Jà  ™ˆJØ�	‰	×Ñ˜' 7¨1¡:¨zÔ:Ø�	‰	×Ñ˜W d×&8Ñ&8Õ9r   )r   r   ÚparensÚ
expressionc                 óØ   — | xj                   dz  c_         | | j                   | j                  j                  d«      fd„}| j                  j                  j                  t        ||«       y)zSHighlight will remain until user input turns it off
        or the insert has movedr$   r9   c                 óº   — ||j                   j                  d«      k7  r|j                  |«       y |j                  j                  j                  t        | | «       y )Nr9   )r   ÚindexrS   r   Ú
text_frameÚafterÚCHECK_DELAY)Úcallmer   Úcrc   s       r   rg   z+ParenMatch.set_timeout_none.<locals>.callme    sA   € à˜Ÿ	™	Ÿ™¨Ó1Ò1Ø×)Ñ)¨!Õ,à—‘×'Ñ'×-Ñ-¬k¸6À6ÕJr   N)r   r   rc   r   rd   re   rf   )r   rg   s     r   rL   zParenMatch.set_timeout_none™   sO   € ð 	�Š˜Ñ�Ø $¨¯©ØŸ™Ÿ™¨Ó2ó	Kð 	�‰×Ñ×%Ñ%¤k°6¸6ÕBr   c                 óª   — | xj                   dz  c_         | j                  j                  j                  | j                  | | j                   fd„«       y)zFThe last highlight created will be removed after FLASH_DELAY millisecsr$   c                 ó$   — | j                  |«      S rH   )rS   )r   rh   s     r   Ú<lambda>z-ParenMatch.set_timeout_last.<locals>.<lambda>¯   s   € ¨d×.GÑ.GÈÔ.Jr   N)r   r   rd   re   r(   )r   s    r   rK   zParenMatch.set_timeout_last¨   s@   € ð 	�Š˜Ñ�Ø�‰×Ñ×%Ñ%Ø×ÑØ §¡ÒJõ	Lr   rH   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r0   r   Úclassmethodr.   r4   r7   r?   rF   r<   r   rS   rW   r]   rJ   rI   rL   rK   © r   r   r   r      s„   „ ñð( "@Ðð<Ðò	#ð ñ<ó ð<ò*ò+òòò	5óò!ò:ò
:ò:ð $Ø$Ø#Ø+ñ	
€HòCóLr   r   Ú__main__)Úmainz!idlelib.idle_test.test_parenmatché   )Ú	verbosityN)ro   Úidlelib.hyperparserr   Úidlelib.configr   rB   rf   r   r.   rl   Úunittestrs   rq   r   r   Ú<module>ry      s]   ðñõ ,Ý #à˜ Ñ$€Ø€÷bLñ bLðJ × Ñ Ô ð ˆzÒÝÙÐ	,¸Ö:ð r   