o
    
iY_                     @  sl  d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
mZmZ ddlZddlmZmZ ddlmZmZ ddlmZm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#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 d	dl1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddgZ8e e9ej:e.e0Z;dZ<G dd dej=j>Z?						d$d%d!dZ@G d"d# d#Z>dS )&aY  
This parser will interpret a JSON-LD document as an RDF Graph. See http://json-ld.org/

Example:
    ```python
    >>> from rdflib import Graph, URIRef, Literal
    >>> test_json = '''
    ... {
    ...     "@context": {
    ...         "dc": "http://purl.org/dc/terms/",
    ...         "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
    ...         "rdfs": "http://www.w3.org/2000/01/rdf-schema#"
    ...     },
    ...     "@id": "http://example.org/about",
    ...     "dc:title": {
    ...         "@language": "en",
    ...         "@value": "Someone's Homepage"
    ...     }
    ... }
    ... '''
    >>> g = Graph().parse(data=test_json, format='json-ld')
    >>> list(g) == [(URIRef('http://example.org/about'),
    ...     URIRef('http://purl.org/dc/terms/title'),
    ...     Literal("Someone's Homepage", lang='en'))]
    True

    ```
    )annotationsN)TYPE_CHECKINGAnyDictIterableListOptionalUnion)ConjunctiveGraphGraph)RDFXSD)InputSourceURLInputSource)BNodeIdentifiedNodeLiteralNodeURIRef   )UNDEFContextTerm)CONTEXTGRAPHIDINCLUDEDINDEXJSONLANGLISTNESTNONEREVSETTYPEVALUEVOCAB)_HAS_ORJSONVOCAB_DELIMScontext_from_urlinputsourcejsonorjsonsource_to_jsonJsonLDParserto_rdfTc                      s6   e Zd Z fddZ							ddddZ  ZS )r.   c                   s   t t|   d S N)superr.   __init__)self	__class__ Q/home/ubuntu/.local/lib/python3.10/site-packages/rdflib/plugins/parsers/jsonld.pyr2   Q   s   zJsonLDParser.__init__皙?Futf-8Nsourcer   sinkr   versionfloat	skolemizeboolencodingOptional[str]basecontextLOptional[Union[List[Union[Dict[str, Any], str, None]], Dict[str, Any], str]]generalized_rdfOptional[bool]extract_all_scriptskwargsr   returnNonec
              	   K  s  |dvrt d|  |s|| p| pd}|}|s5t|dr5t|dr5tr1t|ts1J t	|}zt
|}W n tyF   d}Y nw z	t| j}W n ty[   d}Y nw t|||	\}}|durnt||d}|jszt|j|jd	}n|}t|||||t||d
 dS )a  Parse JSON-LD from a source document.

        The source document can be JSON or HTML with embedded JSON script
        elements (type attribute = `application/ld+json`). To process as HTML
        `source.content_type` must be set to "text/html" or
        `application/xhtml+xml.

        Args:
            source: InputSource with JSON-formatted data (JSON or HTML)
            sink: Graph to receive the parsed triples
            version: parse as JSON-LD version, defaults to 1.1
            skolemize: whether to skolemize blank nodes, defaults to False
            encoding: character encoding of the JSON (should be "utf-8"
            base: JSON-LD [Base IRI](https://www.w3.org/TR/json-ld/#base-iri), defaults to None
            context: JSON-LD [Context](https://www.w3.org/TR/json-ld/#the-context), defaults to None
            generalized_rdf: parse as [Generalized RDF](https://www.w3.org/TR/json-ld/#relationship-to-rdf), defaults to False
            extract_all_scripts: if source is an HTML document then extract
                script element). This is ignored if `source.system_id` contains
                a fragment identifier, in which case only the script element with
                matching id attribute is extracted.
        )r9   zutf-16z9JSON should be encoded as unicode. Given encoding was: %s urllinksr8   NrB   )store
identifier)r>   )warningswarn
absolutizegetPublicIdgetSystemIdhasattrr   
isinstancer   r*   r=   
ValueErrorr   fragment	Exceptionr-   context_awarer
   rO   rP   r/   r?   )r3   r:   r;   r<   r>   r@   rB   rC   rE   rG   rH   context_datafragment_iddata	html_base	conj_sinkr6   r6   r7   parseT   sL   (
zJsonLDParser.parse)r8   Fr9   NNFF)r:   r   r;   r   r<   r=   r>   r?   r@   rA   rB   rA   rC   rD   rE   rF   rG   rF   rH   r   rI   rJ   )__name__
__module____qualname__r2   ra   __classcell__r6   r6   r4   r7   r.   P   s    Fr^   r   datasetr   rB   rA   r\   rD   r<   Optional[float]rE   r?   allow_lists_of_listsrF   r>   c           
      C  s6   t ||d}|r|| t|||d}	|	| ||S )N)rB   r<   )rE   rh   r>   )r   loadParserra   )
r^   rf   rB   r\   r<   rE   rh   r>   rC   parserr6   r6   r7   r/      s   
c                   @  s   e Zd Z			dGdHdd	ZdIddZ	dJdKddZdLddZ		dMdNd%d&ZdOd*d+Ze	dPd.d/Z
	dJdQd2d3ZdRd6d7ZdSd9d:ZdTd=d>Ze	dUdAdBZedVdEdFZdS )Wrj   FNrE   r?   rh   rF   r>   c                 C  s(   || _ || _|d ur|nt| _i | _d S r0   )r>   rE   ALLOW_LISTS_OF_LISTSrh   invalid_uri_to_bnode)r3   rE   rh   r>   r6   r6   r7   r2      s   
zParser.__init__r^   r   rC   r   rf   r   rI   c                 C  s   d}t |tr
|}nt |tr)|t}|r|||j d}|}t |ts)|g}|jr3|d |j |j	
 D ]\}}|jrL|jtrL|||j q8|jrS|jn|}	|D ]}
| ||	||
| qW|	S )NFT)rW   listdictgetr   ri   rB   vocabbindtermsitemsidendswithr)   r[   default_context_add_to_graph)r3   r^   rC   rf   
topcontext	resourceslocal_contextnametermgraphnoder6   r6   r7   ra      s*   



zParser.parser~   r   ry   Optional[Node]c                 C  sR  t |tr
||rd S t|v r$|s$|t }|r||}nt|jd}||}||}|d u rD| 	||}|d urDt
|dkrD|}t |trP| ||}	n
t }	| jrZ|	 }	|	d u r`d S |d u }
| D ]>\}}|tksw||tv rxqh|tks||tv r| D ]\}}| j||||	||d|
d qqh| j||||	|||
d qh|	S )NrN   r   T)reverseno_id)r   )rW   ro   	get_valuer   
subcontextr   doc_baseget_context_for_typeget_id_get_nested_idlenstr
_to_rdf_idr   r>   rt   get_keysr   r#   _key_to_graph)r3   rf   r~   rC   r   ry   r{   id_val	nested_idsubjr   keyobjrkeyrobjr6   r6   r7   rx      sN   


zParser._add_to_graphDict[str, Any]rA   c           	      C  s   |  D ]T\}}|jdkrX||tv rX|j|}|r"|jd u r"qt|tr)|n|g}|D ])}t|t	s6q.|
|}|sL||j|}| ||}t|trW|    S q.qd S )Nr8   )rt   r<   r   r!   rs   rp   ru   rW   rn   ro   r   get_context_for_termr   r   )	r3   rC   r   r   r   r}   objsr   r   r6   r6   r7   r   7  s(   



zParser._get_nested_idr   r   r   r   r   r   r   rJ   c	              
     s  t |tr|}	n|g}	 j|}
|
r;|
j}|
jtkr"| |g}	nt|
j	v r.| 
|	g}	nt |tr:|  |
|}	nd }t||fv rEt}
t||fv rp|jr_|s_trYt |tsYJ ||}n|}|	D ]
}| || | qcd S t||fv r|	D ]
}| || | qxd S t||fv r|	D ]
}| || | qd S  jdkr| tv r j|}
|
r|
jd u rd S t |tr|n|g}|D ](}t |tsq| D ]\}}| tv rq͈ |}| |||||| qqd S |
r|
jn |} |
 d fdd|	}	|sd S |
r|
j r| }| !|}|r1| j"s$d S t#|}| j$r0|$ }nt%|}|	D ](}| &|| |
|}|d u rIq7|rV|'|||f q7|'|||f q7d S )	Nr8   nIterable[Any]rI   	List[Any]c                   sT   g }| D ]#}t |tr |}|d ur|}t |tr"||7 }q|| q|S r0   )rW   ro   get_setrn   append)r   	flattenedr   r   rC   flattenr6   r7   r     s   


z%Parser._key_to_graph.<locals>.flatten)r   r   rI   r   )(rW   rn   rs   rp   ru   typer   _to_typed_json_valuer    	container_expand_nested_listro   _parse_containerr%   	TYPE_TERMr   r[   r   r
   get_contextrx   r$   r   r<   r   r!   rt   r   r   r   expandr   r   _get_bnodeidrE   r   r>   r   
_to_objectadd)r3   rf   r~   rC   r   r   r   r   r   	obj_nodesr}   term_idsubgraphonoder   nkeynobjr   pred_uribidpredobj_noder6   r   r7   r   J  s   









zParser._key_to_graphr}   r   r   c                   s  t jv r2g }| D ]$\}}t|ts|g}| tv r#||7 }q|D ]	}|||f q%q|S  jdk}|rNt	jv rNt
jv rN fdd| D S |rct	jv rctjv rcdd | D S |rqt	jv rqtt	|igS |rt
jv r fdd| D S |rtjv r fdd| D S tjv rg }| D ]D\}	}
t|
ts|
g}
|
D ]5}|rjr|	 tvrt|tst
|i}|jg }t|ts|g}||	 ||j< || qq|S |gS )Nr8   c                   sH   g | ] \}}|  tv rtt|int|tr tt|t|in|qS r6   )r   r"   ro   r   rW   r   .0korC   r6   r7   
<listcomp>  s    z+Parser._parse_container.<locals>.<listcomp>c                 S  s   g | ]
\}}t t|iqS r6   )ro   r   r   r6   r6   r7   r     s    c                   s@   g | ]\}}t |tr| tvrtt|ifi |n|qS r6   )rW   ro   r   r"   r   r   r   r6   r7   r     s    c              	     sd   g | ].\}}t |ttfr.| tvr. t |tr*tjtkr' 	|n|in||n|qS r6   )
rW   ro   r   r   r"   	_add_typer   r   r'   r   r   rC   r3   r}   r6   r7   r     s    	
)r   r   rt   rW   rn   r   r"   r   r<   r   r   r   ro   r%   indexrp   )r3   rC   r}   r   r   langvaluesvv11r   nodesr   r6   r   r7   r     s\   




	
	






zParser._parse_containerr   r   c                 C  s8   |  |pg }|rt|ts|g}|| ||t< |S r0   )get_typerW   rn   r   r%   )rC   r   r   otyper6   r6   r7   r     s   
zParser._add_typeOptional[Term]inlistc                 C  s"  t |tr|\}}|d u rd S |rd|v rd S t||dS t |tr@||}	|	d ur?|r2| js2d S | |||||	}
|
r?|
S nm|r|jr|jtkrP| 	|}n]|d u rVd S |jt
krht |trht
||i}nE|jtkrt |trt
||p|||i}n.t|jt|i}n&|d u rd S t |trt|tjdS |r|jtur|j}n|j}t||dS ||}| r||pd }||}||tv r| 	|}||}||}|s|t|v st|v r	|d u rd S |rd|v rd S t||dS |rt|||dS t|S | ||||S )N )r   )datatype)rW   tupler   ro   get_listrh   	_add_listr   r   r   r   r   resolver'   r   resolve_irir%   r&   r=   r   doublelanguager   get_languager   r   r   get_keyrx   )r3   rf   r~   rC   r}   r   r   valuer   	node_listlistrefr   r6   r6   r7   r     sh   
	










zParser._to_objectr   Optional[IdentifiedNode]c                 C  s   |  |}|rt|}| jr| S |S ||}| js"d|vr"d S t|}t|s>|| jvr9tt	d| j|< | j| }|S )N:   )
r   r   r>   r   rE   r   r   rm   secretstoken_urlsafe)r3   rC   r   r   burir   r6   r6   r7   r   f  s   



zParser._to_rdf_idrefc                 C  s&   | dsd S |ddd }|pd S )Nz_:   )
startswithsplit)r3   r   r   r6   r6   r7   r   x  s   
zParser._get_bnodeidr   r   c              	   C  s   t |ts|g}t }| jrt |tr| }|d }}|D ]<}	|	d u r%q|r2||tj|f |}| j|||||	dd}
|
d u rBq||tj|
f t }| jrZt |trZ| }q|ri||tjtj	f |S tj	S )NT)r   )
rW   rn   r   r>   r   r   restr   firstnil)r3   rf   r~   rC   r}   r   
first_subjr   r   r   r   r6   r6   r7   r     s0   

zParser._add_listr   Dict[str, str]c                 C  sB   t rtj| tjtjB dd}n	tj| dddd}ttj	t
|iS )N)optionr9   ),r   TF)
separators	sort_keysensure_ascii)r(   r,   dumpsOPT_SORT_KEYSOPT_NON_STR_KEYSdecoder+   r%   r   r   r&   )r   
val_stringr6   r6   r7   r     s   
zParser._to_typed_json_valuer   Dict[str, List[Any]]c                   s    fdd|D }t |iS )Nc                   s$   g | ]}t |tr |n|qS r6   )rW   rn   r   )r   r   clsr6   r7   r     s    z.Parser._expand_nested_list.<locals>.<listcomp>)r    )r   r   resultr6   r   r7   r     s   
zParser._expand_nested_list)FNF)rE   r?   rh   rF   r>   r?   )r^   r   rC   r   rf   r   rI   r   )F)rf   r   r~   r   rC   r   r   r   ry   r?   rI   r   )rC   r   r   r   rI   rA   )FF)rf   r   r~   r   rC   r   r   r   r   r   r   r   r   r?   r   r?   rI   rJ   )rC   r   r}   r   r   r   rI   r   )rC   r   r   r   r   r   rI   r   )rf   r   r~   r   rC   r   r}   r   r   r   r   r?   rI   r   )rC   r   r   r   rI   r   )r   r   rI   rA   )rf   r   r~   r   rC   r   r}   r   r   r   rI   r   )r   r   rI   r   )r   r   rI   r   )rb   rc   rd   r2   ra   rx   r   r   r   staticmethodr   r   r   r   r   r   classmethodr   r6   r6   r6   r7   rj      s0    
#
@
tP
O

+rj   )NNNFNF)r^   r   rf   r   rB   rA   r\   rD   r<   rg   rE   r?   rh   rF   r>   r?   )A__doc__
__future__r   r   rQ   typingr   r   r   r   r   r   r	   rdflib.parserrdflibrdflib.graphr
   r   rdflib.namespacer   r   r   r   rdflib.termr   r   r   r   r   shared.jsonld.contextr   r   r   shared.jsonld.keysr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   shared.jsonld.utilr(   r)   r*   r+   r,   r-   __all__r   r   r   rl   rk   rj   r.   r/   r6   r6   r6   r7   <module>   s2    !$D 	a