
    cg(                     d    d dl Z d dlZd dlmZmZmZmZmZ d dlmZ	 d dl
mZ d dlZ G d d      Zy)    N)Element
SubElementElementTreeQNameparse)Xpafsc                       e Zd ZddZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Z	 	 ddZd Zd Zd Zd Zd Zy)Rixerc                    || _         || _        d |j                  d   i| _        |j                  d   | _        t        |j                  d         dz   | _        |j                  d   |j                  d   d| _        t        |      | _	        y )Namf   ernad)ae)
r   
do_verbosens
namespacesamf_nslen
end_prefixxpspacesr   xpafs)selferimpr   s      !/home/ernad/ernad/python/rixer.py__init__zRixer.__init__   sz    $%1hhuoehhuo.2#hhuo#hhw/15\
    c                     | j                   j                  d   }t        t        |d      | j                        }|j                  |       t        |      }|S )Nr   nsmap)r   r   r   r   r   appendr   )r   eler   amf_eleamf_docs        r   wrap_with_amfzRixer.wrap_with_amf   sI    5!%. $1sg&r   c                     || j                   j                  vrt        d|       | j                   j                  |   }t        t	        ||      | j
                        }|S )Nzno such namespace r   )r   r   	Exceptionr   r   r   )r   namer   r"   s       r   basez
Rixer.base"   sT    TVVYY0566VVYYr]eBo OO-
r   c                    t        |t        j                        r|}nqt        |t              rat        j
                  j                  |      }t        j
                  j                  |      st        d|z         t        j                  |      }j                  d| j                        }i }|D ]  }|j                  d      }|||<    |S )1gets docs by ref, returning elements of the textsI don't see your file z//a:text[@ref]r   ref)
isinstanceet_ElementTreestrospathabspathisfiler'   filer	parse_laxxpathr   get)r   argtreein_fufidoc_listdocsdocr.   s           r   r?   z
Rixer.docs*   s    c2??+DS!ggooc*G77>>'* 87 BCC??7+D::.4==:IC''%.CDI  r   c                 Z    d|z   dz   }|j                  || j                        }|d   }|S );get a doc by reference, may run out of memory because of //z//a:text[@ref=""]r-   r   r9   r   )r   r<   r.   xpr>   r@   s         r   
doc_by_refzRixer.doc_by_ref;   s5    $t+::bT]]:;qk
r   c                 N    d}|j                  || j                        }|d   }|S )z(get the collection from the amf documentz/a:amf/a:collectionr-   r   rD   )r   r<   rE   col_listcol_eles        r   get_colzRixer.get_colB   s+    "::bT]]:;1+r   c                 N    d}|j                  || j                        }|d   }|S )rB   z"/a:amf/a:collection/e:route/text()r-   r   rD   )r   r<   r.   rE   
route_listroutes         r   rM   zRixer.routeI   s+    1ZZt}}Z=
1r   c                    | j                   j                  d   }t        t        |d      | j                   j                        }t	        |t        |d      | j                   j                        }|D ]P  }|j                  |       t	        |t        |d      | j                   j                        }|j                  |       R |S )2wrap document records elements to form an issuedocr   r   
collectionhaspart)r   r   r   r   r   addnextr!   )r   dorelsr   root_elerI   dorelhaspart_eles          r   wrap_dorelszRixer.wrap_dorelsP   s    5!5/!%,XuV\'B#'6699.EOOE"$WeFI.F+/66996Ku%	 
 r   c                     | j                   j                  d   }t        t        |d      | j                        }t        |      }|j                         }|j                  |       t        |      }|S )rO   r   r   )	r   r   r   r   r   r   getrootr!   r   )r   fufir   r#   repdocrepdoc_rootr$   s          r   wrap_file_with_amfzRixer.wrap_file_with_amf^   s^    5!%. $1tnn&{#g&r   c                     d}|j                  || j                        }t        |      }|dk7  rt        d| d       y|d   }|j	                         j                  ||       y)	Nz/a:amf/a:collection/a:haseditorr-      zrixer can't handle z editorsFr   T)r9   r   r   print	getparentreplace)r   r<   haseditor_ele	editor_xpeditor_listtotal_editorsold_haseditor_eles          r   change_editorzRixer.change_editori   sk    5	jjt}}jEK(A'h?@'N##%--.?Or   c                     |}t        |t        j                        r|j                         }| j	                  |j
                        dk(  r|j                  d      d   }| j                  |      sy |S )Nr   z./*r   )r/   r0   r1   rY   amf_nametagfindallis_noun)r   
ele_or_docr"   s      r   get_nounzRixer.get_nount   s_    j"//2$$&C==!U*++e$Q'C||C 
r   c                     |}t        |t        j                        r|j                  }d| j                  z   dz   }|j                  |      sy || j                  d  S )N{})r/   r0   _Elementrk   r   
startswithr   )r   name_or_eler(   prefixs       r   rj   zRixer.amf_name~   sR    k2;;/??Dt{{"S(v&DOO$%%r   c                 J    | j                  |j                        }|y|dv ryy)NF)organizationrP   persontextTrj   rk   r   r"   r(   s      r   rm   zRixer.is_noun   s+    }}SWW%<CCr   c                 J    | j                  |j                        }|y|dv ryy)NF)
iseditorof	haseditorTr{   r|   s      r   is_verbzRixer.is_verb   s+    }}SWW%<..r   c                    | j                  |      }|Bt        |t        j                        r|j	                         }t        d|j                  z          | j                  |j                        }d|z   }|j                  || j                        }|D ]h  }|j                         }| j                  |      s&| j                  rt        d|j                   d       J|j                         j                  |       j |S )z/remove references from an amf noun to same nounrixer: I need a noun, not z.//a:r-   rixer:  is not a verb)ro   r/   r0   r1   rY   r`   rk   rj   rl   r   ra   r   r   remove)r   
doc_or_elenoun_ele	noun_namerE   
same_nouns	same_nounverb_eles           r   flattenzRixer.flatten   s    ==,*boo6'//1
.?@MM(,,/	y %%bT]]%C
#I **,H<<)??GHLL>@A ''1 $ r   c                    ||S | j                  |      }|Ct        |t        j                        r|j	                         }t        d|j                  z          yd|z   dz   }|j                  || j                        }|D ]h  }|j                         }| j                  |      s&| j                  rt        d|j                   d       J|j                         j                  |       j |S )z,remove references to ref, to avoid recursionNr   z.//*[@ref="rC   r-   r   r   )ro   r/   r0   r1   rY   r`   rk   rl   r   ra   r   r   r   )r   r   r.   r   rE   	ref_nounsref_nounr   s           r   cut_refzRixer.cut_ref   s    ;==,*boo6'//1
.?@S 4'$$RDMM$B	!H))+H<<)??GHLL>@A ''1 " r   c                     | j                  |      }|t        |       d}|j                  || j                        }|D ]!  }|j	                         j                  |       # |S )Nz.//*[@until]r-   ro   r`   rl   r   ra   r   )r   r   r   rE   	old_verbsold_verbs         r   remove_historyzRixer.remove_history   sc    ==,*$$RDMM$B	!H ''1 "r   Nc                 n   | j                  |      }|t        |       d}|j                  || j                        }i }|D ]p  }	|dkD  rd|	j	                         j
                  v r%|| j                  |	      |vr;|"| j                  |	j	                               |vr_|	||	j
                  d   <   r |S )Nz
.//*[@ref]r-   r   untilr.   )ro   r`   rl   r   ra   attribrj   )
r   r   
only_nouns
only_verbslevelr   rE   refed_nounsouts
refed_nouns
             r   get_refszRixer.get_refs   s    ==,*&&rdmm&D%Jqyj224;;;%==,J>%==!5!5!78
J .8D""5)* & r   c                     | j                  |      }|t        |       |j                  || j                        }|D ]!  }|j	                         j                  |       # |S )Nr-   r   )r   r   rE   r   
issue_eles	issue_eles         r   r   zRixer.remove   s^    ==,*%%bT]]%C
#I!((3 $r   c                 Z   t        |t              st        d      t        j                  j                  |      }t        j                  j                  |      st        d|z         t        j                  |      }|j                  d| j                        }t        |      dk(  r|j                  d| j                        }d| j                  j                  d   z   d	z   }d| j                  j                  d
   z   dz   }d| j                  j                  d
   z   dz   }|D ]:  }|j                  }	|	||fv r|	|k7  s|j                         j!                  |       < dD ]E  }
|j                  |
| j                        }|D ]!  }|j                         j!                  |       # G |S )r+   zFixme: I need a string herer,   z/a:amf/a:collection/*r-   r   z/a:collection/*rq   r   z}haspartr   z
}issuedatez}repcode)z//e:itemz//e:sausage)r/   r2   r'   r3   r4   r5   r6   r7   r8   r9   r   r   r   r   rk   ra   r   )r   r;   r=   r<   eleshaspart_tagissuedate_tagrepcode_tagr"   rk   r4   s              r   members_onlyzRixer.members_only   sl   #s#9::''//#&ww~~g&4w>??w'zz1dmmzLt9>::/DMM:JDDFFIIe,,z9dffii00<?DFFIIg..;C''C{M22k!&&s+  0D::dt}}:=D&&s+  0
 r   c                    |j                  d| j                        d   }d|j                  vrt        dt        j
                         |S |j                  d   }|j                  |      s|S |d|z   z  }||j                  d<   |S )Nz//a:collection[1]r-   r   idzrixer: collection has no handle)file/)r9   r   r   r`   sysstderrendswith)r   r@   repcode	issuedatecoll_eleid_attrs         r   date_the_collectionzRixer.date_the_collection  s    990T]]9KANx&3zz#J//$'(J3?" '
r   c                 p    |j                  d      D ]!  }|j                         j                  |       # |S )Nz//comment())r9   ra   r   )r   r@   comments      r   	decommentzRixer.decomment  s1    yy/G&&w/ 0
r   c                 V    d}| j                   j                  ||      }|j                  S )Nz'//a:collection[1]/a:haseditor/*/a:email)r   one_or_firstrz   )r   r@   rE   emails       r   editor_emailzRixer.editor_email  s'    6

''R0zzr   )F)NNr   )__name__
__module____qualname__r   r%   r)   r?   rF   rJ   rM   rW   r]   rh   ro   rj   rm   r   r   r   r   r   r   r   r   r   r    r   r   r
   r
      s    	"		&&* @D0<
r   r
   )r3   r   
lxml.etreer   r   r   r   r   etreer0   r   r   r7   r
   r   r   r   <module>r      s)    	 
 F E   P Pr   