3
v_>                 @   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x4eD ],Zejejjed
 ejejjed qzW ejejjd g ai Zi Zi Zdddddg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(d) Zd*d+ Zd,S )-	IconThemez&Class to parse and validate IconThemesc             C   s   t j|  d S )N)r   __init__)self r
   //usr/lib/python3/dist-packages/xdg/IconTheme.pyr      s    zIconTheme.__init__c             C   s   | j S )N)name)r	   r
   r
   r   __repr__   s    zIconTheme.__repr__c             C   s8   t j| |ddg tjj|| _tjj| j\}| _d S )Nz
Icon ThemezKDE Icon Theme)r   parseospathdirnamedirsplitr   )r	   fileZnilr
   r
   r   r      s    zIconTheme.parsec             C   s   | j S )N)r   )r	   r
   r
   r   getDir   s    zIconTheme.getDirc             C   s   | j dddS )NNameT)locale)get)r	   r
   r
   r   getName    s    zIconTheme.getNamec             C   s   | j dddS )NCommentT)r   )r   )r	   r
   r
   r   
getComment"   s    zIconTheme.getCommentc             C   s   | j dddS )NInheritsT)list)r   )r	   r
   r
   r   getInherits$   s    zIconTheme.getInheritsc             C   s   | j dddS )NDirectoriesT)r   )r   )r	   r
   r
   r   getDirectories&   s    zIconTheme.getDirectoriesc             C   s   | j dddS )NScaledDirectoriesT)r   )r   )r	   r
   r
   r   getScaledDirectories(   s    zIconTheme.getScaledDirectoriesc             C   s   | j dddS )NHiddenboolean)type)r   )r	   r
   r
   r   	getHidden*   s    zIconTheme.getHiddenc             C   s
   | j dS )NExample)r   )r	   r
   r
   r   
getExample,   s    zIconTheme.getExamplec             C   s   | j dd|dS )NSizeinteger)r%   group)r   )r	   	directoryr
   r
   r   getSize0   s    zIconTheme.getSizec             C   s   | j d|dS )NContext)r+   )r   )r	   r,   r
   r
   r   
getContext2   s    zIconTheme.getContextc             C   s   | j d|d}|r|S dS d S )NType)r+   	Threshold)r   )r	   r,   valuer
   r
   r   getType4   s    zIconTheme.getTypec             C   s.   | j dd|d}|s|dkr |S | j|S d S )NMaxSizer*   )r%   r+   r   )r   r-   )r	   r,   r2   r
   r
   r   
getMaxSize:   s    zIconTheme.getMaxSizec             C   s.   | j dd|d}|s|dkr |S | j|S d S )NMinSizer*   )r%   r+   r   )r   r-   )r	   r,   r2   r
   r
   r   
getMinSize@   s    zIconTheme.getMinSizec             C   s(   | j dd|d}|s|dkr |S dS d S )Nr1   r*   )r%   r+   r      )r   )r	   r,   r2   r
   r
   r   getThresholdF   s    zIconTheme.getThresholdc             C   s   | j dd|d}|pdS )NScaler*   )r%   r+      )r   )r	   r,   r2   r
   r
   r   getScaleM   s    zIconTheme.getScalec             C   s   | j dkr| jjd | jdkr"n$| jdkr:| jjd n| jjd y| j| j  d | _W n  tk
r|   | jjd Y nX y| j| j  d	 | _W n  tk
r   | jjd
 Y nX y| j| j  d | _	W n  tk
r   | jjd Y nX d S )NzKDE Icon Themez%[KDE Icon Theme]-Header is deprecatedz.themez.desktopz$.desktop fileExtension is deprecatedzUnknown File extensionr   zKey 'Name' is missingr   zKey 'Comment' is missingr   zKey 'Directories' is missing)
defaultGroupwarningsappendfileExtensioncontentr   KeyErrorerrorsZcommentZdirectories)r	   r
   r
   r   checkExtrasR   s&    


zIconTheme.checkExtrasc             C   s$  || j kry| j| d | _W n$ tk
rB   | jjd|  Y nX y| j| d | _W n$ tk
r|   | jjd|  Y nX n|| j kry| j| d | _W n tk
r   d| _Y nX y| j| d | _W n$ tk
r   | jjd|  Y nX n(tj	d	|ot
|s | jjd
|  d S )Nr   z#Key 'Name' in Group '%s' is missingr   z&Key 'Comment' in Group '%s' is missingr0   r1   r)   z#Key 'Size' in Group '%s' is missingz^\[X-zInvalid Group name: %s)r=   rA   r   rB   rC   r?   r    r%   rematchr   )r	   r+   r
   r
   r   
checkGroupr   s(    
zIconTheme.checkGroupc             C   sD  || j krtjdtjj d |r$ntjdtjj d |r>n|dkrX| j||dd n|dkrr| j||dd nh|dkr| j||dd nN|d	kr| j||d
d n4|dkr| j|| ntjd|rn| jjd|  nb|| j	 kr@|dkr
| j||dd n6|dkr$| j|| n|dkrV| j|| |dkr@| jjd|  n|dkr| j||dd | j
dkr@| jjd| j
  n|dkr| j||dd | j
dkr@| jjd| j
  nv|dkr| j||dd | j
dkr@| jjd| j
  n<|dkr | j||dd n tjd|r0n| jjd|  d S )Nz^Name$z^Commentr   T)r   r   r!   r#   r$   )r%   r'   z^X-[a-zA-Z0-9-]+zInvalid key: %sr)   r*   r.   r0   FixedScalabler1   zGKey 'Type' must be one out of 'Fixed','Scalable','Threshold', but is %sr4   z"Key 'MaxSize' give, but Type is %sr6   z"Key 'MinSize' give, but Type is %sz$Key 'Threshold' give, but Type is %sr:   )rI   rJ   r1   )r=   rE   rF   xdgLocaleregex
checkValuerC   r?   r    r%   )r	   keyr2   r+   r
   r
   r   checkKey   sX    








zIconTheme.checkKeyN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r    r"   r&   r(   r-   r/   r3   r5   r7   r9   r<   rD   rG   rP   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   s   t j|  d S )N)r   r   )r	   r
   r
   r   r      s    zIconData.__init__c             C   s   | j  }|rd| S dS d S )Nz<IconData: %s>z
<IconData>)getDisplayName)r	   Zdisplaynamer
   r
   r   r      s    zIconData.__repr__c             C   s   t j| |dg d S )Nz	Icon Data)r   r   )r	   r   r
   r
   r   r      s    zIconData.parsec             C   s   | j dddS )zBRetrieve the display name from the icon data, if one is specified.ZDisplayNameT)r   )r   )r	   r
   r
   r   rV      s    zIconData.getDisplayNamec             C   s   | 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.EmbeddedTextRectangler*   T)r%   r   )r   )r	   r
   r
   r   getEmbeddedTextRectangle   s    z!IconData.getEmbeddedTextRectanglec             C   s   | j ddddS )zRetrieve the anchor points for overlays & emblems from the icon data,
        as a list of co-ordinate pairs, if they are specified.AttachPointspointT)r%   r   )r   )r	   r
   r
   r   getAttachPoints   s    zIconData.getAttachPointsc             C   s   | j dkr| jjd d S )Nz.iconzUnknown File extension)r@   r>   r?   )r	   r
   r
   r   rD      s    
zIconData.checkExtrasc             C   s:   || j kptjd|ot|s6| jjd|jdd  d S )Nz^\[X-zInvalid Group name: %sasciireplace)r=   rE   rF   r   rC   r?   encode)r	   r+   r
   r
   r   rG      s    
zIconData.checkGroupc             C   st   t jdtjj d |rnV|dkr6| j||ddd n:|dkrR| j||ddd nt jd	|r`n| jjd
|  d S )Nz^DisplayNamerH   rW   r*   T)r%   r   rY   rZ   z^X-[a-zA-Z0-9-]+zInvalid key: %s)rE   rF   rK   rL   rM   rN   rC   r?   )r	   rO   r2   r+   r
   r
   r   rP      s    zIconData.checkKeyN)rQ   rR   rS   rT   r   r   r   rV   rX   r[   rD   rG   rP   r
   r
   r
   r   rU      s   rU   ZiconsZpixmapsz~/.iconsZpngZsvgZxpmc             C   sX  |dkrt jj}|dkr t jj}tjj| r0| S tjj| d dd |kr\tjj| d } tg ksrtd j	|kr~t
t|a| ||t|f}yt| \}}W n tk
r   Y n"X tj | t jjkrt|= n|S x2tD ]*}t| |||}|rtj |ft|< |S qW xtD ]z}|tksXttj t| d  t jjkrt| d tjj|k rtjj|rtj|tj tjj|ft|< qW xtj D ]\}	}
x|D ]|}yD| d | |
d krtjj|	| d | }tj |gt|< |S W n0 tk
r } ztr|n W Y dd}~X nX qW qW |dkrTt| |d}tj |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'
    Nr;   r   r8   .Zhicolor)rK   ConfigZ	icon_sizeZ
icon_themer   r   isabssplitextthemesr   r   __get_themestuple
icon_cacherB   time
cache_time
LookupIconicondirs	dir_cacheintgetmtimeisdirlistdiritemsjoinUnicodeDecodeErrorr   getIconPath)iconnamesizetheme
extensionsZtmpZ	timestampZiconZthmer,   r   values	extensioner
   r
   r   rs      sX    


"&

rs   c             C   sD   t jj| r@t jj| d d }t jj|r@t }|j| |S dS )zRetrieve 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   z.iconN)r   r   isfilerb   rU   r   )r   Z	icon_filedatar
   r
   r   getIconDataP  s    
r}   c             c   s   xXt D ]@}tjj|| d}tjj|r(P tjj|| d}tjj|rP qW trVt| dS t }|j| |V  x(|j	 D ]}xt
|D ]
}|V  qW qzW dS )zjGenerator yielding IconTheme objects for a specified theme and any themes
    from which it inherits.
    zindex.themezindex.desktopN)rj   r   r   rq   r{   r   r   r   r   r   rd   )Z	themenamer   Z
theme_filerv   Zsubthemetr
   r
   r   rd   _  s     

rd   c             C   s@  |j tkrVg t|j < t|j  jtj tjjd   t|j  jd t|j  jt  ttj t|j  d  tjjkrHtj t|j  d< x|j	 D ]}xt
D ]}tjj||j |}|t|j  d kst|j  d tjjtjj||j k r|dkrtjj|r|tj|gt|j  d |< tjjtjj||j t|j  d< qW qW xnt|j  d j D ]X\}}t|d ||r\x:|D ]2}| d | |d kr|tjj|| d | S q|W q\W d}	d}
xzt|j  d j D ]d\}}t|d ||}||	k rx>|D ]6}| d | |d krtjj|| d | }
|}	qW qW |
S )Nr;   r   r8    r_      l        )r   theme_cacher?   rg   rK   r`   rh   dictrl   r    rj   r   r   rq   rm   rn   ro   rp   DirectoryMatchesSizeDirectorySizeDistance)rt   ru   rv   rw   subdirr,   r   rx   ry   Zminimal_sizeZclosest_filenameZdistancer
   r
   r   ri   v  s>    

 $
&*
"

ri   c             C   s   |j | }|j| }|j| }|j| }|j| }|dkrB||kS |dkrb||  ko\|kS   S |dkr|| |  ko|| kS   S d S )NrI   Z	Scaleabler1   )r3   r-   r9   r7   r5   )r   iconsizerv   r0   r)   r1   r6   r4   r
   r
   r   r     s    




r   c             C   s   |j | }|j| }|j| }|j| }|j| }|dkrFt|| S |dkrr||k r^|| S ||krn|| S dS |dkr||| k r|| S ||| kr|| S dS d S )NrI   rJ   r   r1   )r3   r-   r9   r7   r5   abs)r   r   rv   r0   r)   r1   r6   r4   r
   r
   r   r     s&    




r   ) rT   r   rg   rE   Zxdg.IniFiler   r   Zxdg.BaseDirectoryr   Zxdg.Exceptionsr   r   Z
xdg.ConfigrK   r   rU   rj   Zbasedirr?   r   rq   
expanduserrc   r   rk   rf   rs   r}   rd   ri   r   r   r
   r
   r
   r   <module>   s0    -7
R'