B
    ›³ëb1  ã               @   sö   d Z ddlZddlZddlZddlZddlZddlZddlZddl	Zddl
ZddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZ G dd	„ d	ƒZd
d„ ZG dd„ deƒZddd„Zdd„ Zdefdd„Zdd„ Zdd„ Zdd„ Z dS )z0Tool specific initialization of `xgettext` tool.é    N)ÚBuilderBase)Ú_null)ÚCYGWIN_DEFAULT_PATHS)ÚMINGW_DEFAULT_PATHS)Ú_detect_xgettextÚ_POTargetFactoryÚRPathsÚ_xgettext_existsc               @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
Ú
_CmdRunnerzÍ Callable object, which runs shell command storing its stdout and stderr to
    variables. It also provides `strfunction()` method, which shall be used by
    scons Action objects to print command string. Nc             C   s"   d | _ d | _d | _|| _|| _d S )N)ÚoutÚerrÚstatusÚcommandÚ
commandstr)Úselfr   r   © r   ú2lib/python3.7/site-packages/SCons/Tool/xgettext.pyÚ__init__6   s
    z_CmdRunner.__init__c             C   sp   dt jt jdddœ}|j| j||d}tjj||f|Ž}| ¡ \| _| _	| 
¡ | _| j	rjtj t| j	ƒ¡ | jS )NÚdevnullT)ÚstdinÚstdoutÚstderrZuniversal_newlinesÚshell)ÚtargetÚsource)Ú
subprocessÚPIPEÚsubstr   ÚSConsÚActionZ_subprocZcommunicater   r   Úwaitr   Úsysr   ÚwriteÚstr)r   r   r   ÚenvÚkwr   Úprocr   r   r   Ú__call__=   s    
z_CmdRunner.__call__c             C   s4   | j }|j|||ddkr | j}|j|||d}|S )N)r   r   Ú )r   r   r   )r   r   r   r$   ZcomstrÚsr   r   r   ÚstrfunctionM   s
    z_CmdRunner.strfunction)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r'   r*   r   r   r   r   r
   1   s   
r
   c          
   C   s   dd„ }|j  ¡ }t ¡ }| d j}t| ¡ ƒ}| tj |d| ¡¡ |j  	|d¡ y2t
ddƒ}tjj||jd}	|	| d g||ƒ}
W n>   | tj |d	| ¡¡ |j  	|d¡ t 	|¡ ‚ Y nX | tj |d	| ¡¡ |j  	|d¡ t 	|¡ |
r|
S |j}|sd
}d}nj| d  ¡ rz| d  ¡ }t dtj¡}t |d|¡}t |d|¡}||krpd
}d}nd}d}nd}d}|rädtt| d ƒƒ d | d }| tj ||¡¡ tt| d ƒdƒ}| |¡ | ¡  dS dtt| d ƒƒ d | d }| tj ||¡¡ dS dS )z) Action function for `POTUpdate` builder c             S   s   dS )Nr   r   )r   r   r$   r   r   r   Ú<lambda>W   ó    z"_update_pot_file.<locals>.<lambda>r   z	Entering é   z$XGETTEXTCOMz$XGETTEXTCOMSTR)r*   zLeaving Fz)no internationalized messages encounteredz ^"POT-Creation-Date: .*"$[\r\n]?r(   z'messages in file found to be up-to-dateTzmessages in file were outdatedznew filezWriting z (ú)ÚwzNot writing N)ÚfsÚgetcwdÚosÚdirÚreprZget_abspathZExecuter   r   Úchdirr
   r*   r   ÚexistsÚget_text_contentsÚreÚcompileÚMÚsubr#   Úopenr"   Úclose)r   r   r$   ZnopZsave_cwdZsave_os_cwdr9   Z	chdir_strÚcmdÚactionr   Znew_contentZneeds_updateZexplainZold_contentZre_cdateZold_content_nocdateZnew_content_nocdateÚmsgÚfr   r   r   Ú_update_pot_fileU   s^    




 
 
 rF   c               @   s   e Zd Zdd„ ZdS )Ú_POTBuilderc             G   s>   |s(d|kr|d r|d }nd}|g}t j| |||f|žŽ S )NZ	POTDOMAINZmessages)r   Ú_execute)r   r$   r   r   ÚargsZdomainr   r   r   rH   ¢   s    
z_POTBuilder._executeN)r+   r,   r-   rH   r   r   r   r   rG   ¡   s   rG   c             C   sŒ  |dkrdS t j |¡s|g}|dkr<d|kr8|d }ng }t j |¡sN|g}t j |¡}d}xT|D ]L}t|t jjjƒs¤t j |¡r”|j	||| d}| 
||jj¡}|t|ƒ7 }qdW |sÄ|j ¡ f}t dtj¡}t dtj¡}t d¡}	xœ|D ]”}
t|
t jjjƒrð|
 ¡ rð|
 ¡ }| d	|¡}| d	|¡}|	 d	|¡}| ¡ }xB|D ]:}t jj ||¡}|sr| 
||d j¡}| | |¡ qFW qðW dS )
zN Parses `POTFILES.in`-like file and returns list of extracted file names.
    Nr   ÚXGETTEXTPATHr   )r   r   z^#[^\n\r]*$\r?\n?z^[ \t\r]*$\r?\n?z	[ \t\r]+$r(   )r   ÚUtilÚis_ListÚflattenÚ
isinstanceÚNodeÚFSÚBaseÚ	is_Stringr   Ú	arg2nodesr4   ZDirÚtupler5   r<   r=   r>   Zrexistsr;   r?   Ú
splitlinesZ	find_fileÚFileÚDepends)r   r   r$   ÚfilesÚpathÚdirsÚpZ
re_commentZ
re_emptylnZ
re_trailwsrE   ÚcontentsZdepnamesZdepnameZdepfiler   r   r   Ú_scan_xgettext_from_files¬   sH    




r]   c             C   s°   d|kr|d }n| |fS t j |¡s,|g}t j |¡}g }xL|D ]D}t|t jjjƒs|t j |¡rr|j	||| d}| 
|¡}| |¡ qBW |r¨| | |¡ t| |||ƒ | |fS )z* Emitter function for `POTUpdate` builder ÚXGETTEXTFROM)r   r   )r   rK   rL   rM   rN   rO   rP   rQ   rR   r   rS   ÚextendrW   r]   )r   r   r$   ZxfromrX   Zxfr   r   r   Ú_pot_update_emitterÝ   s"    


r`   c             K   s   | j ||f|ŽS )N)Ú_POTUpdateBuilder)r$   r   r   r%   r   r   r   Ú_POTUpdateBuilderWrapper÷   s    rb   c             K   s>   t j td¡|d< d|d< t| ddj|d< t|d< tf |ŽS )	z$ Creates `POTUpdate` builder object NrC   z
$POTSUFFIXÚsuffixz$POTUPDATE_ALIAS)ÚaliasZtarget_factoryZemitter)r   r   rF   r   rV   r`   rG   )r$   r%   r   r   r   ra   û   s
    ra   c             K   sì   t jdkrPtjj| dtt d}|r>tj 	|¡}|  
d|¡ ntj tjjd¡ yt| ƒ| d< W n   d| d< Y nX d}d| }d	}d
}| jdg |dg ddddd||dgdt| ƒd | jdt| ƒid |  td¡ |  |  d¡¡ dS )z Generate `xgettext` tool Zwin32Úxgettext)Zdefault_pathsÚPATHz9xgettext tool requested, but binary not found in ENV PATHZXGETTEXTzL$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET, SOURCES)} $)zF$XGETTEXT $XGETTEXTFLAGS $_XGETTEXTPATHFLAGS $_XGETTEXTFROMFLAGS -o - zh$( ${_concat( XGETTEXTPATHPREFIX, XGETTEXTPATH, XGETTEXTPATHSUFFIX, __env__, RDirs, TARGET, SOURCES)} $)zo$( ${_concat( XGETTEXTFROMPREFIX, XGETTEXTFROM, XGETTEXTFROMSUFFIX, __env__, target=TARGET, source=SOURCES)} $)z${TARGET.filebase}r(   z-DNz-fz.potz
pot-update)Z_XGETTEXTDOMAINZXGETTEXTFLAGSZXGETTEXTCOMZXGETTEXTCOMSTRrJ   ZXGETTEXTPATHPREFIXZXGETTEXTPATHSUFFIXr^   ZXGETTEXTFROMPREFIXZXGETTEXTFROMSUFFIXZ_XGETTEXTPATHFLAGSZ_XGETTEXTFROMFLAGSZ	POTSUFFIXZPOTUPDATE_ALIASZXgettextRPathsra   )ZBUILDERSZ	POTUpdatez$POTUPDATE_ALIAS)r!   Úplatformr   ZToolZfind_program_pathr   r   r6   rY   ÚdirnameZAppendENVPathZWarningsÚwarnZSConsWarningr   Z
SetDefaultr   ZAppendra   Z	AddMethodrb   ZAlwaysBuildZAlias)r$   r%   re   Zxgettext_bin_dirZsourcesZxgettextcomZxgettextpathflagsZxgettextfromflagsr   r   r   Úgenerate  sH    
rj   c             C   s   yt | ƒS    dS dS )z  Check, whether the tool exists FN)r	   )r$   r   r   r   r:   E  s    r:   )NN)!r.   r6   r<   r   r!   ZSCons.Actionr   ZSCons.Node.FSZ
SCons.ToolZ
SCons.UtilZSCons.WarningsZSCons.Builderr   ZSCons.Environmentr   ZSCons.Platform.cygwinr   ZSCons.Platform.mingwr   ZSCons.Tool.GettextCommonr   r   r   r	   r
   rF   rG   r]   r`   rb   ra   rj   r:   r   r   r   r   Ú<module>   s.   	$L
1	A