3
d5                 @   s   d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZmZ ddlmZmZ d	d
gZdd ZG dd	 d	eZdZdZdZdZdZG dd
 d
eZdS )zr
Turtle RDF graph serializer for RDFLib.
See <http://www.w3.org/TeamSubmission/turtle/> for syntax specification.
    )defaultdict)
cmp_to_key)BNodeLiteralURIRef)Error)
Serializer)RDFRDFS)b	text_typeRecursiveSerializerTurtleSerializerc             C   sR   y| |krdS | |k rdS dS  t k
rL   t| } t|}| |k| |k  S X dS )a  
    for nice clean output we sort the objects of triples,
    some of them are literals,
    these are sorted according to the sort order of the underlying python objects
    in py3 not all things are comparable.
    This falls back on comparing string representations when not.
       r   N)	TypeErrorr   )ar    r   C/tmp/pip-build-7vycvbft/rdflib/rdflib/plugins/serializers/turtle.py_object_comparator   s    	r   c                   s   e Zd ZejgZejejgZ	dZ
dZe Z f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dZdd Z  ZS )r   
   z  c                s"   t t| j| d | _| j  d S )N)superr   __init__streamreset)selfstore)	__class__r   r   r   0   s    zRecursiveSerializer.__init__c             C   s>   || j kr0| j | |kr0td||| j | f || j |< d S )NzJTrying to override namespace prefix %s => %s, but it's already bound to %s)
namespaces	Exception)r   prefixurir   r   r   addNamespace6   s    z RecursiveSerializer.addNamespacec             C   sF   | j |s>|| jks>|| jkr(| jdks>t|trB| j| jkrBdS dS )z4Check to see if the subject should be serialized yetr   FT)isDone	_subjects
_topLevelsdepth
isinstancer   maxDepth)r   subjectr   r   r   checkSubject;   s    


z RecursiveSerializer.checkSubjectc             C   s
   || j kS )z$Return true if subject is serialized)_serialized)r   r)   r   r   r   r#   E   s    zRecursiveSerializer.isDonec                s   i  g }xTj D ]J}tjjtj|}|j  |j| x|D ]}dj|< d |< q@W qW  fddj	D }|j  |jdd |D  |S )NTc                s*   g | ]"}| krt |tj| |fqS r   )r'   r   _references).0r)   )seenr   r   r   
<listcomp>W   s   z5RecursiveSerializer.orderSubjects.<locals>.<listcomp>c             S   s   g | ]\}}}|qS r   r   )r-   Zisbnoderefsr)   r   r   r   r/   \   s    )

topClasseslistr   subjectsr	   typesortextendr%   r$   )r   r3   ZclassURImembersmemberZ
recursabler   )r.   r   r   orderSubjectsI   s    



z!RecursiveSerializer.orderSubjectsc             C   s$   x| j jdD ]}| j| qW d S )N)NNN)r   triplespreprocessTriple)r   tripler   r   r   
preprocess`   s    zRecursiveSerializer.preprocessc             C   s*   |\}}}| j |  d7  < d| j|< d S )Nr   T)r,   r$   )r   Zspospor   r   r   r;   d   s    
z$RecursiveSerializer.preprocessTriplec             C   s   d| _ i | _i | _tt| _i | _i | _i | _| j	rt
| j	drpxR| jj D ]\}}|| j	krL| j|| qLW n$x"| jj D ]\}}| j|| q|W d S )Nr   __iter__)r&   listsr   r   intr,   r+   r$   r%   roundtrip_prefixeshasattrr   r"   )r   r    nsr   r   r   r   i   s    

zRecursiveSerializer.resetc             C   sH   i }x>| j j|ddfD ](\}}}|j|g }|j| |||< qW |S )zb
        Build a hash key by predicate to a list of objects for the given
        subject
        N)r   r:   getappend)r   r)   
propertiesr>   r?   r@   ZoListr   r   r   buildPredicateHash{   s    
z&RecursiveSerializer.buildPredicateHashc             C   s   x$|j  D ]\}}|jttd q
W g }i }x0| jD ]&}||kr6||kr6|j| d||< q6W t|j }|j  x&|D ]}||krz|j| d||< qzW |S )z}Take a hash from predicate uris to lists of values.
           Sort the lists of values.  Return a sorted list of properties.)keyT)itemsr5   r   r   predicateOrderrH   r2   keys)r   rI   propobjectspropListr.   propsr   r   r   sortProperties   s    


z"RecursiveSerializer.sortPropertiesc             C   s   d| j |< dS )zMark a subject as done.TN)r+   )r   r)   r   r   r   subjectDone   s    zRecursiveSerializer.subjectDoner   c             C   s   | j | | j S )z-Returns indent string multiplied by the depth)r&   indentString)r   modifierr   r   r   indent   s    zRecursiveSerializer.indentc             C   s   | j j|j| jd dS )zWrite text in given encoding.replaceN)r   writeencodeencoding)r   textr   r   r   rY      s    zRecursiveSerializer.write)r   )__name__
__module____qualname__r
   ZClassr1   r	   r4   labelrM   r(   rU   tuplerD   r   r"   r*   r#   r9   r=   r;   r   rJ   rS   rT   rW   rY   __classcell__r   r   )r   r   r   (   s$   

r      Fc                   s   e Zd ZdZdZ fddZ fddZ fddZd.d
dZ fddZ	d/ddZ
dd Zdd Zdd Zdd Zdd Zd0ddZd1ddZd d! Zd2d"d#Zd$d% Zd&d' Zd3d(d)Zd4d*d+Zd,d- Z  ZS )5r   Zturtlez    c                s:   i | _ tt| j| tjdi| _| j  d | _t	| _
d S )Nr   )_ns_rewriter   r   r   r	   r4   keywordsr   r   _SPACIOUS_OUTPUT	_spacious)r   r   )r   r   r   r      s    zTurtleSerializer.__init__c                s~   |dkr|d dks&| j j|||krh|| jkrZd| }x|| j krNd| }q:W || j|< | jj||}tt| j|| |S )N r   _r?   )r   rG   rd   r   r   r"   )r   r    	namespacer?   )r   r   r   r"      s    


zTurtleSerializer.addNamespacec                s$   t t| j  i | _d| _i | _d S )NF)r   r   r   Z_shortNames_startedrd   )r   )r   r   r   r      s    zTurtleSerializer.resetNc       	      K   s   | j   || _|d k	r|| _n| jjd k	r4| jj| _|d k	rB|| _| j  | j }| j  d}x:|D ]2}| j|rtqd|r|d}| j	|rd| rd| j
d qdW | j  |j
td d | _d S )NTF
)r   r   baser   rg   r=   r9   startDocumentr#   	statementrY   endDocumentr   )	r   r   rm   r[   ZspaciousargsZsubjects_listZ	firstTimer)   r   r   r   	serialize   s,    


zTurtleSerializer.serializec                s   t t| j| xRt|D ]F\}}|| jkr.q| j||tkd t|tr|j	r| j|j	t
d qW |d }t|tr| j|  d7  < d S )N)
gen_prefixr   )r   r   r;   	enumeratere   getQNameVERBr'   r   datatype_GEN_QNAME_FOR_DTr   r,   )r   r<   inoder?   )r   r   r   r;      s    

z!TurtleSerializer.preprocessTripleTc          
   C   s   t |tsd S d }y| jj||d}W n2   | jjj|}|d k	rP||df}nd S Y nX |\}}}|jdrrd S | j||}d||f S )N)generaterh   .z%s:%s)r'   r   r   Zcompute_qnamer    endswithr"   )r   r!   rs   partspfxr    rj   localr   r   r   ru     s    



zTurtleSerializer.getQNamec             C   sv   d| _ t| jj }| jr2| j| j d| j   x*|D ]"\}}| j| j d||f   q8W |rr| jrr| jd d S )NTz@base <%s> .
z@prefix %s: <%s> .
rl   )rk   sortedr   rL   rm   rY   rW   rg   )r   Zns_listr    r!   r   r   r   rn   )  s    
zTurtleSerializer.startDocumentc             C   s   | j r| jd d S )Nrl   )rg   rY   )r   r   r   r   rp   4  s    zTurtleSerializer.endDocumentc             C   s   | j | | j|p| j|S )N)rT   	s_squared	s_default)r   r)   r   r   r   ro   8  s    
zTurtleSerializer.statementc             C   s6   | j d| j   | j|t | j| | j d dS )Nrl   z .T)rY   rW   pathSUBJECTpredicateList)r   r)   r   r   r   r   <  s
    

zTurtleSerializer.s_defaultc             C   sL   | j | dkst|t rdS | jd| j  d  | j| | jd dS )Nr   Frl   z[]z .T)r,   r'   r   rY   rW   r   )r   r)   r   r   r   r   C  s    

zTurtleSerializer.s_squaredFc             C   s.   | j |||p| j|||s*td|f d S )NzCannot serialize node '%s')	p_squared	p_defaultr   )r   rz   positionnewliner   r   r   r   K  s    zTurtleSerializer.pathc             C   s.   |t kr| r| jd | j| j|| dS )N T)r   rY   r`   )r   rz   r   r   r   r   r   r   P  s    
zTurtleSerializer.p_defaultc                sp   |t jkrdS |tkr*| jkr* j| S t|trJ|jd fdddS  j|} j||tkpj|j	 S d S )Nz()Tc                s    j | tS )N)ru   rx   )dt)r   r   r   <lambda>^  s   z(TurtleSerializer.label.<locals>.<lambda>)Z	use_plainZqname_callback)
r	   nilrv   re   r'   r   Z_literal_n3Z
relativizeru   Zn3)r   rz   r   r   )r   r   r`   V  s    



zTurtleSerializer.labelc             C   s   t |t s,|| jks,| j| dks,|tkr0dS |s>| jd | j|r| jd |  jd7  _| j| |  jd8  _| jd nV| j	| |  jd7  _| jd |  jd8  _| j
|dd | jd	 |  jd8  _d
S )Nr   Fr   (z )rc   [)r   z ]T)r'   r   r+   r,   r   rY   isValidListr&   doListrT   r   )r   rz   r   r   r   r   r   r   e  s*    







zTurtleSerializer.p_squaredc          
   C   sl   y| j j|tjdkrdS W n
   dS x>|rf|tjkrTtt| j j|dkrTdS | j j|tj}q*W dS )zW
        Checks if l is a valid RDF list, i.e. no nodes have other properties.
        NFrc   T)	r   valuer	   firstr   lenr2   Zpredicate_objectsrest)r   lr   r   r   r     s    zTurtleSerializer.isValidListc             C   sL   xF|rF| j j|tj}|d k	r4| j|t | j| | j j|tj}qW d S )N)r   r   r	   r   r   OBJECTrT   r   )r   r   itemr   r   r   r     s    
zTurtleSerializer.doListc             C   s   | j |}| j|}t|dkr$d S | j|d |d | j||d   xD|dd  D ]4}| jd| jd  | j|dd | j||  qVW d S )Nr   )r   r   z ;
T)rJ   rS   r   verb
objectListrY   rW   )r   r)   r   rI   rQ   	predicater   r   r   r     s    

zTurtleSerializer.predicateListc             C   s   | j |t| d S )N)r   rv   )r   rz   r   r   r   r   r     s    zTurtleSerializer.verbc             C   s   t |}|dkrd S |dkr dp"d}|  j|7  _| j|d t x8|dd  D ](}| jd| jd  | j|tdd qPW |  j|8  _d S )Nr   r   z,
T)r   )r   r&   r   r   rY   rW   )r   rP   countZdepthmodobjr   r   r   r     s    zTurtleSerializer.objectList)NNN)T)F)F)F)F)F)r]   r^   r_   Z
short_namerU   r   r"   r   rr   r;   ru   rn   rp   ro   r   r   r   r   r`   r   r   r   r   r   r   rb   r   r   )r   r   r      s.   
 






N)__doc__collectionsr   	functoolsr   Zrdflib.termr   r   r   Zrdflib.exceptionsr   Zrdflib.serializerr   Zrdflib.namespacer	   r
   sixr   r   __all__r   r   r   rv   r   rx   rf   r   r   r   r   r   <module>   s"    