
    b_>                        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e      Z G d d	e      Zg ZeD ]X  Zej%                  ej&                  j)                  ed
             ej%                  ej&                  j)                  ed             Z ej%                  ej&                  j+                  d             g ai Zi Zi Zddg dfdZd Zd Zd Zd Zd Zy)z`
Complete implementation of the XDG Icon Spec
http://standards.freedesktop.org/icon-theme-spec/
    N)IniFileis_ascii)xdg_data_dirs)NoThemeErrordebugc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)	IconThemez&Class to parse and validate IconThemesc                 .    t        j                  |        y Nr   __init__selfs    -lib/python3.12/site-packages/xdg/IconTheme.pyr   zIconTheme.__init__           c                     | j                   S r   )namer   s    r   __repr__zIconTheme.__repr__   s    yyr   c                     t        j                  | |ddg       t        j                  j	                  |      | _        t        j                  j                  | j
                        \  }| _        y )Nz
Icon ThemeKDE Icon Theme)r   parseospathdirnamedirsplitr   )r   filenils      r   r   zIconTheme.parse   sI    dD<1A"BC77??4(77==2dir   c                     | j                   S r   )r   r   s    r   getDirzIconTheme.getDir   s    xxr   c                 (    | j                  dd      S )NNameTlocalegetr   s    r   getNamezIconTheme.getName    s    xxtx,,r   c                 (    | j                  dd      S )NCommentTr$   r&   r   s    r   
getCommentzIconTheme.getComment"   s    xx	$x//r   c                 (    | j                  dd      S )NInheritsTlistr&   r   s    r   getInheritszIconTheme.getInherits$   s    xx
x..r   c                 (    | j                  dd      S )NDirectoriesTr.   r&   r   s    r   getDirectorieszIconTheme.getDirectories&   s    xxDx11r   c                 (    | j                  dd      S )NScaledDirectoriesTr.   r&   r   s    r   getScaledDirectorieszIconTheme.getScaledDirectories(   s    xx+$x77r   c                 (    | j                  dd      S )NHiddenbooleantyper&   r   s    r   	getHiddenzIconTheme.getHidden*   s    xxyx11r   c                 $    | j                  d      S )NExampler&   r   s    r   
getExamplezIconTheme.getExample,   s    xx	""r   c                 *    | j                  dd|      S )NSizeintegerr;   groupr&   r   	directorys     r   getSizezIconTheme.getSize0   s    xxYix@@r   c                 (    | j                  d|      S )NContextrD   r&   rE   s     r   
getContextzIconTheme.getContext2   s    xx	x33r   c                 2    | j                  d|      }|r|S y)NTyperJ   	Thresholdr&   r   rF   values      r   getTypezIconTheme.getType4   s    y1Lr   c                 ^    | j                  dd|      }|s|dk(  r|S | j                  |      S )NMaxSizerB   rC   r   r'   rG   rO   s      r   
getMaxSizezIconTheme.getMaxSize:   3    )DEQJL<<	**r   c                 ^    | j                  dd|      }|s|dk(  r|S | j                  |      S )NMinSizerB   rC   r   rT   rO   s      r   
getMinSizezIconTheme.getMinSize@   rV   r   c                 >    | j                  dd|      }|s|dk(  r|S y)NrN   rB   rC   r      r&   rO   s      r   getThresholdzIconTheme.getThresholdF   s'    9IFEQJLr   c                 6    | j                  dd|      }|xs dS )NScalerB   rC      r&   rO   s      r   getScalezIconTheme.getScaleM   s     y	Bzr   c                    | j                   dk(  r| j                  j                  d       | j                  dk(  rnF| j                  dk(  r| j                  j                  d       n| j                  j                  d       	 | j                  | j                      d   | _        	 | j                  | j                      d	   | _        	 | j                  | j                      d   | _	        y # t        $ r | j                  j                  d       Y kw xY w# t        $ r | j                  j                  d
       Y sw xY w# t        $ r | j                  j                  d       Y y w xY 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 missingr2   zKey 'Directories' is missing)
defaultGroupwarningsappendfileExtensioncontentr   KeyErrorerrorscommentdirectoriesr   s    r   checkExtraszIconTheme.checkExtrasR   s6    00MM  !HI ):-MM  !GHMM  !9:	8T%6%67?DI
	;<<(9(9:9EDL
	?#||D,=,=>}MD  	8KK67	8  	;KK9:	;  	?KK=>	?s6   !C( $!D !D< ($DD$D98D9<$E#"E#c                    || j                   k(  r1	 | j                  |   d   | _        	 | j                  |   d   | _        y || j                         v r1	 | j                  |   d   | _        	 | j                  |   d   | _        y t        j                  d	|      rt        |      s| j                  j                  d
|z         y y # t        $ r! | j                  j                  d|z         Y w xY w# t        $ r! | j                  j                  d|z         Y y w xY w# t        $ r
 d| _        Y w xY w# t        $ r! | j                  j                  d|z         Y y w xY w)Nr#   z#Key 'Name' in Group '%s' is missingr*   z&Key 'Comment' in Group '%s' is missingrM   rN   rA   z#Key 'Size' in Group '%s' is missing^\[X-Invalid Group name: %s)rc   rg   r   rh   ri   re   r3   r;   rematchr   r   rD   s     r   
checkGroupzIconTheme.checkGroupr   sX   D%%%R LL/7	U LL/	:	 d))++( LL/7	R LL/7	 ((8U+KK7%?@ 1@  R""#H5#PQR  U""#Ke#STU
  ('	(  R""#H5#PQRsF   C C2 D ,D5 'C/.C/2'DDD21D25'EEc                    || j                   k(  r t        j                  dt        j                  j
                  z   dz   |      ry t        j                  dt        j                  j
                  z   dz   |      ry |dk(  r| j                  ||d       y |dk(  r| j                  ||d       y |dk(  r| j                  ||d       y |d	k(  r| j                  ||d
       y |dk(  r| j                  ||       y t        j                  d|      ry | j                  j                  d|z         y || j                         v r|dk(  r| j                  ||d       y |dk(  r| j                  ||       y |dk(  r6| j                  ||       |dvr| j                  j                  d|z         y y |dk(  rM| j                  ||d       | j                  dk7  r)| j                  j                  d| j                  z         y y |dk(  rM| j                  ||d       | j                  dk7  r)| j                  j                  d| j                  z         y y |dk(  rM| j                  ||d       | j                  dk7  r)| j                  j                  d| j                  z         y y |dk(  r| j                  ||d       y t        j                  d|      ry | j                  j                  d|z         y y )Nz^Name$z^Commentr-   Tr.   r2   r5   r8   r9   r:   r>   ^X-[a-zA-Z0-9-]+Invalid key: %srA   rB   rI   rM   )FixedScalablerN   zGKey 'Type' must be one out of 'Fixed','Scalable','Threshold', but is %srS   ry   z"Key 'MaxSize' give, but Type is %srX   z"Key 'MinSize' give, but Type is %srN   z$Key 'Threshold' give, but Type is %sr^   )rc   rp   rq   xdgLocaleregex
checkValueri   re   r3   r;   r   keyrP   rD   s       r   checkKeyzIconTheme.checkKey   s   D%%%xx

 0 004c:*SZZ%5%55c93?
"U6%U6++U6U;	!U+,c2""#4s#:;d))++f}U;	!U+U+ BBKK&&'psx'xy C	!U;99
*KK&&'Kdii'WX +	!U;99
*KK&&'Kdii'WX +#U;99+KK&&'MPTPYPY'YZ ,U;,c2""#4s#:;5 ,r   N)__name__
__module____qualname____doc__r   r   r   r!   r(   r+   r0   r3   r6   r<   r?   rG   rK   rQ   rU   rY   r\   r`   rl   rs   r    r   r   r	   r	      sq    ,3
-0/282#A4++
?@A./<r   r	   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)IconDataz*Class to parse and validate IconData Filesc                 .    t        j                  |        y r   r   r   s    r   r   zIconData.__init__   r   r   c                 2    | j                         }|rd|z  S y)Nz<IconData: %s>z
<IconData>)getDisplayName)r   displaynames     r   r   zIconData.__repr__   s!    ))+#k11r   c                 4    t        j                  | |dg       y )Nz	Icon Data)r   r   )r   r   s     r   r   zIconData.parse   s    dD;-0r   c                 (    | j                  dd      S )zBRetrieve the display name from the icon data, if one is specified.DisplayNameTr$   r&   r   s    r   r   zIconData.getDisplayName   s    xxdx33r   c                 *    | j                  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.EmbeddedTextRectanglerB   Tr;   r/   r&   r   s    r   getEmbeddedTextRectanglez!IconData.getEmbeddedTextRectangle   s     xx/idxKKr   c                 *    | j                  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pointTr   r&   r   s    r   getAttachPointszIconData.getAttachPoints   s     xxW4x@@r   c                 Z    | j                   dk7  r| j                  j                  d       y y )N.iconrb   )rf   rd   re   r   s    r   rl   zIconData.checkExtras   s(    (MM  !9: )r   c                     || j                   k(  sQt        j                  d|      rt        |      s/| j                  j                  d|j                  dd      z         y y y )Nrn   ro   asciireplace)rc   rp   rq   r   ri   re   encoderr   s     r   rs   zIconData.checkGroup   sR    ***HHXu%(5/KK7%,,wPY:ZZ[ +: +r   c                 D   t        j                  dt        j                  j                  z   dz   |      ry |dk(  r| j                  ||dd       y |dk(  r| j                  ||dd       y t        j                  d	|      ry | j                  j                  d
|z         y )Nz^DisplayNameru   r   rB   Tr   r   r   rv   rw   )rp   rq   rz   r{   r|   r}   ri   re   r~   s       r   r   zIconData.checkKey   s    88N3::#3#33C7=++OOCYTOBN"OOCW4O@XX(#.KK0367r   N)r   r   r   r   r   r   r   r   r   r   rl   rs   r   r   r   r   r   r      s5    0 14LA;
\8r   r   iconspixmapsz~/.icons)pngsvgxpmc                 |   |dk(  rt         j                  j                  }|dk(  rt         j                  j                  }t        j
                  j                  |       r| S t        j
                  j                  |       d   dd |v r"t        j
                  j                  |       d   } t        g k(  st        d   j                  |k7  rt        t        |            a| ||t        |      f}	 t        |   \  }}t        j                         |z
  t         j                  j                  k\  rt        |= n|S t        D ]3  }t#        | |||      }|st        j                         |ft        |<   |c S  t$        D ]  }|t&        vsst)        t        j                         t&        |   d   z
        t         j                  j                  k\  sQt&        |   d   t        j
                  j+                  |      k  s~t        j
                  j-                  |      st	        j.                  |      t        j                         t        j
                  j+                  |      ft&        |<    t&        j1                         D ]c  \  }	}
|D ]Y  }	 | dz   |z   |
d   v rIt        j
                  j3                  |	| dz   |z         }t        j                         |gt        |<   |c c S [ e |dk7  r,t9        | |d      }t        j                         |gt        |<   |S y# t         $ r Y w xY w# t4        $ r}t6        r|Y d}~d}~ww xY w)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   r[   .hicolor)rz   Config	icon_size
icon_themer   r   isabssplitextthemesr   r/   __get_themestuple
icon_cachetime
cache_timerh   
LookupIconicondirs	dir_cacheintgetmtimeisdirlistdiritemsjoinUnicodeDecodeErrorr   getIconPath)iconnamesizetheme
extensionstmp	timestampiconthmerF   r   values	extensiones                r   r   r      s   ( t|zz##}

%% 
ww}}X 
ww!!$QR(J677##H-a0 	"&)..E1l5)* T5%
"3
4C$S/	4 IIK)#

(=(==3K(D$
;#yy{D1JsOK	  	Y&DIIK)I"6q"99:cjj>S>SS)$Q'"''*:*:9*EEi($&JJy$9499;HXHXYbHc#dIi   !(V#I	c>I-:77<<X^i-GHD'+yy{D&9JsOK ; $ ) 	8T9599;-
3 I  : & G	s+   ,L AL 	LL 	L;)L66L;c                    t         j                  j                  |       rbt         j                  j                  |       d   dz   }t         j                  j                  |      rt	               }|j                  |       |S yy)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   r   N)r   r   isfiler   r   r   )r   	icon_filedatas      r   getIconDatar   P  sd     
ww~~dGG$$T*1-7	77>>)$:DJJy!K % r   c              #     K   t         D ]  }t        j                  j                  || d      }t        j                  j	                  |      r nVt        j                  j                  || d      }t        j                  j	                  |      s n t
        rt        |       yt               }|j                  |       | |j                         D ]  }t        |      D ]  }|   yw)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   r0   r   )	themenamer   
theme_filer   subthemets         r   r   r   _  s      WW\\#y-@
77>>*%WW\\#y/B
77>>*%  y))KE	KK

K%%'h'AG ( (s   BC-AC-c           	      b   |j                   t        vrg t        |j                   <   t        |j                      j                  t        j                         t        j
                  j                  dz   z
         t        |j                      j                  d       t        |j                      j                  t                      t        t        j                         t        |j                      d   z
        t        j
                  j                  k\  rt        j                         t        |j                      d<   |j                         D ]a  }t        D ]T  }t        j                  j                  ||j                   |      }|t        |j                      d   vs_t        |j                      d   t        j                  j                  t        j                  j                  ||j                               k  s|dk7  st        j                  j                  |      s|t        j                   |      gt        |j                      d   |<   t        j                  j                  t        j                  j                  ||j                               t        |j                      d<   W d t        |j                      d   j#                         D ]T  \  }}t%        |d   ||      s|D ]9  }| dz   |z   |d   v st        j                  j                  || dz   |z         c c S  V d}	d}
t        |j                      d   j#                         D ]X  \  }}t'        |d   ||      }||	k  s|D ]8  }| dz   |z   |d   v st        j                  j                  || dz   |z         }
|}	: Z |
S )Nr_   r   r[    r   l        )r   theme_cachere   r   rz   r   r   dictr   r3   r   r   r   r   r   r   r   r   DirectoryMatchesSizeDirectorySizeDistance)r   r   r   r   subdirrF   r   r   r   minimal_sizeclosest_filenamedistances               r   r   r   v  s   zz$"$EJJEJJ&&tyy{cjj6K6Ka6O'PQEJJ&&q)EJJ&&tv. 499;UZZ0334

8M8MM%)YY[EJJ"**,F%X	ggll9UZZ?{5::6q99uzz*1-0@0@iX]XbXbAc0ddbLGGMM#&7=rzz#6OK

+A.s3131A1A"'',,yY^YcYcBd1eK

+A. & - #5::.q1779Vq	47'	c>I-:77<<X^i-GHH ( : L"5::.q1779V(D%@l"'	c>I-:')ww||CC)9S'T$#+L ( : r   c                 "   |j                  |       }|j                  |       }|j                  |       }|j                  |       }|j	                  |       }|dk(  r||k(  S |dk(  r||cxk  xr |k  S c S |dk(  r||z
  |cxk  xr ||z   k  S c S y )Nrx   	ScaleablerN   )rQ   rG   r\   rY   rU   r   iconsizer   rM   rA   rN   rX   rS   s           r   r   r     s    == D== D""6*Iv&Gv&Gwx		(-g----		i8?ti/????? 
r   c                 H   |j                  |       }|j                  |       }|j                  |       }|j                  |       }|j	                  |       }|dk(  rt        ||z
        S |dk(  r||k  r||z
  S ||kD  r||z
  S y|dk(  r|||z
  k  r||z
  S |||z   kD  r||z
  S yy )Nrx   ry   r   rN   )rQ   rG   r\   rY   rU   absr   s           r   r   r     s    == D== D""6*Iv&Gv&Gw4(?##		gX%%X%%		dY&&X%%y((g%% 
r   ) r   r   r   rp   xdg.IniFiler   r   xdg.BaseDirectoryr   xdg.Exceptionsr   r   
xdg.Configrz   r	   r   r   basedirre   r   r   
expanduserr   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   
  	 ) + . i< i<X38w 38n GOOBGGLL'23OOBGGLL)45  	"":. / 
	
!%tBW Pd.%N@r   