o
    
i(<                     @  s  d Z ddlmZ ddlZddlmZmZmZmZm	Z	 ddl
mZmZmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZ d	d
lmZmZ d	dlmZmZmZm Z m!Z!m"Z"m#Z# d	dl$m%Z%m&Z&m'Z' ddgZ(ej)ej*ej+ej,hZ-G dd deZ.							dddZ/G dd dZ0dS )a  
This serialiser will output an RDF Graph as a JSON-LD formatted document. See http://json-ld.org/

Example:
    ```python
    >>> from rdflib import Graph
    >>> testrdf = '''
    ... @prefix dc: <http://purl.org/dc/terms/> .
    ... <http://example.org/about>
    ...     dc:title "Someone's Homepage"@en .
    ... '''

    >>> g = Graph().parse(data=testrdf, format='n3')

    >>> print(g.serialize(format='json-ld', indent=2))
    [
      {
        "@id": "http://example.org/about",
        "http://purl.org/dc/terms/title": [
          {
            "@language": "en",
            "@value": "Someone's Homepage"
          }
        ]
      }
    ]

    ```
    )annotationsN)IOAnyDictListOptional)DATASET_DEFAULT_GRAPH_IDGraph_ObjectType)RDFXSD)
Serializer)BNodeIdentifiedNode
IdentifierLiteralURIRef   )UNDEFContext)CONTEXTGRAPHIDLANGLISTSETVOCAB)_HAS_ORJSONjsonorjsonJsonLDSerializerfrom_rdfc                      s2   e Zd ZdZd fddZ		ddddZ  ZS )r    zJSON-LD RDF graph serializer.storer	   c                   s   t t| | d S N)superr    __init__)selfr"   	__class__ U/home/ubuntu/.local/lib/python3.10/site-packages/rdflib/plugins/serializers/jsonld.pyr%   <   s   zJsonLDSerializer.__init__Nstream	IO[bytes]baseOptional[str]encodingkwargsr   returnNonec                 K  s  |pd}|dvrt d|  |d}|ddf}|dd}|dd}|d	d
}	|dd}
|dd}|dd}t| j|||||d}trutj}|	d urY|tjO }|r`|tj	O }|rgt d tj
||d}|| d S tj
||	|
||d}|||d d S )Nutf-8)r3   zutf-16z7JSON should be encoded as unicode. Given encoding was: contextuse_native_typesFuse_rdf_typeauto_compactindentr   
separators),z: 	sort_keysTensure_ascii)r7   z#Cannot use ensure_ascii with orjson)option)r8   r9   r;   r<   replace)warningswarngetr!   r"   r   r   OPT_NON_STR_KEYSOPT_INDENT_2OPT_SORT_KEYSdumpswriter   encode)r&   r+   r-   r/   r0   context_datar5   r6   r7   r8   r9   r;   r<   objr=   
data_bytesdatar)   r)   r*   	serialize?   sN   



zJsonLDSerializer.serialize)r"   r	   NN)
r+   r,   r-   r.   r/   r.   r0   r   r1   r2   )__name__
__module____qualname____doc__r%   rL   __classcell__r)   r)   r'   r*   r    9   s    Fc                 C  s   |s|rt dd |  D }t|tr|}| }nt||d}t|||}	|	| }
|	jjr@t|
t	r<|
t|
i}
||
t< |
S )Nc                 s  s0    | ]\}}|rt |d kr|t |fV  qdS )z$http://www.w3.org/XML/1998/namespaceN)str).0pfxnsr)   r)   r*   	<genexpr>   s    
zfrom_rdf.<locals>.<genexpr>)r-   )dict
namespaces
isinstancer   to_dict	Converterconvertr4   activelistget_keyr   r   )graphrH   r-   r5   r6   r7   	startnodeindexr4   	converterresultr)   r)   r*   r!   t   s   



c                   @  s\   e Zd Zd$ddZd%d
dZd%ddZd&ddZd'ddZd(ddZd)ddZ	d*d!d"Z
d#S )+r\   r4   r   r5   boolr6   c                 C  s   || _ |jp|| _|| _d S r#   )r4   r^   r5   r6   )r&   r4   r5   r6   r)   r)   r*   r%      s   
zConverter.__init__ra   r	   c                 C  s  |j rBt| }tdd |D }|r|jjtkr|j}nt }|g}|j}|D ]}||v r0q)t|jt	r<|
| q)||7 }q)n|g}|j}| j}g }	|D ]T}i }
d }t|jt	rk|j|krk||j}||
|j< | |}|st|dkr|
|d  n|sqO||
|j< |	r|	d |t|kr|	d |
 qO|	
|
 qOt|dkrt|	dkr| jjs|	d }||j}t|dkr|r|}	|	S t|	dkr| jjr|	d }	|	S )Nc                 s  s    | ]}|j tkV  qd S r#   )
identifierr   )rT   cr)   r)   r*   rW      s    

z$Converter.convert.<locals>.<genexpr>   r   )context_awarer_   contextsanydefault_contextrg   r   r	   rZ   r   appendr4   
shrink_iriid_key
from_graphlenupdate	graph_keyrA   r`   r   r^   )r&   ra   all_contextshas_dataset_default_iddefault_graphgraphsdefault_graph_idgr4   objsrI   	graphnamenodesdefaultitemsr)   r)   r*   r]      s`   




 zConverter.convertc                 C  sT   i }t | D ]}t|tst|tr#t|d |s#| ||| qt| S r#   )	setsubjectsrZ   r   r   rl   process_subjectr_   values)r&   ra   nodemapsr)   r)   r*   rq      s   
zConverter.from_graphr   r   c              	   C  s   t |tr| j|}nt |tr| }nd }||v rd S i }||| jj< |||< ||D ]\}}| |||||| q/|S r#   )	rZ   r   r4   ro   r   n3rp   predicate_objectsadd_to_node)r&   ra   r   r   node_idnodepor)   r)   r*   r      s   


zConverter.process_subjectr   r   r   s_nodeDict[str, Any]c                   sr  j }t|tr |jrt|jnd }|j}	|jt|||	dn, |tj	r+t
d gnd g}
|
D ]}tttfD ]}|t|||rF nq7rK nq0d }|j }rֈj}jrb|j}njrp|jjkrpt|}n|jrjd u r|jd u rt|}t
jv r fdd |D }nntjv r|	r||i }||	}t|}|stjv rt|ts|g ||	< }|| d S |||	< d S tjv rd}n0||}|j|}|r|js|jr|}s|tjkrjst|tr||}|j}|d u r |}||}|r*t|ts$|g}|| n	|r1|g}n|}|||< d S )N)languagec                   s*   g | ]} |jp |qS r)   )type_coercetypeto_raw_value)rT   vra   r   r   r&   termr)   r*   
<listcomp>1  s
    z)Converter.add_to_node.<locals>.<listcomp>T) r4   rZ   r   datatyperS   r   	find_termvaluer   firstr   r   r   r   r^   namer   r   	containerto_collectionr   
setdefaultrA   r   r_   rn   	to_symboltermsr6   r   type_keyr   )r&   ra   r   r   r   r   r   r4   r   r   
containersr   coercionr   use_setp_keyr   r   key_termr)   r   r*   r     s|   	











zConverter.add_to_nodecoerce_typerS   c                 C  sr   |t krt|tr| j|S t|tr| S |S |tkr)t|tr)| j|S t|t	r7t
|j|kr7|S d S r#   )r   rZ   r   r4   ro   r   r   r   r   r   rS   r   )r&   r   r   r)   r)   r*   r   ]  s   

zConverter.type_coercer   c                   sf  j } |}|d ur" fdd |D }|j|iS t|trSd} |}|rL|rEtfdd d |D sE|S |||j < |j|	 iS t|t
r`|j||iS t|trjol|jtv }	|	rt| }
nt|}
|jr|	rj jr|
S |j||j|j|
iS |jr|j|jkr|j|j|j|
iS |jr|jr|js|j|
iS |
S d S )Nc                   s   g | ]
}  |qS r)   )r   )rT   lora   r   r   r&   r)   r*   r   r  s    z*Converter.to_raw_value.<locals>.<listcomp>Fc                 3  s    | ]	}| kr|V  qd S r#   r)   )rT   s2)r   r)   r*   rW   }  s    z)Converter.to_raw_value.<locals>.<genexpr>)r4   r   list_keyrZ   r   r   rl   r   rp   r   r   ro   r   r5   r   PLAIN_LITERAL_TYPEStoPythonrS   r^   r   r   	value_keyr   lang_key)r&   ra   r   r   r   r4   collembedonodenativer   r)   r   r*   r   l  sF   


"



zConverter.to_raw_valuel_c           	      C  s   |t jkr||t jsd S g }t|g}|rj|t jkr|S t|tr%d S d\}}||D ]%\}}|s<|t jkr<|}q.|sF|t jkrF|}q.|t j	ksP|t j
krS d S q.|| |}||v rad S || |sd S d S )NrM   )r   nilr   r   r   rZ   r   r   restr   r   rn   add)	r&   ra   r   
list_nodeschainr   r   r   r   r)   r)   r*   r     s0   




zConverter.to_collectionN)r4   r   r5   rf   r6   rf   )ra   r	   )ra   r	   r   r   )
ra   r	   r   r   r   r   r   r   r   r   )r   r   r   rS   )ra   r	   r   r   r   r   r   r   )ra   r	   r   r   )rN   rO   rP   r%   r]   rq   r   r   r   r   r   r)   r)   r)   r*   r\      s    


C


W
/r\   )NNFFFNF)1rQ   
__future__r   r?   typingr   r   r   r   r   rdflib.graphr   r	   r
   rdflib.namespacer   r   rdflib.serializerr   rdflib.termr   r   r   r   r   shared.jsonld.contextr   r   shared.jsonld.keysr   r   r   r   r   r   r   shared.jsonld.utilr   r   r   __all__booleanintegerdoublestringr   r    r!   r\   r)   r)   r)   r*   <module>   s.    $$=
%