
    01iW0                        S r SSKJr  SSKrSSK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  S
SKJr  S/rSrS
rSrSrSr " S S\5      rg)am  
LongTurtle RDF graph serializer for RDFLib.
See http://www.w3.org/TeamSubmission/turtle/ for syntax specification.

This variant, longturtle as opposed to just turtle, makes some small format changes
to turtle - the original turtle serializer. It:

* uses PREFIX instead of @prefix
* uses BASE instead of @base
* adds a new line at RDF.type, or 'a'
* adds a newline and an indent for all triples with more than one object (object list)
* adds a new line and ';' for the last triple in a set with '.'
    on the start of the next line
* uses default encoding (encode()) is used instead of "latin-1"

- Nicholas Car, 2023
    )annotationsN)IOAnyOptional)to_canonical_graph)Error)Graph_TripleType)RDF)BNodeLiteralURIRef   )RecursiveSerializerLongTurtleSerializer   Fc                    ^  \ rS rSrSrSrSrU 4S jrU 4S jrS r	U 4S jr
   S           SS	 jjrSU 4S
 jjrSS jrSS jrS rS rS rS rS rS S jrS S jrS rS rS rS rS S jrS S jrS rSrU =r$ )!r   *   a   LongTurtle, a Turtle serialization format.

When the optional parameter `canon` is set to `True`, the graph is canonicalized
before serialization. This normalizes blank node identifiers and allows for
deterministic serialization of the graph. Useful when consistent outputs are required.

longturtlez    c                   > 0 U l         SU l        [        [        U ]  U5        [
        R                  S0U l        U R                  5         S U l	        [        U l        g )NFa)_ns_rewrite_canonsuperr   __init__r   typekeywordsresetstream_SPACIOUS_OUTPUT	_spacious)selfstore	__class__s     _/home/james-whalen/.local/lib/python3.13/site-packages/rdflib/plugins/serializers/longturtle.pyr   LongTurtleSerializer.__init__5   sH    "D2593

/    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$ )N r   _p)
namespacesgetr   r   r   addNamespace)r"   prefix	namespacer+   r$   s       r%   r.   !LongTurtleSerializer.addNamespace>   s     RKF1I,1D1D2
2 ---&L??*aA ??*+,  (%%))&9F"D6vIr'   c                j   U R                   (       d  gU R                  R                  n[        U R                  5      nUR	                  SS9nUR                  S5      nUR                  5         [        5       nUR                  SR                  U5      SSS9  UR                  5       nXl        XPl        g)zApply canonicalization to the store.

This normalizes blank node identifiers and allows for deterministic
serialization of the graph.
Nzapplication/n-triples)format
T)datar3   	skolemize)r   r#   namespace_managerr   	serializesplitsortr	   parsejoinde_skolemize)r"   r7   r#   contentlinesgraphs         r%   canonizeLongTurtleSerializer.canonizeV   s     {{ JJ88"4::.//)@/Ad#

5!*AT 	 	
 ""$"3
r'   c                t   > [         [        U ]  5         0 U l        SU l        0 U l        U R                  5         g )NF)r   r   r   _shortNames_startedr   rA   )r"   r$   s    r%   r   LongTurtleSerializer.resetl   s1    "D/1r'   c                2   UR                  SS5      U l        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         S U l        g )NcanonFTr4   )r-   r   r   r   baser#   r!   
preprocessorderSubjectsstartDocumentisDone	statementwriteendDocument)	r"   r   rI   encodingspaciouskwargssubjects_list	firstTimesubjects	            r%   r8   LongTurtleSerializer.serializes   s     jj%0

IZZ__(

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

4  % 		r'   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 )N#r)   /)
gen_prefixr   )r   r   preprocessTriple	enumerateVERBr   rI   
isinstancer   
startswithreplace	get_pnamer   datatype_GEN_QNAME_FOR_DTr   _references)r"   tripleinoder+   r$   s        r%   r\   %LongTurtleSerializer.preprocessTriple   s   "D:6B (GADy==(II)"400		224<<		2#>>4<<		2#>> NN4$YN8$((T]]]t}}9JK# )$ 1IaQ1$  r'   c                   [        U[        5      (       d  g  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\%.:)r_   r   r#   compute_qname	Exceptionr/   ra   2LOCALNAME_PECRENT_CHARACTER_REQUIRING_ESCAPE_REGEXsubendswithr.   )r"   urir[   partspfxr/   r0   locals           r%   rb   LongTurtleSerializer.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      $ )NzXLongTurtleSerializer.getQName is deprecated, use LongTurtleSerializer.get_pname instead.r   )
stacklevel)warningswarnDeprecationWarningrb   )r"   ru   r[   s      r%   getQNameLongTurtleSerializer.getQName   s(    f	

 ~~c..r'   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>
r4   )rE   sortedr,   itemsrI   rO   indentr!   )r"   ns_listr/   ru   s       r%   rL   "LongTurtleSerializer.startDocument   s    ..0199JJt{{}}tyy'@@A"KFJJt{{}fc'JJK #t~~JJt &7r'   c                J    U R                   (       a  U R                  S5        g g )Nr4   )r!   rO   )r"   s    r%   rP    LongTurtleSerializer.endDocument   s    >>JJt r'   c                v    U R                  U5        U R                  U5      =(       d    U R                  U5      $ N)subjectDone	s_squared	s_defaultr"   rV   s     r%   rN   LongTurtleSerializer.statement   s-    !~~g&A$..*AAr'   c                    U R                  SU R                  5       -   5        U R                  U[        5        U R                  SU R                  5       -   5        U R	                  U5        U R                  S5        g)Nr4   
.T)rO   r   pathSUBJECTpredicateListr   s     r%   r   LongTurtleSerializer.s_default   s[    

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

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

5r'   c                    U R                   U   S:  d  [        U[        5      (       d  gU R                  SU R	                  5       -   S-   5        U R                  USS9  U R                  S5        g)Nr   Fr4   z[]newliner   T)re   r_   r   rO   r   r   r   s     r%   r   LongTurtleSerializer.s_squared   sb    W%)*We2L2L

4$++-'$./7E2

5r'   c                    U R                  X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"   rh   positionr   s       r%   r   LongTurtleSerializer.path   s8    NN4**dnnTW.U.U>?? /V*r'   c                    U[         :w  a  U(       d  U R                  S5        U R                  U R                  X5      5        g)N T)r   rO   labelr   s       r%   r   LongTurtleSerializer.p_default  s/    wwJJsO

4::d-.r'   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   )rb   rd   )dtr"   s    r%   <lambda>,LongTurtleSerializer.label.<locals>.<lambda>  s    $..=N*Or'   )	use_plainqname_callback)
r   nilr^   r   r_   r   _literal_n3
relativizerb   n3r"   rh   r   s   `  r%   r   LongTurtleSerializer.label
  s    377?t 5==&&dG$$##O $  
 ??4(D>>$D(89FTWWYFr'   c                   [        U[        5      (       a,  XR                  ;   d  U R                  U   S:  d
  U[        :X  a  gU R                  U5      (       ar  U =R                  S-  sl        U R                  S5        U =R                  S-  sl        U R                  U5        U R                  SU R                  5       -   S-   5        g	U R                  U5        U R                  SU R                  S5      -   S-   5        U =R                  S-  sl        U R                  U5        U =R                  S-  sl        U R                  SU R                  S5      -   S-   5        g	)
Nr   Fr   z (
r4   rm   z[
]T)r_   r   _serializedre   r   isValidListdepthrO   doListr   r   r   r   s      r%   r   LongTurtleSerializer.p_squared  s    4'''''%)7"D!!JJ!OJJJvJJ!OJKKJJtdkkm+c12  T"JJtdkk!n,u45JJ!OJt$JJ!OJJJtdkk!n,s23r'   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   firstrq   r   lenlistpredicate_objectsrest)r"   l_s     r%   r    LongTurtleSerializer.isValidList8  s    	zzCII.6 7 SWW}T$***F*Fr*J%K!LPQ!Q!!"chh/B b   		s   +B0 0
B=<B=c                   SnU(       a  U R                   R                  U[        R                  5      nUbp  US:X  a!  U R	                  U R                  S5      5        O#U R	                  SU R                  S5      -   5        U R                  U[        SS9  U R                  U5        U R                   R                  U[        R                  5      nUS-  nU(       a  M  g g )Nr   r   r4   Tr   )
r#   r   r   r   rO   r   r   OBJECTr   r   )r"   r   rg   items       r%   r   LongTurtleSerializer.doListG  s    ::##B		2D6JJt{{1~.JJtdkk!n45		$	5  $!!"chh/BFA br'   c                   U R                  U5      nU R                  U5      n[        U5      S:X  a  g U R                  U R	                  S5      5        U R                  US   S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     U R                  S5        g )Nr   r   Tr   z ;
z ;)buildPredicateHashsortPropertiesr   rO   r   verb
objectList)r"   rV   r   
propertiespropList	predicates         r%   r   "LongTurtleSerializer.predicateListU  s    ,,W5
&&z2x=A

4;;q>"		(1+t	,
A;/0!!"IJJvA./IIiI.OOJ12 & 	

4r'   c                2    U R                  U[        U5        g r   )r   r^   )r"   rh   r   s      r%   r   LongTurtleSerializer.verbc  s    		$g&r'   c                \   [        U5      nUS:X  a  g US:H  =(       a    S=(       d    SnU =R                  U-  sl        SnUS:  aO  [        US   [        5      (       d$  U R	                  SU R                  S5      -   5        OU R	                  S5        SnU R                  US   [        US9  USS   Ha  nU R	                  S5        [        U[        5      (       d#  U R	                  SU R                  S5      -   5        U R                  U[        SS9  Mc     U =R                  U-  sl        g )	Nr   r   Fr4   r   Tr   z ,)r   r   r_   r   rO   r   r   r   )r"   objectscountdepthmodfirst_nlobjs         r%   r   LongTurtleSerializer.objectListf  s    GA:QJ%A*

h
19gaj%00

4$++a.01

3H		'!*fh	712;CJJtc5))

4$++a.01IIc64I0	 
 	

h
r'   )	r   r   rD   r!   rE   rI   r   r#   r   )NNN)r   z	IO[bytes]rI   Optional[str]rQ   r   rR   zOptional[bool]rS   r   returnNone)rf   r
   r   r   )T)F)__name__
__module____qualname____firstlineno____doc__
short_nameindentStringr   r.   rA   r   r8   r\   rb   r   rL   rP   rN   r   r   r   r   r   r   r   r   r   r   r   __static_attributes____classcell__)r$   s   @r%   r   r   *   s     JL00, #"&#'$$ $  	$
 !$ $ 
$L%0 )D/	B@G>' r'   )r   
__future__r   r|   typingr   r   r   rdflib.comparer   rdflib.exceptionsr   rdflib.graphr	   r
   rdflib.namespacer   rdflib.termr   r   r   turtler   __all__r   r^   r   rd   r    r    r'   r%   <module>r      s_   $ #  $ $ - # +   . . '!
"
	
  O. Or'   