3
v_4                 @   s~   d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlZdd ZG dd dZdS )	z5
Base Class for DesktopEntry, IconTheme and IconData
    N)ParsingErrorDuplicateGroupErrorNoGroupError
NoKeyErrorDuplicateKeyErrorValidationErrordebug)uc             C   s*   y| j dd dS  tk
r$   dS X dS )z>Return True if a string consists entirely of ASCII characters.asciistrictTFN)encodeUnicodeError)s r   -/usr/lib/python3/dist-packages/xdg/IniFile.pyis_ascii   s
    r   c               @   s  e Zd ZdZdZdZdZdZd=ddZdd Z	d>dd	Z
d?ddZdd Zdd Zd@ddZdAddZdd Zdd ZdBddZdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdCd*d+ZdDd,d-Zd.d/ Zd0d1 ZdEd3d4Zd5d6 Zd7d8 Z dFd9d:Z!d;d< Z"dS )GIniFile NFc             C   s   t  | _|r| j| d S )N)dictcontentparse)selffilenamer   r   r   __init__   s    zIniFile.__init__c             C   s   t | j|jS )N)Zcmpr   )r   otherr   r   r   __cmp__#   s    zIniFile.__cmp__c          #   C   s  | j }tjj|std|ytj|dddd}W n0 tk
rb } ztrN|ndS W Y dd}~X nX x|D ]}|j	 }|sqlql|d dkrqlql|d d	kr|j
d	jd
}tr| j|rt||ni ||< qly|jdd\}}	W n$ tk
r
   td| |Y nX |j	 }y6tr8| j||r8t|||n|	j	 || |< W ql ttfk
rn   td|Y qlX qlW |j  || _d| _|rx2|D ]}
|
|kr|
| _P qW td|d  || j jdi }|jd|jdd| _dS )zyParse an INI file.
        
        headers -- list of headers the parser will try to select as a default header
        zFile not foundrzutf-8replace)encodingerrorsNr   #[]=   zInvalid line: z#Parsing error on key, group missingFz[%s]-Header missingzDesktop EntryzX-GNOME-Gettext-DomainzX-Ubuntu-Gettext-Domain)r   ospathisfiler   ioopenIOErrorr   striplstriprstriphasGroupr   split
ValueErrorhasKeyr   
IndexErrorUnboundLocalErrorcloser   tainteddefaultGroupgetgettext_domain)r   r   Zheadersr   fdelineZcurrentGroupkeyvalueheaderr   r   r   r   &   sV    



zIniFile.parsestringc             C   s  |s
| j }|| jkr~|| j| kr~|rn| j||}|jdsD| j rT| j| | }q|tj| j| j| | }q| j| | }n>tr|| jkrt|| j	q|| j| krt
||| j	nd}|dkr| j|}g }n|g}x|D ]}|dkr| j|}n|dkr,yt|}W n tk
r(   d}Y nX nr|dkr`yt|}W n tk
r\   d}Y nX n>|d	krvtj|}n(|d
kr|jd\}	}
t|	t|
f}|dkr|j| q|}qW |S )Nr"   r   Tbooleanintegerr   numericg        regexpoint,)r6   r   _IniFile__addLocaleendswithr8   gettextdgettextr   r   r   r   getList_IniFile__getBooleanintr0   floatrecompiler/   append)r   r<   grouplocaletypelistr=   valuesresultxyr   r   r   r7   p   sR    







zIniFile.getc             C   sl   t jd|rt jd|}n:t jd|r4t jd|}n t jd|rNt jd|}n|g}|d dkrh|j  |S )Nz	(?<!\\)\;z(?<!\\);z	(?<!\\)\|z(?<!\\),r$   r   )rN   searchr/   pop)r   r?   rT   r   r   r   rJ      s    zIniFile.getListc             C   s<   |dks|dks|dkrdS |dks4|dks4|dkr8dS dS )	Nr$   trueTrueTr   falseFalseFr   )r   r@   r   r   r   Z__getBoolean   s
    zIniFile.__getBooleanc             C   s>   |s
| j }x.tjjD ]"}d||f }|| j| kr|S qW |S )z3add locale to key according the current lc_messagesz%s[%s])r6   xdgLocalelangsr   )r   r<   rQ   ZlangZlangkeyr   r   r   Z__addLocale   s    zIniFile.__addLocaleAllc             C   s   g | _ g | _tjj| jd | _| j  xf| jD ]\}| j	| xL| j| D ]>}| j
|| j| | | | j| | dkrJ| j jd|  qJW q0W d}|dks|dkrx| j D ]}|d| 7 }qW |dks|dkrx| jD ]}|d| 7 }qW |rt|| jdS )	zValidate the contents, raising ``ValidationError`` if there
        is anything amiss.
        
        report can be 'All' / 'Warnings' / 'Errors'
        r$   r   zValue of Key '%s' is emptyrc   ZWarningsz
- ZErrorsN)warningsr   r%   r&   splitextr   fileExtensioncheckExtrasr   
checkGroupcheckKeyrP   r   )r   reportrQ   r<   msgr;   r   r   r   validate   s&    
zIniFile.validatec             C   s   d S )Nr   )r   rQ   r   r   r   rh      s    zIniFile.checkGroupc             C   s   d S )Nr   )r   r<   r=   rQ   r   r   r   ri      s    zIniFile.checkKeyc             C   s   |dkr| j |}n|g}x|D ]}|dkr6| j|}|dkrBq nb|dkrV| j|}nN|dkrj| j|}n:|dkr~| j|}n&|dkr| j|}n|dkr| j|}|d	kr| jjd
||f  q |dkr | j	jd|  q W d S )NTr?   Zlocalestringr@   rB   rA   rC   rD   r$   z'%s' is not a valid %s   zValue of key '%s' is deprecated)
rJ   checkStringcheckBooleancheckNumbercheckInteger
checkRegex
checkPointr   rP   rd   )r   r<   r=   rS   rT   rU   coder   r   r   
checkValue   s,    


zIniFile.checkValuec             C   s   d S )Nr   )r   r   r   r   rg     s    zIniFile.checkExtrasc             C   s,   |dks|dkrdS |dkp"|dks(dS d S )N10rm   r\   r^   r$   r   )r   r=   r   r   r   ro     s    zIniFile.checkBooleanc          	   C   s   yt | W n
   dS d S )Nr$   )rM   )r   r=   r   r   r   rp   #  s    zIniFile.checkNumberc          	   C   s   yt | W n
   dS d S )Nr$   )rL   )r   r=   r   r   r   rq   *  s    zIniFile.checkIntegerc             C   s   t jd|sdS d S )Nz^[0-9]+,[0-9]+$r$   )rN   match)r   r=   r   r   r   rs   1  s    zIniFile.checkPointc             C   s   t |rdS dS )Nr   r$   )r   )r   r=   r   r   r   rn   5  s    zIniFile.checkStringc          	   C   s   yt j| W n
   dS d S )Nr$   )rN   rO   )r   r=   r   r   r   rr   8  s    zIniFile.checkRegexc       
      C   s  | r| j  rtdd|r$|| _ n| j }tjj|r^tjjtjj| r^tjtjj| tj|ddd}|r|j	t
d | jr|j	t
d| j  x2| j| j j D ]\}}|j	t
d||f  qW |j	t
d	 xn| jj D ]`\}}|| jkr|j	t
d|  x,|j D ] \}}|j	t
d||f  qW |j	t
d	 qW W d Q R X |rtj|j}|tjB tjB tjB }	tj||	 d
| _d S )NzFile not foundr   wzutf-8)r   z#!/usr/bin/env xdg-open
z[%s]
z%s=%s

F)r   r   r%   r&   dirnameisdirmakedirsr(   r)   writer	   r6   r   itemsstatst_modeS_IXUSRS_IXGRPS_IXOTHchmodr5   )
r   r   Ztrustedfpr<   r=   namerQ   Zoldmodemoder   r   r   r~   ?  s4    
"
zIniFile.writec             C   s   |s
| j }|dkr:ttjjdkr:|d tjjd  d }y|| j| |< W n  tk
rl   t|| jY nX || j	||k| _
d S )NTr   r!   r"   )r6   lenr`   ra   rb   r   KeyErrorr   r   r7   r5   )r   r<   r=   rQ   rR   r   r   r   seth  s    zIniFile.setc             C   s0   | j |rtr,t|| jni | j|< d| _d S )NT)r.   r   r   r   r   r5   )r   rQ   r   r   r   addGroupw  s
    

zIniFile.addGroupc             C   s2   || j k}|r| j |= d| _ntr.t|| j|S )NT)r   r5   r   r   r   )r   rQ   Zexistedr   r   r   removeGroup  s    
zIniFile.removeGroupTc             C   s   |s
| j }yf|rXxFt| j| D ]4}tjd| tjj d |r ||kr | j| |= q W | j| j|}d| _	|S  t
k
r } z4tr||krt|| jqt||| jndS W Y d d }~X nX d S )N^$Tr   )r6   rT   r   rN   rx   r`   ra   rC   r[   r5   r   r   r   r   r   )r   r<   rQ   Zlocalesr   r=   r:   r   r   r   	removeKey  s     $zIniFile.removeKeyc             C   s
   | j j S )N)r   keys)r   r   r   r   groups  s    zIniFile.groupsc             C   s
   || j kS )N)r   )r   rQ   r   r   r   r.     s    zIniFile.hasGroupc             C   s   |s
| j }|| j| kS )N)r6   r   )r   r<   rQ   r   r   r   r1     s    zIniFile.hasKeyc             C   s   | j S )N)r   )r   r   r   r   getFileName  s    zIniFile.getFileName)N)N)NFr?   F)N)rc   )r?   F)NF)NF)NT)N)#__name__
__module____qualname__r6   rf   r   r8   r5   r   r   r   r7   rJ   rK   rF   rl   rh   ri   ru   rg   ro   rp   rq   rs   rn   rr   r~   r   r   r   r   r   r.   r1   r   r   r   r   r   r      s@   

J
;

(

)



r   )__doc__rN   r%   r   r(   Zxdg.Exceptionsr   r   r   r   r   r   r   Z
xdg.Localer`   Zxdg.utilr	   rH   r   r   r   r   r   r   <module>   s    $