o
    ©N˜P¤–  ã                   @   s¾  d Z ddl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mZ ddlmZ ddlZddlZejjjZdd„ ZG d	d
„ d
ƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZi Zdd„ Z dIdd„Z!dId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/d0„ Z,d1d2„ Z-d3d4„ Z.d5d6„ Z/d7d8„ Z0d9d:„ Z1d;d<„ Z2d=d>„ Z3d?d@„ Z4dAdB„ Z5dCdD„ Z6dEdF„ Z7G dGdH„ dHƒZ8dS )JaË  
Implementation of the XDG Menu Specification Version 1.0.draft-1
http://standards.freedesktop.org/menu-spec/

Example code:

from xdg.Menu import parse, Menu, MenuEntry

def print_menu(menu, tab=0):
  for submenu in menu.Entries:
    if isinstance(submenu, Menu):
      print ("	" * tab) + unicode(submenu)
      print_menu(submenu, tab+1)
    elif isinstance(submenu, MenuEntry):
      print ("	" * tab) + unicode(submenu.DesktopEntry)

print_menu(parse())
é    N)Úxdg_data_dirsÚxdg_config_dirs)ÚDesktopEntry)ÚParsingErrorÚValidationErrorÚdebug)ÚPY3c                 C   s"   t st| tƒr|  d¡} t | ¡S )zkWrapper around locale.strxfrm that accepts unicode strings on Python 2.
    
    See Python bug #2481.
    zutf-8)r   Ú
isinstanceÚunicodeÚencodeÚlocaleÚstrxfrm)Ús© r   ú:/var/www/html/env/lib/python3.10/site-packages/xdg/Menu.pyÚ_strxfrm!   s   

r   c                   @   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d„Zd$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#S )&ÚMenuz[Menu containing sub menus under menu.Entries

	Contains both Menu and MenuEntry items.
    c                 C   s‚   d| _ d | _g | _d| _d| _d| _d | _d| _d| _d| _	g | _
d | _d| _g | _g | _d | _g | _g | _d| _g | _g | _d S )NÚ r   FTÚnotset)ÚNameÚ	DirectoryÚEntriesÚDocÚFilenameÚDepthÚParentÚNotInXmlÚShowÚVisibleÚAppDirsÚDefaultLayoutÚDeletedÚDirectoriesÚDirectoryDirsÚLayoutÚMenuEntriesÚMovesÚOnlyUnallocatedÚRulesÚSubmenus©Úselfr   r   r   Ú__init__/   s*   
zMenu.__init__c                 C   ó   | j S ©N©r   r*   r   r   r   Ú__str__K   ó   zMenu.__str__c                 C   sÒ   |j D ]}| j  |¡ q|jD ]}| j |¡ q|jD ]}| j |¡ q|jdkr-|j| _|jdkr6|j| _|jr=|j| _|jrD|j| _|jD ]}| j |¡ qG|j	D ]}| j	 |¡ qS|j
D ]}|  |¡ q_| S )Nr   )r   Úappendr#   r"   r!   r'   r$   r    r(   r&   r)   Ú
addSubmenu)r+   ÚotherÚdirÚ	directoryÚruleÚmoveÚsubmenur   r   r   Ú__add__N   s*   







zMenu.__add__c                 C   s   t  |  ¡ | ¡ ¡S r.   )r   ÚstrcollÚgetName©r+   r4   r   r   r   Ú__cmp__p   ó   zMenu.__cmp__c                 C   s   t |  ¡ ƒS ©z&Key function for locale-aware sorting.)r   r<   r*   r   r   r   Ú_keys   s   z	Menu._keyc                 C   ó,   z|  ¡ }W n	 ty   Y nw |   ¡ |k S r.   ©rA   ÚAttributeErrorr=   r   r   r   Ú__lt__w   ó   ÿzMenu.__lt__c                 C   s2   z| j t|ƒkW S  ty   | j t|ƒk Y S w r.   )r   r
   Ú	NameErrorÚstrr=   r   r   r   Ú__eq__~   s
   ÿzMenu.__eq__Fc                 c   s2   � | j D ]}|dkr|V  q|jdkr|V  qdS )z4Interator for a list of Entries visible to the user.TN)r   r   )r+   ÚhiddenÚentryr   r   r   Ú
getEntries…   s   €

€üzMenu.getEntriesc                 C   sF   | j D ]}|j|kr|  S q|dkr| jD ]
}| ||¡ qdS dS )z4Searches for a MenuEntry with a given DesktopFileID.TN)r%   ÚDesktopFileIDr)   ÚgetMenuEntry)r+   ÚdesktopfileidÚdeepÚ	menuentryr9   r   r   r   rN   ‘   s   

ÿ
þzMenu.getMenuEntryc                 C   sP   |  dd¡}| jD ]}|j|d kr%t|ƒdkr!| |d ¡  S |  S q	dS )z&Searches for a Menu with a given path.ú/é   r   N)Úsplitr)   r   ÚlenÚgetMenu)r+   ÚpathÚarrayr9   r   r   r   rV   š   s   
üÿzMenu.getMenuc                 C   sz   | }g }	 |r|  |j¡ n|  | ¡ ¡ |jdkr|j}nnq| ¡  d}|dkr/| d¡ |D ]	}tj 	||¡}q1|S )z/Returns this menu's path in the menu structure.rS   r   r   F)
r2   r   r<   r   r   ÚreverseÚpopÚosrW   Újoin)r+   ÚorgÚtoplevelÚparentÚnamesrW   Únamer   r   r   ÚgetPath¤   s"   
ø	
zMenu.getPathc                 C   s(   z| j j ¡ W S  ty   | j Y S w )z"Returns the menu's localised name.)r   r   r<   rD   r   r*   r   r   r   r<   ¹   s
   
ÿzMenu.getNamec                 C   ó$   z| j j ¡ W S  ty   Y dS w )z Returns the menu's generic name.r   )r   r   ÚgetGenericNamerD   r*   r   r   r   rd   À   ó
   ÿzMenu.getGenericNamec                 C   rc   )z Returns the menu's comment text.r   )r   r   Ú
getCommentrD   r*   r   r   r   rf   Ç   re   zMenu.getCommentc                 C   rc   )z0Returns the menu's icon, filename or simple namer   )r   r   ÚgetIconrD   r*   r   r   r   rg   Î   re   zMenu.getIconc                 C   sD   | j D ]}||kr||7 } d S q| j  |¡ | |_| jd |_d S )NrS   )r)   r2   r   r   )r+   Únewmenur9   r   r   r   r3   Ö   s   
þzMenu.addSubmenuN)F)FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r,   r0   r:   r>   rA   rE   rI   rL   rN   rV   rb   r<   rd   rf   rg   r3   r   r   r   r   r   *   s(    "

	

r   c                   @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚMovezA move operationNc                 C   s"   |r	|   |¡ d S d| _d| _d S ©Nr   )Ú	parseNodeÚOldÚNew©r+   Únoder   r   r   r,   â   s   
zMove.__init__c                 C   s   t | j|jƒS r.   )Úcmprp   r=   r   r   r   r>   é   s   zMove.__cmp__c              	   C   sŽ   |j D ]A}|jtkrD|jdkr'z|  |j d j¡ W q ty&   tddƒ‚w |jdkrDz|  |j d j¡ W q tyC   tddƒ‚w qd S )Nrp   r   zOld cannot be emptyz??rq   zNew cannot be empty)	Ú
childNodesÚnodeTypeÚELEMENT_NODEÚtagNameÚparseOldÚ	nodeValueÚ
IndexErrorr   ÚparseNew©r+   rs   Úchildr   r   r   ro   ì   s    



ÿ

ÿ€özMove.parseNodec                 C   ó
   || _ d S r.   )rp   ©r+   Úvaluer   r   r   ry   ú   ó   
zMove.parseOldc                 C   r   r.   )rq   r€   r   r   r   r|   ü   r‚   zMove.parseNewr.   )	ri   rj   rk   rl   r,   r>   ro   ry   r|   r   r   r   r   rm   à   s    
rm   c                   @   sF   e Zd ZdZddd„Zdd„ Zdd
d„Zdd„ Zdd„ Zddd„Z	dS )r$   zMenu Layout classNc                 C   s¶   g | _ |r:| d¡pd| _| d¡pd| _| d¡pd| _| d¡p#d| _| d¡p+d| _t| jƒ| _|  |¡ d S d| _d| _d| _d| _d| _| j  	d	d
g¡ | j  	d	dg¡ d S )NÚ
show_emptyÚfalseÚinlineÚinline_limité   Úinline_headerÚtrueÚinline_aliasÚMergeÚmenusÚfiles)
ÚorderÚgetAttributerƒ   r…   r†   rˆ   rŠ   Úintro   r2   rr   r   r   r   r,     s    zLayout.__init__c                 C   sü   |j D ]x}|jtkr{|jdkrEz)|  |j d j| d¡pd| d¡p#d| d¡p)d| d¡p/d	| d
¡p5d¡ W q tyD   tddƒ‚w |jdkrO|  	¡  q|jdkrlz|  
|j d j¡ W q tyk   tddƒ‚w |jdkr{|  | d¡pyd¡ qd S )NÚMenunamer   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   zMenuname cannot be emptyr   Ú	Separatorr   úFilename cannot be emptyr‹   ÚtypeÚall)ru   rv   rw   rx   ÚparseMenunamerz   r�   r{   r   ÚparseSeparatorÚparseFilenameÚ
parseMerger}   r   r   r   ro     s6   



ú
ÿ



ÿ
€ëzLayout.parseNoder„   r‡   r‰   c              	   C   s:   | j  d||||||g¡ t| j d d ƒ| j d d< d S )Nr‘   éÿÿÿÿr‡   )rŽ   r2   r�   )r+   r�   Úemptyr…   r†   rˆ   rŠ   r   r   r   r–   -  s    zLayout.parseMenunamec                 C   s   | j  dg¡ d S )Nr’   ©rŽ   r2   r*   r   r   r   r—   1  s   zLayout.parseSeparatorc                 C   ó   | j  d|g¡ d S )Nr   rœ   r€   r   r   r   r˜   4  r?   zLayout.parseFilenamer•   c                 C   r�   )Nr‹   rœ   )r+   r”   r   r   r   r™   7  r?   zLayout.parseMerger.   )r„   r„   r‡   r‰   r„   )r•   )
ri   rj   rk   rl   r,   ro   r–   r—   r˜   r™   r   r   r   r   r$      s    

r$   c                   @   sl   e Zd ZdZddd„Z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S )ÚRulezInlcude / Exclude Rules ClassNc                 C   s6   || _ d| _d| _dg| _d| _|r|  |¡ d S d S )Nr   r   ÚorT)ÚTyperž   r   ÚExprrq   ro   )r+   r”   rs   r   r   r   r,   =  s   ÿzRule.__init__c                 C   r-   r.   )rž   r*   r   r   r   r0   L  r1   zRule.__str__c                 C   sR   |D ]$}|dkr|j dks|jdkrqt| jƒr&|dkr#d|_d|_ qd|_q|S )Né   TÚIncludeF)ÚMatchedIncludeÚ	AllocatedÚevalrž   ÚAdd)r+   Úmenuentriesr”   ÚrunrQ   r   r   r   ÚdoO  s   

€zRule.doc              	   C   sâ   |j D ]k}|jtkrn|jdkr'z|  |j d j¡ W q ty&   tddƒ‚w |jdkrDz|  |j d j¡ W q tyC   tddƒ‚w |jdkrN|  	¡  q|jdkrY|  
|¡ q|jd	krd|  |¡ q|jd
krn|  |¡ qd S )Nr   r   r“   z???ÚCategoryzCategory cannot be emptyÚAllÚAndÚOrÚNot)ru   rv   rw   rx   r˜   rz   r{   r   ÚparseCategoryÚparseAllÚparseAndÚparseOrÚparseNotr}   r   r   r   ro   \  s0   



ÿ

ÿ





€ízRule.parseNodeTc                 C   sD   | j s|  jd| j| j  d 7  _|sd| _ d S |r d| _ d S d S )Nú TF)rq   rž   r¡   r   )r+   Úsetr   r   r   r|   r  s   

ÿzRule.parseNewc                 C   s2   |   ¡  |  jd| ¡  dd¡ dd¡ 7  _d S )Nzmenuentry.DesktopFileID == '%s'ú\z\\ú'z\')r|   rž   ÚstripÚreplacer€   r   r   r   r˜   z  s   *zRule.parseFilenamec                 C   s"   |   ¡  |  jd| ¡  7  _d S )Nz'%s' in menuentry.Categories)r|   rž   r¹   r€   r   r   r   r°   ~  s   zRule.parseCategoryc                 C   s   |   ¡  |  jd7  _d S )NÚTrue)r|   rž   r*   r   r   r   r±   ‚  s   zRule.parseAllc                 C   óf   |   d¡ |  jd7  _|  jd7  _| j d¡ |  |¡ |  jd8  _| j ¡  |  jd7  _d S )NFú(rS   Úandú)©r|   rž   r   r¡   r2   ro   rZ   rr   r   r   r   r²   †  ó   


zRule.parseAndc                 C   r¼   )NFr½   rS   rŸ   r¿   rÀ   rr   r   r   r   r³   �  rÁ   zRule.parseOrc                 C   r¼   )NFznot (rS   rŸ   r¿   rÀ   rr   r   r   r   r´   š  rÁ   zRule.parseNotr.   ©T)ri   rj   rk   rl   r,   r0   rª   ro   r|   r˜   r°   r±   r²   r³   r´   r   r   r   r   rž   ;  s    



rž   c                   @   st   e Zd ZdZddd„Z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dS )Ú	MenuEntryz(Wrapper for 'Menu Style' Desktop Entriesr   c                 C   sV   t tj ||¡ƒ| _ |  |||¡ d| _d | _g | _d| _d| _	d| _
| j  ¡ | _d S ©NTF)r   r[   rW   r\   ÚsetAttributesr   ÚOriginalÚParentsr¥   r§   r¤   ÚgetCategoriesÚ
Categories©r+   Úfilenamer5   Úprefixr   r   r   r,   §  s   zMenuEntry.__init__c                 C   s   | j jdkr| j  ¡  dS dS )z&Save any changes to the desktop entry.TN)r   ÚtaintedÚwriter*   r   r   r   Úsave»  s   ÿzMenuEntry.savec                 C   s   | j j | jd¡S )z7Return the directory containing the desktop entry file.r   )r   rË   rº   r   r*   r   r   r   ÚgetDirÀ  s   zMenuEntry.getDirc                 C   s2   t jjdkr| jrdS td | jjv rdS dS dS )z.Return the type of MenuEntry, System/User/BothFÚBothr   ÚUserÚSystem)ÚxdgÚConfigÚ	root_moderÆ   r   r   rË   r*   r   r   r   ÚgetTypeÄ  s   zMenuEntry.getTypec                 C   sD   || _ || _tj ||¡ dd¡| _tj | jj	¡s |  
¡  d S d S )NrR   ú-)r   ÚPrefixr[   rW   r\   rº   rM   Úisabsr   rË   Ú_MenuEntry__setFilenamerÊ   r   r   r   rÅ   Ð  s   ÿzMenuEntry.setAttributesc                 C   s2   |   ¡ dkrt| j|  ¡ | jƒ| _|  ¡  d S d S )NrÓ   )r×   rÃ   r   rÐ   rÙ   rÆ   rÛ   r*   r   r   r   ÚupdateAttributesØ  s   þzMenuEntry.updateAttributesc                 C   sb   t jjdkrtd }ntd }| j ¡ dkrtj |d¡}ntj |d¡}tj || j	¡| j_
d S )NFr   rS   ÚApplicationÚapplicationsúdesktop-directories)rÔ   rÕ   rÖ   r   r   r×   r[   rW   r\   r   rË   )r+   rW   r5   r   r   r   Ú__setFilenameÝ  s   
zMenuEntry.__setFilenamec                 C   s   t  | j ¡ |j ¡ ¡S r.   )r   r;   r   r<   r=   r   r   r   r>   ê  s   zMenuEntry.__cmp__c                 C   s   t | j ¡ ƒS r@   )r   r   r<   r*   r   r   r   rA   í  s   zMenuEntry._keyc                 C   rB   r.   rC   r=   r   r   r   rE   ñ  rF   zMenuEntry.__lt__c                 C   s   | j t|ƒkr	dS dS rÄ   )rM   rH   r=   r   r   r   rI   ù  s   zMenuEntry.__eq__c                 C   r-   r.   )rM   r*   r   r   r   Ú__repr__ÿ  r1   zMenuEntry.__repr__N)r   r   )ri   rj   rk   rl   r,   rÏ   rÐ   r×   rÅ   rÜ   rÛ   r>   rA   rE   rI   rá   r   r   r   r   rÃ   ¥  s    

rÃ   c                   @   s   e Zd ZdZdd„ ZdS )r’   z!Just a dummy class for Separatorsc                 C   s   || _ d| _d S )NT)r   r   )r+   r_   r   r   r   r,     s   
zSeparator.__init__N)ri   rj   rk   rl   r,   r   r   r   r   r’     s    r’   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚHeaderzClass for Inline Headersc                 C   s   || _ || _|| _d S r.   )r   ÚGenericNameÚComment)r+   ra   Úgeneric_nameÚcommentr   r   r   r,     s   
zHeader.__init__c                 C   r-   r.   r/   r*   r   r   r   r0     r1   zHeader.__str__N)ri   rj   rk   rl   r,   r0   r   r   r   r   râ   
  s    râ   c                 C   s`   t d d … }tjjdkr| d¡ |D ]}tj |d| ¡}tj |¡r-tj 	|¡r-|  S qd S )NTr   rŒ   )
r   rÔ   rÕ   rÖ   rZ   r[   rW   r\   ÚisdirÚisfile)rË   Údirsr5   Úmenunamer   r   r   Ú__getFileName  s   
€ýrë   c                 C   s"  | rt j | ¡st| ƒ} | st j dd¡d }t|ƒ} | s$tdd| ƒ‚t j | ¡d dks3td| ƒ‚z	tj	j
 | ¡}W n tjjjyK   td	| ƒ‚w dtd
< g td< g td< tƒ td< t|| td
 ƒ ttd
 ƒ ttd
 ƒ |td
 _| td
 _ttd
 ƒ ttd
 ƒ ttd
 ƒ td
 S )z›Load an applications.menu file.
    
    filename : str, optional
      The default is ``$XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu``.
    ÚXDG_MENU_PREFIXr   úapplications.menuúFile not foundz/etc/xdg/menus/%srS   ú.menuzNot a .menu fileúNot a valid .menu fileÚRootÚ
mergeFilesr#   Úcache)r[   rW   rÚ   rë   ÚenvironÚgetr   ÚsplitextÚxmlÚdomÚminidomÚparseÚparsersÚexpatÚ
ExpatErrorÚtmpÚMenuEntryCacheÚ__parseÚ__parsemoveÚ__postparser   r   Ú__genmenuNotOnlyAllocatedÚ__genmenuOnlyAllocatedÚsort)rË   Ú	candidateÚdocr   r   r   rú   !  s6   

ÿ


rú   c              	   C   sF  | j D �]œ}|jtk�r |jdkrt|||ƒ q|jdkr6zt|j d j||ƒ W q ty5   td|ƒ‚w |jdkrAt	||ƒ q|jdkr_zt
|j d j||ƒ W q ty^   td|ƒ‚w |jdkrjt||ƒ q|jd	kr…z	|j d j|_W q ty„   td
|ƒ‚w |jdkr£z|j |j d j¡ W q ty¢   td|ƒ‚w |jdkr¬d|_q|jdkrµd|_q|jdkr¾d|_q|jdkrÇd|_q|jdksÑ|jdkrÜ|j t|j|ƒ¡ q|jdk�rz| d¡dkròtd|||ƒ nt|j d j|||ƒ W q t�y   td|ƒ‚w |jdk�r-zt|j d j|||ƒ W q t�y,   td|ƒ‚w |jdk�r:t|||ƒ q|jdk�rI|j t|ƒ¡ q|jdk�r]t|j ƒdk�r\t|ƒ|_q|jd k�rqt|j ƒdk�rpt|ƒ|_q|jd!k�r•zt|j d j| d"¡||ƒ W q t�y”   td#|ƒ‚w |jd$k�r t||ƒ qd S )%Nr   ÚAppDirr   zAppDir cannot be emptyÚDefaultAppDirsÚDirectoryDirzDirectoryDir cannot be emptyÚDefaultDirectoryDirsr   zName cannot be emptyr   zDirectory cannot be emptyr'   TÚNotOnlyUnallocatedFr!   Ú
NotDeletedr£   ÚExcludeÚ	MergeFiler”   r_   rí   zMergeFile cannot be emptyÚMergeDirzMergeDir cannot be emptyÚDefaultMergeDirsrm   r$   rS   r    Ú	LegacyDirrÌ   zLegacyDir cannot be emptyÚKDELegacyDirs)ru   rv   rw   rx   Ú__parseMenuÚ__parseAppDirrz   r{   r   Ú__parseDefaultAppDirÚ__parseDirectoryDirÚ__parseDefaultDirectoryDirr   r"   r2   r'   r!   r(   rž   r�   Ú__parseMergeFileÚ__parseMergeDirÚ__parseDefaultMergeDirsr&   rm   rU   r$   r    Ú__parseLegacyDirÚ__parseKDELegacyDirs)rs   rË   r_   r~   r   r   r   r   T  sž   


ÿ


ÿ


ÿ

ÿ



€
ÿ
ÿ
€
€ 
ÿ
€½r   c                 C   sÒ   | j D ]}t|ƒ q| jD ]Y}|  |j¡}|rf|  |j¡}|j d¡}d }t|ƒdkr[|s/| }| |d ¡}|sNtƒ }|d |_	t|ƒdkrId|_
| |¡ |}| d¡ t|ƒdks+||7 }|jj  |¡ qd S )NrR   r   rS   T)r)   r  r&   rV   rp   rq   rT   rU   r   r   r   r3   rZ   r   Úremove)Úmenur9   r8   Úmove_from_menuÚmove_to_menurŒ   Ú	oldparentrh   r   r   r   r  š  s2   





õ€ër  c                 C   sŠ  | j dkrd| _ | jdkrd| _| jr| jsI| jr| j| _n+| jr1| jdkr,| jj| _ntƒ | _n| jdkrA| jj| _| jj| _ntƒ | _tƒ | _| jdkr^| jj| j | _| jj| j | _t| j	ƒ| _	t| jƒ| _t| jƒ| _| j
D ]}t|ƒ qs| j	 ¡  | j ¡  | j ¡  | j	D ]6}| jD ]*}tj tj ||¡¡r»t||ƒ}| jsª|| _q‘| ¡ dkr»| j ¡ dkr»|| j_q‘| jrÂ d S qŒd S )Nr   Fr   rÓ   rÒ   )r!   r'   r$   r    r   r   r   r#   Ú__removeDuplicatesr"   r)   r  rY   r[   rW   rè   r\   rÃ   r   r×   rÆ   )r  r9   r6   r5   rQ   r   r   r   r  ¶  sR   















€ÿ÷r  c                 C   s0   t ƒ }t| ||ƒ |r| |¡ d S |td< d S )Nrñ   )r   r   r3   rþ   )r~   rË   r_   Úmr   r   r   r  ð  s
   r  c                 C   s~   t j |¡}t j | ¡st j || ¡} t j | ¡} |dkr+t j | ¡r+t j | ¡r+| S |dkr=t j | ¡r=t j | ¡r=| S dS )Nr5   ÚfileF)	r[   rW   ÚdirnamerÚ   r\   ÚabspathÚexistsrç   rè   )r�   rË   r”   rW   r   r   r   Ú__checkù  s     r)  c                 C   ó$   t | |dƒ} | r|j | ¡ d S d S ©Nr5   )r)  r   r2   ©r�   rË   r_   r   r   r   r  	  ó   ÿr  c                 C   ó(   t tƒD ]}ttj |d¡| |ƒ qd S )NrÞ   )Úreversedr   r  r[   rW   r\   ©rË   r_   r5   r   r   r   r    ó   ÿr  c                 C   r*  r+  )r)  r#   r2   r,  r   r   r   r    r-  r  c                 C   r.  )Nrß   )r/  r   r  r[   rW   r\   r0  r   r   r   r    r1  r  c                 C   sž   |  d¡dkr=tD ]1}| |d¡ d¡}||kr:tD ]}||kr!qtj tj ||¡¡r9ttj ||¡||ƒ  nqq	d S t	| |dƒ} | rMt| ||ƒ d S d S )Nr”   r_   r   rR   r%  )
r�   r   rº   r¹   r[   rW   rè   r\   Ú__mergeFiler)  )r�   r~   rË   r_   r5   Úrel_fileÚpr   r   r   r    s"   þ€ú
ÿr  c              	   C   sh   t | |dƒ} | r0t | ¡D ]$}ztj |¡d dkr%ttj | |¡||ƒ W q ty/   Y qw d S d S )Nr5   rS   rï   )r)  r[   ÚlistdirrW   rö   r2  r\   ÚUnicodeDecodeError)r�   r~   rË   r_   Úitemr   r   r   r  ,  s   €ÿûr  c                 C   sH   t j t j |¡¡d }ttƒD ]}tt j |d|d ¡| ||ƒ qd S )Nr   rŒ   z-merged)r[   rW   rö   Úbasenamer/  r   r  r\   )r~   rË   r_   r8  r5   r   r   r   r  6  s    ÿr  c                 C   s´   | t d v rtrtd| ƒ‚d S t d  | ¡ z	tjj | ¡}W n$ ty0   tr-td| ƒ‚Y d S  tj	j
jyC   tr@td| ƒ‚Y d S w |jD ]}|jtkrWt|| |ƒ  d S qGd S )Nrò   z Infinite MergeFile loop detectedrî   rð   )rþ   r   r   r2   r÷   rø   rù   rú   ÚIOErrorrû   rü   rý   ru   rv   rw   r   )rË   r~   r_   r  r   r   r   r2  ;  s,   


ü

þÿr2  c                 C   s"   t | |||ƒ}|r||7 }d S d S r.   )Ú__mergeLegacyDir)r5   rÌ   rË   r_   r$  r   r   r   r  Z  s   ÿr  c           
   	   C   sT  t | |dƒ} | r¦| td vr¨td  | ¡ tƒ }|j | ¡ |j | ¡ tj | ¡|_	d|_
t | ¡D ]2}z'|dkrA|j |¡ ntj tj | |¡¡r[| ttj | |¡|||ƒ¡ W q3 tye   Y q3w td  | g|d¡ td  | gd¡}|D ](}|j}t|ƒdkr–tdƒ}	|	 |j¡ |j |	¡ | |jvr£| d	¡ ||_q{|S d S d S )
Nr5   r#   Tz
.directoryró   Fr   r£   ÚLegacy)r)  rþ   r2   r   r   r#   r[   rW   r8  r   r   r5  r"   rç   r\   r3   r:  r6  ÚaddMenuEntriesÚgetMenuEntriesrÉ   rU   rž   r˜   rM   r(   )
r5   rÌ   rË   r_   r$  r7  r¨   rQ   Ú
categoriesÚrr   r   r   r:  _  s@   €ÿ

€ár:  c                 C   s~   zt jg d¢t jdd�}| ¡ d  ¡ }W n
 ty   Y d S w z|d  d¡D ]	}t|d| |ƒ q(W d S  ty>   Y d S w )N)z
kde-configz--pathÚappsT)ÚstdoutÚuniversal_newlinesr   ú:Úkde)	Ú
subprocessÚPopenÚPIPEÚcommunicateÚ
splitlinesÚOSErrorrT   r  r{   )rË   r_   ÚprocÚoutputr5   r   r   r   r  ‚  s   
ÿþÿÿr  c                    s*   i ‰ |   ¡  ‡ fdd„| D ƒ} |   ¡  | S )Nc                    s    g | ]}|ˆ vrˆ   ||¡‘qS r   )Ú
setdefault)Ú.0Úe©r¶   r   r   Ú
<listcomp>•  s     z&__removeDuplicates.<locals>.<listcomp>)rY   )Úlistr   rP  r   r#  ’  s
   r#  c                 C   sš   | j D ]}t|ƒ q| jdkrItd  | j¡ g }| jD ]}| td  | j¡|j	d¡}q|D ]}|j
dkrH|j | ¡ d|_
d|_| j |¡ q/d S d S )NFró   rS   T)r)   r  r'   rþ   r<  r   r(   rª   r=  r    r§   rÇ   r2   r¥   r%   ©r  r9   r¨   r7   rQ   r   r   r   r  š  s    




€ör  c                 C   sŽ   | j D ]}t|ƒ q| jdkrCtd  | j¡ g }| jD ]}| td  | j¡|j	d¡}q|D ]}|j
dkrB|j | ¡ | j |¡ q/d S d S )NTró   r¢   )r)   r  r'   rþ   r<  r   r(   rª   r=  r    r§   rÇ   r2   r%   rS  r   r   r   r  ª  s   




€ör  c                 C   s  g | _ d| _| jD ]}t|ƒ q	g }g }| jjD ]}|d dkr(| |d ¡ q|d dkr5| |d ¡ q| jjD ]™}|d dkr_t| ƒ}t| j ƒdkrXt	| j d tƒrXd|_
| j  |¡ q:|d dkru|  |d ¡}|rt| j  |¡ q:|d dkrŠ|  |d ¡}|r‰t|| ƒ q:|d dkrÓ|d d	ksœ|d d
kr²| j ¡  | jD ]}||vr°| j  |¡ q¤q:|d dks¾|d d
krÓ| j ¡  | jD ]}|j|vrÒt|| ƒ qÆq:| j D ]Ï}d|_
|  jd7  _t	|tƒ�r(|jdkrùd|_
|  jd8  _q×t	|jtƒ�r'|jj ¡ dk�rd|_
|  jd8  _q×|jj ¡ dk�r'd|_
|  jd8  _q×t	|tƒ�r™|j ¡ dk�rAd|_
|  jd8  _q×|j ¡ dk�rTd|_
|  jd8  _q×|j ¡ �rmt|j ¡ ƒ�smd|_
|  jd8  _q×tjj�r˜|j ¡ g k�r„tjj|j ¡ v�sŽtjj|j ¡ v �r˜d|_
|  jd8  _q×t	|tƒ�r¦|  jd8  _q×t| j ƒdk�r¾t	| j d tƒ�r¾d| j d _
t| j ƒdk�rÕt	| j d tƒ�rÕd| j d _
| j d d … D ],}t	|tƒ�r|jjdk�r|jdk�rd|_
|  jd8  _|jdk�r| j   |¡ �qÜd S )Nr   r   rS   r‘   r’   rš   Fr‹   r�   r•   rŒ   Tr!   Ú	NoDisplayÚHiddenÚNoExecÚ	NotShowInr„   ÚEmpty)!r   r   r)   r  r$   rŽ   r2   r’   rU   r	   r   rN   rV   Ú__parse_inliner%   r   r   r!   r   rÃ   r   ÚgetNoDisplayÚ	getHiddenÚ
getTryExecÚ
__try_execrÔ   rÕ   ÚwindowmanagerÚgetOnlyShowInÚgetNotShowInrƒ   r   r  )r  r9   Útmp_sÚtmp_erŽ   Ú	separatorrQ   rK   r   r   r   r  »  s´   

€€
€

€þ



€

€
$€€&€ûr  c                 C   sp   t jd  t j¡}t j | ¡s-|D ]}t j || ¡}t j |¡r*t  |t j¡r* dS qdS t  | t j¡r6dS dS )NÚPATHTF)	r[   rô   rT   ÚpathseprW   rè   r\   ÚaccessÚX_OK)Ú
executableÚpathsr4  Úfr   r   r   r]    s   €þr]  c                 C   s  | j jdkr~t| jƒdkrA| j jdkrA| jd }|jjd|  ¡ dd� |jjd|  ¡ dd� |jjd|  	¡ dd� |j 
|¡ d S t| jƒ| j jksP| j jdkrv| j jdkrht|  ¡ |  ¡ |  	¡ ƒ}|j 
|¡ | jD ]}|j 
|¡ qkd S |j 
| ¡ d S |j 
| ¡ d S )	Nr‰   rS   r   r   T)r   rã   rä   )r$   r…   rU   r   rŠ   r   r¶   r<   rd   rf   r2   r†   rˆ   râ   )r9   r  rQ   ÚheaderrK   r   r   r   rY  $  s    

ÿrY  c                   @   s4   e Zd ZdZdd„ Zddd„Zdd	„ Zddd„ZdS )rÿ   zClass to cache Desktop Entriesc                 C   s   i | _ g | j d< i | _d S )NÚlegacy)ÚcacheEntriesró   r*   r   r   r   r,   9  s   

zMenuEntryCache.__init__r   Fc                 C   s2   |D ]}|| j vrg | j |< |  |d||¡ qd S rn   )rm  Ú_MenuEntryCache__addFiles)r+   ré   rÌ   rl  r5   r   r   r   r<  >  s   

€ýzMenuEntryCache.addMenuEntriesc              	   C   sÄ   t  t j ||¡¡D ]U}t j |¡d dkrBztt j ||¡||ƒ}W n	 ty,   Y q
w | j|  |¡ |dkrA| jd  |¡ q
t j 	t j |||¡¡r_|dkr_|  
|t j ||¡||¡ q
d S )NrS   z.desktopTrl  F)r[   r5  rW   r\   rö   rÃ   r   rm  r2   rç   rn  )r+   r5   ÚsubdirrÌ   rl  r7  rQ   r   r   r   Ú
__addFilesD  s   ÿ€ €õzMenuEntryCache.__addFilesTc              
   C   sà   g }g }|d d … }|dkr|  d¡ d |¡}z| j| W S  ty'   Y nw |D ]>}| j| D ]6}z+|j|vrE|  |j¡ |  |¡ n| ¡ dkr]| |¡}	||	 }
|
 ¡ dkr]||
_W q1 t	yg   Y q1w q*|| j|< |S )NTrl  r   rÓ   rÒ   )
r2   r\   ró   ÚKeyErrorrm  rM   r×   ÚindexrÆ   r6  )r+   ré   rl  rR  ÚidsÚappdirsÚkeyr5   rQ   ÚirO  r   r   r   r=  R  s:   

ÿ

€ÿõ
zMenuEntryCache.getMenuEntriesN)r   FrÂ   )ri   rj   rk   rl   r,   r<  rn  r=  r   r   r   r   rÿ   7  s    
rÿ   r.   )9rl   r   r[   Úxml.dom.minidomr÷   rE  Úxdg.BaseDirectoryr   r   Úxdg.DesktopEntryr   Úxdg.Exceptionsr   r   r   Úxdg.utilr   Ú
xdg.LocalerÔ   Ú
xdg.Configrø   ÚNoderw   r   r   rm   r$   rž   rÃ   r’   râ   rþ   rë   rú   r   r  r  r  r)  r  r  r  r  r  r  r  r2  r  r:  r  r#  r  r  r  r]  rY  rÿ   r   r   r   r   Ú<module>   sZ    
	 7 ;j^


3F:	
#[