o
    0²ÊGáG  ã                   @   sV   d Z ddlT ddlT ddlT ddlT ddlT ddlZddlZddl	Z	G dd„ dƒZ
dS )z CLass to edit XDG Menus é    )Ú*Nc                   @   sT  e Zd ZdOdd„ZdOdd„Zdd„ ZdPd	d
„ZdQdd„ZdRdd„ZdRdd„Z	dRdd„Z
dRdd„ZdRdd„ZdSdd„ZdTdd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Z	 d-d.„ Zd/d0„ Zd1d2„ Zd3d4„ ZdUd6d7„Zd8d9„ Zd:d;„ ZdVd=d>„Zd?d@„ Z dAdB„ Z!dCdD„ Z"dEdF„ Z#dRdGdH„Z$dRdIdJ„Z%dKdL„ Z&dMdN„ Z'dS )WÚ
MenuEditorNFc                 C   s*   d | _ d | _d | _|  |||¡ g | _d S ©N)ÚmenuÚfilenameÚdocÚparseÚ	filenames©Úselfr   r   Úroot© r   ú@/var/www/html/env/lib/python3.10/site-packages/xdg/MenuEditor.pyÚ__init__   s
   
zMenuEditor.__init__c                 C   sô   |dkrt dƒ t|tƒr|| _n|rt|ƒ| _ntƒ | _|dkr'| jj| _n|r-|| _ntj 	t
d dtj | jj¡d ¡| _ztjj | j¡| _W n& tyb   tjj d| jj d ¡| _Y n tjjjyq   td| jƒ‚w |  | j¡ d S )NTr   Úmenusé   z«<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN" "http://standards.freedesktop.org/menu-spec/menu-1.0.dtd"><Menu><Name>Applications</Name><MergeFile type="parent">z</MergeFile></Menu>zNot a valid .menu file)ÚsetRootModeÚ
isinstanceÚMenur   r   ÚFilenamer   ÚosÚpathÚjoinÚxdg_config_dirsÚsplitÚxmlÚdomÚminidomr   ÚIOErrorÚparseStringÚparsersÚexpatÚ
ExpatErrorÚParsingErrorÚ$_MenuEditor__remove_whilespace_nodesr
   r   r   r   r   !   s(   
& ÿzMenuEditor.parsec                 C   s   |   | j¡ |  ¡  d S r   )Ú_MenuEditor__saveEntriesr   Ú_MenuEditor__saveMenu)r   r   r   r   Úsave<   s   zMenuEditor.savec
              	   C   sD   t |  |d¡ƒ}
|  |
||||||¡}
|  ||
||	¡ t| jƒ |
S )Nú.desktop)Ú	MenuEntryÚ_MenuEditor__getFileNameÚeditMenuEntryÚ_MenuEditor__addEntryÚsortr   )r   ÚparentÚnameÚcommandÚgenericnameÚcommentÚiconÚterminalÚafterÚbeforeÚ	menuentryr   r   r   ÚcreateMenuEntry@   s
   
zMenuEditor.createMenuEntryc           	      C   sX   t ƒ }||_|jd |_|j|_|j|_|  |||||¡}|  ||||¡ t| jƒ |S )Nr   )	r   ÚParentÚDepthÚDefaultLayoutÚLayoutÚeditMenur,   r-   r   )	r   r.   r/   r1   r2   r3   r5   r6   r   r   r   r   Ú
createMenuJ   s   
zMenuEditor.createMenuc                 C   s&   t |ƒ}|  ||||¡ t| jƒ |S r   )Ú	Separatorr,   r-   r   )r   r.   r5   r6   Ú	separatorr   r   r   ÚcreateSeparatorZ   s   
zMenuEditor.createSeparatorc                 C   s.   |   ||||¡ |  ||||¡ t| jƒ |S r   ©Ú_MenuEditor__deleteEntryr,   r-   r   ©r   r7   Ú	oldparentÚ	newparentr5   r6   r   r   r   ÚmoveMenuEntryc   ó   
zMenuEditor.moveMenuEntryc              	   C   s‚   |   ||||¡ |  ||||¡ |  | jj¡}| d¡| d¡kr:|  |tj 	| d¡|j¡tj 	| d¡|j¡¡ t
| jƒ |S )NT)rC   r,   Ú_MenuEditor__getXmlMenur   ÚNameÚgetPathÚ_MenuEditor__addXmlMover   r   r   r-   )r   r   rE   rF   r5   r6   Ú	root_menur   r   r   ÚmoveMenuk   s   2
zMenuEditor.moveMenuc                 C   s.   |   ||||¡ |  ||||¡ t| jƒ |S r   rB   )r   r@   r.   r5   r6   r   r   r   ÚmoveSeparatorw   rH   zMenuEditor.moveSeparatorc                 C   s   |   ||||¡ t| jƒ |S r   )r,   r-   r   rD   r   r   r   ÚcopyMenuEntry   s   
zMenuEditor.copyMenuEntryc
                 C   sF  |j }
|r|
 d¡s|
 d|¡ |
jd|dd� |r-|
 d¡s%|
 d|¡ |
jd|dd� |rB|
 d¡s:|
 d|¡ |
jd|dd� |rJ|
 d|¡ |rR|
 d|¡ |dkr]|
 d	d
¡ n
|dkrg|
 d	d¡ |dkrr|
 dd
¡ n
|dkr||
 dd¡ |	dkr‡|
 dd
¡ n
|	dkr‘|
 dd¡ | ¡  t|jƒdkr¡t| jƒ |S )NrJ   T©ÚlocaleÚCommentÚGnericNeÚGenericNameÚExecÚIconÚTerminalÚtrueFÚfalseÚ	NoDisplayÚHiddenr   )ÚDesktopEntryÚhasKeyÚsetÚupdateAttributesÚlenÚParentsr-   r   )r   r7   r/   r1   r2   r0   r3   r4   Ú	nodisplayÚhiddenÚ	deskentryr   r   r   r+   †   sB   



zMenuEditor.editMenuEntryc                 C   sÈ  t |jtƒr)|jjdkr)|  | dd¡¡}|  |d|jd ¡ |j |jd ¡ n4t |jtƒs]|s4|j}|  	|d¡ 
dd¡}	|jsH|	 
dd¡|_|  | dd¡¡}|  |d|	¡ t|	ƒ|_|jj}
|rv|
 d¡sn|
 d|¡ |
jd|dd� |r‹|
 d¡sƒ|
 d|¡ |
jd|dd� |r |
 d	¡s˜|
 d	|¡ |
jd	|dd� |r¨|
 d
|¡ |dkr³|
 dd¡ n
|dkr½|
 dd¡ |dkrÈ|
 dd¡ n
|dkrÒ|
 dd¡ |j ¡  t |jtƒrât| jƒ |S )Nú
.directoryTÚ	Directoryú/Ú rJ   rQ   rU   rS   rW   r[   rY   FrZ   r\   )r   rg   r)   r   rI   rK   Ú_MenuEditor__addXmlTextElementrJ   ÚsetAttributesr*   Úreplacer]   r^   r_   r`   r9   r   r-   r   )r   r   r/   r1   r2   r3   rc   rd   Úxml_menur   re   r   r   r   r=   °   sP   





zMenuEditor.editMenuc                 C   ó   | j |dd� d S ©NT)rc   ©r+   ©r   r7   r   r   r   ÚhideMenuEntryã   ó   zMenuEditor.hideMenuEntryc                 C   s   | j |ddd� d S )NF©rc   rd   rp   rq   r   r   r   ÚunhideMenuEntryæ   s   zMenuEditor.unhideMenuEntryc                 C   rn   ro   )r=   ©r   r   r   r   r   ÚhideMenué   rs   zMenuEditor.hideMenuc                 C   sJ   | j |ddd� |  | dd¡d¡}|  ddg|¡D ]}|j |¡ qd S )NFrt   TÚDeletedÚ
NotDeleted)r=   rI   rK   Ú_MenuEditor__getXmlNodesByNameÚ
parentNodeÚremoveChild)r   r   rm   Únoder   r   r   Ú
unhideMenuì   s
   ÿzMenuEditor.unhideMenuc                 C   sB   |   |¡dkr|  |jj¡ |jD ]}|  ||¡ qt| jƒ |S )NÚdelete)Ú	getActionÚ_MenuEditor__deleteFiler]   r   rb   rC   r-   r   )r   r7   r.   r   r   r   ÚdeleteMenuEntryò   s   

zMenuEditor.deleteMenuEntryc                 C   s|   |   |¡dkr<|  |jj¡ g |j_|jD ]!}|j |¡}|j|j|< |j |¡}|j|j|< |jj 	|¡ qt
| jƒ |S ©NÚrevert)r€   r�   r]   r   ÚOriginalrb   ÚEntriesÚindexÚMenuEntriesÚappendr-   r   )r   r7   r.   r‡   r   r   r   ÚrevertMenuEntryú   s   

zMenuEditor.revertMenuEntryc                 C   sX   |   |¡dkr*|  |jjj¡ |  |j|¡ |  | dd¡¡}|j	 
|¡ t| jƒ |S )Nr   T)r€   r�   rg   r]   r   rC   r9   rI   rK   r{   r|   r-   r   )r   r   rm   r   r   r   Ú
deleteMenu  s   
zMenuEditor.deleteMenuc                 C   s6   |   |¡dkr|  |jjj¡ |jj|_t| jƒ |S rƒ   )r€   r�   rg   r]   r   r…   r-   r   rv   r   r   r   Ú
revertMenu  s
   

zMenuEditor.revertMenuc                 C   s    | j |j|dd� t| jƒ |S )NT)r5   )rC   r9   r-   r   )r   r@   r   r   r   ÚdeleteSeparator  s   
zMenuEditor.deleteSeparatorc                 C   sŒ   t |tƒr-t |jtƒsdS |j ¡ dkrdS |j ¡ dkr+t|jƒt|jƒ dkr+dS dS t |tƒrD| ¡ dkr:dS | ¡ dkrBdS dS dS )NÚnoneÚBothr„   ÚUserr   r   )r   r   rg   r)   ÚgetTypera   ÚSubmenusrˆ   )r   Úentryr   r   r   r€     s    


øzMenuEditor.getActionc                 C   s^   |s| j }t|jtƒr|j ¡  |jdd�D ]}t|tƒr"| ¡  qt|tƒr,|  |¡ qd S )NT)rd   )r   r   rg   r)   r'   Ú
getEntriesr   r%   )r   r   r“   r   r   r   Ú__saveEntries3  s   




€üzMenuEditor.__saveEntriesc              
   C   sd   t j t j | j¡¡st  t j | j¡¡ t| jdƒ}| t 	dd| j
 ¡  dd¡¡¡ | ¡  d S )NÚwz
[\s]*([^
<]*)
[\s]*</z\1</z<?xml version="1.0" ?>
ri   )r   r   ÚisdirÚdirnamer   ÚmakedirsÚopenÚwriteÚreÚsubr   Útoprettyxmlrl   Úclose)r   Úfdr   r   r   Ú
__saveMenu>  s
   "zMenuEditor.__saveMenuc                 C   sˆ   d}	 |dkr|| }n
|d t |ƒ | }|dkrd}n|dkr#d}|| jvr?tj tj td ||¡¡s?| j |¡ 	 |S |d7 }q)Nr   r   ú-r(   Úapplicationsrf   zdesktop-directories)Ústrr	   r   r   Úisfiler   Úxdg_data_dirsr‰   )r   r/   Ú	extensionÚpostfixr   Údirr   r   r   Ú__getFileNameE  s"   

ÿþòzMenuEditor.__getFileNameTc                 C   s¾   |s| j }d|v r| dd¡\}}n|}d}d }|  d|¡D ]%}|  d|¡D ]}|jd j|kr>|r:|  |||¡}n|} nq&|rC nq|s]|dkr]|  ||¡}|r[|  |||¡}|S |}|S )Nrh   r   ri   r   rJ   r   T)r   r   rz   Ú
childNodesÚ	nodeValuerI   Ú_MenuEditor__addXmlMenuElement)r   r   ÚcreateÚelementr/   Úfoundr}   Úchildr   r   r   Ú__getXmlMenuY  s2   ûÿþzMenuEditor.__getXmlMenuc                 C   s$   | j  d¡}|  |d|¡ | |¡S )Nr   rJ   )r   ÚcreateElementrj   ÚappendChild)r   r¯   r/   r}   r   r   r   Ú__addXmlMenuElementw  s   
zMenuEditor.__addXmlMenuElementc                 C   s,   | j  |¡}| j  |¡}| |¡ | |¡S r   )r   r³   ÚcreateTextNoder´   )r   r¯   r/   Útextr}   r   r   r   Ú__addXmlTextElement|  s   

zMenuEditor.__addXmlTextElementÚIncludec                 C   sp   |   ddg|¡D ]}|jd jdkr"|jd jd j|kr"| |¡ q| j |¡}| |  |d|¡¡ | |¡S )Nr¹   ÚExcluder   r   )	rz   r«   ÚnodeNamer¬   r|   r   r³   r´   rj   )r   r¯   r   Útyper}   r   r   r   Ú__addXmlFilename‚  s   &
€
zMenuEditor.__addXmlFilenamec                 C   s>   | j  d¡}| |  |d|¡¡ | |  |d|¡¡ | |¡S )NÚMoveÚOldÚNew)r   r³   r´   rj   )r   r¯   ÚoldÚnewr}   r   r   r   Ú__addXmlMove�  s   
zMenuEditor.__addXmlMovec                 C   sÔ   |   d|¡D ]}| |¡ q| j d¡}|jD ]M}|d dkr+| j d¡}| |¡ q|d dkr;|  |d|d ¡}q|d dkrK|  |d|d ¡}q|d dkrd| j d¡}| d|d ¡ | |¡ q| |¡S )	Nr<   r   r?   r   r   ÚMenunameÚMerger¼   )rz   r|   r   r³   Úorderr´   rj   ÚsetAttribute)r   r¯   Úlayoutr}   rÆ   r±   r   r   r   Ú__addXmlLayout“  s"   

€
zMenuEditor.__addXmlLayoutc                 c   s2   � |j D ]}|jtjjjkr|j|v r|V  qd S r   )r«   ÚnodeTyper   r   ÚNodeÚELEMENT_NODEr»   )r   r/   r¯   r±   r   r   r   Ú__getXmlNodesByName¨  s   €
€þzMenuEditor.__getXmlNodesByNamec                 C   s¶   t ƒ }g |_|j j|_|j j|_|j j|_|j j|_|j j|_|j ddg¡ |jD ]#}t	|t
ƒr8| |j¡ q*t	|tƒrD| |j¡ q*t	|tƒrM| ¡  q*|j ddg¡ ||_ |S )NrÅ   r   Úfiles)r<   rÆ   Ú
show_emptyÚinlineÚinline_headerÚinline_aliasÚinline_limitr‰   r†   r   r   ÚparseMenunamerJ   r)   ÚparseFilenameÚDesktopFileIDr?   ÚparseSeparator)r   r.   rÈ   r“   r   r   r   Ú__addLayout­  s&   








€zMenuEditor.__addLayoutc                 C   sÌ   |s|r|r|j  |¡d }n|r|j  |¡}|j  ||¡ n|j  |¡ |  | dd¡¡}t|tƒrH|j |¡ |j	 |¡ |  
||jd¡ n
t|tƒrR| |¡ |sV|rd|  |¡ |  ||j¡ d S d S )Nr   Tr¹   )r†   r‡   Úinsertr‰   rI   rK   r   r)   rˆ   rb   Ú_MenuEditor__addXmlFilenamerÖ   r   Ú
addSubmenuÚ_MenuEditor__addLayoutÚ_MenuEditor__addXmlLayoutr<   )r   r.   r“   r5   r6   r‡   Ú
xml_parentr   r   r   Ú
__addEntryÄ  s$   



þzMenuEditor.__addEntryc                 C   s�   |j  |¡ |  | dd¡¡}t|tƒr)|j |¡ |j |¡ |  ||j	d¡ nt|t
ƒr4|j |¡ |s8|rF|  |¡ |  ||j¡ d S d S )NTrº   )r†   ÚremoverI   rK   r   r)   rb   rˆ   rÚ   rÖ   r   r’   rÜ   rÝ   r<   )r   r.   r“   r5   r6   rÞ   r   r   r   Ú__deleteEntryÛ  s   


þzMenuEditor.__deleteEntryc                 C   sJ   zt  |¡ W n	 ty   Y nw z	| j |¡ W d S  ty$   Y d S w r   )r   rà   ÚOSErrorr	   Ú
ValueError)r   r   r   r   r   Ú__deleteFileë  s   ÿÿzMenuEditor.__deleteFilec                 C   sp   g }|j D ]%}|jtjjjjkr!|j ¡ |_|j ¡ s | 	|¡ q| 
¡ r*|  |¡ q|D ]}|j |¡ q-d S r   )r«   rÊ   r   r   r   rË   Ú	TEXT_NODEÚdataÚstripr‰   ÚhasChildNodesr$   r{   r|   )r   r}   Úremove_listr±   r   r   r   Ú__remove_whilespace_nodesõ  s   


€
€ÿz$MenuEditor.__remove_whilespace_nodes)NNF)NNNNNNN)NNNNN)NN)NNNNNNNN)NNNNNN)TN)r¹   )(Ú__name__Ú
__module__Ú__qualname__r   r   r'   r8   r>   rA   rG   rN   rO   rP   r+   r=   rr   ru   rw   r~   r‚   rŠ   r‹   rŒ   r�   r€   r%   r&   r*   rI   r­   rj   rÚ   rL   rÝ   rz   rÜ   r,   rC   r�   r$   r   r   r   r   r      sN    

	




	




*3	




r   )Ú__doc__Úxdg.MenuÚxdg.BaseDirectoryÚxdg.ExceptionsÚxdg.DesktopEntryÚ
xdg.ConfigÚxml.dom.minidomr   r   rœ   r   r   r   r   r   Ú<module>   s    