docs: 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 = jsg.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 = jsg.String(numlit.INTEGER().getText())
                  rval.type = RDF_INTEGER_TYPE
              elif numlit.DECIMAL():
                  rval.value = jsg.String(numlit.DECIMAL().getText())
                  rval.type = RDF_DECIMAL_TYPE
              elif numlit.DOUBLE():
                  rval.value = jsg.String(numlit.DOUBLE().getText())
                  rval.type = RDF_DOUBLE_TYPE
          elif literal.booleanLiteral():
              rval.value = jsg.String(literal.booleanLiteral().getText().lower())
              rval.type = RDF_BOOL_TYPE
          return rval