o
    +a                     @   s   d Z ddlmZ ddlZddlZdddZG dd dZG dd	 d	Zed
kr^dZ	dD ]4Z
ee	e
Zede
d dZedee edde ed eded  ed q+dS dS )zmacros.py: Generate macro values from configuration values and provide
substitution functions.

The following macros are available:

  LCODE CCODE PKGCODE LOCALE
    )print_functionNc              	   C   s   d}t | d}|D ],}z	||\}}W n	 ty   Y q	w |ddks,|ddkr-q	||kr5| }q	|  |dkrFtd|| f |S )z[Look up key in given file ("key value" lines). Throw an exception if
    key was not found.Nr#r   zKey %s not found in %s)opensplit
ValueErrorfindstripcloseKeyError)filekeysepvalflkv r   9/usr/lib/python3/dist-packages/LanguageSelector/macros.py	_file_map   s"   
r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )LangcodeMacrosz1/usr/share/language-selector/data/langcode2localec              	   C   s   i | _ i }t| jD ]7}z| }|d\}}W n	 ty"   Y q
w |ddks1|ddkr2q
||vr:g ||< || | q
|| | d< d S )N:r   r   LOCALES)macrosr   LANGCODE_TO_LOCALErstripr   r   r   append)selflangCodelocalesr   r   r   r   r   r   __init__'   s   zLangcodeMacros.__init__c                 C      | j |dS N r   getr   itemr   r   r   __getitem__7      zLangcodeMacros.__getitem__c                 C      || j |< d S Nr   r   r(   valuer   r   r   __setitem__;      zLangcodeMacros.__setitem__c                 C      | j |S r,   r   __contains__r'   r   r   r   r4   >      zLangcodeMacros.__contains__N)__name__
__module____qualname__r   r!   r)   r0   r4   r   r   r   r   r   #   s    r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )LangpackMacrosc                 C   s  t j|dd| _i | _d| d< d| d< d| d< d| d< d| d< d| d	< |d
ks,|dkr.d}d|v r;|d\}| d< d|v rF|dd }d|v rV|d\| d< | d< n|| d< t| d dkrmd|| d f | d< n|| d< t| d dkrt| d dkrd| d | d f | d	< nd| d  | d	< t| d dkrd| d	 | d f | d	< zt| j| d d| d< W dS  ty   | d | d< Y dS w )a9  Initialize values of macros.

        This uses information from maps/, config/, some hardcoded aggregate
        strings (such as package names), and some external input:
        
        - locale: Standard locale representation (e. g. pt_BR.UTF-8)
                  Format is: ll[_CC][.UTF-8][@variant]
        datalocale2langpackr$   LCODECCODEVARIANTLOCALEPKGCODE	SYSLOCALECPOSIXen_US@.r   _z%s@%sz%s_%s.UTF-8z%s.UTF-8r   N)	ospathjoinLOCALE_TO_LANGPACKr   r   lenr   r   )r   datadirlocaler   r   r   r!   B   s>   
zLangpackMacros.__init__c                 C   r"   r#   r%   r'   r   r   r   r)   r   r*   zLangpackMacros.__getitem__c                 C   r+   r,   r-   r.   r   r   r   r0   v   r1   zLangpackMacros.__setitem__c                 C   r2   r,   r3   r'   r   r   r   r4   y   r5   zLangpackMacros.__contains__c                 C   s^   t d}	 ||}|r+|d|dd  | |d  ||dd d  }n	 |S q)z&Substitute all macros in given string.z
%([A-Z]+)%   N)recompilesearchstartgroupend)r   sre_macromr   r   r   subst_string|   s   

<zLangpackMacros.subst_stringc                 C   s&   t | }t |d| | dS )z$Substitute all macros in given file.wN)r   readwriterY   )r   r   rV   r   r   r   
subst_file   s   zLangpackMacros.subst_filec              	   C   s:   t |D ]\}}}|D ]}| t j||| qqdS )z.Substitute all macros in given directory tree.N)rH   walkr]   rI   rJ   )r   rootrI   dirsfilesr   r   r   r   
subst_tree   s
   zLangpackMacros.subst_treeN)
r6   r7   r8   r!   r)   r0   r4   rY   r]   rb   r   r   r   r   r9   A   s    0r9   __main__z/usr/share/language-selector)	dede_DEzde_DE.UTF-8zde_DE.UTF-8@eurozfr_BE@latinzzh_CN.UTF-8zzh_TW.UTF-8zzh_HK.UTF-8invalid_Localez-------z---------------z;"%PKGCODE%: %LCODE% %CCODE% %VARIANT% %LOCALE% %SYSLOCALE%"zstring:testtestrZ   zfile  :r,   )__doc__
__future__r   rH   rP   r   r   r9   r6   rM   rN   r   printtemplaterY   r   r\   r]   r[   unlinkr   r   r   r   <module>   s(    
U

