
    01iF                    ,   S r SSKJr  SSKrSSKrSSKJr  SSKJrJ	r	J
r
JrJrJrJrJrJrJrJrJr  SSKJr  SSKJr  SSKJrJr  SS	KJr  SS
KJrJrJ r J!r!  \" S\"S9r#\	(       a
  SSKJ$r$J%r%J&r&  SS/r' " S S\5      r(Sr)Sr*Sr+Sr,Sr- " S S\(5      r.g)zr
Turtle RDF graph serializer for RDFLib.
See <http://www.w3.org/TeamSubmission/turtle/> for syntax specification.
    )annotationsN)defaultdict)IOTYPE_CHECKINGAnyDefaultDictDictListMappingOptionalSequenceTupleTypeVarUnion)Error)Graph)RDFRDFS)
Serializer)BNodeLiteralNodeURIRef_StrT)bound)_PredicateType_SubjectType_TripleTypeRecursiveSerializerTurtleSerializerc                  L  ^  \ rS rSr% Sr\R                  /r\R                  \R                  /rSrSrSrS\S'   \R"                  " S5      rSU 4S	 jjrSS
 jrSS jrSS jrSS jrSS jrSS jrSS jr    SS jr    SS jrS S jrS!S"S jjrS#S jrS$S jr Sr!U =r"$ )%r   (   z%Base class for recursive serializers.
   z   zTuple[Any, ...]roundtrip_prefixes%(?![0-9A-Fa-f]{2})c                Z   > [         [        U ]  U5        S U l        U R	                  5         g N)superr   __init__streamresetselfstore	__class__s     [/home/james-whalen/.local/lib/python3.13/site-packages/rdflib/plugins/serializers/turtle.pyr*   RecursiveSerializer.__init__4   s#    !41%8+/

    c           	         XR                   ;   a7  U R                   U   U:w  a$  [        SU< SU< SU R                   U   < 35      eX R                   U'   g )Nz$Trying to override namespace prefix z => z, but it's already bound to )
namespaces	Exception)r.   prefixuris      r1   addNamespace RecursiveSerializer.addNamespace9   sL    __$)@C)G3 79  #&r3   c                    U R                  U5      (       d]  XR                  ;  dN  XR                  ;   a  U R                  S:  d/  [	        U[
        5      (       a  U R                  U R                  :  a  gg)z4Check to see if the subject should be serialized yet   FT)isDone	_subjects
_topLevelsdepth
isinstancer   maxDepthr.   subjects     r1   checkSubject RecursiveSerializer.checkSubjectA   sS     [[!!~~-OO+$**q.7F++t}}1Lr3   c                    XR                   ;   $ )z$Return true if subject is serialized_serializedrC   s     r1   r=   RecursiveSerializer.isDoneL   s    ****r3   c           
        0 n/ nU R                    Hs  n[        U R                  R                  [        R
                  U5      5      nUR                  5         UR                  U5        U H  nSU R                  U'   SX'   M     Mu     U R                   Vs/ s H*  nXa;  d  M
  [        U[        5      U R                  U   U4PM,     nnUR                  5         UR                  U VV	Vs/ s H  u  pofPM	     snn	n5        U$ s  snf s  snn	nf )NT)
topClasseslistr/   subjectsr   typesortextendr?   r>   rA   r   _references)
r.   seenrN   classURImembersmemberrD   
recursableisbnoderefss
             r1   orderSubjects!RecursiveSerializer.orderSubjectsP   s    )+')H4::..sxxBCGLLNOOG$!*.'# " (  >>
)" MZ')9)9')BGL) 	 
 	L%=gWLM
 Ms   	D#$D*Dc                j    U R                   R                  S5       H  nU R                  U5        M     g )NNNN)r/   triplespreprocessTriple)r.   triples     r1   
preprocessRecursiveSerializer.preprocessi   s*    jj(();<F!!&) =r3   c                Z    Uu  p#nU R                   U==   S-  ss'   SU R                  U'   g )Nr<   T)rR   r>   )r.   spospos        r1   r_   $RecursiveSerializer.preprocessTriplem   s/    aq  qr3   c                   SU l         0 U l        0 U l        [        [        5      U l        0 U l        0 U l        0 U l        U R                  (       a  [        U R                  S5      (       aF  U R                  R                  5        H'  u  pXR                  ;   d  M  U R                  X5        M)     g U R                  R                  5        H  u  pU R                  X5        M     g g )Nr   __iter__)r@   listsr5   r   intrR   rI   r>   r?   r%   hasattrr/   r9   )r.   r7   nss      r1   r,   RecursiveSerializer.resetr   s    
')
-/3>s3C573546""t..
;;"&**"7"7"9JF!8!88))&5 #: #'**"7"7"9JF%%f1 #: #r3   c                    0 nU R                   R                  USS45       H-  u  p4nUR                  U/ 5      nUR                  U5        XbU'   M/     U$ )zJ
Build a hash key by predicate to a list of objects for the given
subject
N)r/   r^   getappend)r.   rD   
propertiesre   rf   rg   oLists          r1   buildPredicateHash&RecursiveSerializer.buildPredicateHash   sX     8:
zz))7D$*?@GA!NN1b)ELLO!qM A r3   c                h   UR                  5        H  u  p#UR                  5         M     / n0 nU R                   H&  nX!;   d  M
  X%;  d  M  UR                  U5        SXR'   M(     [	        UR                  5       5      nUR                  5         U H  nX%;  d  M
  UR                  U5        SXR'   M!     U$ )zrTake a hash from predicate uris to lists of values.
Sort the lists of values.  Return a sorted list of properties.T)itemsrP   predicateOrderrr   rM   keys)r.   rs   propobjectspropListrS   propss          r1   sortProperties"RecursiveSerializer.sortProperties   s     (--/MDLLN 0
 *,+-''D")9%!
 ( Z__&'

D%!
  r3   c                "    SU R                   U'   g)zMark a subject as done.TNrH   rC   s     r1   subjectDoneRecursiveSerializer.subjectDone   s    $(!r3   c                :    U R                   U-   U R                  -  $ )z-Returns indent string multiplied by the depth)r@   indentString)r.   modifiers     r1   indentRecursiveSerializer.indent   s    

X%):):::r3   c                n    U R                   R                  UR                  U R                  S5      5        g)zWrite text in given encoding.replaceN)r+   writeencodeencoding)r.   texts     r1   r   RecursiveSerializer.write   s%     	$++dmmY?@r3   c                    U R                   nUb^  UR                  U5      (       aH  SUR                  US5      ;  a2  SUR                  US5      ;  a  [        UR                  USS5      5      nU$ )N# /r<   )base
startswithr   r   )r.   r8   r   s      r1   
relativizeRecursiveSerializer.relativize   sd    yyt$$3;;tR003;;tR00 T2q12C
r3   )rR   rI   r>   r?   r@   rk   r5   r+   r/   r   )r7   strr8   r   returnNonerD   r   r   bool)r   zList[_SubjectType]r   r   )rd   r   r   r   )rD   r   r   #Mapping[_PredicateType, List[Node]])rs   r   r   zList[_PredicateType])rD   r   r   r   )r   )r   rl   r   r   )r   r   r   r   )r8   r   r   zUnion[_StrT, URIRef])#__name__
__module____qualname____firstlineno____doc__r   ClassrL   r   rO   labelry   rB   r   r%   __annotations__recompile2LOCALNAME_PECRENT_CHARACTER_REQUIRING_ESCAPE_REGEXr*   r9   rE   r=   rZ   ra   r_   r,   ru   r   r   r   r   r   __static_attributes____classcell__r0   s   @r1   r   r   (   s    /**Jhh

+NHL*,,9;:6
&	+2*!
2&#	,=	4);A

 
r3   r<      Fc                  r  ^  \ rS rSrSrSrSr\R                  " S5      r	SU 4S jjr
SU 4S jjrSU 4S jjr   S           S S	 jjrS!U 4S
 jjrS"S#S jjrS"S#S jjrSS jrSS jrS$S jrS$S jrS$S jrS%S&S jjrS%S'S jjrS(S jrS%S'S jjrS)S jrS*S jrS%S+S jjrS%S,S jjrS-S jrSrU =r $ ).r       zTurtle RDF graph serializer.turtlez    r&   c                   > 0 U l         [        [        U ]  U5        [        R
                  S0U l        U R                  5         S U l        [        U l
        g )Na)_ns_rewriter)   r    r*   r   rO   keywordsr,   r+   _SPACIOUS_OUTPUT	_spaciousr-   s     r1   r*   TurtleSerializer.__init__   sA    +-.u5*-((C

)r3   c                N  > US:  a	  US   S:X  d  U R                   R                  X5      U:w  ab  XR                  ;  a8  SU-   nX0R                   ;   a  SU-   nX0R                   ;   a  M  X0R                  U'   U R                  R                  X5      n[        [        U ]  X5        U$ )Nr   r   _rf   )r5   rq   r   r)   r    r9   )r.   r7   	namespacerf   r0   s       r1   r9   TurtleSerializer.addNamespace   s     RKF1I,1D1D2
2 ---&L??*aA ??*+,  (%%))&9F26Er3   c                T   > [         [        U ]  5         0 U l        SU l        0 U l        g )NF)r)   r    r,   _shortNames_startedr   )r.   r0   s    r1   r,   TurtleSerializer.reset   s(    +--/r3   c                D   U R                  5         Xl        Ub  X l        O2U R                  R                  b  U R                  R                  U l        Ub  X@l        U R                  5         U R                  5       nU R                  5         SnU HV  nU R                  U5      (       a  M  U(       a  SnU R                  U5      (       d  M<  U(       a  ME  U R                  S5        MX     U R                  5         UR                  SR                  S5      5        S U l        g )NTF
zlatin-1)r,   r+   r   r/   r   ra   rZ   startDocumentr=   	statementr   endDocumentr   )	r.   r+   r   r   spaciouskwargssubjects_list	firstTimerD   s	            r1   	serializeTurtleSerializer.serialize   s     	

IZZ__(

DI%N**,	$G{{7##!	~~g&&yy

4  % 	T[[+,	r3   c                  > [         [        U ]  U5        [        U5       GH  u  p#U[        :X  a  X0R
                  ;   a  M!  U R                  bw  [        U[        5      (       ab  UR                  U R                  5      (       aB  SUR                  U R                  S5      ;  a"  SUR                  U R                  S5      ;  a  M  U R                  X2[        :H  S9  [        U[        5      (       d  M  UR                  (       d  M  U R                  UR                  [        S9  GM     US   n[        U[        5      (       a  U R                   U==   S-  ss'   g g )Nr   r   r   )
gen_prefixr<   )r)   r    r_   	enumerateVERBr   r   rA   r   r   r   	get_pnamer   datatype_GEN_QNAME_FOR_DTr   rR   )r.   r`   inoderf   r0   s        r1   r_   !TurtleSerializer.preprocessTriple&  s   6v> (GADy==(II)"400		224<<		2#>>4<<		2#>> NN4$YN8$((T]]]t}}9JK# )$ 1IaQ1$  r3   c                   [        U[        5      (       d  g S n U R                  R                  XS9nUu  pVnUR                  SS5      R                  SS5      nU R                  R                  SU5      nUR                  S5      (       a  g U R                  XV5      nU< S	U< 3$ ! [         a1    U R                  R                  R                  U5      nUb  XAS4n N g f = f)
N)generater   (z\()z\)z\%.:)rA   r   r/   compute_qnamer6   r7   r   r   subendswithr9   )r.   r8   r   partspfxr7   r   locals           r1   r   TurtleSerializer.get_pname?  s    #v&&
	JJ,,S,FE $) 5
 dE*224?GGKK5

 >>#""65 %((5  	**""))#.C2 	s   B' '6C"!C"c                X    [         R                  " S[        SS9  U R                  X5      $ )NzPTurtleSerializer.getQName is deprecated, use TurtleSerializer.get_pname instead.r   )
stacklevel)warningswarnDeprecationWarningr   )r.   r8   r   s      r1   getQNameTurtleSerializer.getQNamec  s(    ^	

 ~~c..r3   c           	        SU l         [        U R                  R                  5       5      nU R                  (       a/  U R                  U R                  5       SU R                  -  -   5        U H0  u  p#U R                  U R                  5       SU< SU< S3-   5        M2     U(       a$  U R                  (       a  U R                  S5        g g g )NTz@base <%s> .
z@prefix z: <z> .
r   )r   sortedr5   rx   r   r   r   r   )r.   ns_listr7   r8   s       r1   r   TurtleSerializer.startDocumentk  s    ..0199JJt{{}'7$))'CCD"KFJJt{{}'MMN #t~~JJt &7r3   c                J    U R                   (       a  U R                  S5        g g )Nr   )r   r   )r.   s    r1   r   TurtleSerializer.endDocumentv  s    >>JJt r3   c                v    U R                  U5        U R                  U5      =(       d    U R                  U5      $ r(   )r   	s_squared	s_defaultrC   s     r1   r   TurtleSerializer.statementz  s-    !~~g&A$..*AAr3   c                    U R                  SU R                  5       -   5        U R                  U[        5        U R	                  U5        U R                  S5        g)Nr    .T)r   r   pathSUBJECTpredicateListrC   s     r1   r   TurtleSerializer.s_default~  sD    

4$++-'(		'7#7#

4r3   c                    U R                   U   S:  d  [        U[        5      (       d  gU R                  SU R	                  5       -   S-   5        U R                  U5        U R                  S5        g)Nr   Fr   z[]r   T)rR   rA   r   r   r   r   rC   s     r1   r   TurtleSerializer.s_squared  s]    W%)*We2L2L

4$++-'$./7#

4r3   c                    U R                  XU5      (       d(  U R                  XU5      (       d  [        SU< S35      eg g )NzCannot serialize node '')	p_squared	p_defaultr   r.   r   positionnewlines       r1   r   TurtleSerializer.path  s<    NN4733~~dg66>?? 7 4r3   c                    U[         :w  a  U(       d  U R                  S5        U R                  U R                  X5      5        g)N T)r   r   r   r   s       r1   r   TurtleSerializer.p_default  s/    wwJJsO

4::d-.r3   c                P  ^  U[         R                  :X  a  gU[        L a  UT R                  ;   a  T R                  U   $ [	        U[
        5      (       a  UR                  SU 4S jS9$ T R                  U5      nT R                  X[        :H  5      =(       d    UR                  5       $ )Nz()Tc                0   > TR                  U [        5      $ r(   )r   r   )dtr.   s    r1   <lambda>(TurtleSerializer.label.<locals>.<lambda>  s    $..=N*Or3   )	use_plainqname_callback)
r   nilr   r   rA   r   _literal_n3r   r   n3)r.   r   r  s   `  r1   r   TurtleSerializer.label  s    377?t 5==&&dG$$##O $  
 ??4(D>>$D(89FTWWYFr3   c                   [        U[        5      (       a,  XR                  ;   d  U R                  U   S:  d
  U[        :X  a  gU(       d  U R                  S5        U R                  U5      (       a^  U R                  S5        U =R                  S-  sl        U R                  U5        U =R                  S-  sl        U R                  S5        g
U R                  U5        U =R                  S-  sl        U R                  S5        U =R                  S-  sl        U R                  USS9  U R                  S	5        U =R                  S-  sl        g
)Nr<   Fr  r   z )r   [r  z ]T)rA   r   rI   rR   r   r   isValidListr@   doListr   r   r   s       r1   r   TurtleSerializer.p_squared  s    4'''''%)7"JJsOD!!JJsOJJ!OJKKJJ!OJJJt  T"JJ!OJJJsOJJ!OJtU3JJtJJ!OJr3   c                    U R                   R                  U[        R                  5      c  g U(       ay  U[        R
                  :w  a2  [        [        U R                   R                  U5      5      5      S:w  a  gU R                   R                  U[        R                  5      nU(       a  My  g! [         a     gf = f)zG
Checks if l is a valid RDF list, i.e. no nodes have other properties.
Fr   T)
r/   valuer   firstr6   r  lenrM   predicate_objectsrest)r.   l_s     r1   r  TurtleSerializer.isValidList  s    	zzCII.6 7 SWW}T$***F*Fr*J%K!LPQ!Q!!"chh/B	 b
   		s   +B0 0
B=<B=c                "   U(       a  U R                   R                  U[        R                  5      nUb'  U R	                  U[
        5        U R                  U5        U R                   R                  U[        R                  5      nU(       a  M  g g r(   )r/   r  r   r  r   OBJECTr   r  )r.   r  items      r1   r  TurtleSerializer.doList  sb    ::##B		2D		$'  $!!"chh/B br3   c                ^   U R                  U5      nU R                  U5      n[        U5      S:X  a  g U R                  US   US9  U R	                  X4S      5        USS   HI  nU R                  SU R                  S5      -   5        U R                  USS9  U R	                  X5   5        MK     g )Nr   r  r<   z ;
T)ru   r   r  verb
objectListr   r   )r.   rD   r  rs   r}   	predicates         r1   r   TurtleSerializer.predicateList  s    ,,W5
&&z2x=A		(1+w	/
A;/0!!"IJJvA./IIiI.OOJ12 &r3   c                2    U R                  U[        U5        g r(   )r   r   )r.   r   r  s      r1   r%  TurtleSerializer.verb  s    		$g&r3   c                d   [        U5      nUS:X  a  g US:H  =(       a    S=(       d    SnU =R                  U-  sl        U R                  US   [        5        USS   H;  nU R	                  SU R                  S5      -   5        U R                  U[        SS9  M=     U =R                  U-  sl        g )Nr   r<   z,
Tr  )r  r@   r   r!  r   r   )r.   r|   countdepthmodobjs        r1   r&  TurtleSerializer.objectList  s    GA:QJ%A*

h
		'!*f%12;CJJut{{1~-.IIc64I0  	

h
r3   )r   r   r   r   r   r   r+   r   )r7   r   r   r   r   r   r   r]   )r+   z	IO[bytes]r   Optional[str]r   r0  r   zOptional[bool]r   r   r   r   )r`   r   r   r   )T)r8   r   r   r   r   r0  r   )F)r   r   r  rl   r  r   r   r   )r   r   r  rl   r  r   r   r   )r   r   r  rl   r   r   )r  r   r   r   )r  r   r   r   )rD   r   r  r   r   r   )r   r   r  r   r   r   )r|   zSequence[Node]r   r   )!r   r   r   r   r   
short_namer   r   r   r   r*   r9   r,   r   r_   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r%  r&  r   r   r   s   @r1   r    r       s    &JL9;:6*0 #"&#'$$ $  	$
 !$ $ 
$L%2")H/	B@GB 0
3'
 
r3   )/r   
__future__r   r   r   collectionsr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   rdflib.exceptionsr   rdflib.graphr   rdflib.namespacer   r   rdflib.serializerr   rdflib.termr   r   r   r   r   r   r   r   r   __all__r   r   r   r!  r   r   r    r$   r3   r1   <module>r;     s   
 # 	  #    $  & ( 4 4s#FF "4
5\* \~ 	
  m* mr3   