o =_I@sdZddlZz ddlmmZWney#ddlmmZYnwddlm Z m Z m Z m Z m Z ddlmZmZddlmZddlmZGdddeZdS) z CLass to edit XDG Menus N)Menu MenuEntryLayout SeparatorXMLMenuBuilder)xdg_config_dirs xdg_data_dirs) ParsingError) setRootModec@s\eZdZdQddZdQddZddZdRd d ZdSd d ZdTd dZdTddZ dTddZ dTddZ dTddZ dUddZ dVddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Z d-d.Zd/d0Zd1d2Zd3d4ZdWd6d7Zd8d9Zd:d;ZdXd=d>Zd?d@Z dAdBZ!dCdDZ"dTdEdFZ#dTdGdHZ$dIdJZ%dKdLZ&dMdNZ'dOdPZ(dS)Y MenuEditorNFcCs2d|_d|_d|_t|_||||g|_dSN)menufilenametreerparserparse filenamesselfr rrootr0/usr/lib/python3/dist-packages/xdg/MenuEditor.py__init__s  zMenuEditor.__init__cCs|rtdt|tr||_n|r|j||_n|j|_|r'|jj|_n|r-||_ntj t ddtj |jjd|_z t |j|_Wn$tyat d|jj}t ||_Yn tymtd|jw||jdS)NTrmenusz Applications %s zNot a valid .menu file)r isinstancerr rrFilenamerospathjoinrsplitetreerIOError fromstring ElementTreer $_MenuEditor__remove_whitespace_nodesrrrrr$s.   &   zMenuEditor.parsecCs||j|dSr )_MenuEditor__saveEntriesr _MenuEditor__saveMenurrrrsaveGs  zMenuEditor.savec CsDt||d} || ||||||} ||| || |j| S)N.desktop)r_MenuEditor__getFileName editMenuEntry_MenuEditor__addEntryr sort) rparentnamecommand genericnamecommenticonterminalafterbefore menuentryrrrcreateMenuEntryKs  zMenuEditor.createMenuEntryc CsXt}||_|jd|_|j|_|j|_||||||}||||||j|S)Nr) rParentDepth DefaultLayoutreditMenur-r r.) rr/r0r2r3r4r6r7r rrr createMenuUs  zMenuEditor.createMenucCs&t|}||||||j|Sr )rr-r r.)rr/r6r7 separatorrrrcreateSeparatores zMenuEditor.createSeparatorcCs.|||||||||||j|Sr _MenuEditor__deleteEntryr-r r.rr8 oldparent newparentr6r7rrr moveMenuEntryn zMenuEditor.moveMenuEntryc Cs||||||||||||jj}|d|dkr:||tj |d|jtj |d|j|j |S)NT) rBr-_MenuEditor__getXmlMenur NamegetPath_MenuEditor__addXmlMoverrrr.)rr rDrEr6r7 root_menurrrmoveMenuvs2 zMenuEditor.moveMenucCs.|||||||||||j|Sr rA)rr?r/r6r7rrr moveSeparatorrGzMenuEditor.moveSeparatorcCs||||||j|Sr )r-r r.rCrrr copyMenuEntrys zMenuEditor.copyMenuEntryc Cs>|j} |r| ds| d|| jd|dd|r-| ds%| d|| jd|dd|rB| ds:| 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|jdkr|j|S)NrITlocaleComment GenericNameExecIconTerminaltruefalse NoDisplayFHiddenr) DesktopEntryhasKeysetupdateAttributeslenParentsr r.) rr8r0r2r3r1r4r5 nodisplayhidden deskentryrrrr,sB            zMenuEditor.editMenuEntryc Cst|jtr)|jjdkr)||dd}||d|jd|j|jdn4t|jts]|s4|j}| |d dd} |jsH| dd|_||dd}||d| t| |_|jj } |rv| dsn| d|| j d|dd|r| ds| 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|jt|jtr|j|S)N .directoryT Directory/rIrPrSrRrUrYrWFrXrZ)rrerrrHrJ_MenuEditor__addXmlTextElementrI setAttributesr+replacer[r\r]r^r:rr r.) rr r0r2r3r4rarbxml_menurrcrrrr=sP              zMenuEditor.editMenucC|j|dddSNT)rar,rr8rrr hideMenuEntryzMenuEditor.hideMenuEntrycCs|j|ddddS)NFrarbrnrorrrunhideMenuEntryszMenuEditor.unhideMenuEntrycCrlrm)r=rr rrrhideMenurqzMenuEditor.hideMenucCsT|j|ddd||ddd}|d}|d}||D]}||q dS)NFrrTDeleted NotDeleted)r=rHrJfindallremove)rr rkdeleted not_deletednoderrr unhideMenus    zMenuEditor.unhideMenucCsB||dkr||jj|jD]}|||q|j|S)Ndelete) getAction_MenuEditor__deleteFiler[rr`rBr r.)rr8r/rrrdeleteMenuEntrys   zMenuEditor.deleteMenuEntrycCs|||dkr<||jjg|j_|jD]!}|j|}|j|j|<|j|}|j|j|<|jj |q|j |SNrevert) rrr[rOriginalr`Entriesindex MenuEntriesappendr r.)rr8r/rrrrrevertMenuEntrys      zMenuEditor.revertMenuEntrycCs`||dkr.||jjj||j|||dd}| |}| ||j |S)Nr~T) rrrer[rrBr:rHrJ_MenuEditor__get_parent_noderyr r.)rr rkr/rrr deleteMenus   zMenuEditor.deleteMenucCs6||dkr||jjj|jj|_|j|Sr)rrrer[rrr r.rtrrr revertMenus   zMenuEditor.revertMenucCs |j|j|dd|j|S)NT)r6)rBr:r r.)rr?rrrdeleteSeparator%s zMenuEditor.deleteSeparatorcCst|tr-t|jts dS|jdkrdS|jdkr+t|jt|jdkr+dSdSt|trD|dkr:dS|dkrBdSdSdS)NnoneBothrUserrr~)rrrergetTyper_Submenusr)rentryrrrr-s$    zMenuEditor.getActioncCs^|s|j}t|jtr|j|jddD]}t|tr"|qt|tr,||qdS)NT)rb)r rrerr) getEntriesrr&)rr rrrr __saveEntriesBs      zMenuEditor.__saveEntriescCs@tjtj|jsttj|j|jj|jdddS)Nzutf-8)encoding)rrisdirdirnamermakedirsrwriter(rrr __saveMenuMszMenuEditor.__saveMenucCsd} |dkr ||}n |dt||}|dkrd}n|dkr#d}||jvr?tjtjtd||s?|j| |S|d7}q)Nrr-r* applicationsrdzdesktop-directories)strrrrisfilerrr)rr0 extensionpostfixrdirrrr __getFileNameRs"  zMenuEditor.__getFileNameTcCs|s|j}d|vr|dd\}}n|}d}d}|dD]}|d}|j|kr5|r3||||}n|}|r9nq|sQ|rQ|||}|rO||||}|S|}|S)NrfrrgrrI)rr rxfindtextrH_MenuEditor__addXmlMenuElement)rrcreateelementr0foundr| name_noderrr __getXmlMenugs.   zMenuEditor.__getXmlMenucCs"td|}td|}||_|S)NrrIr! SubElementr)rrr0 menu_noderrrr__addXmlMenuElements  zMenuEditor.__addXmlMenuElementcCst||}||_|Sr r)rrr0rr|rrr__addXmlTextElements zMenuEditor.__addXmlTextElementIncludec Csj|d}|d}||}|D]}|djdkr%|dj|kr%||qt||}||d||S)NrExcluderr)rxtagrryr!rrh) rrrtype_includesexcludesrulesruler|rrr__addXmlFilenames    zMenuEditor.__addXmlFilenamecCs,td|}||d|||d||S)NMoveOldNew)r!rrh)rroldnewr|rrr __addXmlMoves zMenuEditor.__addXmlMovecCs|dD]}||qtd|}|jD]B}|ddkr%td|}q|ddkr5||d|d}q|ddkrE||d|d}q|ddkrXtd|}|d|jd<q|S) NrrrrrMenunameMergetype)rxryr!rorderrhattrib)rrlayoutr|rchildrrr__addXmlLayouts        zMenuEditor.__addXmlLayoutcCst}g|_|jj|_|jj|_|jj|_|jj|_|jj|_|jddg|jD]#}t |t r8| |j q*t |t rD||jq*t |trM|q*|jddg||_|S)Nrrfiles)rr show_emptyinline inline_header inline_alias inline_limitrrrr parseMenunamerIr parseFilename DesktopFileIDrparseSeparator)rr/rrrrr __addLayouts&         zMenuEditor.__addLayoutcCs|s|r|r|j|d}n|r|j|}|j||n|j|||dd}t|trH|j||j || ||j dn t|t rR| ||sV|rd|||||jdSdS)NrTr)rrinsertrrHrJrrrr`_MenuEditor__addXmlFilenamerr addSubmenu_MenuEditor__addLayout_MenuEditor__addXmlLayoutr)rr/rr6r7r xml_parentrrr __addEntrys$        zMenuEditor.__addEntrycCs|j|||dd}t|tr)|j||j||||j dn t|t r4|j ||s8|rF| || ||jdSdS)NTr)rryrHrJrrr`rrrrrrrr)rr/rr6r7rrrr __deleteEntrys       zMenuEditor.__deleteEntrycCsJzt|Wn tyYnwz |j|WdSty$YdSwr )rryOSErrorr ValueError)rrrrr __deleteFiles  zMenuEditor.__deleteFilecCsH|D]}|j}|sd|_|j}|sd|_t|r!||qdS)Nrg)rstriptailr_$_MenuEditor__remove_whilespace_nodes)rr|rrrrrr__remove_whitespace_nodes s   z$MenuEditor.__remove_whitespace_nodescCs&|D] \}}||ur|SqdSr )_MenuEditor__iter_parent)rr|r/rrrr__get_parent_nodes zMenuEditor.__get_parent_nodeccs*|jD] }|D]}||fVq qdSr )r getiterator)rr/rrrr __iter_parents  zMenuEditor.__iter_parent)NNF)NNNNNNN)NNNNN)NN)NNNNNNNN)NNNNNN)TN)r))__name__ __module__ __qualname__rrr)r9r>r@rFrMrNrOr,r=rprsrur}rrrrrrr&r'r+rHrrhrrKrrr-rBrr%rrrrrrr sP  #      *3          r )__doc__rxml.etree.cElementTreer! cElementTree ImportErrorxml.etree.ElementTreer$xdg.Menurrrrrxdg.BaseDirectoryrrxdg.Exceptionsr xdg.Configr objectr rrrrs