o
    Ñ¢UPC=  ã                   @   s  d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
mZ ddlZG dd„ deƒZG dd	„ d	eƒZg ZeD ]Ze ej ed
¡¡ e ej ed¡¡ q<e ej d¡¡ g ai Zi Zi Zddg d¢fdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )zl
Complete implementation of the XDG Icon Spec Version 0.8
http://standards.freedesktop.org/icon-theme-spec/
é    N)ÚIniFileÚis_ascii)Úxdg_data_dirs)ÚNoThemeErrorÚdebugc                   @   s¨   e Zd Z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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d(S ))Ú	IconThemez&Class to parse and validate IconThemesc                 C   ó   t  | ¡ d S ©N©r   Ú__init__©Úself© r   ú?/var/www/html/env/lib/python3.10/site-packages/xdg/IconTheme.pyr      ó   zIconTheme.__init__c                 C   ó   | j S r	   )Únamer   r   r   r   Ú__repr__   ó   zIconTheme.__repr__c                 C   s8   t  | |ddg¡ tj |¡| _tj | j¡\}| _d S )Nz
Icon ThemeúKDE Icon Theme)r   ÚparseÚosÚpathÚdirnameÚdirÚsplitr   )r   ÚfileÚnilr   r   r   r      s   zIconTheme.parsec                 C   r   r	   )r   r   r   r   r   ÚgetDir   r   zIconTheme.getDirc                 C   ó   | j ddd�S )NÚNameT©Úlocale©Úgetr   r   r   r   ÚgetName    r   zIconTheme.getNamec                 C   r   )NÚCommentTr!   r#   r   r   r   r   Ú
getComment"   r   zIconTheme.getCommentc                 C   r   )NÚInheritsT©Úlistr#   r   r   r   r   ÚgetInherits$   r   zIconTheme.getInheritsc                 C   r   )NÚDirectoriesTr)   r#   r   r   r   r   ÚgetDirectories&   r   zIconTheme.getDirectoriesc                 C   r   )NÚHiddenÚboolean©Útyper#   r   r   r   r   Ú	getHidden(   r   zIconTheme.getHiddenc                 C   s
   |   d¡S )NÚExampler#   r   r   r   r   Ú
getExample*   s   
zIconTheme.getExamplec                 C   s   | j dd|d�S )NÚSizeÚinteger©r1   Úgroupr#   ©r   Ú	directoryr   r   r   ÚgetSize.   s   zIconTheme.getSizec                 C   s   | j d|d�S )NÚContext©r8   r#   r9   r   r   r   Ú
getContext0   r   zIconTheme.getContextc                 C   s   | j d|d�}|r|S dS )NÚTyper=   Ú	Thresholdr#   ©r   r:   Úvaluer   r   r   ÚgetType2   s   zIconTheme.getTypec                 C   ó*   | j dd|d�}|s|dkr|S |  |¡S )NÚMaxSizer6   r7   r   ©r$   r;   rA   r   r   r   Ú
getMaxSize8   ó   
zIconTheme.getMaxSizec                 C   rD   )NÚMinSizer6   r7   r   rF   rA   r   r   r   Ú
getMinSize>   rH   zIconTheme.getMinSizec                 C   s$   | j dd|d�}|s|dkr|S dS )Nr@   r6   r7   r   é   r#   rA   r   r   r   ÚgetThresholdD   s   zIconTheme.getThresholdc                 C   sì   | j dkr| j d¡ | jdkrn| jdkr| j d¡ n| j d¡ z| j| j  d | _W n ty=   | j d¡ Y nw z| j| j  d	 | _W n tyX   | j d
¡ Y nw z| j| j  d | _	W d S  tyu   | j d¡ Y d S w )Nr   z%[KDE Icon Theme]-Header is deprecatedz.themez.desktopz$.desktop fileExtension is deprecatedúUnknown File extensionr    zKey 'Name' is missingr&   zKey 'Comment' is missingr,   zKey 'Directories' is missing)
ÚdefaultGroupÚwarningsÚappendÚfileExtensionÚcontentr   ÚKeyErrorÚerrorsÚcommentÚdirectoriesr   r   r   r   ÚcheckExtrasL   s,   


ÿÿÿzIconTheme.checkExtrasc                 C   s   || j kr?z
| j| d | _W n ty    | j d| ¡ Y nw z| j| d | _W d S  ty>   | j d| ¡ Y d S w ||  ¡ v rzz
| j| d | _W n ty[   d| _Y nw z| j| d | _W d S  tyy   | j d| ¡ Y d S w t 	d	|¡r„t
|ƒsŽ| j d
| ¡ d S d S )Nr    z#Key 'Name' in Group '%s' is missingr&   z&Key 'Comment' in Group '%s' is missingr?   r@   r5   z#Key 'Size' in Group '%s' is missingú^\[X-úInvalid Group name: %s)rN   rR   r   rS   rT   rP   r-   r1   ÚreÚmatchr   ©r   r8   r   r   r   Ú
checkGroupl   s2   
ÿÿ
ÿÿÿzIconTheme.checkGroupc                 C   s&  || j krit dtjj d |¡rd S t dtjj d |¡r!d S |dkr/| j||dd� d S |dkr=| j||dd� d S |dkrK| j||d	d
� d S |dkrW|  ||¡ d S t d|¡r_d S | j d| ¡ d S ||  	¡ v �r|dkr~| j||dd
� d S |dkrŠ|  ||¡ d S |dkr¤|  ||¡ |dvr¢| j d| ¡ d S d S |dkrÂ| j||dd
� | j
dkrÀ| j d| j
 ¡ d S d S |dkrà| j||dd
� | j
dkrÞ| j d| j
 ¡ d S d S |dkrþ| j||dd
� | j
dkrü| j d| j
 ¡ d S d S t d|¡�rd S | j d| ¡ d S d S )Nz^Nameú$z^Commentr(   Tr)   r,   r.   r/   r0   r3   ú^X-[a-zA-Z0-9-]+úInvalid key: %sr5   r6   r<   r?   )ÚFixedÚScalabler@   zGKey 'Type' must be one out of 'Fixed','Scalable','Threshold', but is %srE   rb   z"Key 'MaxSize' give, but Type is %srI   z"Key 'MinSize' give, but Type is %sr@   z$Key 'Threshold' give, but Type is %s)rN   rZ   r[   ÚxdgÚLocaleÚregexÚ
checkValuerT   rP   r-   r1   ©r   ÚkeyrB   r8   r   r   r   ÚcheckKeyƒ   sZ   
ÿ
ÿ
ÿ
ÿèzIconTheme.checkKeyN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r%   r'   r+   r-   r2   r4   r;   r>   rC   rG   rJ   rL   rW   r]   ri   r   r   r   r   r      s*     r   c                   @   sX   e Zd Z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dS )ÚIconDataz*Class to parse and validate IconData Filesc                 C   r   r	   r
   r   r   r   r   r   ³   r   zIconData.__init__c                 C   s   |   ¡ }|r
d| S dS )Nz<IconData: %s>z
<IconData>)ÚgetDisplayName)r   Údisplaynamer   r   r   r   ¶   s   zIconData.__repr__c                 C   s   t  | |dg¡ d S )Nz	Icon Data)r   r   )r   r   r   r   r   r   ½   s   zIconData.parsec                 C   r   )zBRetrieve the display name from the icon data, if one is specified.ÚDisplayNameTr!   r#   r   r   r   r   ro   Á   s   zIconData.getDisplayNamec                 C   ó   | j dddd�S )zzRetrieve the embedded text rectangle from the icon data as a list of
        numbers (x0, y0, x1, y1), if it is specified.ÚEmbeddedTextRectangler6   T©r1   r*   r#   r   r   r   r   ÚgetEmbeddedTextRectangleÄ   ó   z!IconData.getEmbeddedTextRectanglec                 C   rr   )z„Retrieve the anchor points for overlays & emblems from the icon data,
        as a list of co-ordinate pairs, if they are specified.ÚAttachPointsÚpointTrt   r#   r   r   r   r   ÚgetAttachPointsÈ   rv   zIconData.getAttachPointsc                 C   s   | j dkr| j d¡ d S d S )Nú.iconrM   )rQ   rO   rP   r   r   r   r   rW   Î   s   
ÿzIconData.checkExtrasc                 C   sB   || j kst d|¡rt|ƒs| j d| dd¡ ¡ d S d S d S )NrX   rY   ÚasciiÚreplace)rN   rZ   r[   r   rT   rP   Úencoder\   r   r   r   r]   Ó   s   

ÿÿþzIconData.checkGroupc                 C   s|   t  dtjj d |¡rd S |dkr| j||ddd� d S |dkr,| j||ddd� d S t  d	|¡r4d S | j d
| ¡ d S )Nz^DisplayNamer^   rs   r6   Trt   rw   rx   r_   r`   )rZ   r[   rc   rd   re   rf   rT   rP   rg   r   r   r   ri   Ù   s   zIconData.checkKeyN)rj   rk   rl   rm   r   r   r   ro   ru   ry   rW   r]   ri   r   r   r   r   rn   ±   s    rn   ÚiconsÚpixmapsz~/.icons)ÚpngÚsvgÚxpmc                 C   sB  |dkrt jj}|dkrt jj}tj | ¡r| S tj | ¡d dd… |v r.tj | ¡d } tg ks9td j	|kr?t
t|ƒƒa| ||t|ƒf}zt| \}}W n	 tyX   Y nw t ¡ | t jjkrgt|= n|S tD ]}t| |||ƒ}|r‚t ¡ |ft|< |  S qktD ]8}|tvs§tt ¡ t| d  ƒt jjkr½t| d tj |¡k r½tj |¡r½t |¡t ¡ tj |¡ft|< q…t ¡ D ]G\}	}
|D ]@}z&| d | |
d v rïtj |	| d | ¡}t ¡ |gt|< |W     S W qÈ t�y } ztrý|‚	 W Y d}~qÈd}~ww qÂ|dk�rt| |dƒ}t ¡ |gt|< |S dS )aå  Get the path to a specified icon.
    
    size :
      Icon size in pixels. Defaults to ``xdg.Config.icon_size``.
    theme :
      Icon theme name. Defaults to ``xdg.Config.icon_theme``. If the icon isn't
      found in the specified theme, it will be looked up in the basic 'hicolor'
      theme.
    extensions :
      List of preferred file extensions.
    
    Example::
    
        >>> getIconPath("inkscape", 32)
        '/usr/share/icons/hicolor/32x32/apps/inkscape.png'
    Né   r   rK   Ú.Úhicolor)rc   ÚConfigÚ	icon_sizeÚ
icon_themer   r   ÚisabsÚsplitextÚthemesr   r*   Ú__get_themesÚtupleÚ
icon_cacherS   ÚtimeÚ
cache_timeÚ
LookupIconÚicondirsÚ	dir_cacheÚintÚgetmtimeÚisdirÚlistdirÚitemsÚjoinÚUnicodeDecodeErrorr   ÚgetIconPath)ÚiconnameÚsizeÚthemeÚ
extensionsÚtmpÚ	timestampÚiconÚthmer:   r   ÚvaluesÚ	extensionÚer   r   r   r›   ô   sj   ÿþ 
ÿ €ý€üú
ýr›   c                 C   sH   t j | ¡r t j | ¡d d }t j |¡r"tƒ }| |¡ |S dS dS )zÜRetrieve the data from the .icon file corresponding to the given file. If
    there is no .icon file, it returns None.
    
    Example::
    
        getIconData("/usr/share/icons/Tango/scalable/places/folder.svg")
    r   rz   N)r   r   ÚisfilerŠ   rn   r   )r   Ú	icon_fileÚdatar   r   r   ÚgetIconDataF  s   
ûrª   c                 c   s˜   � t D ]"}tj || d¡}tj |¡r ntj || d¡}tj |¡r% n	qtr,t| ƒ‚dS tƒ }| |¡ |V  | 	¡ D ]}t
|ƒD ]}|V  qCq=dS )zjGenerator yielding IconTheme objects for a specified theme and any themes
    from which it inherits.
    zindex.themezindex.desktopN)r’   r   r   r™   r§   r   r   r   r   r+   rŒ   )Ú	themenamer   Ú
theme_filerž   ÚsubthemeÚtr   r   r   rŒ   U  s(   €ÿ
ÿÿrŒ   c              	   C   s"  |j tvr+g t|j < t|j   t ¡ tjjd  ¡ t|j   d¡ t|j   tƒ ¡ tt ¡ t|j  d  ƒtjjkrŸt ¡ t|j  d< | 	¡ D ]U}t
D ]P}tj ||j |¡}|t|j  d vstt|j  d tj tj ||j ¡¡k r�|dkr�tj |¡r�|t |¡gt|j  d |< tj tj ||j ¡¡t|j  d< qMqIt|j  d  ¡ D ]*\}}t|d ||ƒrÒ|D ]}| d | |d v rÑtj || d | ¡    S q¶q¨d}	d}
t|j  d  ¡ D ].\}}t|d ||ƒ}||	k �r|D ]}| d | |d v �rtj || d | ¡}
|}	qóqà|
S )Nrƒ   r   rK   Ú r„   l        )r   Útheme_cacherP   r�   rc   r†   r�   Údictr”   r-   r’   r   r   r™   r•   r–   r—   r˜   ÚDirectoryMatchesSizeÚDirectorySizeDistance)rœ   r�   rž   rŸ   Úsubdirr:   r   r¤   r¥   Úminimal_sizeÚclosest_filenameÚdistancer   r   r   r‘   l  sJ   

 "&
ÿ"€ù	ÿ€
€r‘   c                 C   sŽ   |  | ¡}| | ¡}| | ¡}| | ¡}| | ¡}|dkr!||kS |dkr1||  ko.|kS   S |dkrE|| |  koB|| kS   S d S )Nra   Ú	Scaleabler@   )rC   r;   rL   rJ   rG   ©r´   Úiconsizerž   r?   r5   r@   rI   rE   r   r   r   r²   “  s   




 ÿr²   c                 C   sª   |  | ¡}| | ¡}| | ¡}| | ¡}| | ¡}|dkr#t|| ƒS |dkr9||k r/|| S ||kr7|| S dS |dkrS||| k rG|| S ||| krQ|| S dS d S )Nra   rb   r   r@   )rC   r;   rL   rJ   rG   Úabsr¹   r   r   r   r³      s(   




ûr³   ) rm   r   r�   rZ   Úxdg.IniFiler   r   Úxdg.BaseDirectoryr   Úxdg.Exceptionsr   r   Ú
xdg.Configrc   r   rn   r’   ÚbasedirrP   r   r™   Ú
expanduserr‹   r°   r“   rŽ   r›   rª   rŒ   r‘   r²   r³   r   r   r   r   Ú<module>   s2     #7R'