
    ucH5                         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 Z G d d      Zy)z5
Base Class for DesktopEntry, IconTheme and IconData
    N)ParsingErrorDuplicateGroupErrorNoGroupError
NoKeyErrorDuplicateKeyErrorValidationErrordebug)uc                 H    	 | j                  dd       y# t        $ r Y yw xY w)z>Return True if a string consists entirely of ASCII characters.asciistrictTF)encodeUnicodeError)ss    -/usr/lib/python3/dist-packages/xdg/IniFile.pyis_asciir      s*    	(# s    	!!c                       e Zd ZdZdZdZdZdZddZd Z	ddZ
d dZd Zd	 Zdd
Zd!dZd Zd Zd"dZd Zd Zd Zd Zd Zd Zd Zd#dZd#dZd Zd Zd$dZd Zd Z ddZ!d Z"y)%IniFile NFc                 J    t               | _        |r| j                  |       y y N)dictcontentparse)selffilenames     r   __init__zIniFile.__init__   s    vJJx      c                 B    t        | j                  |j                        S r   )cmpr   )r   others     r   __cmp__zIniFile.__cmp__#   s    4<<//r   c                 &   | j                   }t        j                  j                  |      st	        d|      	 t        j                  |ddd      }|5  |D ]  }|j                         }|s|d   dk(  r|d   d	k(  rI|j                  d	      j                  d
      }t        r| j                  |      rt        ||      i ||<   p	 |j                  dd      \  }}	|j                         }	 t        r| j!                  |      rt#        |||      |	j                         |   |<    	 ddd       || _        d| _        |r&|D ]  }
|
|v s|
| _         n t	        d|d   z  |      | j                   j/                  di       }|j/                  d|j/                  dd            | _        y# t        $ r}t        r|Y d}~yd}~ww xY w# t        $ r t	        d|z   |      w xY w# t$        t&        f$ r t	        d|      w xY w# 1 sw Y   xY w)zyParse an INI file.
        
        headers -- list of headers the parser will try to select as a default header
        File not foundr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UnboundLocalErrorr   tainteddefaultGroupgetgettext_domain)r   r   headersr   fdelinecurrentGroupkeyvalueheaders              r   r   zIniFile.parse&   s6    ,,ww~~h'/::		 3KB  	\ \zz|!W^!W^#';;s#3#:#:3#?L|!<1,II02-N%)ZZQ%7
U ))+C\ T[[l%C"3Cx"PP9>GL1#67\	\@ ! ! QW$(.D%Q
 ##871:#ExPP LL_b1ee$<EE+T24k  			6 & N*+;d+BHMMN '(9: \*+PRZ[[\;	\ 	\sT   F. A3HGH.;G()H.	G	7GG	G%%H(HHHc                    |s| j                   }|| j                  v r|| j                  |   v r|rs| j                  ||      }|j                  d      s| j                  s| j                  |   |   }nt        j                  | j                  | j                  |   |         }ni| j                  |   |   }nV|st        rL|| j                  vrt        || j                        || j                  |   vrt        ||| j                        d}|dk(  r| j                        }g }	ng}|D ]  }|dk(  r| j                  |      }nn|dk(  r	 t        |      }n\|dk(  r	 t        |      }nJ|d	k(  rt!        j"                  |      }n/|d
k(  r*|j%                  d      \  }
}t        |
      t        |      f}|dk(  r	j'                  |       |}	 	S # t        $ r d}Y *w xY w# t        $ r d}Y ;w xY w)Nr,   r   Tbooleanintegerr   numericg        regexpoint,)r?   r   _IniFile__addLocaleendswithrA   gettextdgettextr	   r   r   r   getList_IniFile__getBooleanintr:   floatrecompiler9   append)r   rG   grouplocaletypelistr   rH   valuesresultxys               r   r@   zIniFile.geto   s   %%E T\\!t||E/B(B&&sE2<<$D,?,? LL/4E#,,T-@-@$,,uBUVYBZ[EU+C0,&udmm<<U 33$S%??4<\\%(FFWF 	Ey ))%0"JE " !%LE 

5){{3'1AAt|e$-	0 % " E
 "  E s$   
GG GG G.-G.c                 J   t        j                  d|      rt        j                  d|      }n]t        j                  d|      rt        j                  d|      }n0t        j                  d|      rt        j                  d|      }n|g}|d   dk(  r|j                          |S )Nz	(?<!\\)\;z(?<!\\);z	(?<!\\)\|z(?<!\\),r   )rY   searchr9   pop)r   stringr_   s      r   rU   zIniFile.getList   s|    99\6*88K0DYY|V,88L&1DYY{F+88K0D8D8r>HHJr   c                 D    |dk(  s
|dk(  s|dk(  ry|dk(  s
|dk(  s|dk(  ryy)	Nr.   trueTrueTr   falseFalseF )r   rK   s     r   __getBooleanzIniFile.__getBoolean   s5    a<7f,60A\W/7g3Er   c                     |s| j                   }t        j                  j                  D ]  }|d|d}|| j                  |   v s|c S  |S )z3add locale to key according the current lc_messagesr+   r,   )r?   xdgLocalelangsr   )r   rG   r\   langlangkeys        r   __addLocalezIniFile.__addLocale   sR     %%EJJ$$ 	D"%t,G$,,u--	
 
r   c                 |   g | _         g | _        t        j                  j	                  | j
                        d   | _        | j                          | j                  D ]~  }| j                  |       | j                  |   D ]Y  }| j                  || j                  |   |   |       | j                  |   |   dk(  s<| j                   j                  d|z         [  d}|dk(  s|dk(  r| j                   D ]
  }|d|z   z  } |dk(  s|dk(  r| j                  D ]
  }|d|z   z  } |rt        || j
                        y)	zValidate the contents, raising :class:`~xdg.Exceptions.ValidationError`
        if there is anything amiss.
        
        report can be 'All' / 'Warnings' / 'Errors'
        r.   r   zValue of Key '%s' is emptyAllWarningsz
- ErrorsN)warningsr)   r/   r0   splitextr   fileExtensioncheckExtrasr   
checkGroupcheckKeyr[   r   )r   reportr\   rG   msgrE   s         r   validatezIniFile.validate   sM      WW--dmm<Q? 	 \\ 	MEOOE"||E* Mc4<<#6s#;UC<<&s+r1MM(()E)KL	M	M U?f
2 %v}$% U?f0 %v}$% !#t}}55 r   c                      y r   rn   r   r\   s     r   r   zIniFile.checkGroup       r   c                      y r   rn   )r   rG   rH   r\   s       r   r   zIniFile.checkKey   r   r   c                    |dk(  r| j                  |      }n|g}|D ]  }|dk(  r| j                  |      }|dk(  r|dk(  r| j                  |      }n[|dk(  r| j                  |      }nD|dk(  r| j	                  |      }n-|dk(  r| j                  |      }n|dk(  r| j                  |      }d	k(  r"| j                  j                  d
|d|       |dk(  s| j                  j                  d|z          y )NTrh   localestringrK   rM   rL   rN   rO   r.   'z' is not a valid    zValue of key '%s' is deprecated)
rU   checkStringcheckBooleancheckNumbercheckInteger
checkRegex
checkPointr)   r[   r{   )r   rG   rH   r^   r_   r`   codes          r   
checkValuezIniFile.checkValue   s   4<\\%(FWF 	NEx''.~%"((/"''."((/u-u-qy""ud#KL$$%F%LM%	Nr   c                      y r   rn   r   s    r   r~   zIniFile.checkExtras  r   r   c                 2    |dk(  s|dk(  ry|dk(  s|dk(  syy y )N10r   rj   rl   r.   rn   r   rH   s     r   r   zIniFile.checkBoolean  s*    SLESL6/Ug%5 &6/r   c                 *    	 t        |       y #  Y yxY wNr.   )rX   r   s     r   r   zIniFile.checkNumber"  s    	%L	    c                 *    	 t        |       y #  Y yxY wr   )rW   r   s     r   r   zIniFile.checkInteger)  s    	J	r   c                 2    t        j                  d|      syy )Nz^[0-9]+,[0-9]+$r.   )rY   matchr   s     r   r   zIniFile.checkPoint0  s    xx)51 2r   c                      t        |      rdS dS )Nr   r.   )r   r   s     r   r   zIniFile.checkString4  s    UOq**r   c                 >    	 t        j                  |       y #  Y yxY wr   )rY   rZ   r   s     r   r   zIniFile.checkRegex7  s    	JJu	s    c                 n   |s| j                   st        dd      |r|| _         n| j                   }t        j                  j	                  |      rnt        j                  j                  t        j                  j	                  |            s2t        j                  t        j                  j	                  |             t        j                  |dd      5 }|r|j                  t        d             | j                  r|j                  t        d      | j                  z         | j                  | j                     j                         D ]$  \  }}|j                  t        d      ||fz         & |j                  t        d	             | j                  j                         D ]  \  }}|| j                  k7  s|j                  t        d      |z         |j                         D ]$  \  }}|j                  t        d      ||fz         & |j                  t        d	              	 d d d        |rjt        j                  |      j                  }|t        j                   z  t        j"                  z  t        j$                  z  }	t        j&                  ||	       d
| _        y # 1 sw Y   }xY w)Nr$   r   wr&   )r(   z#!/usr/bin/env xdg-open
z[%s]
z%s=%s

F)r   r   r/   r0   dirnameisdirmakedirsr2   r3   writer
   r?   r   itemsstatst_modeS_IXUSRS_IXGRPS_IXOTHchmodr>   )
r   r   trustedfprG   rH   namer\   oldmodemodes
             r   r   zIniFile.write>  s   /44$DM}}H77??8$RWW]]277??8;T-UKK12WWXsW5 	& 678  8t'8'889$(LL1B1B$C$I$I$K :LS%HHQy\S%L89:4!!%!3!3!5 &u4,,,HHQx[4/0(- >e9e!<=>HHQtW%&	&, ggh'//GT\\)DLL84<<GDHHXt$7	& 	&s   C'J+>A0J++J4c                 b   |s| j                   }|dk(  rLt        t        j                  j                        dkD  r&|dz   t        j                  j                  d   z   dz   }	 || j
                  |   |<   || j                  ||      k(  | _
        y # t        $ r t        || j                        w xY w)NTr   r+   r,   )r?   lenrq   rr   rs   r   KeyErrorr   r   r@   r>   )r   rG   rH   r\   r]   s        r   setzIniFile.setg  s    %%ET>c#**"2"23a7)cjj..q11C7C	5',DLL$ #u!55  	5udmm44	5s   !B  B.c                     | j                  |      rt        rt        || j                        y i | j                  |<   d| _        y NT)r8   r	   r   r   r   r>   r   s     r   addGroupzIniFile.addGroupv  s>    ==)%??  #%DLLDLr   c                     || j                   v }|r| j                   |= d| _        |S t        rt        || j                        |S r   )r   r>   r	   r   r   )r   r\   existeds      r   removeGroupzIniFile.removeGroup~  sH    4<<'U#DL  "5$--88r   c                    |s| j                   }	 |rkt        | j                  |         D ]P  }t        j                  d|z   t
        j                  j                  z   dz   |      s;||k7  sA| j                  |   |= R | j                  |   j                  |      }d| _	        |S # t        $ rB}t        r2||k(  rt        || j                        t        ||| j                        Y d }~yd }~ww xY w)N^$Tr   )r?   r_   r   rY   r   rq   rr   rN   rg   r>   r   r	   r   r   r   )r   rG   r\   localesr   rH   rD   s          r   	removeKeyzIniFile.removeKey  s    %%E	 e!45 6Dxxc	CJJ,<,< <s BDIdVYk LL/56 LL'++C0EDLL 	:&udmm<<$S%??	s$   AB$ %B$ +8B$ $	C/-8C**C/c                 6    | j                   j                         S r   )r   keysr   s    r   groupszIniFile.groups  s    ||  ""r   c                     || j                   v S r   )r   r   s     r   r8   zIniFile.hasGroup  s    $$r   c                 @    |s| j                   }|| j                  |   v S r   )r?   r   )r   rG   r\   s      r   r;   zIniFile.hasKey  s$    %%Edll5)))r   c                     | j                   S r   )r   r   s    r   getFileNamezIniFile.getFileName  s    }}r   r   )NFrh   FF)rx   )rh   F)NFr   )#__name__
__module____qualname__r?   r}   r   rA   r>   r   r"   r   r@   rU   rV   rQ   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r8   r;   r   rn   r   r   r   r      s    LMHNG!
0F4R7v%6PN4+'R7 .#%*r   r   )__doc__rY   r/   r   r2   xdg.Exceptionsr   r   r   r   r   r   r	   
xdg.Localerq   xdg.utilr
   rS   r   r   rn   r   r   <module>r      s=     # # #   X Xr   