o
    i1                     @   s   d Z ddlZddlmZ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mZ dd
lmZmZmZmZmZmZmZ ddl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Z%dS )a  
This serialiser will output an RDF Graph as a JSON-LD formatted document. See:

    http://json-ld.org/

Example usage::

    >>> 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=4))
    [
        {
            "@id": "http://example.org/about",
            "http://purl.org/dc/terms/title": [
                {
                    "@language": "en",
                    "@value": "Someone's Homepage"
                }
            ]
        }
    ]

    N)IOOptional)Graph)RDFXSD)
Serializer)BNodeLiteralURIRef   )UNDEFContext)CONTEXTGRAPHIDLANGLISTSETVOCAB)jsonJsonLDSerializerfrom_rdfc                       sJ   e Zd Zdef fddZ		d
dee dee dee fdd	Z	  Z
S )r   storec                    s   t t| | d S N)superr   __init__)selfr   	__class__ \/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/rdflib/plugins/serializers/jsonld.pyr   9   s   zJsonLDSerializer.__init__Nstreambaseencodingc                 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j||	|
||d}|||d d S )Nutf-8)r$   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)r(   )r)   r*   r,   r-   replace)	warningswarngetr   r   r   dumpswriteencode)r   r!   r"   r#   kwargscontext_datar&   r'   r(   r)   r*   r,   r-   objdatar   r   r    	serialize<   s:   
	zJsonLDSerializer.serializeNN)__name__
__module____qualname__r   r   r   bytesr   strr9   __classcell__r   r   r   r    r   8   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)r?   ).0pfxnsr   r   r    	<genexpr>v   s    
zfrom_rdf.<locals>.<genexpr>)r"   )dict
namespaces
isinstancer   to_dict	Converterconvertr%   activelistget_keyr   r   )graphr6   r"   r&   r'   r(   	startnodeindexr%   	converterresultr   r   r    r   h   s   



c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )rI   c                 C   s   || _ |jp|| _|| _d S r   )r%   rK   r&   r'   )r   r%   r&   r'   r   r   r    r      s   
zConverter.__init__c                 C   sb  |j r!t }|g}| D ]}t|jtr|| q||7 }qn|g}| j}g }|D ]O}i }d }t|jtrB||j}|||j	< | 
|}	|sWt|	dkrW||	d  n|	sZq+|	||j< |ru|d |t|kru|d | q+|| q+t|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 )N   r   )context_awarer   contextsrG   
identifierr
   appendr%   
shrink_iriid_key
from_graphlenupdate	graph_keyr1   rM   r   rK   )r   rN   default_graphgraphsgr%   objsr7   	graphnamenodesdefaultitemsr   r   r    rJ      sF   



 zConverter.convertc                 C   sT   i }t | D ]}t|tst|tr#t|d |s#| ||| qt| S r   )	setsubjectsrG   r
   r   anyprocess_subjectrL   values)r   rN   nodemapsr   r   r    rZ      s   
zConverter.from_graphc              	   C   s   t |tr| j|}nt |tr| }nd }||v rd S i }||| jj< |||< ||D ]\}}| |||||| q/|S r   )	rG   r
   r%   rX   r   n3rY   predicate_objectsadd_to_node)r   rN   rl   rk   node_idnodepor   r   r    ri      s   


zConverter.process_subjectc                    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)rA   vrN   rk   rl   r   termr   r    
<listcomp>  s
    z)Converter.add_to_node.<locals>.<listcomp>T) r%   rG   r	   datatyper?   rt   	find_termvaluer   firstr   r   r   r   rK   namerv   ru   	containerto_collectionr   
setdefaultr1   r   rL   rW   	to_symboltermsr'   r
   type_keyrw   )r   rN   rl   rr   rs   s_noderk   r%   r|   rt   
containersr   coercionrq   use_setp_keyr~   rj   key_termr   ry   r    ro      s|   











zConverter.add_to_nodec                 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   rG   r
   r%   rX   r   rm   r   r   r	   r?   r|   )r   rs   coerce_typer   r   r    ru   0  s   

zConverter.type_coercec                    sp  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|
i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   )rw   )rA   lorN   rk   rl   r   r   r    r{   C  s    z*Converter.to_raw_value.<locals>.<listcomp>Fc                 3   s    | ]	}| kr|V  qd S r   r   )rA   s2)rl   r   r    rD   N  s    z)Converter.to_raw_value.<locals>.<genexpr>)r%   r   list_keyrG   r   ri   rh   rg   rY   rm   r
   rX   r	   r&   r|   PLAIN_LITERAL_TYPEStoPythonr?   rK   	value_keyr   r   rt   lang_key)r   rN   rl   rs   rk   r%   collembedonodenativerx   r   r   r    rw   ?  sJ   


"




zConverter.to_raw_valuec           	      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 )Nr:   )r   nilr~   r   rf   rG   r
   rn   restrv   ListrW   add)	r   rN   l_
list_nodeschainr   r   rr   rs   r   r   r    r   n  s0   




zConverter.to_collectionN)r;   r<   r=   r   rJ   rZ   ri   ro   ru   rw   r   r   r   r   r    rI      s    1K/rI   )NNFFFNF)&__doc__r/   typingr   r   rdflib.graphr   rdflib.namespacer   r   rdflib.serializerr   rdflib.termr   r	   r
   shared.jsonld.contextr   r   shared.jsonld.keysr   r   r   r   r   r   r   shared.jsonld.utilr   __all__booleanintegerdoublestringr   r   r   rI   r   r   r   r    <module>   s,   $$2
%