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   ZLOCALES)macrosr   LANGCODE_TO_LOCALErstripr   r   r   append)selfZlangCodeZ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   r1   >      zLangcodeMacros.__contains__N)__name__
__module____qualname__r   r   r&   r-   r1   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]
        dataZlocale2langpackr!   ZLCODEZCCODEZVARIANTLOCALEZPKGCODEZ	SYSLOCALECZPOSIXen_US@.r   _z%s@%sz%s_%s.UTF-8z%s.UTF-8r   N)	ospathjoinZ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   r-   v   r.   zLangpackMacros.__setitem__c                 C   r/   r)   r0   r$   r   r   r   r1   y   r2   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   sZ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writerM   )r   r   rK   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)r>   walkrQ   r?   r@   )r   rootr?   dirsfilesr   r   r   r   
subst_tree   s
   zLangpackMacros.subst_treeN)
r3   r4   r5   r   r&   r-   r1   rM   rQ   rV   r   r   r   r   r6   A   s    0r6   __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-8Zinvalid_Localez-------z---------------z;"%PKGCODE%: %LCODE% %CCODE% %VARIANT% %LOCALE% %SYSLOCALE%"zstring:ZtesttestrN   zfile  :r)   )__doc__Z
__future__r   r>   rE   r   r   r6   r3   rB   rC   r   printtemplaterM   r   rP   rQ   rO   unlinkr   r   r   r   <module>   s(    
U

