o
     JAf                     @   s   	 d dl mZ d dlZd dlZd dlmZ d dlZG dd deZG dd deZ	G dd	 d	eZ
G d
d deZG dd deZG dd dZe Ze Zdd ZG dd deZdd Zedkrqd dlmZ edddd dS dS )    )ConfigParserN)Fontc                   @      e Zd ZdS )InvalidConfigTypeN__name__
__module____qualname__ r
   r
   %/usr/lib/python3.10/idlelib/config.pyr   #       r   c                   @   r   )InvalidConfigSetNr   r
   r
   r
   r   r   $   r   r   c                   @   r   )InvalidThemeNr   r
   r
   r
   r   r   %   r   r   c                   @   s2   e Zd Z	 dddZdddZdd Zd	d
 ZdS )IdleConfParserNc                 C   s   	 || _ tj| |dd d S )NF)defaultsstrict)filer   __init__)selfcfgFileZcfgDefaultsr
   r
   r   r   +   s   zIdleConfParser.__init__Fc                 C   sJ   	 |  ||s	|S |dkr| ||S |dkr| ||S | j|||dS )Nboolintraw)
has_optionZ
getbooleanZgetintget)r   sectionoptiontypedefaultr   r
   r
   r   Get2   s   zIdleConfParser.Getc                 C   s   	 |  |r| |S g S N)has_sectionoptionsr   r   r
   r
   r   GetOptionListC   s   

zIdleConfParser.GetOptionListc                 C   s   	 | j r| | j  d S d S r!   )r   readr   r
   r
   r   LoadJ   s   zIdleConfParser.Loadr!   )NNF)r   r   r	   r   r    r%   r(   r
   r
   r
   r   r   '   s    

r   c                   @   s>   e Zd Z	 dd Zdd Zdd Zdd Zd	d
 Zdd ZdS )IdleUserConfParserc                 C   sZ   	 |  ||r| |||krdS | ||| dS | |s$| | | ||| dS )NFT)r   r   setr"   add_section)r   r   r   valuer
   r
   r   	SetOptionT   s   

zIdleUserConfParser.SetOptionc                 C   s   	 |  |r| ||S dS )NF)r"   Zremove_option)r   r   r   r
   r
   r   RemoveOptione   s   
zIdleUserConfParser.RemoveOptionc                 C   s   	 |  |s| | d S d S r!   )r"   r+   r$   r
   r
   r   
AddSectionn   s   
zIdleUserConfParser.AddSectionc                 C   s(   	 |   D ]}| |s| | qd S r!   )sectionsr%   remove_sectionr$   r
   r
   r   RemoveEmptySectionss   s   

z&IdleUserConfParser.RemoveEmptySectionsc                 C   s   	 |    |   S r!   )r2   r0   r'   r
   r
   r   IsEmptyy   s   
zIdleUserConfParser.IsEmptyc                 C   s   	 | j }|rT|d dkrV|  sEzt|d}W n ty*   t| t|d}Y nw | | | W d    d S 1 s>w   Y  d S tj| j rXt	| j  d S d S d S d S )Nr   #w)
r   r3   openOSErrorosunlinkwritepathexistsremove)r   Zfnamer   r
   r
   r   Save~   s"   
"	zIdleUserConfParser.SaveN)	r   r   r	   r-   r.   r/   r2   r3   r>   r
   r
   r
   r   r)   O   s    	r)   c                   @   s
  e Zd Z	 d=ddZdd Zdd Z		d>d
dZdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zedd Z			d?ddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zh d0Zd@d1d2Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z dS )AIdleConfFc                 C   s4   d| _ i | _i | _i | _|s|   |   d S d S )N)main	highlightkeys
extensions)config_types
defaultCfguserCfgcfgCreateConfigHandlersLoadCfgFiles)r   Z_utestr
   r
   r   r      s   zIdleConf.__init__c                 C   sz   	 t jt}tjrdn|   | _}| jD ]$}t	t j
|d| d| j|< tt j
|p/dd| d| j|< qd S )N zconfig-z.defr4   z.cfg)r8   r;   dirname__file__idlelibtestingGetUserCfgDiruserdirrD   r   joinrE   r)   rF   )r   ZidledirrP   Zcfg_typer
   r
   r   rH      s   

zIdleConf.CreateConfigHandlersc                 C   s   	 d}t jd}|dkr1t j|s1tjs/d| d }z	t|tjd W n	 t	y.   Y nw d}|dkr9t 
 }t j||}t j|svzt | W |S  t	yu   tjssd| d }z
t|tjd W t t	yr   Y tw tw |S )Nz.idlerc~z.
 Warning: os.path.expanduser("~") points to
 z,
 but the path does not exist.r   z2
 Warning: unable to create user config directory
z(
 Check path and permissions.
 Exiting!
)r8   r;   
expanduserr<   rM   rN   printsysstderrr7   getcwdrQ   mkdir
SystemExit)r   ZcfgDirZuserDirwarnr
   r
   r   rO      sR   
zIdleConf.GetUserCfgDirNTc           	      C   s   	 z| j | ||r| j | j||||dW S W n! ty:   d|||| j | j|||df }t|||| Y nw z| j| ||rR| j| j||||dW S W n	 ty\   Y nw |rmd|||f }t|||| |S )N)r   r   zn
 Warning: config.py - IdleConf.GetOption -
 invalid %r value for configuration option %r
 from section %r: %rr   z
 Warning: config.py - IdleConf.GetOption -
 problem retrieving configuration option %r
 from section %r.
 returning default value: %r)rF   r   r    
ValueError_warnrE   )	r   
configTyper   r   r   r   warn_on_defaultr   warningr
   r
   r   	GetOption   s<   
zIdleConf.GetOptionc                 C   s   	 | j | ||| d S r!   )rF   r-   )r   r^   r   r   r,   r
   r
   r   r-      s   zIdleConf.SetOptionc                 C   sP   	 || j vr
td|dkr| j| }| S |dkr$| j| }| S td)NzInvalid configType specifieduserr   Invalid configSet specified)rD   r   rF   rE   r   r0   )r   	configSetr^   	cfgParserr
   r
   r   GetSectionList  s   


zIdleConf.GetSectionListc                 C   sT   	 | j d |rdnd}| ||}||d  }|dkrd}||d  }||dS )	NrA   r   rb   z-foregroundZcursornormalz-background)Z
foregroundZ
background)rE   r"   GetThemeDict)r   themeelementrG   Z
theme_dictZforeZbackr
   r
   r   GetHighlight  s   
zIdleConf.GetHighlightc                 C   s  	 |dkr| j d }n|dkr| jd }ntdi 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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 ])}|||s~|ds~d|||| f }t|d|| |j|||| d||< qa|S )Nrb   rA   r   zInvalid theme type specifiedznormal-foregroundz#000000znormal-backgroundz#ffffffzkeyword-foregroundzkeyword-backgroundzbuiltin-foregroundzbuiltin-backgroundzcomment-foregroundzcomment-backgroundzstring-foregroundzstring-backgroundzdefinition-foregroundzdefinition-backgroundzhilite-foregroundzhilite-backgroundZgrayzbreak-foregroundzbreak-backgroundzhit-foreground)zhit-backgroundzerror-foregroundzerror-backgroundzcontext-foregroundzcontext-backgroundzlinenumber-foregroundzlinenumber-backgroundzcursor-foregroundzstdout-foregroundzstdout-backgroundzstderr-foregroundzstderr-backgroundzconsole-foregroundzconsole-background)zcontext-zlinenumber-z{
 Warning: config.IdleConf.GetThemeDict -
 problem retrieving theme element %r
 from theme %r.
 returning default color: %rr   )rF   rE   r   r   
startswithr]   r    )r   r   Z	themeNamere   ri   rj   r`   r
   r
   r   rh   !  s   	
"
zIdleConf.GetThemeDictc                 C      	 |  dS )NThemecurrent_colors_and_keysr'   r
   r
   r   CurrentThemee     
zIdleConf.CurrentThemec                 C   rn   )NZKeysrp   r'   r
   r
   r   CurrentKeysi  rs   zIdleConf.CurrentKeysc                 C   s   	 |dkrdnd}| j d|dddd}d	}|r | j d|d
d	d}|s+| j d|dd	d}|r>|r2| jn| j}|| |r>|S |dkrDdS |  S )Nro   rA   rB   r@   r   r   Tr   r   rJ   Zname2rl   namezIDLE Classic)ra   rE   rF   r"   default_keys)r   r   Zcfgnamer   rv   sourcer
   r
   r   rq   m  s   
z IdleConf.current_colors_and_keysc                   C   s(   t jd d dkrdS t jdkrdS dS )N   winzIDLE Classic WindowsdarwinzIDLE Classic OSXzIDLE Modern Unix)rV   platformr
   r
   r
   r   rw     s
   
zIdleConf.default_keysc           	   	   C   s   	 |  | dd}|  | dd}|D ]}||vr || qdD ]}|| q#|rag }|D ]-}| jd|ddddr^|sA|rY|rFd	}nd
}| jd||ddddrX|| q1|| q1|S |S )Nr   rC   rb   )ZAutoCompleteZCodeContextZFormatParagraphZ
ParenMatchenableTr   r   r   Zenable_editorZenable_shellF)r   r   r_   )RemoveKeyBindNamesrf   appendr=   ra   )	r   active_onlyZeditor_onlyZ
shell_onlyZextnsZ	userExtnsextnactiveExtnsr   r
   r
   r   GetExtensions  sB   





zIdleConf.GetExtensionsc                 C   s   	 dd |D S )Nc                 S   s   g | ]	}| d s|qS ))	_bindings_cfgBindings)endswith).0nr
   r
   r   
<listcomp>  s    z/IdleConf.RemoveKeyBindNames.<locals>.<listcomp>r
   )r   ZextnNameListr
   r
   r   r     s   zIdleConf.RemoveKeyBindNamesc                 C   sD   	 d }d| d }| j ddD ]}| |D ]}||kr|}qq|S )N<<>>r   r   )r   GetExtensionKeys)r   virtualEventZextNameZvEventr   eventr
   r
   r   GetExtnNameForEvent  s   zIdleConf.GetExtnNameForEventc           	      C   s`   	 |d }|   }i }| jd |r.| jd |}|D ]}d| d }|| }|||< q|S )Nr   rC   r   r   )GetCurrentKeySetrE   r"   r%   )	r   extensionNamekeysNameZ
activeKeysextKeys
eventNames	eventNamer   bindingr
   r
   r   r     s   
zIdleConf.GetExtensionKeysc                 C   sf   	 |d }i }| j d |r1| j d |}|D ]}| jd||dd }d| d }|||< q|S )Nr   rC   rJ   rl   r   r   )rE   r"   r%   ra   split)r   r   r   r   r   r   r   r   r
   r
   r   Z__GetRawExtensionKeys  s   
zIdleConf.__GetRawExtensionKeysc                 C   sl   	 |d }|  |}| jd |r4| jd |}|D ]}| jd||dd }d| d }|||< q|S )Nr   rC   rJ   rl   r   r   )r   rE   r"   r%   ra   r   )r   r   Z	bindsNameZextBindsr   r   r   r   r
   r
   r   GetExtensionBindings  s   

zIdleConf.GetExtensionBindingsc                 C   s*   	 |dd }| j d||ddd }|S )N   rB   rJ   F)r   r_   )ra   r   )r   
keySetNameZeventStrr   r   r
   r
   r   GetKeyBinding  s   zIdleConf.GetKeyBindingc                 C   sN   	 |  |  }tjdkr%| D ]\}}dd |D }||kr$|||< q|S )Nr{   c                 S   s   g | ]}| d dqS )z<Alt-z<Option-)replace)r   xr
   r
   r   r   %  s    z-IdleConf.GetCurrentKeySet.<locals>.<listcomp>)	GetKeySetrt   rV   r|   items)r   resultkvZv2r
   r
   r   r     s   
zIdleConf.GetCurrentKeySetc                 C   sb   	 |  |}| jdd}|D ] }| |}|r.|D ]}|| | v r'd||< || ||< qq|S )N   r   rJ   )GetCoreKeysr   _IdleConf__GetRawExtensionKeysvalues)r   r   ZkeySetr   r   r   r   r
   r
   r   r   +  s   

zIdleConf.GetKeySetc                 C   s   	 d| d |   v S )Nr   r   )r   )r   r   r
   r
   r   IsCoreBinding=  s   zIdleConf.IsCoreBinding>	   <<force-open-calltip>><<force-open-completions>><<expand-word>><<check-module>><<zoom-height>><<run-custom>><<format-paragraph>><<run-module>><<flash-paren>>c              	   C   sr  	 i dddgdddgddd	gd
ddgddgddgddgddgddgddgddgddgddgddgdd gd!d"gd#d$gi d%d&gd'd(gd)d*gd+d,gd-d.gd/d0gd1d2gd3d4gd5d6gd7d8gd9d:gd;d<gd=d>gd?d@dAgdBdCgdDdEgdFdGgi dHdIgdJdKgdLdMgdNdOdPgdQdRgdSdTgdUdVgdWdXgdYdZgd[d\gd]d^gd_d`gdadbgdcddgdedfgdgdhgdidjgdkgdlgdmgdngdogdpgdqgdr}|r7| j ds |s| jds |sdt|f }t|ds| |S |D ](}| ||}|r|||< q|| jvr5du|||| f }t|ds|| q|S )vNz<<copy>>z<Control-c>z<Control-C>z<<cut>>z<Control-x>z<Control-X>z	<<paste>>z<Control-v>z<Control-V>z<<beginning-of-line>>z<Control-a>z<Home>z<<center-insert>>z<Control-l>z<<close-all-windows>>z<Control-q>z<<close-window>>z<Alt-F4>z<<do-nothing>>z<<end-of-file>>z<Control-d>z<<python-docs>>z<F1>z<<python-context-help>>z
<Shift-F1>z<<history-next>>z<Alt-n>z<<history-previous>>z<Alt-p>z<<interrupt-execution>>z<<view-restart>>z<F6>z<<restart-shell>>z<Control-F6>z<<open-class-browser>>z<Alt-c>z<<open-module>>z<Alt-m>z<<open-new-window>>z<Control-n>z<<open-window-from-file>>z<Control-o>z<<plain-newline-and-indent>>z<Control-j>z<<print-window>>z<Control-p>z<<redo>>z<Control-y>z<<remove-selection>>z<Escape>z<<save-copy-of-window-as-file>>z<Alt-Shift-S>z<<save-window-as-file>>z<Alt-s>z<<save-window>>z<Control-s>z<<select-all>>z<Alt-a>z<<toggle-auto-coloring>>z<Control-slash>z<<undo>>z<Control-z>z<<find-again>>z<Control-g>z<F3>z<<find-in-files>>z<Alt-F3>z<<find-selection>>z<Control-F3>z<<find>>z<Control-f>z<<replace>>z<Control-h>z<<goto-line>>z<Alt-g>z<<smart-backspace>>z<Key-BackSpace>z<<newline-and-indent>>z<Key-Return>z<Key-KP_Enter>z<<smart-indent>>z	<Key-Tab>z<<indent-region>>z<Control-Key-bracketright>z<<dedent-region>>z<Control-Key-bracketleft>z<<comment-region>>z<Alt-Key-3>z<<uncomment-region>>z<Alt-Key-4>z<<tabify-region>>z<Alt-Key-5>z<<untabify-region>>z<Alt-Key-6>z<<toggle-tabs>>z<Alt-Key-t>z<<change-indentwidth>>z<Alt-Key-u>z<<del-word-left>>z<Control-Key-BackSpace>z<<del-word-right>>z<Control-Key-Delete>r   z<Control-Key-space>r   z<Alt-Key-slash>z<Control-Key-backslash>z<Control-Key-0>z<Alt-Key-q>z<Key-F5>z<Shift-Key-F5>z<Alt-Key-x>z<Alt-Key-2>)r   r   r   r   r   r   r   rB   za
 Warning: config.py - IdleConf.GetCoreKeys -
 key set %r is not defined, using default bindings.z
 Warning: config.py - IdleConf.GetCoreKeys -
 problem retrieving key binding for event %r
 from key set %r.
 returning default value: %r)rF   r"   rE   r]   r   former_extension_events)r   r   ZkeyBindingsr`   r   r   r
   r
   r   r   O  s  	
 !"#$%&'()*+,-./01234=zIdleConf.GetCoreKeysc           	      C   s   	 g }|dkr| j d }n|dkr| jd }ntd|d}|D ]3}|jd|dd}|ddkr8d	}d	}n|d}|d
  }|d  }|rU|rU||||f q"|j	dd d |S )Nrb   r@   r   rc   	HelpFiles;rl   rJ   r   r   c                 S   s   | d S )Nr   r
   )r   r
   r
   r   <lambda>  s    z1IdleConf.GetExtraHelpSourceList.<locals>.<lambda>)key)
rF   rE   r   r%   r    findr   stripr   sort)	r   rd   ZhelpSourcesre   r#   r   r,   ZmenuItemZhelpPathr
   r
   r   GetExtraHelpSourceList  s*   	

zIdleConf.GetExtraHelpSourceListc                 C   s   	 |  d|  d }|S )Nr   rb   )r   )r   ZallHelpSourcesr
   r
   r   GetAllExtraHelpSourcesList  s
   z#IdleConf.GetAllExtraHelpSourcesListc           	      C   s   	 | j ||ddd}| j ||dddd}| j ||dd	d
d}|dkrBtdd|d}t|}|d }|d }|d	kr<d}|d dk}|||rIdfS dfS )NZfontZcourierrl   z	font-sizer   Z10ru   z	font-boldr   r   r~   ZTkFixedFontT)rv   r<   rootfamilysize
   Zweightboldrg   )ra   r   actual)	r   r   r^   r   r   r   r   fZ
actualFontr
   r
   r   GetFont  s"   

zIdleConf.GetFontc                 C   s.   	 | j D ]}| j |   | j|   qd S r!   )rE   r(   rF   r   r   r
   r
   r   rI     s
   
zIdleConf.LoadCfgFilesc                 C   s    	 | j D ]	}| j |   qd S r!   )rF   r>   r   r
   r
   r   SaveUserCfgFiles  s   
zIdleConf.SaveUserCfgFiles)F)NNTF)TFFr!   )!r   r   r	   r   rH   rO   ra   r-   rf   rk   rh   rr   rt   rq   staticmethodrw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   r   r
   r
   r
   r   r?      sH    


$
(D&

)
` 	r?   c                 G   sJ   | f| }|t vr#z	t| tjd W n	 ty   Y nw t | d S d S )NrS   )_warnedrU   rV   rW   r7   add)msgr   r
   r
   r   r]     s   
r]   c                   @   sB   e Zd Z	 dd Zdd Zedd Zdd Zd	d
 Zdd Z	dS )ConfigChangesc                 C   s0   	 g | _ tjD ]}i | |< | j | |  qd S r!   )pagesidleConfrD   r   )r   config_typer
   r
   r   r     s   
zConfigChanges.__init__c                 C   s2   	 | | }t |}||vri ||< ||| |< d S r!   )str)r   r   r   itemr,   pager
   r
   r   
add_option%  s   zConfigChanges.add_optionc                 C   sP   	 t j|  ||rt j|  |||krt j|  ||S t j|  |||S r!   )r   rE   r   r    rF   r.   r-   )r   r   r   r,   r
   r
   r   save_option-  s
   zConfigChanges.save_optionc              	   C   s   	 t jd   d}| D ];}d}| | }|D ]%}|dkr&t jd d d}||  D ]\}}| ||||r:d}q,q|rGt j|   d}qdD ]	}t j|   qJ|   |S )Nr@   Fr   T)rB   rA   )r   rF   r>   r1   r   r   clear)r   changedr   Zcfg_type_changedr   r   r   r,   r
   r
   r   save_all:  s.   zConfigChanges.save_allc                 C   s8   	 || | v r| | |= t j| }|| |  d S r!   )r   rF   r1   r>   )r   r   r   Z
configpager
   r
   r   delete_sectionX  s   


zConfigChanges.delete_sectionc                 C   s   	 | j D ]}|  qd S r!   )r   r   )r   r   r
   r
   r   r   c  s   

zConfigChanges.clearN)
r   r   r	   r   r   r   r   r   r   r   r
   r
   r
   r   r     s    
r   c                     sV   ddl m  d\} } fddfdd}|tj |tj td| d	|d
d d S )Nr   crc32)r   r   c                    s.   t | }td7 a |jddtat| d S )Nr   zutf-8)encoding)r   lineencodecrcrU   )objZtxtr   r
   r   sprintr  s   z_dump.<locals>.sprintc              	      s   t d| d t|  D ]7}| |  } |  | |D ]$}| | |} |  | |D ]} |d | | ||  q1qqd S )N
z = )rU   sortedrB   r0   r#   r    )rG   r   r0   r   r#   r   )r   r
   r   dumpCfgz  s   z_dump.<locals>.dumpCfgz	
lines = z, crc = rJ   )sep)zlibr   r   rE   rF   rU   )r   r   r   r
   )r   r   r   _dumpn  s   

r   __main__)r@   zidlelib.idle_test.test_configr   F)	verbosityexit)configparserr   r8   rV   Ztkinter.fontr   rM   	Exceptionr   r   r   r   r)   r?   r   r*   r   r]   dictr   r   r   Zunittestr@   r
   r
   r
   r   <module>   s2    (B    q
c