
    #HJjW0                        d Z ddlmZ ddl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 dd	lmZmZmZ d
dlmZ dgZdZd
ZdZdZdZ G d de      Zy)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                       e Zd ZdZdZdZ fdZ fdZd Z fdZ		 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ
d fd	Zdd
ZddZd Zd Zd Zd Zd ZddZddZd Zd Zd Zd ZddZddZd Z xZS )r   a0  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                    i | _         d| _        t        t        |   |       t
        j                  di| _        | j                          d | _	        t        | _        y )NFa)_ns_rewrite_canonsuperr   __init__r   typekeywordsresetstream_SPACIOUS_OUTPUT	_spacious)selfstore	__class__s     o/Users/ahmed/devFolder/claude-voice/.venv/lib/python3.12/site-packages/rdflib/plugins/serializers/longturtle.pyr   zLongTurtleSerializer.__init__5   sH    "D2593

/    c                H   |dkD  r|d   dk(  s| j                   j                  ||      |k7  r`|| j                  vr6d|z   }|| j                   v rd|z   }|| j                   v r|| j                  |<   | j                  j                  ||      }t        t        |   ||       |S )N r   _p)
namespacesgetr   r   r   addNamespace)r!   prefix	namespacer)   r#   s       r$   r,   z!LongTurtleSerializer.addNamespace>   s     RKF1I,1D1DI2
2 T---&L4??*aA 4??*+,  (%%))&&9F"D6vyIr%   c                p   | j                   sy| j                  j                  }t        | j                        }|j	                  d      }|j                  d      }|j                          t               }|j                  dj                  |      dd       |j                         }||_        || _        y)zApply canonicalization to the store.

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

5!*AT 	 	
 ""$"3
r%   c                t    t         t        |           i | _        d| _        i | _        | j                          y )NF)r   r   r   _shortNames_startedr   r>   )r!   r#   s    r$   r   zLongTurtleSerializer.resetl   s1    "D/1r%   c                    |j                  dd      | _        | j                          || _        ||| _        n1| j
                  j                  | j
                  j                  | _        ||| _        | j                          | j                         }| j                          d}|D ]>  }| j                  |      r|rd}| j                  |      s+|r.| j                  d       @ | j                          d | _        y )NcanonFTr1   )r+   r   r   r   baser"   r    
preprocessorderSubjectsstartDocumentisDone	statementwriteendDocument)	r!   r   rD   encodingspaciouskwargssubjects_list	firstTimesubjects	            r$   r5   zLongTurtleSerializer.serializes   s     jj%0

DIZZ__(

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

4  % 		r%   c                v   t         t        |   |       t        |      D ]  \  }}|t        k(  r|| j
                  v r| j                  ht        |t              rX|j                  | j                        r=d|j                  | j                  d      vrd|j                  | j                  d      vr| j                  ||t        k(         t        |t              s|j                  s| j                  |j                  t                |d   }t        |t              r| j                   |xx   dz  cc<   y y )N#r'   /)
gen_prefixr   )r   r   preprocessTriple	enumerateVERBr   rD   
isinstancer   
startswithreplace	get_pnamer   datatype_GEN_QNAME_FOR_DTr   _references)r!   tripleinoder)   r#   s        r$   rV   z%LongTurtleSerializer.preprocessTriple   s    "D:6B (GAtDy4==(II)"40		24<<		2#>>4<<		2#>> NN4Q$YN8$(T]]t}}9JK# )$ 1IaQ1$  r%   c                   t        |t              sy 	 | j                  j                  ||      }|\  }}}|j                  dd      j                  dd      }| j                  j                  d|      }|j                  d      ry | j                  ||      }|d	|S # t        $ r2 | j                  j                  j                  |      }|||df}nY y Y w xY w)
N)generater'   (z\()z\)z\%.:)rY   r   r"   compute_qname	Exceptionr-   r[   2LOCALNAME_PECRENT_CHARACTER_REQUIRING_ESCAPE_REGEXsubendswithr,   )r!   urirU   partspfxr-   r.   locals           r$   r\   zLongTurtleSerializer.get_pname   s    #v&
	JJ,,S:,FE $) 	5
 dE*224?GGKK5

 >>#""695 %((5  	**""))#.Cc2  	s   B 6CCc                ^    t        j                  dt        d       | j                  ||      S )NzXLongTurtleSerializer.getQName is deprecated, use LongTurtleSerializer.get_pname instead.r   )
stacklevel)warningswarnDeprecationWarningr\   )r!   rn   rU   s      r$   getQNamezLongTurtleSerializer.getQName   s*    f	

 ~~c:..r%   c           	     v   d| _         t        | j                  j                               }| j                  r/| j                  | j                         d| j                  z  z          |D ].  \  }}| j                  | j                         d|d|dz          0 |r| j                  r| j                  d       y y y )NTz
BASE <%s>
zPREFIX z: <z>
r1   )rA   sortedr*   itemsrD   rJ   indentr    )r!   ns_listr-   rn   s       r$   rG   z"LongTurtleSerializer.startDocument   s    ..0199JJt{{}}tyy'@@A"KFCJJt{{}fc'JJK #t~~JJt &7r%   c                @    | j                   r| j                  d       y y )Nr1   )r    rJ   )r!   s    r$   rK   z LongTurtleSerializer.endDocument   s    >>JJt r%   c                l    | j                  |       | j                  |      xs | j                  |      S N)subjectDone	s_squared	s_defaultr!   rQ   s     r$   rI   zLongTurtleSerializer.statement   s-    !~~g&A$..*AAr%   c                    | j                  d| j                         z          | j                  |t               | j                  d| j                         z          | j	                  |       | j                  d       y)Nr1   
.T)rJ   r{   pathSUBJECTpredicateListr   s     r$   r   zLongTurtleSerializer.s_default   s[    

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

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

5r%   c                    | j                   |   dkD  st        |t              sy| j                  d| j	                         z   dz          | j                  |d       | j                  d       y)Nr   Fr1   z[]newliner   T)r_   rY   r   rJ   r{   r   r   s     r$   r   zLongTurtleSerializer.s_squared   s_    W%)*We2L

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

5r%   c                n    | j                  ||      s#| j                  |||      st        d|d      y y )NzCannot serialize node '')	p_squared	p_defaultr   r!   rb   positionr   s       r$   r   zLongTurtleSerializer.path   s6    NN4*dnnT8W.U>?? /V*r%   c                ~    |t         k7  r|s| j                  d       | j                  | j                  ||             y)N T)r   rJ   labelr   s       r$   r   zLongTurtleSerializer.p_default  s1    wwJJsO

4::dH-.r%   c                :    |t         j                  k(  ry|t        u r| j                  v r j                  |   S t	        |t
              r|j                  d fd      S  j                  |      } j                  ||t        k(        xs |j                         S )Nz()Tc                0    j                  | t              S r   )r\   r^   )dtr!   s    r$   <lambda>z,LongTurtleSerializer.label.<locals>.<lambda>  s    $..=N*Or%   )	use_plainqname_callback)
r   nilrX   r   rY   r   _literal_n3
relativizer\   n3r!   rb   r   s   `  r$   r   zLongTurtleSerializer.label
  s    377?t 5==&&dG$##O $  
 ??4(D>>$D(89FTWWYFr%   c                   t        |t              r)|| j                  v s| j                  |   dkD  s	|t        k(  ry| j                  |      rr| xj                  dz  c_        | j                  d       | xj                  dz  c_        | j                  |       | j                  d| j                         z   dz          y	| j                  |       | j                  d| j                  d      z   dz          | xj                  dz  c_        | j                  |       | xj                  dz  c_        | j                  d| j                  d      z   dz          y	)
Nr   Fr   z (
r1   rf   z[
]T)rY   r   _serializedr_   r   isValidListdepthrJ   doListr{   r   r   r   s      r$   r   zLongTurtleSerializer.p_squared  s    4't'''%)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                b   	 | j                   j                  |t        j                        y	 |rq|t        j
                  k7  r1t        t        | j                   j                  |                  dk7  ry| j                   j                  |t        j                        }|rqy# t        $ r Y yw xY w)zW
        Checks if l is a valid RDF list, i.e. no nodes have other properties.
        Fr   T)
r"   valuer   firstrj   r   lenlistpredicate_objectsrest)r!   l_s     r$   r   z LongTurtleSerializer.isValidList8  s    	zzCII.6 7 SWW}T$***F*Fr*J%K!LPQ!Q!!"chh/B    		s   *B" "	B.-B.c                   d}|r| j                   j                  |t        j                        }|r|dk(  r!| j	                  | j                  d             n#| j	                  d| j                  d      z          | j                  |t        d       | j                  |       | j                   j                  |t        j                        }|dz  }|ry y )Nr   r   r1   Tr   )
r"   r   r   r   rJ   r{   r   OBJECTr   r   )r!   r   ra   items       r$   r   zLongTurtleSerializer.doListG  s    ::##B		2D6JJt{{1~.JJtdkk!n45		$	5  $!!"chh/BFA r%   c                   | j                  |      }| j                  |      }t        |      dk(  ry | j                  | j	                  d             | j                  |d   d       | j                  ||d             |dd  D ]L  }| j                  d| j	                  d      z          | j                  |d       | j                  ||          N | j                  d       y )Nr   r   Tr   z ;
z ;)buildPredicateHashsortPropertiesr   rJ   r{   verb
objectList)r!   rQ   r   
propertiespropList	predicates         r$   r   z"LongTurtleSerializer.predicateListU  s    ,,W5
&&z2x=A

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

4r%   c                2    | j                  |t        |       y r   )r   rX   )r!   rb   r   s      r$   r   zLongTurtleSerializer.verbc  s    		$g&r%   c                8   t        |      }|dk(  ry |dk(  xr dxs d}| xj                  |z  c_        d}|dkD  rJt        |d   t              s$| j	                  d| j                  d      z          n| j	                  d       d}| j                  |d   t        |       |dd  D ]^  }| j	                  d       t        |t              s#| j	                  d| j                  d      z          | j                  |t        d       ` | xj                  |z  c_        y )	Nr   r   Fr1   r   Tr   z ,)r   r   rY   r   rJ   r{   r   r   )r!   objectscountdepthmodfirst_nlobjs         r$   r   zLongTurtleSerializer.objectListf  s    GA:QJ%A*

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

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

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

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

h
r%   )NNN)r   z	IO[bytes]rD   Optional[str]rL   r   rM   zOptional[bool]rN   r   returnNone)r`   r
   r   r   )T)F)__name__
__module____qualname____doc__
short_nameindentStringr   r,   r>   r   r5   rV   r\   rw   rG   rK   rI   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r#   s   @r$   r   r   *   s     JL00, #"&#'$$ $  	$
 !$ $ 
$L%0 )D/	B@G>'r%   )r   
__future__r   rt   typingr   r   r   rdflib.comparer   rdflib.exceptionsr   rdflib.graphr	   r
   rdflib.namespacer   rdflib.termr   r   r   turtler   __all__r   rX   r   r^   r   r    r%   r$   <module>r      s_   $ #  $ $ - # +   . . '!
"
	
  O. Or%   