o =Œ_íIã@s dZddlZz ddlmmZWney#ddlmmZYnwddlm Z m Z m Z m Z m Z ddlmZmZddlmZddlmZGdd„deƒZdS) z CLass to edit XDG Menus éN)ÚMenuÚ MenuEntryÚLayoutÚ SeparatorÚXMLMenuBuilder)Úxdg_config_dirsÚ xdg_data_dirs)Ú ParsingError)Ú setRootModec@s\eZdZdQdd„ZdQdd„Zdd„ZdRd d „ZdSd d „ZdTd d„ZdTdd„Z dTdd„Z dTdd„Z dTdd„Z dUdd„Z dVdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Z d-d.„Zd/d0„Zd1d2„Zd3d4„ZdWd6d7„Zd8d9„Zd:d;„ZdXd=d>„Zd?d@„Z dAdB„Z!dCdD„Z"dTdEdF„Z#dTdGdH„Z$dIdJ„Z%dKdL„Z&dMdN„Z'dOdP„Z(dS)YÚ MenuEditorNFcCs2d|_d|_d|_tƒ|_| |||¡g|_dS©N)ÚmenuÚfilenameÚtreerÚparserÚparseÚ filenames©Úselfr rÚroot©rú0/usr/lib/python3/dist-packages/xdg/MenuEditor.pyÚ__init__s  zMenuEditor.__init__cCsì|rtdƒt|tƒr||_n|r|j |¡|_n|j ¡|_|r'|jj|_n|r-||_ntj   t ddtj   |jj¡d¡|_z t  |j¡|_Wn$tyat  d|jj¡}t  |¡|_Yn tymtd|jƒ‚w| |j¡dS)NTrÚmenusézÞ Applications %s zNot a valid .menu file)r Ú isinstancerr rrÚFilenamerÚosÚpathÚjoinrÚsplitÚetreerÚIOErrorÚ fromstringÚ ElementTreer Ú$_MenuEditor__remove_whitespace_nodesrrrrr$s.   & ú  ÿzMenuEditor.parsecCs| |j¡| ¡dSr )Ú_MenuEditor__saveEntriesr Ú_MenuEditor__saveMenu©rrrrÚsaveGs  zMenuEditor.savec CsDt| |d¡ƒ} | | ||||||¡} | || || ¡|j ¡| S)Nú.desktop)rÚ_MenuEditor__getFileNameÚ editMenuEntryÚ_MenuEditor__addEntryr Úsort) rÚparentÚnameÚcommandÚ genericnameÚcommentÚiconÚterminalÚafterÚbeforeÚ menuentryrrrÚcreateMenuEntryKs  zMenuEditor.createMenuEntryc CsXtƒ}||_|jd|_|j|_|j|_| |||||¡}| ||||¡|j ¡|S)Nr) rÚParentÚDepthÚ DefaultLayoutrÚeditMenur-r r.) rr/r0r2r3r4r6r7r rrrÚ createMenuUs  zMenuEditor.createMenucCs&t|ƒ}| ||||¡|j ¡|Sr )rr-r r.)rr/r6r7Ú separatorrrrÚcreateSeparatores zMenuEditor.createSeparatorcCs.| ||||¡| ||||¡|j ¡|Sr ©Ú_MenuEditor__deleteEntryr-r r.©rr8Ú oldparentÚ newparentr6r7rrrÚ moveMenuEntrynó zMenuEditor.moveMenuEntryc Cs‚| ||||¡| ||||¡| |jj¡}| d¡| d¡kr:| |tj  | d¡|j¡tj  | d¡|j¡¡|j  ¡|S)NT) rBr-Ú_MenuEditor__getXmlMenur ÚNameÚgetPathÚ_MenuEditor__addXmlMoverrrr.)rr rDrEr6r7Ú root_menurrrÚmoveMenuvs2 zMenuEditor.moveMenucCs.| ||||¡| ||||¡|j ¡|Sr rA)rr?r/r6r7rrrÚ moveSeparator‚rGzMenuEditor.moveSeparatorcCs| ||||¡|j ¡|Sr )r-r r.rCrrrÚ copyMenuEntryŠs zMenuEditor.copyMenuEntryc Cs>|j} |r|  d¡s|  d|¡| jd|dd|r-|  d¡s%|  d|¡| jd|dd|rB|  d¡s:|  d|¡| jd|dd|rJ|  d|¡|rR|  d|¡|r[|  dd ¡n|sc|  dd ¡|durn|  d d ¡n |d urx|  d d ¡| durƒ|  d d ¡n | d ur|  d d ¡| ¡t|jƒdkr|j ¡|S)NrIT©ÚlocaleÚCommentÚ GenericNameÚExecÚIconÚTerminalÚtrueÚfalseÚ NoDisplayFÚHiddenr)Ú DesktopEntryÚhasKeyÚsetÚupdateAttributesÚlenÚParentsr r.) rr8r0r2r3r1r4r5Ú nodisplayÚhiddenÚ deskentryrrrr,‘sB            zMenuEditor.editMenuEntryc CsÈt|jtƒr)|jjdkr)| | dd¡¡}| |d|jd¡|j |jd¡n4t|jtƒs]|s4|j}|  |d¡  dd¡} |jsH|   dd¡|_| | dd¡¡}| |d| ¡t| ƒ|_|jj } |rv|   d¡sn|   d|¡| j d|dd|r‹|   d¡sƒ|   d|¡| j d|dd|r |   d ¡s˜|   d |¡| j d |dd|r¨|   d |¡|dur³|   d d ¡n |d ur½|   d d¡|durÈ|   dd ¡n |d urÒ|   dd¡|j ¡t|jtƒrâ|j ¡|S)Nú .directoryTÚ Directoryú/ÚrIrPrSrRrUrYrWFrXrZ)rrerrrHrJÚ_MenuEditor__addXmlTextElementrIÚ setAttributesr+Úreplacer[r\r]r^r:rr r.) rr r0r2r3r4rarbÚxml_menurrcrrrr=»sP              zMenuEditor.editMenucCó|j|dddS©NT)ra©r,©rr8rrrÚ hideMenuEntryîózMenuEditor.hideMenuEntrycCs|j|ddddS)NF©rarbrnrorrrÚunhideMenuEntryñszMenuEditor.unhideMenuEntrycCrlrm)r=©rr rrrÚhideMenuôrqzMenuEditor.hideMenucCsT|j|ddd| | dd¡d¡}| d¡}| d¡}||D]}| |¡q dS)NFrrTÚDeletedÚ NotDeleted)r=rHrJÚfindallÚremove)rr rkÚdeletedÚ not_deletedÚnoderrrÚ unhideMenu÷s    ÿzMenuEditor.unhideMenucCsB| |¡dkr| |jj¡|jD]}| ||¡q|j ¡|S)NÚdelete)Ú getActionÚ_MenuEditor__deleteFiler[rr`rBr r.)rr8r/rrrÚdeleteMenuEntryÿs   zMenuEditor.deleteMenuEntrycCs|| |¡dkr<| |jj¡g|j_|jD]!}|j |¡}|j|j|<|j |¡}|j|j|<|jj  |¡q|j   ¡|S©NÚrevert) rr€r[rÚOriginalr`ÚEntriesÚindexÚ MenuEntriesÚappendr r.)rr8r/r†rrrÚrevertMenuEntrys      zMenuEditor.revertMenuEntrycCs`| |¡dkr.| |jjj¡| |j|¡| | dd¡¡}|  |¡}|  |¡|j   ¡|S)Nr~T) rr€rer[rrBr:rHrJÚ_MenuEditor__get_parent_noderyr r.)rr rkr/rrrÚ deleteMenus   zMenuEditor.deleteMenucCs6| |¡dkr| |jjj¡|jj|_|j ¡|Sr‚)rr€rer[rr„r r.rtrrrÚ revertMenus   zMenuEditor.revertMenucCs |j|j|dd|j ¡|S)NT)r6)rBr:r r.)rr?rrrÚdeleteSeparator%s zMenuEditor.deleteSeparatorcCsŒt|tƒr-t|jtƒs dS|j ¡dkrdS|j ¡dkr+t|jƒt|jƒdkr+dSdSt|tƒrD| ¡dkr:dS| ¡dkrBdSdSdS)NÚnoneÚBothrƒÚUserrr~)rrrerÚgetTyper_ÚSubmenusr‡)rÚentryrrrr-s$  þ ø  zMenuEditor.getActioncCs^|s|j}t|jtƒr|j ¡|jddD]}t|tƒr"| ¡qt|tƒr,| |¡qdS)NT)rb)r rrerr)Ú getEntriesrr&)rr r“rrrÚ __saveEntriesBs      €üzMenuEditor.__saveEntriescCs@tj tj |j¡¡st tj |j¡¡|jj|jdddS)Nzutf-8)Úencoding)rrÚisdirÚdirnamerÚmakedirsrÚwriter(rrrÚ __saveMenuMszMenuEditor.__saveMenucCsˆd} |dkr ||}n |dt|ƒ|}|dkrd}n|dkr#d}||jvr?tj tj td||¡¡s?|j |¡ |S|d7}q)Nrrú-r*Ú applicationsrdzdesktop-directories)ÚstrrrrÚisfilerrrˆ)rr0Ú extensionÚpostfixrÚdirrrrÚ __getFileNameRs" ÿ þñzMenuEditor.__getFileNameTcCs¦|s|j}d|vr| dd¡\}}n|}d}d}| d¡D]}| d¡}|j|kr5|r3| |||¡}n|}|r9nq|sQ|rQ| ||¡}|rO| |||¡}|S|}|S)NrfrrgrrI)rr rxÚfindÚtextrHÚ_MenuEditor__addXmlMenuElement)rrÚcreateÚelementr0Úfoundr|Ú name_noderrrÚ __getXmlMenugs.  ÿ þzMenuEditor.__getXmlMenucCs"t d|¡}t d|¡}||_|S)NrrI©r!Ú SubElementr¥)rr¨r0Ú menu_noderªrrrÚ__addXmlMenuElement‡s  zMenuEditor.__addXmlMenuElementcCst ||¡}||_|Sr r¬)rr¨r0r¥r|rrrÚ__addXmlTextElements zMenuEditor.__addXmlTextElementÚIncludec Csj| d¡}| d¡}||}|D]}|djdkr%|dj|kr%| |¡qt ||¡}| |d|¡|S)Nr±ÚExcluderr)rxÚtagr¥ryr!r­rh) rr¨rÚtype_ÚincludesÚexcludesÚrulesÚruler|rrrÚ__addXmlFilename’s   € zMenuEditor.__addXmlFilenamecCs,t d|¡}| |d|¡| |d|¡|S)NÚMoveÚOldÚNew)r!r­rh)rr¨ÚoldÚnewr|rrrÚ __addXmlMove¨s zMenuEditor.__addXmlMovecCs¶| d¡D]}| |¡qt d|¡}|jD]B}|ddkr%t d|¡}q|ddkr5| |d|d¡}q|ddkrE| |d|d¡}q|ddkrXt d|¡}|d|jd<q|S) NrrrrrÚMenunameÚMergeÚtype)rxryr!r­ÚorderrhÚattrib)rr¨Úlayoutr|rÃÚchildrrrÚ__addXmlLayout®s        €zMenuEditor.__addXmlLayoutcCs¶tƒ}g|_|jj|_|jj|_|jj|_|jj|_|jj|_|j ddg¡|jD]#}t |t ƒr8|  |j ¡q*t |t ƒrD| |j¡q*t |tƒrM| ¡q*|j ddg¡||_|S)NrÁrÚfiles)rrÃÚ show_emptyÚinlineÚ inline_headerÚ inline_aliasÚ inline_limitrˆr…rrÚ parseMenunamerIrÚ parseFilenameÚ DesktopFileIDrÚparseSeparator)rr/rÅr“rrrÚ __addLayoutÁs&         €zMenuEditor.__addLayoutcCsÌ|s|r|r|j |¡d}n|r|j |¡}|j ||¡n|j |¡| | dd¡¡}t|tƒrH|j |¡|j  |¡|  ||j d¡n t|t ƒrR|  |¡|sV|rd| |¡| ||j¡dSdS)NrTr±)r…r†ÚinsertrˆrHrJrrr‡r`Ú_MenuEditor__addXmlFilenamerÐrÚ addSubmenuÚ_MenuEditor__addLayoutÚ_MenuEditor__addXmlLayoutr)rr/r“r6r7r†Ú xml_parentrrrÚ __addEntryØs$        þzMenuEditor.__addEntrycCs|j |¡| | dd¡¡}t|tƒr)|j |¡|j |¡| ||j d¡n t|t ƒr4|j  |¡|s8|rF|  |¡|  ||j¡dSdS)NTr²)r…ryrHrJrrr`r‡rÔrÐrr’rÖr×r)rr/r“r6r7rØrrrÚ __deleteEntryïs       þzMenuEditor.__deleteEntrycCsJzt |¡Wn tyYnwz |j |¡WdSty$YdSwr )rryÚOSErrorrÚ ValueError)rrrrrÚ __deleteFileÿs ÿ ÿzMenuEditor.__deleteFilecCsH|D]}|j ¡}|sd|_|j ¡}|sd|_t|ƒr!| |¡qdS)Nrg)r¥ÚstripÚtailr_Ú$_MenuEditor__remove_whilespace_nodes)rr|rÆr¥rßrrrÚ__remove_whitespace_nodes s   €øz$MenuEditor.__remove_whitespace_nodescCs&| ¡D] \}}||ur|SqdSr )Ú_MenuEditor__iter_parent)rr|r/rÆrrrÚ__get_parent_nodes ÿÿzMenuEditor.__get_parent_nodeccs*|j ¡D] }|D]}||fVq qdSr )rÚ getiterator)rr/rÆrrrÚ __iter_parents € ÿÿzMenuEditor.__iter_parent)NNF)NNNNNNN)NNNNN)NN)NNNNNNNN)NNNNNN)TN)r±))Ú__name__Ú __module__Ú __qualname__rrr)r9r>r@rFrMrNrOr,r=rprsrur}rr‰r‹rŒrrr&r'r+rHr¦rhrÔrKr×rÖr-rBr€r%rŠrârrrrr sP  #      *3          r )Ú__doc__rÚxml.etree.cElementTreer!Ú cElementTreeÚ ImportErrorÚxml.etree.ElementTreer$Úxdg.MenurrrrrÚxdg.BaseDirectoryrrÚxdg.Exceptionsr Ú xdg.Configr Úobjectr rrrrÚs ÿ