def map_object_literal( v: Union[str, jsonasobj.JsonObj]) -> ShExJ.ObjectLiteral: """ `PyShEx.jsg <https://github.com/hsolbrig/ShExJSG/ShExJSG/ShExJ.jsg>`_ does not add identifying types to ObjectLiterals. This routine re-identifies the types """ # TODO: isinstance(v, JSGString) should work here, but it doesn't with IRIREF(http://a.example/v1) return v if issubclass(type(v), JSGString) or (isinstance(v, JSGObject) and 'type' in v) else \ ShExJ.IRIREF(v) if isinstance(v, str) else ShExJ.ObjectLiteral(**v._as_dict)
def literal_to_ObjectLiteral( self, literal: ShExDocParser.LiteralContext) -> ShExJ.ObjectLiteral: """ literal: rdfLiteral | numericLiteral | booleanLiteral """ rval = ShExJ.ObjectLiteral() if literal.rdfLiteral(): rdflit = literal.rdfLiteral() txt = rdflit.string().getText() quote_char = '' if len(txt) > 5 and (txt.startswith("'''") and txt.endswith("'''") or txt.startswith('"""') and txt.endswith('"""')): txt = txt[3:-3] else: quote_char = txt[0] txt = txt[1:-1] txt = self.fix_text_escapes(txt, quote_char) rval.value = String(txt) if rdflit.LANGTAG(): rval.language = ShExJ.LANGTAG( rdflit.LANGTAG().getText()[1:].lower()) if rdflit.datatype(): rval.type = self.iri_to_str(rdflit.datatype().iri()) elif literal.numericLiteral(): numlit = literal.numericLiteral() if numlit.INTEGER(): rval.value = String(numlit.INTEGER().getText()) rval.type = RDF_INTEGER_TYPE elif numlit.DECIMAL(): rval.value = String(numlit.DECIMAL().getText()) rval.type = RDF_DECIMAL_TYPE elif numlit.DOUBLE(): rval.value = String(numlit.DOUBLE().getText()) rval.type = RDF_DOUBLE_TYPE elif literal.booleanLiteral(): rval.value = String(literal.booleanLiteral().getText().lower()) rval.type = RDF_BOOL_TYPE return rval