U
    VÉc!  ã                   @   sâ   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ dZ dd„ Z!dd	„ Z"d
efdd„Z#G dd„ de$ƒZ%G dd„ de%ƒZ&G dd„ de%ƒZ'd
S )z$
Office Math Markup Language (OMML)
é    )Ú
NotSupport)ÚPY2)ÚCHARSÚCHRÚCHR_BOÚCHR_DEFAULTÚPOSÚPOS_DEFAULTÚSUBÚSUPÚFÚ	F_DEFAULTÚTÚFUNCÚDÚ	D_DEFAULTÚRADÚRAD_DEFAULTÚARRÚLIM_FUNCÚLIM_TOÚLIM_UPPÚMÚBRKÚBLANKÚ	BACKSLASHÚALNÚ
FUNC_PLACEz<{http://schemas.openxmlformats.org/officeDocument/2006/math}c                 C   s    zt | ƒjW S    Y dS X d S ©NÚ )ÚoMath2LatexÚlatex)Zomath© r"   ú=/var/www/wikiazma_server/doc_parser/utils/omml_parser/omml.pyÚomml_to_latext   s    r$   c                 C   sV   d }g }|   dd¡} | D ]2}|tkr<|tkr<| t| ¡ n
| |¡ |}qt |¡S )Nz\\ú\)Úreplacer   r   Úappendr   Újoin)ÚstrsÚlastZnew_chrÚcr"   r"   r#   Úescape_latex   s    
r,   Nc                 C   s$   | d k	r|s| S |  | | ¡S |S d S ©N)Úget)ÚkeyÚdefaultÚstorer"   r"   r#   Úget_val'   s    r2   c                   @   s<   e Zd Zddd„Zddd„Zddd„Zddd	„Zd
d„ ZdS )Ú
Tag2MethodNc                 C   s<   | j j}|d kr|j td¡}||ƒ}|r4|| |ƒS d S d S r   )Útag2methr.   Útagr&   ÚOMML_NS)ÚselfÚelmÚstagZ	getmethodÚmethodr"   r"   r#   Úcall_method0   s    
zTag2Method.call_methodc                 c   sr   t |ƒD ]d}t|jkrq|j td¡}|r4||kr4q| j||d}|dkr`|  ||¡}|dkr`q|||fV  qdS )z1
		process children of the elm,return iterable
		r   )r9   N)Úlistr6   r5   r&   r;   Úprocess_unknown)r7   r8   ÚincludeÚ_er9   Útr"   r"   r#   Úprocess_children_list:   s    
z Tag2Method.process_children_listc                 C   s*   t ƒ }|  ||¡D ]\}}}|||< q|S )z-
		process children of the elm,return dict
		)ÚdictrA   )r7   r8   r>   Úlatex_charsr9   r@   Úer"   r"   r#   Úprocess_children_dictK   s    
z Tag2Method.process_children_dictc                 C   s   t  dd„ |  ||¡D ƒ¡S )z/
		process children of the elm,return string
		c                 s   s*   | ]"\}}}t |tƒs|nt|ƒV  qd S r-   )Ú
isinstancer3   Ústr©Ú.0r9   r@   rD   r"   r"   r#   Ú	<genexpr>X   s   ÿz.Tag2Method.process_children.<locals>.<genexpr>)r   r(   rA   )r7   r8   r>   r"   r"   r#   Úprocess_childrenT   s    

ÿzTag2Method.process_childrenc                 C   s   d S r-   r"   ©r7   r8   r9   r"   r"   r#   r=   [   s    zTag2Method.process_unknown)N)N)N)N)Ú__name__Ú
__module__Ú__qualname__r;   rA   rE   rK   r=   r"   r"   r"   r#   r3   .   s
   



	
r3   c                   @   sZ   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Ze
eeeeedœZdS )ÚPrr   )ÚchrÚposÚbegChrÚendChrÚtypeNc                 C   s   i | _ |  |¡| _d S r-   )Ú_Pr__innerdictrK   Útext©r7   r8   r"   r"   r#   Ú__init__h   s    zPr.__init__c                 C   s   | j S r-   ©rW   ©r7   r"   r"   r#   Ú__str__l   s    z
Pr.__str__c                 C   s   | j S r-   ©r\   r[   r"   r"   r#   Ú__unicode__o   s    zPr.__unicode__c                 C   s   | j  |d ¡S r-   )rV   r.   )r7   Únamer"   r"   r#   Ú__getattr__r   s    zPr.__getattr__c                 C   s   t | jd< t S )NÚbrk)r   rV   rX   r"   r"   r#   Údo_brku   s    
z	Pr.do_brkc                 C   sZ   |j  td¡}|| jkrV| d t¡¡}trL|d krLt|tƒrB|nt|dƒ}|| j	|< d S )Nr   z{0}valúutf-8)
r5   r&   r6   Ú_Pr__val_tagsr.   Úformatr   rF   rG   rV   )r7   r8   r9   r@   r"   r"   r#   Ú	do_commony   s    

zPr.do_common)ra   rQ   rR   rS   rT   rU   )rM   rN   rO   rW   rd   rV   rY   r\   r^   r`   rb   rf   r4   r"   r"   r"   r#   rP   _   s    
úrP   c                   @   s  e Zd ZdZeZdZdd„ Zdd„ Zdd„ Z	d	d
„ Z
edd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zeeeeeeeeeeeeeeeeeed3œZ d4S )5r    z*
	Convert oMath element of omml to latex
	)ÚboxZsSubZsSupZsSubSupÚnumÚdenÚdegrD   c                 C   s   |   |¡| _d S r-   )rK   Ú_latex)r7   Úelementr"   r"   r#   rY   ”   s    zoMath2Latex.__init__c                 C   s   | j S r-   )r!   r[   r"   r"   r#   r\   —   s    zoMath2Latex.__str__c                 C   s   | j S r-   r]   r[   r"   r"   r#   r^   š   s    zoMath2Latex.__unicode__c                 C   s4   || j kr|  |¡S |dd … dkr,t|ƒS d S d S )NéþÿÿÿrP   )Ú_oMath2Latex__direct_tagsrK   rP   rL   r"   r"   r#   r=      s
    

zoMath2Latex.process_unknownc                 C   s   t s
| jS | j d¡S )Nrc   )r   rk   Úencoder[   r"   r"   r#   r!   ¥   s    zoMath2Latex.latexc                 C   s2   |   |¡}t|d jt d¡td}| |d ¡S )z
		the accent function
		ZaccPrZACC_VAL©r0   r1   rD   )rE   r2   rQ   r   r.   r   re   )r7   r8   Úc_dictÚlatex_sr"   r"   r#   Údo_acc©   s    
zoMath2Latex.do_accc                 C   s<   |   |¡}|d }t|jt d¡td}|j| |d ¡ S )z
		the bar function
		ZbarPrZBAR_VALrp   rD   )rE   r2   rR   r	   r.   r   rW   re   ©r7   r8   rq   Úprrr   r"   r"   r#   Údo_bar±   s    
zoMath2Latex.do_barc                 C   sz   |   |¡}|d }t d¡}t|jt d¡td}t|jt d¡td}|jtj	|sX|nt
|ƒ|d |sl|nt
|ƒd S )z
		the delimiter object
		ZdPrÚnullÚleftrp   ÚrightrD   )rx   rW   ry   )rE   r   r.   r2   rS   r   rT   rW   r   re   r,   )r7   r8   rq   ru   rw   Zs_valZe_valr"   r"   r#   Údo_dº   s    

þzoMath2Latex.do_dc                 C   s   dS )z7
		the Pre-Sub-Superscript object -- Not support yet
		Nr"   rX   r"   r"   r#   Údo_spreÈ   s    zoMath2Latex.do_sprec                 C   s   |   |¡}t |¡S r-   )rK   r
   re   ©r7   r8   rW   r"   r"   r#   Údo_subÎ   s    
zoMath2Latex.do_subc                 C   s   |   |¡}t |¡S r-   )rK   r   re   r|   r"   r"   r#   Údo_supÒ   s    
zoMath2Latex.do_supc                 C   sB   |   |¡}|d }t|jttd}|j|j| d¡| d¡d S )z
		the fraction object
		ZfPrrp   rh   ri   )rh   ri   )rE   r2   rU   r   r   rW   re   r.   rt   r"   r"   r#   Údo_fÖ   s    
zoMath2Latex.do_fc                 C   s&   |   |¡}| d¡}| t| d¡¡S )z2
		the Function-Apply object (Examples:sin cos)
		ÚfNamerD   )rE   r.   r&   r   )r7   r8   rq   Ú	func_namer"   r"   r#   Údo_funcß   s    

zoMath2Latex.do_funcc                 C   sr   g }|   |¡D ]D\}}}|dkrHt |¡r:| t| ¡ qRtd| ƒ‚q| |¡ qt |¡}t|krj|S |t S )z
		the func name
		ÚrzNot support func %s)rA   r   r.   r'   r   r   r(   r   )r7   r8   rC   r9   r@   rD   r"   r"   r#   Údo_fnameç   s    

zoMath2Latex.do_fnamec                 C   s0   |   |¡}|d }t|jƒ}|j| |d ¡ S )z 
		the Group-Character object
		Z
groupChrPrrD   )rE   r2   rQ   rW   re   rt   r"   r"   r#   Údo_groupchr÷   s    

zoMath2Latex.do_groupchrc                 C   s@   |   |¡}| d¡}| d¡}|r0tj||dS tj|dS dS )z
		the radical object
		rD   rj   )rj   rW   rZ   N)rE   r.   r   re   r   )r7   r8   rq   rW   Zdeg_textr"   r"   r#   Údo_rad   s    


zoMath2Latex.do_radc                 C   s&   t jt dd„ | j|ddD ƒ¡dS )z
		the Array object
		c                 S   s   g | ]\}}}|‘qS r"   r"   rH   r"   r"   r#   Ú
<listcomp>  s     z(oMath2Latex.do_eqarr.<locals>.<listcomp>©rD   ©r>   rZ   )r   re   r   r(   rA   rX   r"   r"   r#   Údo_eqarr  s    ÿzoMath2Latex.do_eqarrc                 C   sH   | j |dd}t |d ¡}|s2td|d  ƒ‚n|j| d¡dS dS )z
		the Lower-Limit object
		©rD   Úlimr‰   rD   zNot support lim %srŒ   )rŒ   N)rE   r   r.   r   re   )r7   r8   Út_dictrr   r"   r"   r#   Ú	do_limlow  s
    zoMath2Latex.do_limlowc                 C   s(   | j |dd}tj| d¡| d¡dS )z
		the Upper-Limit object
		r‹   r‰   rŒ   rD   )rŒ   rW   )rE   r   re   r.   )r7   r8   r   r"   r"   r#   Ú	do_limupp  s    zoMath2Latex.do_limuppc                 C   s   |   |¡ td td ¡S )zU
		the lower limit of the limLow object and the upper limit of the limUpp function
		r   é   )rK   r&   r   rX   r"   r"   r#   Údo_lim&  s    zoMath2Latex.do_limc                 C   sH   g }|   |¡D ]&\}}}|dkr"q|dkr| |¡ qtjt |¡dS )z
		the Matrix object
		ZmPrÚmrrZ   )rA   r'   r   re   r   r(   )r7   r8   Úrowsr9   r@   rD   r"   r"   r#   Údo_m,  s    zoMath2Latex.do_mc                 C   s   t  dd„ | j|ddD ƒ¡S )z"
		a single row of the matrix m
		c                 S   s   g | ]\}}}|‘qS r"   r"   rH   r"   r"   r#   r‡   =  s     z%oMath2Latex.do_mr.<locals>.<listcomp>rˆ   r‰   )r   r(   rA   rX   r"   r"   r#   Údo_mr8  s    ÿzoMath2Latex.do_mrc                 C   sN   g }d}|   |¡D ],\}}}|dkr4t|jtd}q| |¡ q|t |¡ S )z
		the n-ary object
		r   ZnaryPr)r1   )rA   r2   rQ   r   r'   r   r(   )r7   r8   ÚresZbor9   r@   rD   r"   r"   r#   Údo_nary?  s    zoMath2Latex.do_naryc                 C   s<   g }|  d t¡¡D ]}| | j ||¡¡ qtt |¡ƒS )z
		Get text from 'r' element,And try convert them to latex symbols
		@todo text style support , (sty)
		@todo 	ext (latex pure text support)
		z./{0}t)	Úfindtextre   r6   r'   Ú_t_dictr.   r,   r   r(   )r7   r8   Ú_strÚsr"   r"   r#   Údo_rL  s    zoMath2Latex.do_r)Úaccrƒ   ÚbarÚsubÚsupÚfÚfuncr€   ZgroupChrÚdZradZeqArrZlimLowZlimUpprŒ   Úmr’   ZnaryN)!rM   rN   rO   Ú__doc__r   r™   rn   rY   r\   r^   r=   Úpropertyr!   rs   rv   rz   r{   r}   r~   r   r‚   r„   r…   r†   rŠ   rŽ   r   r‘   r”   r•   r—   rœ   r4   r"   r"   r"   r#   r    Œ   s^   
			îr    )(r¥   Údoc_parser.utils.omml_parserr   Ú"doc_parser.utils.omml_parser.utilsr   Z'doc_parser.utils.omml_parser.latex_dictr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r$   r,   r2   Úobjectr3   rP   r    r"   r"   r"   r#   Ú<module>   s   p1-