o
    mi(<                     @  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__ [/home/kim/smarthome/.venv/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   ZOPT_NON_STR_KEYSZOPT_INDENT_2ZOPT_SORT_KEYSdumpswriter   encode)r&   r+   r-   r/   r0   context_datar5   r6   r7   r8   r9   r;   r<   objr=   Z
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%   rH   __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   )graphrE   r-   r5   r6   r7   Z	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 )+rX   r4   r   r5   boolr6   c                 C  s   || _ |jp|| _|| _d S r#   )r4   rZ   r5   r6   )r&   r4   r5   r6   r)   r)   r*   r%      s   
zConverter.__init__r]   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   )rP   cr)   r)   r*   rS      s    

z$Converter.convert.<locals>.<genexpr>   r   )Zcontext_awarer[   ZcontextsanyZdefault_contextrb   r   r	   rV   r   appendr4   
shrink_iriid_key
from_graphlenupdateZ	graph_keyrA   r\   r   rZ   )r&   r]   Zall_contextsZhas_dataset_default_idZdefault_graphZgraphsZdefault_graph_idgr4   ZobjsrF   Z	graphnamenodesdefaultitemsr)   r)   r*   rY      s`   




 zConverter.convertc                 C  sT   i }t | D ]}t|tst|tr#t|d |s#| ||| qt| S r#   )	setsubjectsrV   r   r   re   process_subjectr[   values)r&   r]   nodemapsr)   r)   r*   ri      s   
zConverter.from_graphru   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#   )	rV   r   r4   rg   r   n3rh   predicate_objectsadd_to_node)r&   r]   ru   rt   Znode_idnodepor)   r)   r*   rr      s   


zConverter.process_subjectrz   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)rP   vr]   rt   ru   r&   termr)   r*   
<listcomp>1  s
    z)Converter.add_to_node.<locals>.<listcomp>T) r4   rV   r   datatyperO   r~   Z	find_termvaluer   firstr   r   r   r   rZ   namer   r   	containerto_collectionr   
setdefaultrA   r   r[   rf   	to_symbolZtermsr6   r   type_keyr   )r&   r]   ru   rz   r{   r|   rt   r4   r   r~   
containersr   Zcoercionry   Zuse_setZp_keyr   rs   Zkey_termr)   r   r*   rx     s|   	











zConverter.add_to_nodecoerce_typerO   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   rV   r   r4   rg   r   rv   r   r   r   rO   r   )r&   r{   r   r)   r)   r*   r   ]  s   

zConverter.type_coercert   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   )rP   lor]   rt   ru   r&   r)   r*   r   r  s    z*Converter.to_raw_value.<locals>.<listcomp>Fc                 3  s    | ]	}| kr|V  qd S r#   r)   )rP   s2)ru   r)   r*   rS   }  s    z)Converter.to_raw_value.<locals>.<genexpr>)r4   r   Zlist_keyrV   r   rr   re   rq   rh   rv   r   rg   r   r5   r   PLAIN_LITERAL_TYPESZtoPythonrO   rZ   r   r   Z	value_keyr~   Zlang_key)r&   r]   ru   r{   rt   r4   ZcollZembedZ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 )NrI   )r   nilr   r   rp   rV   r   rw   restr   r   rf   add)	r&   r]   r   Z
list_nodeschainr   r   rz   r{   r)   r)   r*   r     s0   




zConverter.to_collectionN)r4   r   r5   ra   r6   ra   )r]   r	   )r]   r	   ru   r   )
r]   r	   ru   r   rz   r   r{   r   r|   r}   )r{   r   r   rO   )r]   r	   ru   r   r{   r   rt   r}   )r]   r	   r   r   )rJ   rK   rL   r%   rY   ri   rr   rx   r   r   r   r)   r)   r)   r*   rX      s    


C


W
/rX   )NNFFFNF)1rM   
__future__r   r?   typingr   r   r   r   r   Zrdflib.graphr   r	   r
   Zrdflib.namespacer   r   Zrdflib.serializerr   Zrdflib.termr   r   r   r   r   Zshared.jsonld.contextr   r   Zshared.jsonld.keysr   r   r   r   r   r   r   Zshared.jsonld.utilr   r   r   __all__booleanintegerdoublestringr   r    r!   rX   r)   r)   r)   r*   <module>   s.    $$=
%