
    uc                        d Z ddlZddlZddlZddlZddlZ	 ddlmc mZ n# e	$ r ddl
mc mZ Y nw xY wddlmZmZ ddlmZ ddlmZ ddlmZ ddlZddlZd Zd Zd	Zd
ZdZdZdZdZ G d d          Z  G d d          Z! G d d          Z" G d d          Z# G d d          Z$ G d d          Z% G d d          Z&d\  Z'Z(d Z)d Z*d  Z+d! Z, G d" d#e-          Z. G d$ d%          Z/d(d'Z0dS ))a  
Implementation of the XDG Menu Specification
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)PY3c                    t           j        dk    rLt          j        |           } t           j        dk    rt          j        |           S t          j        |           S t          j        | t          j                              S )N)      )r	      idctx)sysversion_infoastliteral_evalConstantNameConstantNameLoad)names    */usr/lib/python3/dist-packages/xdg/Menu.py
_ast_constr   '   sj    
6!!%%v%%<%%%#D)))x4SXZZ0000    c                     t           s*t          | t                    r|                     d          } t	          j        |           S )zgWrapper around locale.strxfrm that accepts unicode strings on Python 2.

    See Python bug #2481.
    zutf-8)r   
isinstanceunicodeencodelocalestrxfrm)ss    r   _strxfrmr"   2   s>    
  Z7++ HHW>!r   Deleted	NoDisplayHiddenEmpty	NotShowInNoExecc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
	 dd
ZddZd ZddZd Zd Zd Zd Zd Z	 d Zd ZdS )Menuz^Menu containing sub menus under menu.Entries

    Contains both Menu and MenuEntry items.
    c                 ,   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)r   	DirectoryEntriesDocFilenameDepthParentNotInXmlShowVisibleAppDirsDefaultLayoutr#   DirectoriesDirectoryDirsLayoutMenuEntriesMovesOnlyUnallocatedRulesSubmenusselfs    r   __init__zMenu.__init__I   s    	
 	 !
#
r   c                     | j         S Nr   r@   s    r   __str__zMenu.__str__e   
    yr   c                 D   |j         D ]}| j                             |           |j        D ]}| j                            |           |j        D ]}| j                            |           |j        |j        | _        |j        |j        | _        |j        r|j        | _        |j        r|j        | _        |j        D ]}| j                            |           |j	        D ]}| j	                            |           |j
        D ]}|                     |           | S rD   )r6   appendr9   r8   r#   r=   r:   r7   r>   r<   r?   
addSubmenu)rA   otherdir	directoryrulemovesubmenus          r   __add__zMenu.__add__h   sQ   = 	% 	%CL$$$$& 	+ 	+C%%c***** 	/ 	/I##I....=$ =DL ,#(#8D < 	',DK 	5!&!4DK 	$ 	$DJd####K 	$ 	$DJd####~ 	% 	%GOOG$$$$r   c                 t    t          j        |                                 |                                          S rD   )r   strcollgetNamerA   rK   s     r   __cmp__zMenu.__cmp__   s$    ~dllnnemmoo>>>r   c                 D    t          |                                           S z&Key function for locale-aware sorting.)r"   rT   r@   s    r   _keyz	Menu._key   s    '''r   c                 ~    	 |                                 }n# t          $ r Y nw xY w|                                  |k     S rD   rY   AttributeErrorrU   s     r   __lt__zMenu.__lt__   I    	JJLLEE 	 	 	D	yy{{U""    
$$c                     	 | j         t          |          k    S # t          $ r | j         t          |          k    cY S w xY wrD   )r   r   	NameErrorstrrU   s     r   __eq__zMenu.__eq__   sN    	+9.. 	+ 	+ 	+9E

****	+s    "??Fc              #   F   K   | j         D ]}|r|V  	|j        du r|V  dS )z4Interator for a list of Entries visible to the user.TN)r.   r4   )rA   show_hiddenentrys      r   
getEntrieszMenu.getEntries   sK      \ 	 	E t##		 	r   c                     | j         D ]}|j        |k    r|c S |r | j        D ]}|                    ||           dS dS )z4Searches for a MenuEntry with a given DesktopFileID.N)r;   DesktopFileIDr?   getMenuEntry)rA   desktopfileiddeep	menuentryrP   s        r   rj   zMenu.getMenuEntry   sy    ) 	! 	!I&-77     8 	:= : :$$]D9999	: 	:: :r   c                     |                     dd          }| j        D ]G}|j        |d         k    r4t          |          dk    r|                    |d                   c S |c S HdS )z&Searches for a Menu with a given path./   r   N)splitr?   r   lengetMenu)rA   patharrayrP   s       r   rs   zMenu.getMenu   sz    

3""} 	# 	#G|uQx''u::>>"??5844444"NNN	 (	# 	#r   c                 f   | }g }	 |r|                     |j                   n'|                     |                                           |j        dk    r|j        }nnY|                                 d}|s|                    d           |D ]"}t          j        	                    ||          }#|S )z/Returns this menu's path in the menu structure.rp   r   r,   )
rI   r   rT   r1   r2   reversepoposrt   join)rA   orgtoplevelparentnamesrt   r   s          r   getPathzMenu.getPath   s    	 /V[))))V^^--...|a	 	 	IIaLLL 	, 	,D7<<d++DDr   c                 n    	 | j         j                                        S # t          $ r
 | j        cY S w xY w)z"Returns the menu's localised name.)r-   r   rT   r\   r   r@   s    r   rT   zMenu.getName   sG    	>.66888 	 	 	9	s     44c                 b    	 | j         j                                        S # t          $ r Y dS w xY w)z Returns the menu's generic name.r,   )r-   r   getGenericNamer\   r@   s    r   r   zMenu.getGenericName   s@    	>.==??? 	 	 	22	     
..c                 b    	 | j         j                                        S # t          $ r Y dS w xY w)z Returns the menu's comment text.r,   )r-   r   
getCommentr\   r@   s    r   r   zMenu.getComment   s@    	>.99;;; 	 	 	22	r   c                 b    	 | j         j                                        S # t          $ r Y dS w xY w)z0Returns the menu's icon, filename or simple namer,   )r-   r   getIconr\   r@   s    r   r   zMenu.getIcon   s@    	>.66888 	 	 	22	r   c                    g | _         d| _        | j        D ]}|                                 t	                      }t	                      }| j        j        D ]Q}|d         dk    r|                    |d                    *|d         dk    r|                    |d                    R| j        j        D ]}|d         dk    rit          |           }t          | j                   dk    r't          | j         d         t                    rd|_        | j                             |           x|d         dk    r8|                     |d                   }|r| j                             |           |d         dk    r\|                     |d                   }|r=|j        j        r|                     |           | j                             |           $|d         dk    r|d         d	k    s|d         d
k    rH| j                                         | j        D ]%}|j        |vr| j                             |           &|d         dk    s|d         d
k    rh| j                                         | j        D ]G}|j        |vr<|j        j        r|                     |           -| j                             |           H| j         D ]~}d|_        | xj        dz  c_        t          |t(                    r|j        du rt,          |_        | xj        dz  c_        Ut          |j        t0                    ru|j        j                                        rt6          |_        | xj        dz  c_        |j        j                                        rt:          |_        | xj        dz  c_        t          |t0                    r^|j                                        rt6          |_        | xj        dz  c_        2|j                                        rt:          |_        | xj        dz  c_        i|j                                        r7|j                                        st@          |_        | xj        dz  c_        tB          j"        j#        r|j        $                                g k    r*tB          j"        j#        |j        $                                vs*tB          j"        j#        |j        %                                v rtL          |_        | xj        dz  c_        Yt          |t                    r| xj        dz  c_        t          | j                   dk    r2t          | j         d         t                    rd| j         d         _        t          | j                   dk    r2t          | j         d         t                    rd| j         d         _        | j         d d          D ]m}t          |t(                    rV|j        j'        sJ|j        dk    r?tP          |_        | xj        dz  c_        |j)        du r| j         *                    |           nd S )Nr   r0   rp   Menuname	SeparatorFMergefilesallmenusT)+r.   r5   r?   sortsetr:   orderaddr   rr   r   r4   rI   rj   rs   inlinemerge_inliner;   ri   r   r*   r#   DELETEDr-   	MenuEntryr   getNoDisplay
NO_DISPLAY	getHiddenHIDDEN
getTryExecfindTryExecNO_EXECxdgConfigwindowmanagergetOnlyShowIngetNotShowInNOT_SHOW_IN
show_emptyEMPTYr3   remove)rA   rP   	_submenus_entriesr   	separatorrm   rf   s           r   r   z	Menu.sort   s	   } 	 	GLLNNNNEE	55[& 	( 	(EQx:%%U1X&&&&qZ''eAh'''[& 	= 	=EQx;&&%dOO	t|$$q((ZR8H)-T-T(%*IN##I....qZ'' --eAh77	 3L''	222qZ'',,uQx00 5~, 5))'2222++G444qW$$8w&&%(e*;*;$))+++%)%5 ; ;	$2(BB L//	:::; 1X((E!H,=,=M&&(((#'= = ="<y88&~4 = $ 1 1' : : : : $ 3 3G < < < \ "	" "	"EEJLLALL%&& "=D((!(EJLLA%LLL;; *3@@BB *%/
)5??AA *%+
)E9-- "%2244 *!+EJLLA%LLL'1133 *!'EJLLA%LLL'2244 *U=O=[=[=]=] *!(EJLLA%LLLZ- **88::b@@J4E<N<\<\<^<^^^ 
0E4F4S4S4U4UUU%0
)E9-- "!t|q  $,q/955 -',Q$t|q  $,r*I66 .(-R % \!!!_ 	/ 	/E%&& /u|/F /5=\]K]K]"
!>T))L''...	/ 	/r   c                     | j         D ]}||k    r||z  } d S | j                             |           | |_        | j        dz   |_        d S )Nrp   )r?   rI   r2   r1   )rA   newmenurP   s      r   rJ   zMenu.addSubmenuT  sd    } 	+ 	+G'!!7" " M  )))!GN JNGMMMr   c                 x   t          |j                  dk    r|j        j        r|j        d         }|j                            d|                                d           |j                            d|                                d           |j                            d|                                d           | j        	                    |           dS t          |j                  |j        j
        k    s|j        j
        dk    r|j        j        rat          |                                |                                |                                          }| j        	                    |           |j        D ]}| j        	                    |           dS | j        	                    |           dS )	z}Appends a submenu's entries to this menu
        See the <Menuname> section of the spec about the "inline" attribute
        rp   r   r   T)r   GenericNameCommentN)rr   r.   r:   inline_aliasr   r   rT   r   r   rI   inline_limitinline_headerHeader)rA   rP   rm   headerrf   s        r   r   zMenu.merge_inline_  s    w1$$)D$*I"&&vw/@/@&NNN"&&}g6L6L6N6NW[&\\\"&&y'2D2D2F2Ft&TTTL	*****!!W^%@@@GND_cdDdDd~+ , 1 173I3I3K3KWM_M_MaMabb##F+++  + +##E****+ + L(((((r   NF)FF)__name__
__module____qualname____doc__rB   rF   rQ   rV   rY   r]   rc   rg   rj   rs   r   rT   r   r   r   r   rJ   r    r   r   r*   r*   D   sJ          8    D? ? ?( ( (# # #+ + +    : : : :# # #   *        b/ b/ b/H + + +) ) ) ) )r   r*   c                        e Zd ZdZddZd ZdS )MovezA move operationr,   c                 "    || _         || _        d S rD   )OldNew)rA   oldnews      r   rB   zMove.__init__u  s    r   c                 6    t          | j        |j                  S rD   )cmpr   rU   s     r   rV   zMove.__cmp__y  s    48UY'''r   Nr,   r,   )r   r   r   r   rB   rV   r   r   r   r   r   s  s=           ( ( ( ( (r   r   c                   T    e Zd ZdZ	 	 d	dZed             Zej        d             ZdS )
r:   zMenu Layout classFr
   Tc                 t    || _         || _        || _        || _        || _        g | _        ddgddgg| _        d S )Nr   r   r   )r   r   r   r   r   _order_default_order)rA   r   r   r   r   r   s         r   rB   zLayout.__init__  sO    $(*(gg
r   c                 ,    | j         r| j         n| j        S rD   )r   r   r@   s    r   r   zLayout.order  s    "kBt{{t/BBr   c                     || _         d S rD   )r   )rA   r   s     r   r   zLayout.order  s    r   N)FFr
   TF)r   r   r   r   rB   propertyr   setterr   r   r   r:   r:   }  so        DE27
 
 
 
 C C XC \  \  r   r:   c                   D    e Zd ZdZd\  ZZed             Zd Zd Z	d Z
dS )RulezInclude / Exclude Rules Classr   rp   c                    t          j        t          j        t          j        |          t          j                    gt          j        t          j        dt          j                              dt          j                              g          dd          }t          j        |           t          ||          }|S )	Nrm   r   ri   valueattrr   leftopscomparatorsrp   r   )bodylineno
col_offset)
r   
ExpressionCompareStrEq	Attributer   r   fix_missing_locationsr   )clstypefilenametreerN   s        r   fromFilenamezRule.fromFilename  s    ~WX&&VXXJ ](ksxzzBBB(

      
 
 
 	!$'''D$r   c                 X    || _         || _        t          | j        dd          | _        d S )Nz<compiled-menu-rule>eval)Type
expressioncompilecode)rA   r   r   s      r   rB   zRule.__init__  s*    	$DO-CVLL			r   c                 4    t          j        | j                  S rD   )r   dumpr   r@   s    r   rF   zRule.__str__  s    x(((r   c                     |D ]X}|dk    r|j         du s	|j        du rt          | j                  r)| j        t
          j        u rd|_        d|_         Qd|_        Y|S )N   TF)MatchedInclude	Allocatedr   r   r   r   TYPE_INCLUDEAdd)rA   menuentriesrunrm   s       r   applyz
Rule.apply  sx    $ 		* 		*IaxxY5==&0D88DI *9 111$(IM/3I,,$)IMr   N)r   r   r   r   r   TYPE_EXCLUDEclassmethodr   rB   rF   r   r   r   r   r   r     sm        ''!%L,  ["M M M) ) )    r   r   c                   j    e Zd ZdZdZdZdZddZd Zd Z	d	 Z
dd
Zd Zd Zd Zd Zd Zd Zd ZdS )r   z(Wrapper for 'Menu Style' Desktop EntriesUserSystemBothr,   c                 (   t          t          j                            ||                    | _         |                     |||           d| _        d | _        g | _        d| _        d| _	        d| _
        | j                                         | _        d S NTF)r   ry   rt   rz   setAttributesr4   OriginalParentsr   r   r   getCategories
CategoriesrA   r   rL   prefixs       r   rB   zMenuEntry.__init__  s    (c8)D)DEE8S&111 	  # +99;;r   c                 T    | j         j        r| j                                          dS dS )z&Save any changes to the desktop entry.N)r   taintedwriter@   s    r   savezMenuEntry.save  s5    $ 	&##%%%%%	& 	&r   c                 L    | j         j                            | j        d          S )z7Return the directory containing the desktop entry file.r,   )r   r   replacer0   r@   s    r   getDirzMenuEntry.getDir  s      )11$-DDDr   c                     t           j        j        s5| j        r| j        S t
          d         | j        j        v r| j        S | j	        S | j        S )z.Return the type of MenuEntry, System/User/Bothr   )
r   r   	root_moder   	TYPE_BOTHr   r   r   	TYPE_USERTYPE_SYSTEMr@   s    r   getTypezMenuEntry.getType  sP    z# 	"} (~%q!T%6%???~%''>!r   c                    || _         || _        t          j                            ||                              dd          | _        t          j                            | j        j	                  s| 
                                 d S d S )Nro   -)r0   Prefixry   rt   rz   r  ri   isabsr   r   _MenuEntry__setFilenamer  s       r   r   zMenuEntry.setAttributes  sv     W\\&(;;CCCMMw}}T.788 	!     	! 	!r   c                     |                                  | j        k    rHt          | j        |                                 | j                  | _        |                                  d S d S rD   )r  r  r   r0   r  r  r   r  r@   s    r   updateAttributeszMenuEntry.updateAttributes  sW    <<>>T---%dmT[[]]DKPPDM      .-r   c                 x   t           j        j        st          d         }nt          d         }| j                                        dk    r!t          j                            |d          }n t          j                            |d          }t          j                            || j	                  | j        _
        d S )Nr   rp   Applicationapplicationsdesktop-directories)r   r   r  r   r   r  ry   rt   rz   r0   r   )rA   rt   dir_s      r   __setFilenamezMenuEntry.__setFilename  s    z# 	$ #DD #D$$&&-777<<n55DD7<<&;<<D%'W\\$%F%F"""r   c                     t          j        | j                                        |j                                                  S rD   )r   rS   r   rT   rU   s     r   rV   zMenuEntry.__cmp__  s2    ~d/77995;M;U;U;W;WXXXr   c                 N    t          | j                                                  S rX   )r"   r   rT   r@   s    r   rY   zMenuEntry._key  s    )1133444r   c                 ~    	 |                                 }n# t          $ r Y nw xY w|                                  |k     S rD   r[   rU   s     r   r]   zMenuEntry.__lt__  r^   r_   c                 :    | j         t          |          k    rdS dS r   )ri   rb   rU   s     r   rc   zMenuEntry.__eq__  s     U++45r   c                     | j         S rD   )ri   r@   s    r   __repr__zMenuEntry.__repr__"  s    !!r   Nr   )r   r   r   r   r  r  r  rB   r	  r  r  r   r  r  rV   rY   r]   rc   r%  r   r   r   r   r     s        ..IKI< < < <(& & &
E E E
" 
" 
"! ! ! !! ! !
G G GY Y Y5 5 5# # #  " " " " "r   r   c                       e Zd ZdZd ZdS )r   z!Just a dummy class for Separatorsc                 "    || _         d| _        d S )NT)r2   r4   )rA   r}   s     r   rB   zSeparator.__init__(  s    			r   N)r   r   r   r   rB   r   r   r   r   r   &  s)        ''    r   r   c                       e Zd ZdZd Zd ZdS )r   zClass for Inline Headersc                 0    || _         || _        || _        d S rD   )r   r   r   )rA   r   generic_namecomments       r   rB   zHeader.__init__/  s    	'r   c                     | j         S rD   rE   r@   s    r   rF   zHeader.__str__4  rG   r   N)r   r   r   r   rB   rF   r   r   r   r   r   -  s8          
    r   r   r   c                    t           j                            |          }t           j                            |           s t           j                            ||           } t           j                            |           } t           j                            |           sdS |t          k    r!t           j                            |           r| S |t          k    r!t           j        
                    |           r| S dS NF)ry   rt   dirnamer  rz   abspathexistsTYPE_DIRisdir	TYPE_FILEisfile)r   r   r   rt   s       r   _check_file_pathr6  ;  s    7??8$$D7== *T5))GOOE""E7>>%   uxBGMM%00yRW^^E225r   c                    t          t                    }t          j        j        du r|                    d           |D ]F}t          j                            |d|           }t          j        	                    |          r|c S Gd S )NTr   r   )
listr   r   r   r  rx   ry   rt   rz   r5  )r   dirsdmenunames       r   _get_menu_file_pathr<  I  s      D
zt##  7<<7H557>>(## 	OOO	 r   c                 `    t          | t                    r| S |                                 dk    S )Ntrue)r   boollower)r   s    r   _to_boolrA  S  s,    % ;;==F""r   c                 x    i |                                   fd| D             } |                                   | S )Nc                 D    g | ]}|v                     ||          S r   )
setdefault).0e_sets     r   
<listcomp>z_dedupe.<locals>.<listcomp>]  s,    CCCqQd]]T__Q""]]]r   )rw   )_listrG  s    @r   _deduperJ  Z  s@    D	MMOOOCCCCECCCE	MMOOOLr   c                       e Zd ZddZddZd Zd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S )XMLMenuBuilderFc                     || _         d S rD   )debug)rA   rN  s     r   rB   zXMLMenuBuilder.__init__d  s    


r   Nc                    |r.t           j                            |          st          |          }|sft           j                            dd          dz   }t          |          }|s2t           j                            dd          dz   }t          |          }|st          dd|z            |                    d          st          d|          	 t          j	        |          }n#  t          d	|          xY wt                      | _        t                      | _        t                      | _        |                     |                                |          }||_        ||_        |                     |           |                     |           |                     |           |                     |           |                                 |S )
zLoad an applications.menu file.

        filename : str, optional
          The default is ``$XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu``.
        XDG_MENU_PREFIXr,   applications.menuzdebian-menu.menuFile not foundz/etc/xdg/menus/%s.menuzNot a .menu fileNot a valid .menu file)ry   rt   r  r<  environgetr   endswithetreeparser   _merged_files_directory_dirsMenuEntryCachecache
parse_menugetrootr   r   handle_moves
post_parsegenerate_not_only_allocatedgenerate_only_allocatedr   )rA   r   	candidater   menus        r   rY  zXMLMenuBuilder.parseg  s     	5BGMM(33 	5*844H 	: 
'8"==@SSI*955H  :JNN+<bAA+=>	.y99 	R/1Dy1PQQQ  )) 	=18<<<	C;x((DD	C7BBB !UU"uu#%%
t||~~x88	 $ 	((...$$T*** 			s   C) )C;c                 P    t                      }|                     |||           |S rD   )r*   
parse_node)rA   noder   re  s       r   r^  zXMLMenuBuilder.parse_menu  s&    vvh---r   c                    t          |          }|D ]}|j        |j        }}|r|                                nd }|dk    r,|                     ||          }|                    |           [|dk    r|r|                     |||           {|dk    r|                     ||           |dk    r|r|                     |||           |dk    r| 	                    ||           |dk    r
|r||_
        |dk    r|r|j                            |           	|dk    r	d	|_        |d
k    r	d|_        '|dk    r	d	|_        6|dk    r	d|_        E|dk    s|dk    r/|j                            |                     |                     |dk    rU|j                            dd           dk    r|                     d|||           |r|                     ||||           |dk    r|r|                     ||||           |dk    r|                     |||           |dk    r/|j                            |                     |                     Q|dk    r"|dk    r|                     |          |_        y|dk    r"|dk    r|                     |          |_        |dk    r5|r3|                     ||j                            dd          ||           |dk    r|                     ||           d S )Nr*   AppDirDefaultAppDirsDirectoryDirDefaultDirectoryDirsr   r-   r=   TNotOnlyUnallocatedFr#   
NotDeletedIncludeExclude	MergeFiler   r}   rQ  MergeDirDefaultMergeDirsr   r:   rp   r7   	LegacyDirr  r,   KDELegacyDirs)rr   tagtextstripr^  rJ   parse_app_dirparse_default_app_dirparse_directory_dirparse_default_directory_dirr   r8   rI   r=   r#   r>   
parse_ruleattribrV  parse_merge_fileparse_merge_dirparse_default_merge_dirsr<   
parse_moveparse_layoutr:   r7   parse_legacy_dirparse_kde_legacy_dirs)	rA   rh  r   r}   num_childrenchildrw  rx  re  s	            r   rg  zXMLMenuBuilder.parse_node  s   4yy 0	= 0	=E	5:C#'14::<<<TDf}}uh77!!$''''T""46::::(((**8V<<<<&&4&((x@@@@...006BBBB4"###"))$////))))-&&,,,).&&	!!!%$$!&	!!SI%5%5##DOOE$:$:;;;;##<##FD11X==))*=uhPVWWWW I))$xHHH
""t"$$T5(FCCCC***--eXvFFFF##DOOE$:$:;;;;!##$($5$5e$<$<FM''!##+/+<+<U+C+CF(###%%dEL,<,<Xr,J,JHV\]]]]''**8V<<<a0	= 0	=r   c                    t          t          |j                            dd                    t          |j                            dd                    t	          |j                            dd                    t          |j                            dd                    t          |j                            dd                    	          }g }|D ]}|j        |j        }}|r|                                nd }|d
k    r|r|                    d
|t          |j                            dd                    t          |j                            dd                    t	          |j                            dd                    t          |j                            dd                    t          |j                            dd                    g           |dk    r|                    dg           +|dk    r|r|                    d|g           L|dk    r0|                    d|j                            dd          g           ||_	        |S )Nr   Fr   r   r
   r   Tr   )r   r   r   r   r   r   r   r0   r   r   r   )
r:   rA  r  rV  intrw  rx  ry  rI   r   )rA   rh  layoutr   r  rw  rx  s          r   r  zXMLMenuBuilder.parse_layout  s6   e D DEEDKOOHe<<==T[__^Q??@@"4;???D#I#IJJ!$+//.%"H"HII
 
 
  	 	E	5:C#'14::<<<TDj  T U\--lEBBCCU\--h>>??((;;<<U\--otDDEEU\--neDDEE     ##k]++++
""t"j$/0000L$$VU33    r   c                     d\  }}|D ]=}|j         |j        }}|r|                                nd }|dk    r|r|}3|dk    r|r|}>t          ||          S )Nr   r   r   )rw  rx  ry  r   )rA   rh  r   r   r  rw  rx  s          r   r  zXMLMenuBuilder.parse_move  sr    S 	 	E	5:C#'14::<<<TDe|||$C~~r   c                 F   |j         dk    rt          j        nt          j        }t	          j        dd          }|                     |t	          j                              }|r||_        nt          d          |_        t	          j
        |           t          ||          S )Nrp  rp   r   )r   r   False)rw  r   r   r   r   r   parse_bool_opOrr   r   r   )rA   rh  r   r   exprs        r   r~  zXMLMenuBuilder.parse_rule  s    $(H	$9$9t  t?P~Q1555!!$11 	,DII"7++DI!$'''D$r   c                     g }|D ].}|                      |          }|r|                    |           /t          |          }|dk    rt          j        ||          S |dk    r|d         S d S )Nrp   r   )parse_rule_noderI   rr   r   BoolOp)rA   rh  operatorvaluesr  rN   
num_valuess          r   r  zXMLMenuBuilder.parse_bool_op  s     	$ 	$E''..D $d###[[
>>:h///1__!9tr   c                    |j         }|dk    r'|                     |t          j                              S |dk    r'|                     |t          j                              S |dk    rQ|                     |t          j                              }|r&t          j        t          j                    |          nd S |dk    rt          d          S |dk    r|j        }t          j	        t          j
        |          t          j                    gt          j        t          j        dt          j                              d	t          j                    
          g          S |dk    r|j        }t          j	        t          j
        |          t          j                    gt          j        t          j        dt          j                              dt          j                    
          g          S d S )Nr  AndNotAllTrueCategoryrm   r   r  r   r   r0   ri   )rw  r  r   r  r  UnaryOpr  r   rx  r   r   Inr   r   r   r   )rA   rh  rw  r  categoryr   s         r   r  zXMLMenuBuilder.parse_rule_node  s   h$;;%%dCFHH555E\\%%dCGII666E\\%%dCFHH55D37A3;swyy$///TAE\\f%%%JyH;WX&&VXXJ ](ksxzzBBB%

       JyH;WX&&VXXJ ](ksxzzBBB(

       r   c                 n    t          ||t                    }|r|j                            |           d S d S rD   )r6  r2  r6   rI   rA   r   r   r}   s       r   rz  zXMLMenuBuilder.parse_app_dirA  sA     (;; 	)N!!%(((((	) 	)r   c                     t          t                    D ]7}|                     t          j                            |d          ||           8d S )Nr  )reversedr   rz  ry   rt   rz   rA   r   r}   r:  s       r   r{  z$XMLMenuBuilder.parse_default_app_dirF  sR    -(( 	R 	RArw||A~>>&QQQQ	R 	Rr   c                 n    t          ||t                    }|r|j                            |           d S d S rD   )r6  r2  r9   rI   r  s       r   r|  z"XMLMenuBuilder.parse_directory_dirJ  sB     (;; 	/ ''.....	/ 	/r   c                     t          t                    D ]7}|                     t          j                            |d          ||           8d S )Nr  )r  r   r|  ry   rt   rz   r  s       r   r}  z*XMLMenuBuilder.parse_default_directory_dirO  sT    -(( 	_ 	_A$$RW\\!5J%K%KXW]^^^^	_ 	_r   c                 &   |j                             dd           dk    rt          D ]}|                    |d                              d          }||k    rt          D ]}}||k    r	t
          j                            t
          j                            ||                    r7| 	                    t
          j                            ||          ||            n~d S t          ||t                    }|r| 	                    |||           d S d S )Nr   r}   r,   ro   )r  rV  r   r  ry  ry   rt   r5  rz   
merge_filer6  r4  )rA   r   r  r   r}   r:  rel_fileps           r   r  zXMLMenuBuilder.parse_merge_fileU  s   <FD))X55$ " "#++Ar2288==x'', " "66$7>>"',,q(*C*CDD " OOBGLLH,E,EufUUU!E"" " %UHi@@E 6uf555556 6r   c                    t          ||t                    }|rrt          j        |          D ]_}	 |                    d          r5|                     t          j                            ||          ||           N# t          $ r Y Zw xY wd S d S )NrS  )	r6  r2  ry   listdirrW  r  rt   rz   UnicodeDecodeError)rA   r   r  r   r}   items         r   r  zXMLMenuBuilder.parse_merge_dire  s     (;; 	
5))  }}W-- RUD(A(A5&QQQ)   H	 	 s   A
A;;
BBc           	      ,   t           j                            t           j                            |                    d         }t	          t
                    D ]<}|                     t           j                            |d|dz             |||           =d S )Nr   r   z-merged)ry   rt   splitextbasenamer  r   r  rz   )rA   r  r   r}   r  r:  s         r   r  z'XMLMenuBuilder.parse_default_merge_dirso  s    7##BG$4$4X$>$>??B/** 	j 	jA  a(Y:N!O!OQVX`bhiiii	j 	jr   c                    || j         v r| j        rt          d|          d S | j                             |           	 t	          j        |          }nB# t          $ r | j        rt          d|          Y d S  | j        rt          d|          Y d S xY w|                                }|                     |||           d S )Nz Infinite MergeFile loop detectedrR  rT  )	rZ  rN  r   r   rX  rY  IOErrorr_  rg  )rA   r   r  r}   r   roots         r   r  zXMLMenuBuilder.merge_filet  s    t)))z "#ExPPPx(((	;x((DD 	 	 	z "#3X>>>	z "#;XFFF||~~h/////s   A !B7Bc                 H    |                      ||||          }|r||z  }d S d S rD   )merge_legacy_dir)rA   r  r  r   r}   ms         r   r  zXMLMenuBuilder.parse_legacy_dir  s:    !!$&AA 	aKFFF	 	r   c           	         t          ||t                    }|r#|| j        vr| j                            |           t	                      }|j                            |           |j                            |           t          j	        
                    |          |_        d|_        t          j        |          D ]}	 |dk    r|j                            |           nt          j	                            t          j	                            ||                    rI|                    |                     t          j	                            ||          |||                     # t&          $ r Y w xY w| j                            |g|d           | j                            |gd          }|D ]}|j        }	t1          |	          dk    rDt2                              t2          j        |j                  }
|j                            |
           ||j        vr|	                    d           |	|_        |S d S d S )NTz
.directoryFr   Legacy)r6  r2  r[  r   r*   r6   rI   r9   ry   rt   r  r   r3   r  r8   r3  rz   rJ   r  r  r]  add_menu_entriesget_menu_entriesr  rr   r   r   r   ri   r>   )rA   r  r  r   r}   r  r  r   rm   
categoriesrs              r   r  zXMLMenuBuilder.merge_legacy_dir  s/   h99 "	D 444 $$T***AIT"""O""4(((W%%d++AFAJ
4((  |++,,T2222rw||D$'?'?@@ T%:%:GLLt44"$"	& &    *   H J''===*55tfeDDK( 6 6	&1
z??a''))$*;Y=TUUAGNN1%%%v~--%%h///+5I(HE"	 "	44s   B'E**
E76E7c                 Z   	 t          j        g dt           j        d          }|                                d                                         }n# t
          $ r Y d S w xY w	 |d                             d          D ]}|                     |d||           d S # t          $ r Y d S w xY w)N)z
kde-configz--pathappsT)stdoutuniversal_newlinesr   :kde)	
subprocessPopenPIPEcommunicate
splitlinesOSErrorrq   r  
IndexError)rA   r   r}   procoutputr  s         r   r  z$XMLMenuBuilder.parse_kde_legacy_dirs  s    		#000!#'  D
 %%''*5577FF 	 	 	FF		q	,, E E%%dE8VDDDDE E 	 	 	DD	s$   AA 
A A $6B 
B*)B*c                    |j         d|_         |j        d|_        |j        r|j        s|j        r|j        |_        n|j        r1|j        dk    r|j        j        |_        nht                      |_        nT|j        dk    r#|j        j        |_        |j        j        |_        n&t                      |_        t                      |_        |j        dk    r2|j        j        |j        z   |_        |j        j        |j        z   |_        t          |j	                  |_	        t          |j                  |_        t          |j                  |_        |j
        D ]}|                     |           |j	                                         |j                                         |j                                         |j	        D ]}|j        D ]}t          j                            t          j                            ||                    rtt#          ||          }|j        s||_        ^|                                t"          j        k    r3|j                                        t"          j        k    r||j        _        |j        r d S d S )NFr   )r#   r=   r:   r7   r1   r2   r6   r9   rJ  r8   r?   ra  rw   ry   rt   r5  rz   r   r-   r  r  r  r   )rA   re  rP   rM   rL   rm   s         r   ra  zXMLMenuBuilder.post_parse  sj   < DL'#(D  { 	2$"4 	2! 2"0 2:>>)-)BD&&)/D&&:>>"&+";DK)-)BD&&"(((DK)/D& :>>;.=DL!%!:T=O!OD #4#344$T%788t|,, } 	% 	%GOOG$$$$ 	  """""$$$ ) 
	 
	I) @ @7>>"',,sI">">?? @ ))S 9 9I> @)2"**,,	0EEE>1133y7JJJ6?DN3~ 
	 
	r   c                    |j         D ]}|                     |           |j        du r| j                            |j                   g }|j        D ]5}|                    | j                            |j                  d          }6|D ]O}|j	        du rB|j
                            |           d|_	        d|_        |j                            |           Nd S d S )NFrp   T)r?   rb  r=   r]  r  r6   r>   r   r  r   r  rI   r   r;   rA   re  rP   r   rN   rm   s         r   rb  z*XMLMenuBuilder.generate_not_only_allocated  s    } 	6 	6G,,W55555((J''555K
 W W"jj)D)DT\)R)RTUVV( 7 7	=D((%,,T222$)IM*.I'$++I666 )(7 7r   c                    |j         D ]}|                     |           |j        du r| j                            |j                   g }|j        D ]5}|                    | j                            |j                  d          }6|D ]A}|j	        du r4|j
                            |           |j                            |           @d S d S )NTr   )r?   rc  r=   r]  r  r6   r>   r   r  r   r  rI   r;   r  s         r   rc  z&XMLMenuBuilder.generate_only_allocated  s    } 	2 	2G((11114''J''555K
 W W"jj)D)DT\)R)RTUVV( 7 7	=D((%,,T222 $++I666 ('
7 7r   c                    |j         D ]}|                     |           |j        D ]"}|                    |j                  }|r|                    |j                  }|j                            d          }d }t          |          dk    r|s|}|                    |d                   }|sJt                      }|d         |_	        t          |          dk    rd|_
        |                    |           |}|                    d           t          |          dk    ||z  }|j        j                             |           $d S )Nro   r   rp   T)r?   r`  r<   rs   r   r   rq   rr   r*   r   r3   rJ   rx   r2   r   )	rA   re  rP   rO   move_from_menumove_to_menur   	oldparentr   s	            r   r`  zXMLMenuBuilder.handle_moves$  sV   } 	' 	'Gg&&&&J 	F 	FD!\\$(33N F#||DH55s++ 	%jj1nn$ )$(	'//a99G" 6"&&&',Qxu::>>/3G,!,,W555 'IIIaLLL %jj1nn >)%.55nEEE-	F 	Fr   r   rD   )r   r   r   rB   rY  r^  rg  r  r  r~  r  r  rz  r{  r|  r}  r  r  r  r  r  r  r  ra  rb  rc  r`  r   r   r   rL  rL  b  s          4 4 4 4l  
2= 2= 2= 2=h     D	 	 		  	  	        H) ) )
R R R/ / /
_ _ _6 6 6   j j j
0 0 04  
$ $ $L  "6 6 6r7 7 7"7 7 7 F F F F Fr   rL  c                   .    e Zd ZdZd Zd
dZd ZddZd	S )r\  zClass to cache Desktop Entriesc                 6    i | _         g | j         d<   i | _        d S )Nlegacy)cacheEntriesr]  r@   s    r   rB   zMenuEntryCache.__init__C  s"    &((#


r   r,   Fc                 f    |D ]-}|| j         vr"g | j         |<   |                     |d||           .d S )Nr,   )r  _MenuEntryCache__addFiles)rA   r9  r  r  r  s        r   r  zMenuEntryCache.add_menu_entriesH  sO     	: 	:D4,,,*,!$'b&&999	: 	:r   c                    t          j        t           j                            ||                    D ]}|                    d          r	 t          t           j                            ||          ||          }n# t          $ r Y Uw xY w| j        |                             |           |r | j        d                             |           t           j        	                    t           j                            |||                    r8|s6| 
                    |t           j                            ||          ||           d S )Nz.desktopr  )ry   r  rt   rz   rW  r   r   r  rI   r3  r  )rA   r  subdirr  r  r  rm   s          r   
__addFileszMenuEntryCache.__addFilesN  s4   Jrw||D&99:: 	R 	RD}}Z(( 
R )"',,vt*D*DdF S SII#   H !$'..y999 B%h/66yAAArw||D&$??@@ R Rbgll64&@&@&&QQQ	R 	Rs   /A<<
B	B	Tc                 p   g }t                      }|d d          }|r|                    d           d                    |          }	 | j        |         S # t          $ r Y nw xY w|D ]}| j        |         D ]}	 |j        |vr0|                    |j                   |                    |           nh|                                t          j
        k    rF|                    |          }	||	         }
|
                                t          j        k    r||
_        # t          $ r Y w xY w|| j        |<   |S )Nr  r,   )r   rI   rz   r]  KeyErrorr  ri   r   r  r   r  indexr  r   r  )rA   r9  r  entriesidsappdirskeyr  rm   idxrf   s              r   r  zMenuEntryCache.get_menu_entries\  se   eeqqq' 	%NN8$$$ggg	:c?" 	 	 	D	 	 	D!.t4  	 .c99	 7888y1111"**,,	0EEE%mmI66 ' ==??i.AAA-6EN)   H "
3s%   A 
A"!A"9B!D
D('D(N)r,   F)T)r   r   r   r   rB   r  r  r  r   r   r   r\  r\  A  sc        $$  
: : : :R R R     r   r\  Fc                 F    t          |                              |           S )zYHelper function.
    Equivalent to calling xdg.Menu.XMLMenuBuilder().parse(filename)
    )rL  rY  )r   rN  s     r   rY  rY  {  s      %  &&x000r   r.  )1r   ry   r   r  r   r   xml.etree.cElementTreerX  cElementTreeImportErrorxml.etree.ElementTreeElementTreexdg.BaseDirectoryr   r   xdg.DesktopEntryr   xdg.Exceptionsr   xdg.utilr   
xdg.Localer   
xdg.Configr   r"   r   r   r   r   r   r   r*   r   r:   r   r   r   r   r2  r4  r6  r<  rA  rJ  objectrL  r\  rY  r   r   r   <module>r     s;   & 
			      



 



*********** * * *)))))))))))* = < < < < < < < ) ) ) ) ) ) ' ' ' ' ' '              1 1 1   
	
l) l) l) l) l) l) l) l)^	( ( ( ( ( ( ( (       0, , , , , , , ,^_" _" _" _" _" _" _" _"D                )    # # #  \F \F \F \F \FV \F \F \F~7 7 7 7 7 7 7 7t1 1 1 1 1 1s   	" 33