o
    i?6                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ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)Error)RDFRDFS)
Serializer)BNodeLiteralURIRefRecursiveSerializerTurtleSerializerc                 C   sV   z| |krW dS | |k rW dS W dS  t y*   t| } t|}| |k| |k   Y S w )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   )	TypeErrorstr)ab r   \/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/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d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  r   c                    s"   t t| | d | _|   d S N)superr   __init__streamresetselfstore	__class__r   r   r   .   s   zRecursiveSerializer.__init__c                 C   s>   || j v r| j | |krt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   addNamespace3   s   z RecursiveSerializer.addNamespacec                 C   sF   |  |s|| jvs|| jv r| jdkst|tr!| j| jkr!d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 v S )z$Return true if subject is serialized_serializedr,   r   r   r   r&   F   s   
zRecursiveSerializer.isDonec                    s   i  g }j D ]#}tjtj|}|  || |D ]}dj|< d |< qq fddj	D }|  |dd |D  |S )NTc                    s*   g | ]}| v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   )r2   isbnoderefsr-   r   r   r   r5   ^   s    )

topClasseslistr   subjectsr   typesortextendr(   r'   )r   r:   classURImembersmember
recursabler   r3   r   orderSubjectsJ   s    



z!RecursiveSerializer.orderSubjectsc                 C   s    | j dD ]}| | qd S )NNNN)r   triplespreprocessTriple)r   tripler   r   r   
preprocessb   s   zRecursiveSerializer.preprocessc                 C   s*   |\}}}| j |  d7  < d| j|< d S )Nr   T)r1   r'   )r   spospor   r   r   rE   f   s   
z$RecursiveSerializer.preprocessTriplec                 C   s   d| _ i | _i | _tt| _i | _i | _i | _| j	rGt
| j	dr7| j D ]\}}|| j	v r4| || q%d S | j D ]\}}| || q<d S d S )Nr   __iter__)r)   listsr!   r   intr1   r0   r'   r(   roundtrip_prefixeshasattrr   r%   )r   r#   nsr   r   r   r   k   s$   

zRecursiveSerializer.resetc                 C   sD   i }| j |ddfD ]\}}}||g }|| |||< q|S )zb
        Build a hash key by predicate to a list of objects for the given
        subject
        N)r   rD   getappend)r   r-   
propertiesrI   rJ   rK   oListr   r   r   buildPredicateHash}   s   

z&RecursiveSerializer.buildPredicateHashc                 C   s   |  D ]\}}|jttd qg }i }| jD ]}||v r+||vr+|| d||< qt| }|  |D ]}||vrG|| d||< q8|S )zzTake a hash from predicate uris to lists of values.
        Sort the lists of values.  Return a sorted list of properties.)keyT)itemsr<   r   r   predicateOrderrS   r9   keys)r   rT   propobjectspropListr4   propsr   r   r   sortProperties   s"   


z"RecursiveSerializer.sortPropertiesc                 C   s   d| j |< dS )zMark a subject as done.TNr/   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d dS )zWrite text in given encoding.replaceN)r   writeencodeencoding)r   textr   r   r   re      s   zRecursiveSerializer.write)r   )__name__
__module____qualname__r   Classr8   r   r;   labelrY   r+   ra   rO   r   r%   r.   r&   rB   rG   rE   r   rV   r_   r`   rc   re   __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d0ddZd d! Zd0d"d#Zd$d% Zd&d' Zd0d(d)Zd0d*d+Zd,d- Z  ZS )1r   turtlez    c                    s:   i | _ tt| | tjdi| _|   d | _t	| _
d S )Nr   )_ns_rewriter   r   r   r   r;   keywordsr   r   _SPACIOUS_OUTPUT	_spaciousr   r   r   r   r      s   
zTurtleSerializer.__init__c                    s   |dkr
|d dks| j |||kr6|| jvr/d| }|| j v r*d| }|| j v s!|| j|< | j||}tt| || |S )N r   _rJ   )r!   rR   rq   r   r   r%   )r   r#   	namespacerJ   r   r   r   r%      s   




zTurtleSerializer.addNamespacec                    s$   t t|   i | _d| _i | _d S )NF)r   r   r   _shortNames_startedrq   r   r   r   r   r      s   
zTurtleSerializer.resetNc           	      K   s   |    || _|d ur|| _n| jjd ur| jj| _|d ur!|| _|   |  }|   d}|D ]}| |r9q1|r=d}| 	|rI|sI| 
d q1|   |
dd d | _d S )NTF
zlatin-1)r   r   baser   rt   rG   rB   startDocumentr&   	statementre   endDocumentrf   )	r   r   r|   rg   spaciousargssubjects_list	firstTimer-   r   r   r   	serialize   s.   



zTurtleSerializer.serializec                    s   t t| | t|D ]'\}}|tkr|| jv rq| j||tkd t|tr3|j	r3| j|j	t
d q|d }t|trH| j|  d7  < d S d S )N)
gen_prefixr   )r   r   rE   	enumerateVERBrr   getQNamer*   r	   datatype_GEN_QNAME_FOR_DTr   r1   )r   rF   inoderJ   r   r   r   rE      s   
z!TurtleSerializer.preprocessTripleTc                 C   s   t |tsd S d }z
| jj||d}W n ty0   | jj|}|d ur+||df}nY d S Y nw |\}}}|dddd}|drGd S | ||}d||f S )	N)generateru   (z\()z\).z%s:%s)	r*   r
   r   compute_qnamer"   r#   rd   endswithr%   )r   r$   r   partspfxr#   rw   localr   r   r   r     s$   



zTurtleSerializer.getQNamec                 C   sz   d| _ t| j }| jr| |  d| j   |D ]\}}| |  d||f   q|r9| jr;| d d S d S d S )NTz@base <%s> .
z@prefix %s: <%s> .
r{   )ry   sortedr!   rX   r|   re   rc   rt   )r   ns_listr#   r$   r   r   r   r}   *  s   
zTurtleSerializer.startDocumentc                 C   s   | j r
| d d S d S )Nr{   )rt   re   rz   r   r   r   r   5  s   zTurtleSerializer.endDocumentc                 C   s   |  | | |p| |S r   )r`   	s_squared	s_defaultr,   r   r   r   r~   9  s   
zTurtleSerializer.statementc                 C   s6   |  d|    | |t | | |  d dS )Nr{    .T)re   rc   pathSUBJECTpredicateListr,   r   r   r   r   =  s
   

zTurtleSerializer.s_defaultc                 C   sJ   | j | dkst|tsdS | d|   d  | | | d dS )Nr   Fr{   z[]r   T)r1   r*   r   re   rc   r   r,   r   r   r   r   D  s   

zTurtleSerializer.s_squaredFc                 C   s2   |  |||s| |||std|f d S d S )NzCannot serialize node '%s')	p_squared	p_defaultr   r   r   positionnewliner   r   r   r   L  s   zTurtleSerializer.pathc                 C   s,   |t kr|s| d | | || dS )N T)r   re   rm   r   r   r   r   r   S  s   
zTurtleSerializer.p_defaultc                    sl   |t jkrdS |tu r| jv r j| S t|tr%|jd fdddS  |} ||tkp5|	 S )Nz()Tc                    s     | tS r   )r   r   )dtrz   r   r   <lambda>a  s    z(TurtleSerializer.label.<locals>.<lambda>)	use_plainqname_callback)
r   nilr   rr   r*   r	   _literal_n3
relativizer   n3)r   r   r   r   rz   r   rm   Y  s   




zTurtleSerializer.labelc                 C   s   t |tr|| jv s| j| dks|tkrdS |s| d | |rB| d |  jd7  _| | |  jd8  _| d d
S | 	| |  jd7  _| d |  jd8  _| j
|dd | d	 |  jd8  _d
S )Nr   Fr   r   z )ro   [r   z ]T)r*   r   r0   r1   r   re   isValidListr)   doListr`   r   r   r   r   r   r   h  s.   








zTurtleSerializer.p_squaredc                 C   sv   z| j |tjdu rW dS W n
 ty   Y dS w |r9|tjkr/tt| j |dkr/dS | j |tj	}|sdS )zW
        Checks if l is a valid RDF list, i.e. no nodes have other properties.
        NFro   T)
r   valuer   firstr"   r   lenr9   predicate_objectsrest)r   l_r   r   r   r     s   "zTurtleSerializer.isValidListc                 C   sN   |r%| j |tj}|d ur| |t | | | j |tj}|sd S d S r   )r   r   r   r   r   OBJECTr`   r   )r   r   itemr   r   r   r     s   
zTurtleSerializer.doListc                 C   s   |  |}| |}t|dkrd S | j|d |d | ||d   |dd  D ]}| d| d  | j|dd | ||  q*d S )Nr   r   r   z ;
T)rV   r_   r   verb
objectListre   rc   )r   r-   r   rT   r]   	predicater   r   r   r     s   

zTurtleSerializer.predicateListc                 C   s   |  |t| d S r   )r   r   )r   r   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  _| |d t |dd  D ]}| d| d  | j|tdd q'|  j|8  _d S )Nr   r   z,
Tr   )r   r)   r   r   re   rc   )r   r\   countdepthmodobjr   r   r   r     s   zTurtleSerializer.objectListrC   )T)F)ri   rj   rk   
short_namera   r   r%   r   r   rE   r   r}   r   r~   r   r   r   r   rm   r   r   r   r   r   r   rn   r   r   r   r   r      s.    




!

N)__doc__collectionsr   	functoolsr   rdflib.exceptionsr   rdflib.namespacer   r   rdflib.serializerr   rdflib.termr   r	   r
   __all__r   r   r   r   r   r   rs   r   r   r   r   r   <module>   s"     