+
    ni?  c                   s   R t ^ RIt^ RIt^ RIt^ RIt^ RIt ^ RIHu Ht ^ RIHtHt ^ RIHt ^ RIHt ^ RIHt ^ RIt^ RItR tR tRtR	tR
tRtRtRt ! R R4      t  ! R R4      t! ! R R4      t" ! R R4      t# ! R R4      t$ ! R R4      t% ! R R4      t&^ ^ut't(R t)R t*R t+R t, ! R  R!]-4      t. ! R" R#4      t/R%R$ lt0R#   ]	 d    ^ RI
Hu Ht  Li ; i)&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                 s0   \         P                  R8  dX   \        P                  ! V 4      p \         P                  R8  d   \        P                  ! V 4      # \        P
                  ! V 4      # \        P                  ! V \        P                  ! 4       R7      # )   Zidctx)r      )r   i   )sysZversion_infoastZliteral_evalConstantZNameConstantNameLoad)name   &-/usr/lib/python3.14/site-packages/xdg/Menu.py
_ast_constr   '   se    
6!%v%<<%%##D))xx4SXXZ00    c                s    \         '       g(   \        V \        4      '       d   V P                  R4      p \        P
                  ! V 4      # )z_Wrapper around locale.strxfrm that accepts unicode strings on Python 2.

See Python bug #2481.
zutf-8)r   
isinstanceunicodeZencodelocaleZstrxfrm)Zsr   r   _strxfrmr   2   s2    
 CZ7++HHW>>!r   DeletedZ	NoDisplayZHiddenZEmptyZ	NotShowInZNoExecc                   s   a  ] tR t^Dt o RtR tR tR tR tR t	R t
R t RR	 ltRR
 ltR tRR ltR tR tR tR tR t R tR tRtV tR# )MenuzVMenu containing sub menus under menu.Entries

Contains both Menu and MenuEntry items.
c                s,   R V n         RV n        . V n        R V n        R V n        ^ V n        RV n        RV n        RV n        ^ V n	        . V n
        RV n        RV n        . V n        . V n        RV n        . V n        . V n        RV n        . V n        . V n        R# ) NFT)r   	DirectoryEntriesDocFilenameDepthParentNotInXmlShowVisibleAppDirsDefaultLayoutr   DirectoriesDirectoryDirsLayoutMenuEntriesMovesOnlyUnallocatedRulesSubmenusselfr   r   __init__ZMenu.__init__I   s    	
 	 !
#
r   c                    V P                   # Nr   r-   r   r   __str__ZMenu.__str__e       yyr   c                s"   VP                    F  pV P                   P                  V4       K   	  VP                   F  pV P                  P                  V4       K   	  VP                   F  pV P                  P                  V4       K   	  VP                  e   VP                  V n        VP
                  e   VP
                  V n        VP                  '       d   VP                  V n        VP                  '       d   VP                  V n        VP                   F  pV P                  P                  V4       K   	  VP                   F  pV P                  P                  V4       K   	  VP                   F  pV P                  V4       K  	  V # r1   )r#   appendr&   r%   r   r*   r'   r$   r+   r)   r,   
addSubmenu)r.   otherdir	directoryrulemovesubmenu   &&     r   __add__ZMenu.__add__h   s2   ==CLL$ ! &&C%%c* ' **I##I. + ==$ ==DL  ,#(#8#8D <<<,,DK!&!4!4DKKDJJd#   KKDJJd#   ~~GOOG$ & r   c                sh    \         P                  ! V P                  4       VP                  4       4      # r1   )r   strcollgetNamer.   r7      &&r   __cmp__ZMenu.__cmp__   s    ~~dllnemmo>>r   c                s4    \        V P                  4       4      # z&Key function for locale-aware sorting.)r   r@   r-   r   r   _keyZ	Menu._key   s    ''r   c                l     VP                  4       pV P                  4       V8  #   \         d     L i ; ir1   rE   AttributeErrorrA   rB   r   __lt__ZMenu.__lt__   9    	JJLE yy{U""  		   % 33c                s     V P                   \        V4      8H  #   \         d    T P                   \        T4      8H  u # i ; ir1   )r   r   Z	NameErrorstrrA   rB   r   __eq__ZMenu.__eq__   s<    	+99.. 	+99E
**	+s    #A A c              #  s|   "   V P                    F'  pV'       d   Vx  K  VP                  RJ g   K#  Vx  K)  	  R# 5i)z4Interator for a list of Entries visible to the user.TN)r   r!   )r.   Zshow_hiddenentry   && r   
getEntriesZMenu.getEntries   s,     \\Et#	 "s   +<
<c                s    V P                    F  pVP                  V8X  g   K  Vu # 	  V'       d'   V P                   F  pVP                  W4       K  	  R# R# )z4Searches for a MenuEntry with a given DesktopFileID.N)r(   DesktopFileIDr,   getMenuEntry)r.   ZdesktopfileidZdeep	menuentryr<      &&&  r   rR   ZMenu.getMenuEntry   sL    ))I&&-7   * ==$$]9 ) r   c                s    VP                  R^4      pV P                   FI  pVP                  V^ ,          8X  g   K  \        V4      ^8  d   VP	                  V^,          4      u # Vu # 	  R# )z&Searches for a Menu with a given path./N)splitr,   r   lengetMenu)r.   pathZarrayr<   s   &&  r   rX   ZMenu.getMenu   sS    

3"}}G||uQx'u:>"??5844"N %r   c                s|   T p. p V'       d   VP                  VP                  4       MVP                  VP                  4       4       VP                  ^ 8  d   VP                  pKc   TP                  4        RpT'       g   TP                  ^ 4       T F"  p\        P                  P                  YV4      pK$  	  T# )z/Returns this menu's path in the menu structure.r   )
r5   r   r@   r   r   reversepoposrY   join)r.   ZorgZtoplevelparentZnamesrY   r      &&&    r   getPathZMenu.getPath   s    V[[)V^^-.||aIIaLD77<<+D r   c                s     V P                   P                  P                  4       #   \         d    T P                  u # i ; i)z"Returns the menu's localised name.)r   r   r@   rH   r   r-   r   r   r@   ZMenu.getName   s9    	>>..6688 	99	s   #& A A c                p     V P                   P                  P                  4       #   \         d     R# i ; i)z Returns the menu's generic name.r   )r   r   getGenericNamerH   r-   r   r   rb   ZMenu.getGenericName   s2    	>>..==?? 		   #& 55c                ra   )z Returns the menu's comment text.r   )r   r   
getCommentrH   r-   r   r   rd   ZMenu.getComment   s2    	>>..99;; 		rc   c                ra   )z0Returns the menu's icon, filename or simple namer   )r   r   getIconrH   r-   r   r   re   ZMenu.getIcon   s2    	>>..6688 		rc   c                s0   . V n         ^ V n        V P                   F  pVP                  4        K  	  \	        4       p\	        4       pV P
                  P                   FS  pV^ ,          R8X  d   VP                  V^,          4       K+  V^ ,          R8X  g   K;  VP                  V^,          4       KU  	  V P
                  P                   EF  pV^ ,          R8X  dq   \        V 4      p\        V P                   4      ^ 8  d/   \        V P                   R,          \        4      '       d   RVn        V P                   P                  V4       K  V^ ,          R8X  d@   V P                  V^,          4      pV'       d   V P                   P                  V4       K  K  V^ ,          R8X  dr   V P                  V^,          4      pV'       dO   VP
                  P                  '       d   V P!                  V4       EK-  V P                   P                  V4       EKK  EKN  V^ ,          R8X  g   EK_  V^,          R8X  g   V^,          R8X  d_   V P"                  P                  4        V P"                   F1  pVP$                  V9  g   K  V P                   P                  V4       K3  	  EK  V^,          R8X  g   V^,          R8X  g   EK  V P                  P                  4        V P                   F`  pVP&                  V9  g   K  VP
                  P                  '       d   V P!                  V4       KE  V P                   P                  V4       Kb  	  EK  	  V P                    EFO  pR	Vn        V ;P                  ^,          un        \        V\(        4      '       d   VP*                  R	J d'   \,        Vn        V ;P                  ^,          un        Kp  \        VP.                  \0        4      '       d   VP.                  P2                  P5                  4       '       d'   \6        Vn        V ;P                  ^,          un        K  VP.                  P2                  P9                  4       '       d(   \:        Vn        V ;P                  ^,          un        EK1  EK4  EK7  \        V\0        4      '       Ed   VP2                  P5                  4       '       d(   \6        Vn        V ;P                  ^,          un        EK  VP2                  P9                  4       '       d(   \:        Vn        V ;P                  ^,          un        EK  VP2                  P=                  4       '       dH   VP2                  P?                  4       '       g(   \@        Vn        V ;P                  ^,          un        EKC  \B        PD                  PF                  '       d   VP2                  PI                  4       . 8w  d8   \B        PD                  PF                  VP2                  PI                  4       9  g8   \B        PD                  PF                  VP2                  PK                  4       9   d(   \L        Vn        V ;P                  ^,          un        EK  EK  EK  \        V\        4      '       g   EK6  V ;P                  ^,          un        EKR  	  \        V P                   4      ^ 8  d@   \        V P                   ^ ,          \        4      '       d   RV P                   ^ ,          n        \        V P                   4      ^8  d@   \        V P                   R,          \        4      '       d   RV P                   R,          n        V P                   R
,           F  p\        V\(        4      '       g   K  VP
                  PN                  '       d   K9  VP                  ^ 8X  g   KL  \P        Vn        V ;P                  ^,          un        VPR                  R	J g   K  V P                   PU                  V4       K  	  R# )    r   Menuname	SeparatorFMergefilesallmenusTNNNNi)+r   r"   r,   sortsetr'   orderaddrh   rW   r   r!   r5   rR   rX   inlinemerge_inliner(   rQ   r   r   r   DELETEDr   	MenuEntryr   ZgetNoDisplay
NO_DISPLAYZ	getHiddenHIDDENZ
getTryExecZfindTryExecNO_EXECxdgConfigZwindowmanagerZgetOnlyShowInZgetNotShowInNOT_SHOW_IN
show_emptyEMPTYr    remove)r.   r<   Z	_submenusZ_entriesrp   Z	separatorrS   rN   s   &       r   rn   Z	Menu.sort   s[   }}GLLN % E	5[[&&EQx:%U1X&qZ'eAh'	 ' [[&&EQx;&%dO	t||$q(ZR8H)-T-T%*IN##I.qZ' --eAh7	LL''	2 qZ',,uQx0~~,,,))'2++G4	 
 qW$8w&%(e*;$$))+%)%5%5	$22(B LL//	: &6 1X(E!H,=MM&&(#'=="<<y8&~~444 $ 1 1' : $ 3 3G < $13 'B \\EEJLLAL%&&==D(!(EJLLA%L;;33@@BB%/
)55??AA%+
) B	 < E9--%%2244!+EJLLA%LL''1133!'EJLLA%LL''2244U=O=O=[=[=]=]!(EJLLA%LLZZ---**88:b@JJ44E<N<N<\<\<^^ 

00E4F4F4S4S4UU%0
) V . E9--!E "H t||q $,,q/955',Q$t||q $,,r*I66(-R % \\!__E%&&u||/F/F/F5==\]K]"
!>>T)LL''. %r   c                s    V P                    F  pW!8X  g   K  W!,          p R# 	  V P                   P                  V4       Wn        V P                  ^,           Vn        R# i   N)r,   r5   r   r   )r.   newmenur<   rO   r   r6   ZMenu.addSubmenuT  sI    }}G!" %
 MM  )!N JJNGMr   c                s   \        VP                  4      ^8X  d   VP                  P                  '       d   VP                  ^ ,          pVP                  P                  RVP                  4       RR7       VP                  P                  RVP                  4       RR7       VP                  P                  RVP                  4       RR7       V P                  P                  V4       R# \        VP                  4      VP                  P                  8:  g   VP                  P                  ^ 8X  d   VP                  P                  '       dS   \        VP                  4       VP                  4       VP                  4       4      pV P                  P                  V4       VP                   F  pV P                  P                  V4       K   	  R# V P                  P                  V4       R# )zmAppends a submenu's entries to this menu
See the <Menuname> section of the spec about the "inline" attribute
r   T)r   GenericNameCommentN)rW   r   r'   inline_aliasr   ro   r@   rb   rd   r5   inline_limitinline_headerHeader)r.   r<   rS   ZheaderrN      &&   r   rs   ZMenu.merge_inline_  sY    w1$)D)D)D*I""&&vw/@&N""&&}g6L6L6NW[&\""&&y'2D2D2Ft&TLL	*!W^^%@%@@GNND_D_cdDd~~+++ 173I3I3KWM_M_Mab##F+ ##E* ) LL(r   )r#   r$   r   r   r%   r   r&   r   r   r   r'   r(   r)   r   r    r*   r   r+   r!   r,   r"   NF)FF)__name__
__module____qualname____firstlineno____doc__r/   r3   r>   rC   rE   rI   rM   rP   rR   rX   r`   r@   rb   rd   re   rn   r6   rs   __static_attributes____classdictcell__Z__classdict__   @r   r   r   D   sv     8D?(#+ :#*b/H +) )r   r   c                   s4   a  ] tR tRt o RtRR ltR tRtV tR# )Moveis  zA move operationc                s    Wn         W n        R # r1   )OldNew)r.   oldnew   &&&r   r/   ZMove.__init__u  s    r   c                sB    \        V P                  VP                  4      # r1   )Zcmpr   rA   rB   r   rC   ZMove.__cmp__y  s    488UYY''r   )r   r   Nr   r   )	r   r   r   r   r   r/   rC   r   r   r   r   r   r   r   s  s     ( (r   r   c                   sb   a  ] tR tRt o RtRR lt]R 4       t]P                  R 4       tRt	V t
R# )	r'   i}  zMenu Layout classc                sj    Wn         W n        W0n        W@n        WPn        . V n        R R.R R..V n        R# )ri   rl   rj   N)r|   rr   r   r   r   _order_default_order)r.   r|   rr   r   r   r   s   &&&&&&r   r/   ZLayout.__init__  s?    $(*(gg
r   c                sV    V P                   '       d   V P                   # V P                  # r1   )r   r   r-   r   r   rp   Layout.order  s    "kkkt{{Bt/B/BBr   c                    Wn         R # r1   )r   )r.   rp   rB   r   rp   r     s    r   )r   r   rr   r   r   r   r|   N)FFr   TF)r   r   r   r   r   r/   Zpropertyrp   Zsetterr   r   r   r   r   r'   r'   }  s;     
 C C \\ r   r'   c                   sP   a  ] tR tRt o Rt^ ^utt]R 4       tR t	R t
R tRtV tR# )	Rulei  zInclude / Exclude Rules Classc                s   \         P                  ! \         P                  ! \         P                  ! V4      \         P                  ! 4       .\         P
                  ! \         P                  ! R \         P                  ! 4       R7      R\         P                  ! 4       R7      .R7      R7      p\         P                  ! V4       \        W4      pV# )rS   r   rQ   valueZattrr   ZleftZopsZcomparatorsbody)
r
   
ExpressionComparer   Eq	Attributer   r   fix_missing_locationsr   )Zclstypefilenametreer:   rT   r   fromFilenameZRule.fromFilename  s    ~~\\(+VVXJ ]]((ksxxzB(
 

 	!!$'Dr   c                sV    Wn         W n        \        V P                  R R4      V n        R# )z<compiled-menu-rule>evalN)Type
expressionZcompilecode)r.   r   r   r   r   r/   ZRule.__init__  s!    	$DOO-CVL	r   c                sB    \         P                  ! V P                  4      # r1   )r
   Zdumpr   r-   r   r   r3   ZRule.__str__  s    xx((r   c                s   V F~  pV^8X  d#   VP                   RJ g   VP                  RJ d   K,  \        V P                  4      '       g   KI  V P                  \
        P                  J d   RVn        RVn         Kw  RVn        K  	  V# )i   TF)MatchedInclude	Allocatedr   r   r   r   TYPE_INCLUDEAdd)r.   menuentriesZrunrS      &&& r   applyZ
Rule.apply  sn    $IaxY55=&00D8DII99 1 11$(IM/3I,$)IM % r   )r   r   r   N)r   r   r   r   r   r   TYPE_EXCLUDEZclassmethodr   r/   r3   r   r   r   r   r   r   r   r     s;     '!"AL,  M) r   r   c                   s   a  ] tR tRt o RtRtRtRtRR ltR t	R t
R	 tRR
 ltR tR tR tR tR tR tR tRtV tR# )ru   i  z(Wrapper for 'Menu Style' Desktop EntriesZUserZSystemZBothc                s   \        \        P                  P                  W!4      4      V n         V P	                  WV4       R V n        RV n        . V n        RV n        RV n	        RV n
        V P                   P                  4       V n        R# )TNF)r   r\   rY   r]   setAttributesr!   OriginalParentsr   r   r   ZgetCategories
Categoriesr.   r   r8   prefix   &&&&r   r/   ZMenuEntry.__init__  su    (c)DE8&1 	  # ++99;r   c                sv    V P                   P                  '       d   V P                   P                  4        R# R# )z&Save any changes to the desktop entry.N)r   ZtaintedZwriter-   r   r   saveZMenuEntry.save  s+    $$$##% %r   c                sb    V P                   P                  P                  V P                  R4      # )z7Return the directory containing the desktop entry file.r   )r   r   replacer   r-   r   r   getDirZMenuEntry.getDir  s%      ))11$--DDr   c                s   \         P                  P                  '       g]   V P                  '       d   V P                  # \
        ^ ,          V P                  P                  9   d   V P                  # V P                  # V P                  # )z.Return the type of MenuEntry, System/User/Both)
ry   rz   	root_moder   	TYPE_BOTHr    r   r   	TYPE_USERTYPE_SYSTEMr-   r   r   getTypeZMenuEntry.getType  s^    zz###}}}~~%q!T%6%6%?%??~~%'''>>!r   c                s   Wn         W0n        \        P                  P	                  W14      P                  R R4      V n        \        P                  P                  V P                  P                  4      '       g   V P                  4        R# R# )rU   Z-N)r   Prefixr\   rY   r]   r   rQ   isabsr   r   _MenuEntry__setFilenamer   r   r   r   ZMenuEntry.setAttributes  s^     WW\\&;CCCMww}}T..7788  9r   c                s    V P                  4       V P                  8X  dG   \        V P                  V P	                  4       V P
                  4      V n        V P                  4        R # R # r1   )r   r   ru   r   r   r   r   r   r-   r   r   updateAttributesZMenuEntry.updateAttributes  sE    <<>T---%dmmT[[]DKKPDM  .r   c                s   \         P                  P                  '       g   \        ^ ,          pM\        ^,          pV P                  P                  4       R8X  d"   \        P                  P                  VR4      pM \        P                  P                  VR4      p\        P                  P                  W P                  4      V P                  n
        R# )rf   ZApplicationapplicationsdesktop-directoriesN)ry   rz   r   r    r   r   r\   rY   r]   r   r   )r.   rY   dir_   &  r   Z__setFilenameZMenuEntry.__setFilename   s    zz### #D #D$$&-777<<n5D77<<&;<D%'WW\\$%F"r   c                s    \         P                  ! V P                  P                  4       VP                  P                  4       4      # r1   )r   r?   r   r@   rA   rB   r   rC   ZMenuEntry.__cmp__  s1    ~~d//7795;M;M;U;U;WXXr   c                sH    \        V P                  P                  4       4      # rD   )r   r   r@   r-   r   r   rE   ZMenuEntry._key  s    ))11344r   c                rF   r1   rG   rA   rB   r   rI   ZMenuEntry.__lt__  rJ   rK   c                s>    V P                   \        V4      8X  d   R # R# )TF)rQ   rL   rA   rB   r   rM   ZMenuEntry.__eq__  s    U+r   c                r0   r1   )rQ   r-   r   r   __repr__ZMenuEntry.__repr__!  s    !!!r   )r   r   r   r   rQ   r   r   r   r   r   r!   Nr   )r   r   r   r   r   r   r   r   r/   r   r   r   r   r   r   rC   rE   rI   rM   r   r   r   r   r   r   ru   ru     s[     .IKI<(&
E
"!!
GY5#" "r   ru   c                   s*   a  ] tR tRt o RtR tRtV tR# )rh   i%  z!Just a dummy class for Separatorsc                s     Wn         R V n        R# TNr   r!   )r.   r^   rB   r   r/   ZSeparator.__init__'  s    	r   r   N)r   r   r   r   r   r/   r   r   r   r   r   rh   rh   %  s     ' r   rh   c                   s0   a  ] tR tRt o RtR tR tRtV tR# )r   i,  zClass for Inline Headersc                s*    Wn         W n        W0n        R # r1   )r   r   r   )r.   r   Zgeneric_nameZcommentr   r   r/   ZHeader.__init__.  s    	'r   c                r0   r1   r2   r-   r   r   r3   ZHeader.__str__3  r4   r   )r   r   r   N)	r   r   r   r   r   r/   r3   r   r   r   r   r   r   r   ,  s     
 r   r   c                 s    \         P                  P                  V4      p\         P                  P                  V 4      '       g    \         P                  P	                  W04      p \         P                  P                  V 4      p \         P                  P                  V 4      '       g   R # V\        8X  d(   \         P                  P                  V 4      '       d   V # V\        8X  d(   \         P                  P                  V 4      '       d   V # R # r   )r\   rY   Zdirnamer   r]   ZabspathZexistsTYPE_DIRisdir	TYPE_FILEisfile)r   r   r   rY   r   r   _check_file_pathr   :  s    77??8$D77==T)GGOOE"E77>>%  xBGGMM%00yRWW^^E22r   c                 s(   \        \        4      p\        P                  P                  R J d   VP                  ^ 4       V FM  p\        P                  P                  VRV 4      p\        P                  P                  V4      '       g   KK  Vu # 	  R# )Trl   N)
Zlistr   ry   rz   r   r[   r\   rY   r]   r   )r   dirsdZmenunames   &   r   _get_menu_file_pathr   H  sa     D
zzt#77<<7H577>>(##O r   c                 sX    \        V \        4      '       d   V # V P                  4       R 8H  # )Ztrue)r   ZboolZlower)r   r   r   _to_boolr   R  s%    %;;=F""r   c                 s    / pV P                  4        V  Uu. uF  q"V9  g   K  VP                  W"4      NK  	  p pV P                  4        V # u upi r1   )rZ   Z
setdefault)Z_listZ_setZer   r   _deduper   Y  sH    D	MMO,1CEqd]"T__Q"EEC	MMOL Ds
   AAc                   s   a  ] tR tRt o RR ltRR ltR tRR ltR tR t	R	 t
R
 tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tR tRtV tR# )XMLMenuBuilderia  c                r   r1   )debug)r.   r   rB   r   r/   ZXMLMenuBuilder.__init__c  s    
r   Nc                s   V'       d1   \         P                  P                  V4      '       g   \        V4      pV'       g3   \         P                  P                  RR4      R,           p\        V4      pV'       g   \        RRX,          4      hVP                  R4      '       g   \        RV4      h \        P                  ! V4      p\        4       T n        \        4       T n        \        4       T n        T P                  TP!                  4       T4      pY4n        Yn        T P'                  T4       T P)                  T4       T P+                  T4       T P-                  T4       TP/                  4        T#    \        RT4      h; i)	zLoad an applications.menu file.

filename : str, optional
  The default is ``$XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu``.
ZXDG_MENU_PREFIXr   applications.menuFile not foundz/etc/xdg/menus/%s.menuzNot a .menu fileNot a valid .menu file)r\   rY   r   r   Zenvirongetr   endswithetreeparsero   _merged_files_directory_dirsMenuEntryCachecache
parse_menugetrootr   r   handle_moves
post_parsegenerate_not_only_allocatedgenerate_only_allocatedrn   )r.   r   Z	candidater   menur   r   r   ZXMLMenuBuilder.parsef  s3    BGGMM(33*84H

'8"=@SSI*95H/1Dy1PQQ  ))18<<	C;;x(D
 !U"u#%
t||~x8	 $ 	((.$$T* 			-	C7BBs   2E7 7Fc                s>    \        4       pV P                  WV4       V# r1   )r   
parse_node)r.   noder   r   r   r   r   ZXMLMenuBuilder.parse_menu  s    v-r   c                sb   \        V4      pV EF  pVP                  VP                  rvV'       d   VP                  4       MR pVR8X  d%   V P	                  WR4      pVP                  V4       K`  VR8X  d   V'       d   V P                  WrV4       K  VR8X  d   V P                  W#4       K  VR8X  d   V'       d   V P                  WrV4       K  VR8X  d   V P                  W#4       K  VR8X  d   V'       d	   Wsn
        K  VR8X  d'   V'       d   VP                  P                  V4       EK  VR8X  d   R	Vn        EK/  VR
8X  d   RVn        EK@  VR8X  d   R	Vn        EKQ  VR8X  d   RVn        EKb  VR8X  g   VR8X  d.   VP                  P                  V P!                  V4      4       EK  VR8X  dX   VP"                  P%                  RR 4      R8X  d   V P'                  RWRV4       EK  V'       d   V P'                  WuW#4       EK  EK  VR8X  d   V'       d   V P)                  WuW#4       EK  VR8X  d   V P+                  WRV4       EK;  VR8X  d.   VP,                  P                  V P/                  V4      4       EKo  VR8X  d$   V^8  d   V P1                  V4      Vn        EK  EK  VR8X  d$   V^8  d   V P1                  V4      Vn        EK  EK  VR8X  d8   V'       d0   V P7                  WuP"                  P%                  RR4      W#4       EK  VR8X  g   EK  V P9                  W#4       EK  	  R # )Nr   ZAppDirZDefaultAppDirsZDirectoryDirZDefaultDirectoryDirsr   r   r*   TZNotOnlyUnallocatedFr   Z
NotDeletedIncludeZExcludeZ	MergeFiler   r^   r   ZMergeDirZDefaultMergeDirsr   r'   r$   Z	LegacyDirr   r   ZKDELegacyDirs)rW   tagtextstripr   r6   parse_app_dirparse_default_app_dirparse_directory_dirparse_default_directory_dirr   r%   r5   r*   r   r+   
parse_ruleattribr   parse_merge_fileparse_merge_dirparse_default_merge_dirsr)   
parse_moveparse_layoutr'   r$   parse_legacy_dirparse_kde_legacy_dirs)	r.   r   r   r^   Znum_childrenchildr   r   r   s	   &&&&     r   r   ZXMLMenuBuilder.parse_node  s   4yE		5::#'4::<TDf}u7!!$'T""46:((**8<&4((@..00B4"#""))$/)))-&,,).&	!!%$!&	!SI%5##DOOE$:;#<<##FD1X=))*=uPVW))$xH 
"t$$T(C**--evF##DOOE$:;!#$($5$5e$<FM $'!#+/+<+<U+CF( $#%%dLL,<,<Xr,JH]'**8<a r   c                s   \        \        VP                  P                  R R4      4      \        VP                  P                  RR4      4      \	        VP                  P                  R^4      4      \        VP                  P                  RR4      4      \        VP                  P                  RR4      4      R7      p. pV EF  pVP
                  VP                  reV'       d   VP                  4       MRpVR	8X  d   V'       d   VP                  R	V\        VP                  P                  R R4      4      \        VP                  P                  RR4      4      \	        VP                  P                  R^4      4      \        VP                  P                  RR4      4      \        VP                  P                  RR4      4      .4       EK  VR
8X  d   VP                  R
.4       EK*  VR8X  d   V'       d   VP                  RV.4       EKO  VR8X  g   EKY  VP                  RVP                  P                  RR4      .4       EK  	  W2n	        V# )r|   Frr   r   r   Tr   )r|   rr   r   r   r   Nrg   rh   r   ri   r   rk   )
r'   r   r   r   Zintr   r   r   r5   rp   )r.   r   Zlayoutrp   r  r   r   r=   r   r  ZXMLMenuBuilder.parse_layout  s   e DEDKKOOHe<=T[[__^Q?@"4;;???D#IJ!$++//.%"HI
 E		5::#'4::<TDj TU\\--lEBCU\\--h>?((;<U\\--otDEU\\--neDE  #k]+
"tj$/0LL$$VU3 % , r   c                s    R R r2V F\  pVP                   VP                  reV'       d   VP                  4       MRpVR8X  d   V'       d   TpKG  VR8X  g   KP  V'       g   KZ  TpK^  	  \        W#4      # )r   Nr   r   )r   r   r   r   )r.   r   r   r   r  r   r   r=   r   r   ZXMLMenuBuilder.parse_move  s[    rSE		5::#'4::<TDe|$$  C~r   c                sL   VP                   R 8X  d   \        P                  M\        P                  p\        P
                  ! \        R4      R7      pV P                  V\        P                  ! 4       4      pV'       d   WCn	        \        P                  ! V4       \        W#4      # )r   ZFalser   )r   r   r   r   r
   r   r   parse_bool_opOrr   r   )r.   r   r   r   exprr   r   r   ZXMLMenuBuilder.parse_rule  sl    $(HH	$9t  t?P?P~~:g#67!!$1I!!$'Dr   c                s    . pV F/  pV P                  V4      pV'       g   K  VP                  V4       K1  	  \        V4      pV^8  d   \        P                  ! W#4      # V^8X  d
   V^ ,          # R# r   )parse_rule_noder5   rW   r
   ZBoolOp)r.   r   ZoperatorZvaluesr  r:   Z
num_valuesr_   r   r  ZXMLMenuBuilder.parse_bool_op  sg    E''.Dtd#  [
>::h//1_!9r   c                sR   VP                   pVR 8X  d&   V P                  V\        P                  ! 4       4      # VR8X  d&   V P                  V\        P                  ! 4       4      # VR8X  dZ   V P                  V\        P                  ! 4       4      pV'       d+   \        P
                  ! \        P                  ! 4       V4      # R# VR8X  d   \        R4      # VR8X  d   VP                  p\        P                  ! \        P                  ! V4      \        P                  ! 4       .\        P                  ! \        P                  ! R\        P                  ! 4       R7      R	\        P                  ! 4       R
7      .R7      # VR8X  d   VP                  p\        P                  ! \        P                  ! V4      \        P                  ! 4       .\        P                  ! \        P                  ! R\        P                  ! 4       R7      R\        P                  ! 4       R
7      .R7      # R# )r  AndNotNZAllZTrueZCategoryrS   r   r   r   r   r   rQ   )r   r  r
   r  r	  ZUnaryOpr
  r   r   r   r   ZInr   r   r   r   )r.   r   r   r  Zcategoryr      &&    r   r  ZXMLMenuBuilder.parse_rule_node  su   hh$;%%dCFFH55E\%%dCGGI66E\%%dCFFH5D373;;swwy$/ATAE\f%%JyyH;;\\(+VVXJ ]]((ksxxzB%
   JyyH;;\\(+VVXJ ]]((ksxxzB(
   r   c                p    \        W\        4      pV'       d   VP                  P                  V4       R # R # r1   )r   r   r#   r5   r.   r   r   r^   r   r   r   ZXMLMenuBuilder.parse_app_dir5  s(     (;NN!!%( r   c                    \        \        4       F3  pV P                  \        P                  P                  VR 4      W4       K5  	  R# )r   N)reversedr    r   r\   rY   r]   r.   r   r^   r   r   r   r   Z$XMLMenuBuilder.parse_default_app_dir:  s0    -(Arww||A~>Q )r   c                r  r1   )r   r   r&   r5   r  r   r   r   Z"XMLMenuBuilder.parse_directory_dir>  s*     (;  ''. r   c                r  )r   N)r  r    r   r\   rY   r]   r  r   r   r   Z*XMLMenuBuilder.parse_default_directory_dirC  s1    -(A$$RWW\\!5J%KX^ )r   c                s"   VP                   P                  R R4      R8X  d   \         F  pVP                  VR4      P	                  R4      pWc8w  g   K,  \         F  pWW8X  d   K  \
        P                  P                  \
        P                  P                  Wv4      4      '       g   KO  V P                  \
        P                  P                  Wv4      W$4        K  	  K  	  R# \        W\        4      pV'       d   V P                  WV4       R# R# )r   Nr^   r   rU   )r   r   r   r   r   r\   rY   r   r]   
merge_filer   r   )r.   r   r  r   r^   r   Zrel_fileZps   &&&&&   r   r   ZXMLMenuBuilder.parse_merge_fileI  s    <<FD)X5$#++Ar288=',6$77>>"'',,q*CDD OOBGGLL,EuU! - % %Ui@Ef5 r   c                s*   \        W\        4      pV'       di   \        P                  ! V4       FL  p VP	                  R 4      '       d2   V P                  \        P                  P                  W4      W$4       KL  KN  	  R# R#   \         d     Kb  i ; i)r   N)	r   r   r\   listdirr   r  rY   r]   UnicodeDecodeError)r.   r   r  r   r^   item   &&&&& r   r   ZXMLMenuBuilder.parse_merge_dirY  sq     (;

5)}}W--U(A5Q . * 
 * s   ABBBc           	     s*   \         P                  P                  \         P                  P                  V4      4      ^ ,          p\	        \
        4       F<  pV P                  \         P                  P                  VRVR,           4      WV4       K>  	  R# )rf   rl   z-mergedN)r\   rY   Zsplitextbasenamer  r   r   r]   )r.   r  r   r^   r  r      &&&&  r   r   Z'XMLMenuBuilder.parse_default_merge_dirsc  sc    77##BGG$4$4X$>?B/*A  a(Y:N!OQVbhi +r   c                s   WP                   9   d!   V P                  '       d   \        R V4      hR# V P                   P                  V4        \        P
                  ! V4      pTP                  4       pT P                  YQT4       R#   \         d#    T P                  '       d   \        RT4      h R#  T P                  '       d   \        RT4      h R# ; i)z Infinite MergeFile loop detectedNr   r   )	r   r   r   rq   r   r   ZIOErrorr   r   )r.   r   r  r^   r   Zrootr  r   r  ZXMLMenuBuilder.merge_fileh  s    )))zzz"#ExPPx(	;;x(D ||~/  	zzz"#3X>>	zzz"#;XFFs   B C$C3CCc                sN    V P                  WW44      pV'       d   WE,          pR # R # r1   )merge_legacy_dir)r.   r   r   r   r^   mr  r   r  ZXMLMenuBuilder.parse_legacy_dir  s#    !!$AKF r   c           	     s   \        W\        4      pV'       Ed4   WP                  9  Ed!   V P                  P                  V4       \	        4       pVP
                  P                  V4       VP                  P                  V4       \        P                  P                  V4      Vn        R Vn        \        P                  ! V4       F  p VR8X  d   VP                  P                  V4       K(  \        P                  P                  \        P                  P!                  W4      4      '       dC   VP#                  V P%                  \        P                  P!                  W4      VVV4      4       K  K  	  V P(                  P+                  V.VR 4       V P(                  P-                  V.R4      pV F  pVP.                  p	\1        V	4      ^ 8X  dJ   \2        P5                  \2        P6                  VP8                  4      p
VP:                  P                  V
4       WP
                  9   d   Kz  V	P                  R4       Wn        K  	  V# R# R#   \&         d     EK  i ; i)Tz
.directoryFZLegacyN)r   r   r   rq   r   r#   r5   r&   r\   rY   r  r   r    r  r%   r   r]   r6   r  r  r   add_menu_entriesget_menu_entriesr   rW   r   r   r   rQ   r+   )r.   r   r   r   r^   r  r  r   rS   Z
categoriesZrs   &&&&&      r   r  ZXMLMenuBuilder.merge_legacy_dir  s   94D 4 44  $$T*AIIT"OO""4(WW%%d+AFAJ

4(|+,,T2rww||D'?@@T%:%:GGLL4"$"	&  A	 ) JJ''=**55tfeDK(	&11
z?a'))$*;*;Y=T=TUAGGNN1%~~-%%h/+5( ) HE 54& * s   "I/BIIIc                sR    \         P                  ! . RO\         P                  RR7      pVP                  4       ^ ,          P	                  4       p T^ ,          P                  R4       F  pT P                  TRY4       K  	  R#   \
         d     R# i ; i  \         d     R# i ; i)
kde-configT)ZstdoutZuniversal_newlinesNZ:Zkde)r  z--pathZapps)	
subprocessZPopenZPIPEZcommunicateZ
splitlinesZOSErrorrV   r  Z
IndexError)r.   r   r^   ZprocZoutputr   s   &&&   r   r  Z$XMLMenuBuilder.parse_kde_legacy_dirs  s    		##0!#'D
 %%'*557F	q	,%%dE8D -	  		  		s$   AB 2B BBB&%B&c                s   VP                   f   RVn         VP                  f   RVn        VP                  '       d   VP                  '       g   VP                  '       d   VP                  Vn        MVP                  '       d>   VP                  ^ 8  d   VP
                  P                  Vn        Mv\        4       Vn        MfVP                  ^ 8  d8   VP
                  P                  Vn        VP
                  P                  Vn        M\        4       Vn        \        4       Vn        VP                  ^ 8  dY   VP
                  P                  VP                  ,           Vn        VP
                  P                  VP                  ,           Vn        \        VP                  4      Vn	        \        VP                  4      Vn        \        VP                  4      Vn        VP                   F  pV P                  V4       K  	  VP                  P                  4        VP                  P                  4        VP                  P                  4        VP                   F  pVP                   F  p\        P                  P                  \        P                  P!                  WC4      4      '       g   KG  \#        W44      pVP$                  '       g	   WQn        Kl  VP'                  4       \"        P(                  8X  g   K  VP$                  P'                  4       \"        P*                  8X  g   K  WQP$                  n        K  	  VP$                  '       g   K   R # 	  R # NF)r   r*   r'   r$   r   r   r#   r&   r   r%   r,   r   rZ   r\   rY   r   r]   ru   r   r   r   r   r   )r.   r   r<   r9   r8   rS   r  r   r   ZXMLMenuBuilder.post_parse  s9   << DL'#(D  {{{$"4"4"4!!!"00::>)-)B)BD&)/D&::>"&++";";DK)-)B)BD&"((DK)/D& ::>;;..=DL!%!:!:T=O=O!OD #4#3#34$T%7%78t||, }}GOOG$ % 	  """$ ))I))77>>"'',,s">?? )) 9I>>>)2"**,	0E0EE>>113y7J7JJ6?NN3 * ~~~ *r   c                s   VP                    F  pV P                  V4       K  	  VP                  R J d   V P                  P	                  VP
                  4       . pVP                   F8  pVP                  V P                  P                  VP
                  4      ^4      pK:  	  V FY  pVP                  RJ g   K  VP                  P                  V4       R Vn	        RVn        VP                  P                  V4       K[  	  R# R# )FTN)r,   r   r*   r   r  r#   r+   r   r  r   r   r5   r   r(   r.   r   r<   r   r:   rS   r  r   r   Z*XMLMenuBuilder.generate_not_only_allocated  s    }}G,,W5 % 5(JJ''5K

"jj)D)DT\\)RTUV # )	==D(%%,,T2$)IM*.I'$$++I6 ) )r   c                s   VP                    F  pV P                  V4       K  	  VP                  R J d   V P                  P	                  VP
                  4       . pVP                   F8  pVP                  V P                  P                  VP
                  4      ^4      pK:  	  V FK  pVP                  R J g   K  VP                  P                  V4       VP                  P                  V4       KM  	  R# R# r   )r,   r   r*   r   r  r#   r+   r   r  r   r   r5   r(   r  r  r   r   Z&XMLMenuBuilder.generate_only_allocated  s    }}G((1 % 4'JJ''5K

"jj)D)DT\\)RTUV #(	==D(%%,,T2 $$++I6 ) (r   c                s   VP                    F  pV P                  V4       K  	  VP                   EF  pVP                  VP                  4      pV'       g   K)  VP                  VP
                  4      pVP
                  P                  R 4      pRp\        V4      ^ 8  d   V'       g   TpVP                  V^ ,          4      pV'       gA   \        4       pV^ ,          Vn	        \        V4      ^8  d   RVn
        VP                  V4       TpVP                  ^ 4       K  XV,          pVP                  P                   P                  V4       EK!  	  R# )rU   NT)r,   r   r)   rX   r   r   rV   rW   r   r   r    r6   r[   r   r~   )	r.   r   r<   r;   Zmove_from_menuZmove_to_menurl   Z	oldparentr   s	   &&       r   r   ZXMLMenuBuilder.handle_moves  s    }}Gg& % JJD!\\$((3N~#||DHH5s+ 	%j1n$$(	'//a9G""&&',Qxu:>/3G,!,,W5 'IIIaL>)%%..55nE- r   )r   r   r   r   r   r1   )r   r   r   r   r/   r   r   r   r  r   r   r  r  r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   r   r   r   r   r   r   r   a  s     +Z
2=h D	  H)
R/
_6 j
04
$L"6r7"7 F Fr   r   c                   sD   a  ] tR tRt o RtR tR	R ltR tR
R ltRt	V t
R# )r   i5  zClass to cache Desktop Entriesc                s@    / V n         . V P                   R &   / V n        R# )legacyN)cacheEntriesr   r-   r   r   r/   ZMenuEntryCache.__init__7  s!    &((#
r   c                s    V F7  pW@P                   9   d   K  . V P                   V&   V P                  VR W#4       K9  	  R# )r   N)r!  _MenuEntryCache__addFiles)r.   r   r   r   r   s   &&&& r   r  ZMenuEntryCache.add_menu_entries<  s8    D,,,*,!!$'b&9 r   c                s   \         P                  ! \         P                  P                  W4      4       EF  pVP	                  R 4      '       d{    \        \         P                  P                  W%4      W4      pT P                  T,          P                  T4       T'       d%   T P                  R,          P                  T4       K  K  \         P                  P                  \         P                  P                  WV4      4      '       g   K  V'       d   K  V P                  V\         P                  P                  W%4      W44       EK  	  R#   \         d     EK*  i ; i)z.desktopr   N)r\   r  rY   r]   r   ru   r   r!  r5   r   r"  )r.   r   Zsubdirr   r   r  rS   s   &&&&&  r   Z
__addFilesZMenuEntryCache.__addFilesB  s    JJrww||D9:D}}Z(( )"'',,v*Dd SI !!$'..y9%%h/66yA rww||D$?@@bggll6&@&Q ; $ s   )EEEc                s   . p\        4       pVR ,          pV'       d   VP                  R4       RP                  V4      p V P                  V,          #   \         d     Mi ; iT F  pT P
                  T,           F  p TP                  T9  d/   TP                  TP                  4       TP                  T4       KC  TP                  4       \        P                  8X  dG   TP                  T4      p	Y9,          p
T
P                  4       \        P                  8X  d	   Yn        K  K  K    \         d     K  i ; i	  K  	  Y0P                  T&   T# )rm   r   r   )ro   r5   r]   r   ZKeyErrorr!  rQ   rq   r   ru   r   Zindexr   r   r  )r.   r   r   ZentriesZidsZappdirsZkeyr   rS   ZidxrN   s   &&&        r   r  ZMenuEntryCache.get_menu_entriesP  s#   eq'NN8$ggg	::c?" 		D!..t44	 ..c9	 7 78y1"**,	0E0EE%mmI6 ' ==?i.A.AA-6N B	 F *  5  "

3s+   A A"!A"=D+ A%D++D:9D:)r   r!  N)r   F)T)r   r   r   r   r   r/   r  r"  r  r   r   r   r   r   r   r   5  s"     $
:R r   r   c                s6    \        V4      P                  V 4      # )zQHelper function.
Equivalent to calling xdg.Menu.XMLMenuBuilder().parse(filename)
)r   r   )r   r   rB   r   r   r   o  s     % &&x00r   r  )1r   r\   r   r  r
   r	   Zxml.etree.cElementTreer   ZcElementTreeZImportErrorZxml.etree.ElementTreeZElementTreeZxdg.BaseDirectoryr    r   Zxdg.DesktopEntryr   Zxdg.Exceptionsr   Zxdg.utilr   Z
xdg.Localery   Z
xdg.Configr   r   rt   rv   rw   r}   r{   rx   r   r   r'   r   ru   rh   r   r   r   r   r   r   r   Zobjectr   r   r   ) r   r   <module>r#     s  & 
   
 
*** = ) '   1 
	
l) l)^	( ( 0+ +\_" _"D    )#QFV QFh7 7t1i"  *))*s   	C CC