@thomasfosterau/effect-rdf 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +2251 -2
- package/dist/Algebra-CGG4oae3.mjs +433 -0
- package/dist/Algebra-CGG4oae3.mjs.map +1 -0
- package/dist/Algebra-uGsIEOUA.d.mts +446 -0
- package/dist/Ast-CPRZmBvk.mjs +552 -0
- package/dist/Ast-CPRZmBvk.mjs.map +1 -0
- package/dist/Ast-vcw2W-lf.d.mts +827 -0
- package/dist/Bindings-Ck3m7JRC.mjs +249 -0
- package/dist/Bindings-Ck3m7JRC.mjs.map +1 -0
- package/dist/Bindings-DiKpBd7f.d.mts +153 -0
- package/dist/ClientErrors-CpXdFX5u.mjs +128 -0
- package/dist/ClientErrors-CpXdFX5u.mjs.map +1 -0
- package/dist/ClientErrors-D4IZHUM-.d.mts +101 -0
- package/dist/ClientFormats-CXomkXLV.mjs +73 -0
- package/dist/ClientFormats-CXomkXLV.mjs.map +1 -0
- package/dist/ClientFormats-Dm57ZPwR.d.mts +36 -0
- package/dist/Csv2Json-DynEcwCh.mjs +194 -0
- package/dist/Csv2Json-DynEcwCh.mjs.map +1 -0
- package/dist/Csv2Json-aXNVDoXQ.d.mts +40 -0
- package/dist/Csv2Rdf-8maXP6mt.d.mts +41 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs +161 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs.map +1 -0
- package/dist/Dataset-BlmlcI7J.mjs +782 -0
- package/dist/Dataset-BlmlcI7J.mjs.map +1 -0
- package/dist/Dataset-DS3ESOcO.d.mts +426 -0
- package/dist/Dataset.d.mts +2 -0
- package/dist/Dataset.mjs +1 -0
- package/dist/Datatype-CxMpamHC.d.mts +212 -0
- package/dist/Datatype-DQvkNkiH.mjs +1001 -0
- package/dist/Datatype-DQvkNkiH.mjs.map +1 -0
- package/dist/Dialect-8ChFj5EX.d.mts +113 -0
- package/dist/Dialect-CzVH38uo.mjs +165 -0
- package/dist/Dialect-CzVH38uo.mjs.map +1 -0
- package/dist/DocumentLoader-D3lZREnB.mjs +346 -0
- package/dist/DocumentLoader-D3lZREnB.mjs.map +1 -0
- package/dist/DocumentLoader-ZUCEVrW5.d.mts +178 -0
- package/dist/DublinCore-AnwqxRx6.mjs +137 -0
- package/dist/DublinCore-AnwqxRx6.mjs.map +1 -0
- package/dist/DublinCore-Dq-tVA5d.d.mts +119 -0
- package/dist/Engine-CYPB3g4h.d.mts +144 -0
- package/dist/Engine-DF8PN7g-.mjs +872 -0
- package/dist/Engine-DF8PN7g-.mjs.map +1 -0
- package/dist/Errors-CMdV1RhU.mjs +37 -0
- package/dist/Errors-CMdV1RhU.mjs.map +1 -0
- package/dist/Errors-u2bDjUeM.d.mts +30 -0
- package/dist/Evaluator-DEsU4d1o.d.mts +50 -0
- package/dist/Evaluator-DOY2-guC.mjs +281 -0
- package/dist/Evaluator-DOY2-guC.mjs.map +1 -0
- package/dist/Exif-CpqniYQd.d.mts +78 -0
- package/dist/Exif-DjkCfEB-.mjs +89 -0
- package/dist/Exif-DjkCfEB-.mjs.map +1 -0
- package/dist/Expression-BIMMvduQ.mjs +230 -0
- package/dist/Expression-BIMMvduQ.mjs.map +1 -0
- package/dist/Expression-W8A9cyX7.d.mts +89 -0
- package/dist/Extract-Bop85jES.mjs +220 -0
- package/dist/Extract-Bop85jES.mjs.map +1 -0
- package/dist/Extract-C_pCvuTC.d.mts +88 -0
- package/dist/Federation-BcNrozc1.d.mts +52 -0
- package/dist/Federation-CHScBkaK.mjs +130 -0
- package/dist/Federation-CHScBkaK.mjs.map +1 -0
- package/dist/Functions-AvjNcId_.mjs +1346 -0
- package/dist/Functions-AvjNcId_.mjs.map +1 -0
- package/dist/Functions-OQJZP-F6.d.mts +111 -0
- package/dist/Generator-C52mmq01.d.mts +50 -0
- package/dist/Generator-D3utCJC7.mjs +205 -0
- package/dist/Generator-D3utCJC7.mjs.map +1 -0
- package/dist/Grammar-CPlSxGH6.mjs +200 -0
- package/dist/Grammar-CPlSxGH6.mjs.map +1 -0
- package/dist/Grammar-CRhnRoCu.d.mts +148 -0
- package/dist/Grammar-D6jZdJQ3.d.mts +169 -0
- package/dist/Grammar-mQ8CgE1M.mjs +258 -0
- package/dist/Grammar-mQ8CgE1M.mjs.map +1 -0
- package/dist/GraphStore-DhUa4nFO.d.mts +45 -0
- package/dist/GraphStore-DvbqwKy1.mjs +212 -0
- package/dist/GraphStore-DvbqwKy1.mjs.map +1 -0
- package/dist/Iri-BB8Ks-BF.d.mts +84 -0
- package/dist/Iri-Cr92gsQV.mjs +232 -0
- package/dist/Iri-Cr92gsQV.mjs.map +1 -0
- package/dist/Iri.d.mts +2 -0
- package/dist/Iri.mjs +1 -0
- package/dist/Isomorphism-B6qTY-xy.d.mts +28 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs +232 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs.map +1 -0
- package/dist/Isomorphism-DInKnWIy.mjs +390 -0
- package/dist/Isomorphism-DInKnWIy.mjs.map +1 -0
- package/dist/Isomorphism-DvSfZXLR.d.mts +37 -0
- package/dist/Isomorphism.d.mts +2 -0
- package/dist/Isomorphism.mjs +1 -0
- package/dist/JsonLd-DOwS2FHg.mjs +2836 -0
- package/dist/JsonLd-DOwS2FHg.mjs.map +1 -0
- package/dist/JsonLd-DobFrQNa.d.mts +242 -0
- package/dist/JsonLdError-C9J-BxfG.mjs +106 -0
- package/dist/JsonLdError-C9J-BxfG.mjs.map +1 -0
- package/dist/JsonLdError-DSOfHkOy.d.mts +43 -0
- package/dist/LanguageTag-BCu8rcmX.d.mts +38 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs +89 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs.map +1 -0
- package/dist/LanguageTag.d.mts +2 -0
- package/dist/LanguageTag.mjs +1 -0
- package/dist/Lexical-Cg0JHrf6.mjs +243 -0
- package/dist/Lexical-Cg0JHrf6.mjs.map +1 -0
- package/dist/Lexical-D3zySYVS.d.mts +163 -0
- package/dist/Manifest-B6xf6mUc.mjs +148 -0
- package/dist/Manifest-B6xf6mUc.mjs.map +1 -0
- package/dist/Manifest-DQUMRBFr.d.mts +98 -0
- package/dist/Mapping-BgG74x3U.d.mts +63 -0
- package/dist/Mapping-Dc1ZGirk.mjs +259 -0
- package/dist/Mapping-Dc1ZGirk.mjs.map +1 -0
- package/dist/Mcp-1DwTTKOK.mjs +48 -0
- package/dist/Mcp-1DwTTKOK.mjs.map +1 -0
- package/dist/Mcp-d-pX9erx.d.mts +25 -0
- package/dist/Message-CK_DGQuu.mjs +95 -0
- package/dist/Message-CK_DGQuu.mjs.map +1 -0
- package/dist/Message-fIvTJSXM.d.mts +49 -0
- package/dist/Metadata-BbffwGDZ.mjs +445 -0
- package/dist/Metadata-BbffwGDZ.mjs.map +1 -0
- package/dist/Metadata-CEt3yc1-.d.mts +901 -0
- package/dist/Metadata-D4HsQNXr.mjs +1273 -0
- package/dist/Metadata-D4HsQNXr.mjs.map +1 -0
- package/dist/Metadata-nzS7QKRj.d.mts +350 -0
- package/dist/Model-DaMmxurZ.d.mts +293 -0
- package/dist/Model-DlPzRYhF.mjs +528 -0
- package/dist/Model-DlPzRYhF.mjs.map +1 -0
- package/dist/N3-BzyV-KIH.mjs +974 -0
- package/dist/N3-BzyV-KIH.mjs.map +1 -0
- package/dist/N3-DSLnonDn.d.mts +100 -0
- package/dist/NQuads-C1VBOJ3-.mjs +117 -0
- package/dist/NQuads-C1VBOJ3-.mjs.map +1 -0
- package/dist/NQuads-FjFZikFg.d.mts +76 -0
- package/dist/NTriples-D-kLSEAf.mjs +120 -0
- package/dist/NTriples-D-kLSEAf.mjs.map +1 -0
- package/dist/NTriples-D34OspfW.d.mts +76 -0
- package/dist/Namespace-ClTUO_ya.d.mts +42 -0
- package/dist/Namespace-DHFIsORd.mjs +75 -0
- package/dist/Namespace-DHFIsORd.mjs.map +1 -0
- package/dist/Namespace.d.mts +2 -0
- package/dist/Namespace.mjs +1 -0
- package/dist/Namespaces-Bz85vpjW.mjs +235 -0
- package/dist/Namespaces-Bz85vpjW.mjs.map +1 -0
- package/dist/Namespaces-C1jW6EDo.d.mts +178 -0
- package/dist/Optimizer-BWWQRQPY.mjs +168 -0
- package/dist/Optimizer-BWWQRQPY.mjs.map +1 -0
- package/dist/Optimizer-DUpUow6k.d.mts +26 -0
- package/dist/Options-BLBGL4HE.mjs +72 -0
- package/dist/Options-BLBGL4HE.mjs.map +1 -0
- package/dist/Options-BommQwP9.d.mts +127 -0
- package/dist/Packet-CA76wVX3.mjs +197 -0
- package/dist/Packet-CA76wVX3.mjs.map +1 -0
- package/dist/Packet-Cy5g6XuW.d.mts +130 -0
- package/dist/Parser-p1Gyr0QN.d.mts +85 -0
- package/dist/Parser-xARsOWXk.mjs +1317 -0
- package/dist/Parser-xARsOWXk.mjs.map +1 -0
- package/dist/Path-B20Yp8KE.mjs +284 -0
- package/dist/Path-B20Yp8KE.mjs.map +1 -0
- package/dist/Path-DRB8e-Zn.d.mts +181 -0
- package/dist/Pdf-B9RZn--8.d.mts +77 -0
- package/dist/Pdf-CKK6dkZn.mjs +89 -0
- package/dist/Pdf-CKK6dkZn.mjs.map +1 -0
- package/dist/PdfA-CUjSuntT.d.mts +109 -0
- package/dist/PdfA-CleOhuL6.mjs +124 -0
- package/dist/PdfA-CleOhuL6.mjs.map +1 -0
- package/dist/Photoshop-CiHo80qV.mjs +233 -0
- package/dist/Photoshop-CiHo80qV.mjs.map +1 -0
- package/dist/Photoshop-udKZ0I3N.d.mts +204 -0
- package/dist/PrefixMap-BHFPDLO-.mjs +103 -0
- package/dist/PrefixMap-BHFPDLO-.mjs.map +1 -0
- package/dist/PrefixMap-BMlXrWNd.d.mts +64 -0
- package/dist/PrefixMap.d.mts +2 -0
- package/dist/PrefixMap.mjs +1 -0
- package/dist/Processor-CMmecFsb.mjs +198 -0
- package/dist/Processor-CMmecFsb.mjs.map +1 -0
- package/dist/Processor-FJPvO0CB.d.mts +435 -0
- package/dist/Protocol-BA7OkNgp.mjs +202 -0
- package/dist/Protocol-BA7OkNgp.mjs.map +1 -0
- package/dist/Protocol-DlSoiIKB.d.mts +108 -0
- package/dist/ProtocolErrors-Ckfejnl6.d.mts +84 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs +129 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs.map +1 -0
- package/dist/Query-D9A6LOpP.mjs +364 -0
- package/dist/Query-D9A6LOpP.mjs.map +1 -0
- package/dist/Query-KqSkTYyG.d.mts +96 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs +674 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs.map +1 -0
- package/dist/QueryBuilder-DUqh4ECe.d.mts +529 -0
- package/dist/RdfJs-D6-49XB5.mjs +86 -0
- package/dist/RdfJs-D6-49XB5.mjs.map +1 -0
- package/dist/RdfJs-DXFqdWrd.d.mts +76 -0
- package/dist/RdfJs.d.mts +2 -0
- package/dist/RdfJs.mjs +1 -0
- package/dist/RdfJson-5aKPDlPS.d.mts +297 -0
- package/dist/RdfJson-BNocgW4f.mjs +548 -0
- package/dist/RdfJson-BNocgW4f.mjs.map +1 -0
- package/dist/RdfXml-DJ9G4gOq.mjs +1014 -0
- package/dist/RdfXml-DJ9G4gOq.mjs.map +1 -0
- package/dist/RdfXml-_N7yxWEp.d.mts +149 -0
- package/dist/Rdfs-BRVPsAjc.d.mts +84 -0
- package/dist/Rdfs-CyY2wVHI.mjs +167 -0
- package/dist/Rdfs-CyY2wVHI.mjs.map +1 -0
- package/dist/Rdfs.d.mts +2 -0
- package/dist/Rdfs.mjs +1 -0
- package/dist/Reasoner-BxYhx9s7.d.mts +94 -0
- package/dist/Reasoner-Cw90zrjv.mjs +798 -0
- package/dist/Reasoner-Cw90zrjv.mjs.map +1 -0
- package/dist/Reification-BmN4EfnM.d.mts +40 -0
- package/dist/Reification-dpqQvjDE.mjs +82 -0
- package/dist/Reification-dpqQvjDE.mjs.map +1 -0
- package/dist/Reification.d.mts +2 -0
- package/dist/Reification.mjs +1 -0
- package/dist/Report-XHs8htzK.mjs +121 -0
- package/dist/Report-XHs8htzK.mjs.map +1 -0
- package/dist/Report-hcXsc_19.d.mts +115 -0
- package/dist/Resource-B1cI8FyJ.d.mts +218 -0
- package/dist/Resource-sIEeNh15.mjs +374 -0
- package/dist/Resource-sIEeNh15.mjs.map +1 -0
- package/dist/Resource.d.mts +2 -0
- package/dist/Resource.mjs +1 -0
- package/dist/Results-BVNEC-Wt.d.mts +277 -0
- package/dist/Results-peJjGA2V.mjs +621 -0
- package/dist/Results-peJjGA2V.mjs.map +1 -0
- package/dist/ResultsStream-BhF0OcNn.mjs +639 -0
- package/dist/ResultsStream-BhF0OcNn.mjs.map +1 -0
- package/dist/ResultsStream-toYMXrOe.d.mts +100 -0
- package/dist/SemAct-CDchtk49.d.mts +96 -0
- package/dist/SemAct-CmyT4yI8.mjs +118 -0
- package/dist/SemAct-CmyT4yI8.mjs.map +1 -0
- package/dist/Serialization-DP9H5bYQ.mjs +514 -0
- package/dist/Serialization-DP9H5bYQ.mjs.map +1 -0
- package/dist/Serialization-Df8iVauT.d.mts +392 -0
- package/dist/Serialization.d.mts +2 -0
- package/dist/Serialization.mjs +1 -0
- package/dist/ServerFormats-CrRnjjf6.mjs +64 -0
- package/dist/ServerFormats-CrRnjjf6.mjs.map +1 -0
- package/dist/ServerFormats-DjC9NsO_.d.mts +36 -0
- package/dist/ServiceDescription-BERsvg-k.d.mts +54 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs +97 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs.map +1 -0
- package/dist/ShExC-Ctf-06CL.d.mts +67 -0
- package/dist/ShExC-DJbB19i3.mjs +1181 -0
- package/dist/ShExC-DJbB19i3.mjs.map +1 -0
- package/dist/ShExError-BeYFD9rv.d.mts +61 -0
- package/dist/ShExError-CVtq2NnM.mjs +64 -0
- package/dist/ShExError-CVtq2NnM.mjs.map +1 -0
- package/dist/ShExJ-C1u_wgyD.d.mts +531 -0
- package/dist/ShExJ-COiPd9Xw.mjs +532 -0
- package/dist/ShExJ-COiPd9Xw.mjs.map +1 -0
- package/dist/ShExR-ByR4mCh-.mjs +480 -0
- package/dist/ShExR-ByR4mCh-.mjs.map +1 -0
- package/dist/ShExR-CqONNNBz.d.mts +40 -0
- package/dist/ShapeMap-C422pxKl.d.mts +140 -0
- package/dist/ShapeMap-CsgKxB2G.mjs +181 -0
- package/dist/ShapeMap-CsgKxB2G.mjs.map +1 -0
- package/dist/Shapes-18GjfyBV.mjs +597 -0
- package/dist/Shapes-18GjfyBV.mjs.map +1 -0
- package/dist/Shapes-BQFDFc4Q.d.mts +306 -0
- package/dist/Sparql-BiYFMSpl.mjs +29 -0
- package/dist/Sparql-BiYFMSpl.mjs.map +1 -0
- package/dist/Sparql-DecpWTPh.d.mts +97 -0
- package/dist/SparqlClient-C_CjXbwj.mjs +333 -0
- package/dist/SparqlClient-C_CjXbwj.mjs.map +1 -0
- package/dist/SparqlClient-UPc88SHy.d.mts +290 -0
- package/dist/SparqlServer-CbUW-pVj.d.mts +71 -0
- package/dist/SparqlServer-Db7w7Cll.mjs +308 -0
- package/dist/SparqlServer-Db7w7Cll.mjs.map +1 -0
- package/dist/SqlStore-BBqFx-Wl.mjs +684 -0
- package/dist/SqlStore-BBqFx-Wl.mjs.map +1 -0
- package/dist/SqlStore-CCJo5I-e.d.mts +117 -0
- package/dist/Store-D0jmVfb3.d.mts +166 -0
- package/dist/Store-DH3Ow1GO.mjs +162 -0
- package/dist/Store-DH3Ow1GO.mjs.map +1 -0
- package/dist/Structure-BjMo4Bkc.mjs +334 -0
- package/dist/Structure-BjMo4Bkc.mjs.map +1 -0
- package/dist/Structure-n4CmDiab.d.mts +63 -0
- package/dist/Table-BGgm9nbM.mjs +538 -0
- package/dist/Table-BGgm9nbM.mjs.map +1 -0
- package/dist/Table-C3reiVrb.d.mts +261 -0
- package/dist/Term-B_4ezyXq.d.mts +619 -0
- package/dist/Term-CFLG1qu4.mjs +991 -0
- package/dist/Term-CFLG1qu4.mjs.map +1 -0
- package/dist/Term.d.mts +2 -0
- package/dist/Term.mjs +1 -0
- package/dist/TermCodec-CDZiEztW.mjs +397 -0
- package/dist/TermCodec-CDZiEztW.mjs.map +1 -0
- package/dist/TermCodec-_03bDXr0.d.mts +209 -0
- package/dist/TermCodec.d.mts +2 -0
- package/dist/TermCodec.mjs +1 -0
- package/dist/TermJson-BOPe0yve.d.mts +232 -0
- package/dist/TermJson-FAg3lvjl.mjs +142 -0
- package/dist/TermJson-FAg3lvjl.mjs.map +1 -0
- package/dist/TermJson.d.mts +2 -0
- package/dist/TermJson.mjs +1 -0
- package/dist/TermSchema-Bn9CoaYA.mjs +30 -0
- package/dist/TermSchema-Bn9CoaYA.mjs.map +1 -0
- package/dist/TermSchema-DBO6MroX.d.mts +6 -0
- package/dist/Testing-B-aPCpmu.mjs +63 -0
- package/dist/Testing-B-aPCpmu.mjs.map +1 -0
- package/dist/Testing-CF6s8P3O.d.mts +53 -0
- package/dist/Tiff-CR-2QeSI.d.mts +148 -0
- package/dist/Tiff-DlsOlZPM.mjs +169 -0
- package/dist/Tiff-DlsOlZPM.mjs.map +1 -0
- package/dist/Tools-7MdRKccr.d.mts +583 -0
- package/dist/Tools-ryxphZbI.mjs +329 -0
- package/dist/Tools-ryxphZbI.mjs.map +1 -0
- package/dist/Translate-B0YKKANS.d.mts +37 -0
- package/dist/Translate-gzWPq0Ia.mjs +308 -0
- package/dist/Translate-gzWPq0Ia.mjs.map +1 -0
- package/dist/Translation-DC9rLm2y.mjs +1535 -0
- package/dist/Translation-DC9rLm2y.mjs.map +1 -0
- package/dist/Translation-K4L9XBqX.d.mts +103 -0
- package/dist/TriG-BkqtqZ6Y.mjs +125 -0
- package/dist/TriG-BkqtqZ6Y.mjs.map +1 -0
- package/dist/TriG-xDjdDatp.d.mts +86 -0
- package/dist/Turtle-Bv1_bisW.d.mts +85 -0
- package/dist/Turtle-CZVUOtwl.mjs +133 -0
- package/dist/Turtle-CZVUOtwl.mjs.map +1 -0
- package/dist/ValidationReport-DBdJshW5.mjs +285 -0
- package/dist/ValidationReport-DBdJshW5.mjs.map +1 -0
- package/dist/ValidationReport-Dx3WxY0h.d.mts +192 -0
- package/dist/Validator-227ff9Rn.d.mts +179 -0
- package/dist/Validator-BzXMKDeJ.mjs +1162 -0
- package/dist/Validator-BzXMKDeJ.mjs.map +1 -0
- package/dist/Validator-Dl8cih5V.d.mts +207 -0
- package/dist/Validator-DmUfMbpL.mjs +568 -0
- package/dist/Validator-DmUfMbpL.mjs.map +1 -0
- package/dist/Vocab-DceKywpq.mjs +168 -0
- package/dist/Vocab-DceKywpq.mjs.map +1 -0
- package/dist/Vocab-Df-L-IwZ.d.mts +46 -0
- package/dist/Vocab-Do56UgBX.d.mts +81 -0
- package/dist/Vocab-TfpWG1Ne.mjs +118 -0
- package/dist/Vocab-TfpWG1Ne.mjs.map +1 -0
- package/dist/Vocab.d.mts +2 -0
- package/dist/Vocab.mjs +1 -0
- package/dist/Vocabulary-C6-GPOy4.d.mts +22 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs +179 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs.map +1 -0
- package/dist/Xml-B7iihYCS.mjs +976 -0
- package/dist/Xml-B7iihYCS.mjs.map +1 -0
- package/dist/Xml-CmfHS7SW.d.mts +267 -0
- package/dist/Xmp-D7CKA7MZ.d.mts +111 -0
- package/dist/Xmp-DCGN9pOD.mjs +307 -0
- package/dist/Xmp-DCGN9pOD.mjs.map +1 -0
- package/dist/XmpBasic-CP38jpR_.mjs +73 -0
- package/dist/XmpBasic-CP38jpR_.mjs.map +1 -0
- package/dist/XmpBasic-Cmbe53rQ.d.mts +64 -0
- package/dist/XmpMM-BfL_TgJF.mjs +73 -0
- package/dist/XmpMM-BfL_TgJF.mjs.map +1 -0
- package/dist/XmpMM-Dqm3IX8p.d.mts +63 -0
- package/dist/XmpRights-BKPtoI5L.mjs +73 -0
- package/dist/XmpRights-BKPtoI5L.mjs.map +1 -0
- package/dist/XmpRights-CaALZQz2.d.mts +63 -0
- package/dist/Xsd-Cdgx5zRB.mjs +405 -0
- package/dist/Xsd-Cdgx5zRB.mjs.map +1 -0
- package/dist/Xsd-D2elNhSm.d.mts +187 -0
- package/dist/Xsd.d.mts +2 -0
- package/dist/Xsd.mjs +1 -0
- package/dist/accessors-CEjaojuQ.mjs +28 -0
- package/dist/accessors-CEjaojuQ.mjs.map +1 -0
- package/dist/codec-Lb2T96rv.d.mts +20 -0
- package/dist/codec-QNo7IdJF.mjs +389 -0
- package/dist/codec-QNo7IdJF.mjs.map +1 -0
- package/dist/csvw/Csv2Json.d.mts +2 -0
- package/dist/csvw/Csv2Json.mjs +1 -0
- package/dist/csvw/Csv2Rdf.d.mts +2 -0
- package/dist/csvw/Csv2Rdf.mjs +1 -0
- package/dist/csvw/Datatype.d.mts +2 -0
- package/dist/csvw/Datatype.mjs +1 -0
- package/dist/csvw/Metadata.d.mts +2 -0
- package/dist/csvw/Metadata.mjs +1 -0
- package/dist/csvw/Processor.d.mts +2 -0
- package/dist/csvw/Processor.mjs +1 -0
- package/dist/csvw/Report.d.mts +2 -0
- package/dist/csvw/Report.mjs +1 -0
- package/dist/csvw/Table.d.mts +2 -0
- package/dist/csvw/Table.mjs +1 -0
- package/dist/csvw/index.d.mts +8 -0
- package/dist/csvw/index.mjs +8 -0
- package/dist/index-Cms2TYfC.d.mts +16 -0
- package/dist/index-Ct8xFmRs.d.mts +7 -0
- package/dist/index-D4QFwOjm.d.mts +28 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.mjs +17 -0
- package/dist/jsonld/DocumentLoader.d.mts +2 -0
- package/dist/jsonld/DocumentLoader.mjs +1 -0
- package/dist/jsonld/JsonLd.d.mts +2 -0
- package/dist/jsonld/JsonLd.mjs +1 -0
- package/dist/jsonld/JsonLdError.d.mts +2 -0
- package/dist/jsonld/JsonLdError.mjs +1 -0
- package/dist/jsonld/index.d.mts +4 -0
- package/dist/jsonld/index.mjs +4 -0
- package/dist/lists-D-OpQ0Ir.mjs +77 -0
- package/dist/lists-D-OpQ0Ir.mjs.map +1 -0
- package/dist/loop-D5-gNx9K.mjs +21 -0
- package/dist/loop-D5-gNx9K.mjs.map +1 -0
- package/dist/loop-DZ2hXlr_.mjs +21 -0
- package/dist/loop-DZ2hXlr_.mjs.map +1 -0
- package/dist/n3/Isomorphism.d.mts +2 -0
- package/dist/n3/Isomorphism.mjs +1 -0
- package/dist/n3/Mapping.d.mts +2 -0
- package/dist/n3/Mapping.mjs +1 -0
- package/dist/n3/Model.d.mts +2 -0
- package/dist/n3/Model.mjs +1 -0
- package/dist/n3/N3.d.mts +2 -0
- package/dist/n3/N3.mjs +1 -0
- package/dist/n3/Reasoner.d.mts +2 -0
- package/dist/n3/Reasoner.mjs +2 -0
- package/dist/n3/Vocab.d.mts +2 -0
- package/dist/n3/Vocab.mjs +1 -0
- package/dist/n3/index.d.mts +7 -0
- package/dist/n3/index.mjs +7 -0
- package/dist/ntriples/Grammar.d.mts +2 -0
- package/dist/ntriples/Grammar.mjs +1 -0
- package/dist/ntriples/Lexical.d.mts +2 -0
- package/dist/ntriples/Lexical.mjs +1 -0
- package/dist/ntriples/NQuads.d.mts +2 -0
- package/dist/ntriples/NQuads.mjs +1 -0
- package/dist/ntriples/NTriples.d.mts +2 -0
- package/dist/ntriples/NTriples.mjs +1 -0
- package/dist/ntriples/index.d.mts +5 -0
- package/dist/ntriples/index.mjs +5 -0
- package/dist/rdfjson/RdfJson.d.mts +2 -0
- package/dist/rdfjson/RdfJson.mjs +1 -0
- package/dist/rdfjson/index.d.mts +2 -0
- package/dist/rdfjson/index.mjs +1 -0
- package/dist/rdfxml/RdfXml.d.mts +2 -0
- package/dist/rdfxml/RdfXml.mjs +1 -0
- package/dist/rdfxml/Xml.d.mts +2 -0
- package/dist/rdfxml/Xml.mjs +1 -0
- package/dist/rdfxml/index.d.mts +3 -0
- package/dist/rdfxml/index.mjs +3 -0
- package/dist/rolldown-runtime-D8jQpDG7.mjs +12 -0
- package/dist/serialize-96KBvKaf.mjs +1463 -0
- package/dist/serialize-96KBvKaf.mjs.map +1 -0
- package/dist/serialize-DsoXdM6n.d.mts +37 -0
- package/dist/shacl/Message.d.mts +2 -0
- package/dist/shacl/Message.mjs +1 -0
- package/dist/shacl/Path.d.mts +2 -0
- package/dist/shacl/Path.mjs +1 -0
- package/dist/shacl/Shapes.d.mts +2 -0
- package/dist/shacl/Shapes.mjs +1 -0
- package/dist/shacl/Sparql.d.mts +2 -0
- package/dist/shacl/Sparql.mjs +1 -0
- package/dist/shacl/ValidationReport.d.mts +2 -0
- package/dist/shacl/ValidationReport.mjs +1 -0
- package/dist/shacl/Validator.d.mts +2 -0
- package/dist/shacl/Validator.mjs +1 -0
- package/dist/shacl/Vocabulary.d.mts +2 -0
- package/dist/shacl/Vocabulary.mjs +1 -0
- package/dist/shacl/index.d.mts +9 -0
- package/dist/shacl/index.mjs +8 -0
- package/dist/shex/SemAct.d.mts +2 -0
- package/dist/shex/SemAct.mjs +1 -0
- package/dist/shex/ShExC.d.mts +2 -0
- package/dist/shex/ShExC.mjs +1 -0
- package/dist/shex/ShExError.d.mts +2 -0
- package/dist/shex/ShExError.mjs +1 -0
- package/dist/shex/ShExJ.d.mts +2 -0
- package/dist/shex/ShExJ.mjs +2 -0
- package/dist/shex/ShExR.d.mts +2 -0
- package/dist/shex/ShExR.mjs +1 -0
- package/dist/shex/ShapeMap.d.mts +2 -0
- package/dist/shex/ShapeMap.mjs +1 -0
- package/dist/shex/Structure.d.mts +2 -0
- package/dist/shex/Structure.mjs +2 -0
- package/dist/shex/Validator.d.mts +2 -0
- package/dist/shex/Validator.mjs +4 -0
- package/dist/shex/index.d.mts +9 -0
- package/dist/shex/index.mjs +9 -0
- package/dist/sparql/Algebra.d.mts +2 -0
- package/dist/sparql/Algebra.mjs +1 -0
- package/dist/sparql/Ast.d.mts +2 -0
- package/dist/sparql/Ast.mjs +1 -0
- package/dist/sparql/Bindings.d.mts +2 -0
- package/dist/sparql/Bindings.mjs +1 -0
- package/dist/sparql/ClientErrors.d.mts +2 -0
- package/dist/sparql/ClientErrors.mjs +1 -0
- package/dist/sparql/ClientFormats.d.mts +2 -0
- package/dist/sparql/ClientFormats.mjs +1 -0
- package/dist/sparql/Engine.d.mts +2 -0
- package/dist/sparql/Engine.mjs +1 -0
- package/dist/sparql/Errors.d.mts +2 -0
- package/dist/sparql/Errors.mjs +1 -0
- package/dist/sparql/Expression.d.mts +2 -0
- package/dist/sparql/Expression.mjs +1 -0
- package/dist/sparql/Federation.d.mts +2 -0
- package/dist/sparql/Federation.mjs +1 -0
- package/dist/sparql/Functions.d.mts +2 -0
- package/dist/sparql/Functions.mjs +1 -0
- package/dist/sparql/Generator.d.mts +2 -0
- package/dist/sparql/Generator.mjs +1 -0
- package/dist/sparql/GraphStore.d.mts +2 -0
- package/dist/sparql/GraphStore.mjs +1 -0
- package/dist/sparql/Optimizer.d.mts +2 -0
- package/dist/sparql/Optimizer.mjs +1 -0
- package/dist/sparql/Options.d.mts +2 -0
- package/dist/sparql/Options.mjs +1 -0
- package/dist/sparql/Parser.d.mts +2 -0
- package/dist/sparql/Parser.mjs +1 -0
- package/dist/sparql/Protocol.d.mts +2 -0
- package/dist/sparql/Protocol.mjs +1 -0
- package/dist/sparql/ProtocolErrors.d.mts +2 -0
- package/dist/sparql/ProtocolErrors.mjs +1 -0
- package/dist/sparql/QueryBuilder.d.mts +2 -0
- package/dist/sparql/QueryBuilder.mjs +1 -0
- package/dist/sparql/Results.d.mts +2 -0
- package/dist/sparql/Results.mjs +1 -0
- package/dist/sparql/ResultsStream.d.mts +2 -0
- package/dist/sparql/ResultsStream.mjs +1 -0
- package/dist/sparql/ServerFormats.d.mts +2 -0
- package/dist/sparql/ServerFormats.mjs +1 -0
- package/dist/sparql/ServiceDescription.d.mts +2 -0
- package/dist/sparql/ServiceDescription.mjs +1 -0
- package/dist/sparql/SparqlClient.d.mts +2 -0
- package/dist/sparql/SparqlClient.mjs +1 -0
- package/dist/sparql/SparqlServer.d.mts +2 -0
- package/dist/sparql/SparqlServer.mjs +1 -0
- package/dist/sparql/Store.d.mts +2 -0
- package/dist/sparql/Store.mjs +1 -0
- package/dist/sparql/TermSchema.d.mts +3 -0
- package/dist/sparql/TermSchema.mjs +2 -0
- package/dist/sparql/Testing.d.mts +2 -0
- package/dist/sparql/Testing.mjs +1 -0
- package/dist/sparql/Translate.d.mts +2 -0
- package/dist/sparql/Translate.mjs +1 -0
- package/dist/sparql/ai/Mcp.d.mts +2 -0
- package/dist/sparql/ai/Mcp.mjs +1 -0
- package/dist/sparql/ai/Tools.d.mts +2 -0
- package/dist/sparql/ai/Tools.mjs +1 -0
- package/dist/sparql/ai/index.d.mts +3 -0
- package/dist/sparql/ai/index.mjs +3 -0
- package/dist/sparql/index.d.mts +30 -0
- package/dist/sparql/index.mjs +29 -0
- package/dist/sparql/shacl/Evaluator.d.mts +2 -0
- package/dist/sparql/shacl/Evaluator.mjs +1 -0
- package/dist/sparql/shacl/Query.d.mts +2 -0
- package/dist/sparql/shacl/Query.mjs +1 -0
- package/dist/sparql/shacl/index.d.mts +3 -0
- package/dist/sparql/shacl/index.mjs +3 -0
- package/dist/sparql/sql/Dialect.d.mts +2 -0
- package/dist/sparql/sql/Dialect.mjs +1 -0
- package/dist/sparql/sql/SqlStore.d.mts +2 -0
- package/dist/sparql/sql/SqlStore.mjs +1 -0
- package/dist/sparql/sql/Translation.d.mts +2 -0
- package/dist/sparql/sql/Translation.mjs +1 -0
- package/dist/sparql/sql/index.d.mts +4 -0
- package/dist/sparql/sql/index.mjs +4 -0
- package/dist/stringMap-D5YIpYtR.mjs +38 -0
- package/dist/stringMap-D5YIpYtR.mjs.map +1 -0
- package/dist/tokens-C6BzeodQ.mjs +24 -0
- package/dist/tokens-C6BzeodQ.mjs.map +1 -0
- package/dist/turtle/Grammar.d.mts +3 -0
- package/dist/turtle/Grammar.mjs +3 -0
- package/dist/turtle/Manifest.d.mts +2 -0
- package/dist/turtle/Manifest.mjs +1 -0
- package/dist/turtle/TriG.d.mts +2 -0
- package/dist/turtle/TriG.mjs +1 -0
- package/dist/turtle/Turtle.d.mts +2 -0
- package/dist/turtle/Turtle.mjs +1 -0
- package/dist/turtle/index.d.mts +5 -0
- package/dist/turtle/index.mjs +5 -0
- package/dist/xmp/DublinCore.d.mts +2 -0
- package/dist/xmp/DublinCore.mjs +1 -0
- package/dist/xmp/Exif.d.mts +2 -0
- package/dist/xmp/Exif.mjs +1 -0
- package/dist/xmp/Extract.d.mts +2 -0
- package/dist/xmp/Extract.mjs +1 -0
- package/dist/xmp/Metadata.d.mts +2 -0
- package/dist/xmp/Metadata.mjs +1 -0
- package/dist/xmp/Namespaces.d.mts +2 -0
- package/dist/xmp/Namespaces.mjs +1 -0
- package/dist/xmp/Packet.d.mts +2 -0
- package/dist/xmp/Packet.mjs +1 -0
- package/dist/xmp/Pdf.d.mts +2 -0
- package/dist/xmp/Pdf.mjs +1 -0
- package/dist/xmp/PdfA.d.mts +2 -0
- package/dist/xmp/PdfA.mjs +1 -0
- package/dist/xmp/Photoshop.d.mts +2 -0
- package/dist/xmp/Photoshop.mjs +1 -0
- package/dist/xmp/Tiff.d.mts +2 -0
- package/dist/xmp/Tiff.mjs +1 -0
- package/dist/xmp/Xmp.d.mts +2 -0
- package/dist/xmp/Xmp.mjs +3 -0
- package/dist/xmp/XmpBasic.d.mts +2 -0
- package/dist/xmp/XmpBasic.mjs +1 -0
- package/dist/xmp/XmpMM.d.mts +2 -0
- package/dist/xmp/XmpMM.mjs +1 -0
- package/dist/xmp/XmpRights.d.mts +2 -0
- package/dist/xmp/XmpRights.mjs +1 -0
- package/dist/xmp/index.d.mts +15 -0
- package/dist/xmp/index.mjs +15 -0
- package/package.json +195 -3
- package/src/Dataset.ts +1085 -0
- package/src/Iri.ts +322 -0
- package/src/Isomorphism.ts +319 -0
- package/src/LanguageTag.ts +98 -0
- package/src/Namespace.ts +100 -0
- package/src/PrefixMap.ts +117 -0
- package/src/RdfJs.ts +146 -0
- package/src/Rdfs.ts +241 -0
- package/src/Reification.ts +103 -0
- package/src/Resource.ts +873 -0
- package/src/Serialization.ts +775 -0
- package/src/Term.ts +1300 -0
- package/src/TermCodec.ts +505 -0
- package/src/TermJson.ts +313 -0
- package/src/Vocab.ts +161 -0
- package/src/Xsd.ts +573 -0
- package/src/csvw/Csv2Json.ts +265 -0
- package/src/csvw/Csv2Rdf.ts +268 -0
- package/src/csvw/Datatype.ts +589 -0
- package/src/csvw/Metadata.ts +1523 -0
- package/src/csvw/Processor.ts +276 -0
- package/src/csvw/Report.ts +135 -0
- package/src/csvw/Table.ts +759 -0
- package/src/csvw/index.ts +22 -0
- package/src/csvw/internal/dateFormat.ts +202 -0
- package/src/csvw/internal/json.ts +104 -0
- package/src/csvw/internal/numberFormat.ts +369 -0
- package/src/csvw/internal/object.ts +23 -0
- package/src/csvw/internal/uriTemplate.ts +130 -0
- package/src/csvw/internal/url.ts +93 -0
- package/src/csvw/internal/vocab.ts +282 -0
- package/src/index.ts +40 -0
- package/src/internal/arbitrary.ts +148 -0
- package/src/internal/loop.ts +24 -0
- package/src/internal/pending.ts +20 -0
- package/src/internal/textDecoder.ts +183 -0
- package/src/jsonld/DocumentLoader.ts +512 -0
- package/src/jsonld/JsonLd.ts +847 -0
- package/src/jsonld/JsonLdError.ts +105 -0
- package/src/jsonld/index.ts +13 -0
- package/src/jsonld/internal/compact.ts +852 -0
- package/src/jsonld/internal/context.ts +781 -0
- package/src/jsonld/internal/expand.ts +614 -0
- package/src/jsonld/internal/flatten.ts +243 -0
- package/src/jsonld/internal/frame.ts +559 -0
- package/src/jsonld/internal/iri.ts +52 -0
- package/src/jsonld/internal/json.ts +19 -0
- package/src/jsonld/internal/linkHeader.ts +60 -0
- package/src/jsonld/internal/rdf.ts +481 -0
- package/src/jsonld/internal/util.ts +367 -0
- package/src/n3/Isomorphism.ts +476 -0
- package/src/n3/Mapping.ts +332 -0
- package/src/n3/Model.ts +696 -0
- package/src/n3/N3.ts +237 -0
- package/src/n3/Reasoner.ts +568 -0
- package/src/n3/Vocab.ts +111 -0
- package/src/n3/index.ts +21 -0
- package/src/n3/internal/builtins.ts +668 -0
- package/src/n3/internal/guards.ts +23 -0
- package/src/n3/internal/lists.ts +106 -0
- package/src/n3/internal/loop.ts +28 -0
- package/src/n3/internal/parser.ts +1032 -0
- package/src/n3/internal/writer.ts +344 -0
- package/src/ntriples/Grammar.ts +317 -0
- package/src/ntriples/Lexical.ts +321 -0
- package/src/ntriples/NQuads.ts +140 -0
- package/src/ntriples/NTriples.ts +143 -0
- package/src/ntriples/index.ts +14 -0
- package/src/ntriples/internal/codec.ts +229 -0
- package/src/ntriples/internal/lineParser.ts +326 -0
- package/src/ntriples/internal/loop.ts +14 -0
- package/src/rdfjson/RdfJson.ts +806 -0
- package/src/rdfjson/index.ts +9 -0
- package/src/rdfjson/internal/json.ts +19 -0
- package/src/rdfxml/RdfXml.ts +1408 -0
- package/src/rdfxml/Xml.ts +419 -0
- package/src/rdfxml/index.ts +11 -0
- package/src/rdfxml/internal/chars.ts +73 -0
- package/src/rdfxml/internal/loop.ts +24 -0
- package/src/rdfxml/internal/parser.ts +1265 -0
- package/src/shacl/Message.ts +102 -0
- package/src/shacl/Path.ts +483 -0
- package/src/shacl/Shapes.ts +913 -0
- package/src/shacl/Sparql.ts +128 -0
- package/src/shacl/ValidationReport.ts +438 -0
- package/src/shacl/Validator.ts +1156 -0
- package/src/shacl/Vocabulary.ts +180 -0
- package/src/shacl/index.ts +22 -0
- package/src/shacl/internal/compare.ts +128 -0
- package/src/shacl/internal/regex.ts +56 -0
- package/src/shex/SemAct.ts +197 -0
- package/src/shex/ShExC.ts +415 -0
- package/src/shex/ShExError.ts +71 -0
- package/src/shex/ShExJ.ts +893 -0
- package/src/shex/ShExR.ts +640 -0
- package/src/shex/ShapeMap.ts +385 -0
- package/src/shex/Structure.ts +467 -0
- package/src/shex/Validator.ts +395 -0
- package/src/shex/index.ts +24 -0
- package/src/shex/internal/engine.ts +682 -0
- package/src/shex/internal/iterate.ts +14 -0
- package/src/shex/internal/json.ts +12 -0
- package/src/shex/internal/lexer.ts +56 -0
- package/src/shex/internal/nodeConstraint.ts +368 -0
- package/src/shex/internal/shexcLexer.ts +387 -0
- package/src/shex/internal/shexcParser.ts +1312 -0
- package/src/shex/internal/tokens.ts +41 -0
- package/src/shex/internal/xpathRegex.ts +290 -0
- package/src/sparql/Algebra.ts +914 -0
- package/src/sparql/Ast.ts +1344 -0
- package/src/sparql/Bindings.ts +272 -0
- package/src/sparql/ClientErrors.ts +156 -0
- package/src/sparql/ClientFormats.ts +70 -0
- package/src/sparql/Engine.ts +699 -0
- package/src/sparql/Errors.ts +30 -0
- package/src/sparql/Expression.ts +360 -0
- package/src/sparql/Federation.ts +187 -0
- package/src/sparql/Functions.ts +689 -0
- package/src/sparql/Generator.ts +426 -0
- package/src/sparql/GraphStore.ts +341 -0
- package/src/sparql/Optimizer.ts +230 -0
- package/src/sparql/Options.ts +191 -0
- package/src/sparql/Parser.ts +173 -0
- package/src/sparql/Protocol.ts +342 -0
- package/src/sparql/ProtocolErrors.ts +113 -0
- package/src/sparql/QueryBuilder.ts +953 -0
- package/src/sparql/Results.ts +844 -0
- package/src/sparql/ResultsStream.ts +771 -0
- package/src/sparql/ServerFormats.ts +75 -0
- package/src/sparql/ServiceDescription.ts +130 -0
- package/src/sparql/SparqlClient.ts +947 -0
- package/src/sparql/SparqlServer.ts +528 -0
- package/src/sparql/Store.ts +311 -0
- package/src/sparql/TermSchema.ts +20 -0
- package/src/sparql/Testing.ts +114 -0
- package/src/sparql/Translate.ts +407 -0
- package/src/sparql/ai/Mcp.ts +43 -0
- package/src/sparql/ai/Tools.ts +481 -0
- package/src/sparql/ai/index.ts +11 -0
- package/src/sparql/index.ts +64 -0
- package/src/sparql/internal/evaluator.ts +947 -0
- package/src/sparql/internal/hash.ts +418 -0
- package/src/sparql/internal/json.ts +12 -0
- package/src/sparql/internal/lexer.ts +488 -0
- package/src/sparql/internal/loop.ts +24 -0
- package/src/sparql/internal/parser.ts +2215 -0
- package/src/sparql/internal/prefetch.ts +46 -0
- package/src/sparql/internal/stringMap.ts +39 -0
- package/src/sparql/internal/textResults.ts +226 -0
- package/src/sparql/internal/values.ts +550 -0
- package/src/sparql/shacl/Evaluator.ts +478 -0
- package/src/sparql/shacl/Query.ts +574 -0
- package/src/sparql/shacl/index.ts +12 -0
- package/src/sparql/sql/Dialect.ts +246 -0
- package/src/sparql/sql/SqlStore.ts +1080 -0
- package/src/sparql/sql/Translation.ts +1898 -0
- package/src/sparql/sql/index.ts +17 -0
- package/src/sparql/sql/internal/encoding.ts +313 -0
- package/src/turtle/Grammar.ts +286 -0
- package/src/turtle/Manifest.ts +215 -0
- package/src/turtle/TriG.ts +158 -0
- package/src/turtle/Turtle.ts +166 -0
- package/src/turtle/index.ts +14 -0
- package/src/turtle/internal/loop.ts +23 -0
- package/src/turtle/internal/parse.ts +112 -0
- package/src/turtle/internal/parser.ts +1303 -0
- package/src/turtle/internal/serialize.ts +79 -0
- package/src/turtle/internal/streamWriter.ts +128 -0
- package/src/turtle/internal/writer.ts +898 -0
- package/src/xmp/DublinCore.ts +147 -0
- package/src/xmp/Exif.ts +109 -0
- package/src/xmp/Extract.ts +351 -0
- package/src/xmp/Metadata.ts +703 -0
- package/src/xmp/Namespaces.ts +228 -0
- package/src/xmp/Packet.ts +297 -0
- package/src/xmp/Pdf.ts +99 -0
- package/src/xmp/PdfA.ts +280 -0
- package/src/xmp/Photoshop.ts +275 -0
- package/src/xmp/Tiff.ts +196 -0
- package/src/xmp/Xmp.ts +430 -0
- package/src/xmp/XmpBasic.ts +90 -0
- package/src/xmp/XmpMM.ts +82 -0
- package/src/xmp/XmpRights.ts +83 -0
- package/src/xmp/index.ts +36 -0
- package/src/xmp/internal/accessors.ts +72 -0
- package/src/xmp/internal/xml.ts +63 -0
|
@@ -0,0 +1,1032 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Notation3 parser: a compiled `@thomasfosterau/effect-parse` grammar
|
|
3
|
+
* over the input string (no separate lexer), built on the Turtle terminals of
|
|
4
|
+
* `/turtle` (`Grammar`), as the N3 grammar is: N3 extends Turtle with
|
|
5
|
+
* formulas, paths, quick variables, `=`, `=>`, `<=`, `has`, `is … of` and the
|
|
6
|
+
* legacy `@forAll` / `@forSome`.
|
|
7
|
+
*
|
|
8
|
+
* The grammar's callbacks build the model as it reads, with no syntax tree:
|
|
9
|
+
* a `Builder` holds what depends on what came before (`@prefix` / `@base`,
|
|
10
|
+
* quantifier scopes, blank node allocation, the open formulas and the
|
|
11
|
+
* subjects being described), and statements are made in document order.
|
|
12
|
+
* Side effects run in `tap`s and zero-width `Parser.make`s, never in a `map`
|
|
13
|
+
* whose value is unused (the compiler skips those). An error the builder
|
|
14
|
+
* finds is kept and reported once the whole document has been read, so a
|
|
15
|
+
* syntax error anywhere takes precedence, as when the model was built from a
|
|
16
|
+
* tree after parsing.
|
|
17
|
+
*
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
import * as Ascii from '@thomasfosterau/effect-parse/Ascii';
|
|
21
|
+
import * as Compiler from '@thomasfosterau/effect-parse/Compiler';
|
|
22
|
+
import * as Parser from '@thomasfosterau/effect-parse/Parser';
|
|
23
|
+
import * as Token from '@thomasfosterau/effect-parse/Token';
|
|
24
|
+
import * as TurtleGrammar from '../../turtle/Grammar.ts';
|
|
25
|
+
import * as Iri from '../../Iri.ts';
|
|
26
|
+
import * as PrefixMap from '../../PrefixMap.ts';
|
|
27
|
+
import * as Term from '../../Term.ts';
|
|
28
|
+
import { rdf, xsd } from '../../Vocab.ts';
|
|
29
|
+
import * as Arr from 'effect/Array';
|
|
30
|
+
import * as Iterable from 'effect/Iterable';
|
|
31
|
+
import * as MutableHashMap from 'effect/MutableHashMap';
|
|
32
|
+
import * as Option from 'effect/Option';
|
|
33
|
+
import * as Predicate from 'effect/Predicate';
|
|
34
|
+
import * as Result from 'effect/Result';
|
|
35
|
+
import * as Model from '../Model.ts';
|
|
36
|
+
import { i18n, log, sameAs } from '../Vocab.ts';
|
|
37
|
+
import { loop } from './loop.ts';
|
|
38
|
+
|
|
39
|
+
/** @internal */
|
|
40
|
+
export class SyntaxFailure {
|
|
41
|
+
readonly message: string;
|
|
42
|
+
readonly line: number;
|
|
43
|
+
readonly column: number;
|
|
44
|
+
constructor(message: string, line: number, column: number) {
|
|
45
|
+
this.message = message;
|
|
46
|
+
this.line = line;
|
|
47
|
+
this.column = column;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** @internal */
|
|
52
|
+
export interface ParserOptions {
|
|
53
|
+
readonly baseIri: Option.Option<string>;
|
|
54
|
+
readonly blankNodePrefix: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// -----------------------------------------------------------------------------
|
|
58
|
+
// Character classes (also used by the writer)
|
|
59
|
+
// -----------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
/** @internal */
|
|
62
|
+
export const isPnCharsBase = (c: number): boolean =>
|
|
63
|
+
(c >= 0x41 && c <= 0x5a) ||
|
|
64
|
+
(c >= 0x61 && c <= 0x7a) ||
|
|
65
|
+
(c >= 0xc0 && c <= 0xd6) ||
|
|
66
|
+
(c >= 0xd8 && c <= 0xf6) ||
|
|
67
|
+
(c >= 0xf8 && c <= 0x2ff) ||
|
|
68
|
+
(c >= 0x370 && c <= 0x37d) ||
|
|
69
|
+
(c >= 0x37f && c <= 0x1fff) ||
|
|
70
|
+
(c >= 0x200c && c <= 0x200d) ||
|
|
71
|
+
(c >= 0x2070 && c <= 0x218f) ||
|
|
72
|
+
(c >= 0x2c00 && c <= 0x2fef) ||
|
|
73
|
+
(c >= 0x3001 && c <= 0xd7ff) ||
|
|
74
|
+
(c >= 0xf900 && c <= 0xfdcf) ||
|
|
75
|
+
(c >= 0xfdf0 && c <= 0xfffd) ||
|
|
76
|
+
(c >= 0x10000 && c <= 0xeffff);
|
|
77
|
+
|
|
78
|
+
/** @internal */
|
|
79
|
+
export const isPnCharsU = (c: number): boolean => c === 0x5f || isPnCharsBase(c);
|
|
80
|
+
|
|
81
|
+
/** @internal */
|
|
82
|
+
export const isPnChars = (c: number): boolean =>
|
|
83
|
+
isPnCharsU(c) ||
|
|
84
|
+
c === 0x2d ||
|
|
85
|
+
(c >= 0x30 && c <= 0x39) ||
|
|
86
|
+
c === 0xb7 ||
|
|
87
|
+
(c >= 0x300 && c <= 0x36f) ||
|
|
88
|
+
(c >= 0x203f && c <= 0x2040);
|
|
89
|
+
|
|
90
|
+
// -----------------------------------------------------------------------------
|
|
91
|
+
// IRIs as written
|
|
92
|
+
// -----------------------------------------------------------------------------
|
|
93
|
+
|
|
94
|
+
/** An IRI as written: an IRI reference or a prefixed name, at an offset. */
|
|
95
|
+
type IriNode =
|
|
96
|
+
| {
|
|
97
|
+
readonly _tag: 'IriRef';
|
|
98
|
+
readonly value: string;
|
|
99
|
+
readonly at: number;
|
|
100
|
+
/** Whether the reference contains `UCHAR` escapes. */
|
|
101
|
+
readonly escaped: boolean;
|
|
102
|
+
}
|
|
103
|
+
| {
|
|
104
|
+
readonly _tag: 'PName';
|
|
105
|
+
readonly prefix: string;
|
|
106
|
+
readonly local: string;
|
|
107
|
+
readonly at: number;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// -----------------------------------------------------------------------------
|
|
111
|
+
// Grammar
|
|
112
|
+
// -----------------------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
/** A syntax error with its offset (the cause of a grammar failure). */
|
|
115
|
+
interface Fail {
|
|
116
|
+
readonly message: string;
|
|
117
|
+
readonly at: number;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
type P<A> = Parser.Parser<A, Fail>;
|
|
121
|
+
|
|
122
|
+
const fail = <A>(message: string, at: number): Result.Result<A, Fail> =>
|
|
123
|
+
Result.fail({ message, at });
|
|
124
|
+
|
|
125
|
+
const WHITESPACE = 'whitespace';
|
|
126
|
+
|
|
127
|
+
/** Whitespace and `#` comments (which also end at a form feed). */
|
|
128
|
+
const ws: P<void> = Parser.asVoid(
|
|
129
|
+
Parser.repeat(
|
|
130
|
+
Parser.alt(
|
|
131
|
+
Token.takeWhile(' \t\r\n', { min: 1 }),
|
|
132
|
+
Parser.preceded(Token.literal('#'), Token.takeTill('\n\r\f')),
|
|
133
|
+
).pipe(Parser.expected(WHITESPACE)),
|
|
134
|
+
),
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
const lit = (s: string): P<string> => Token.literal(s);
|
|
138
|
+
|
|
139
|
+
const closeBracket: P<string> = Parser.cut(Parser.preceded(ws, Token.literal(']'))).pipe(
|
|
140
|
+
Parser.expected("']'"),
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
/** `s` after whitespace. */
|
|
144
|
+
const sym = (s: string): P<string> => Parser.preceded(ws, Token.literal(s));
|
|
145
|
+
|
|
146
|
+
/** A character that ends a statement, a list of objects or a formula. */
|
|
147
|
+
const endOf = (chars: string): P<unknown> =>
|
|
148
|
+
Parser.preceded(ws, Parser.alt(Parser.eof, Parser.peek(Token.oneOf(chars))));
|
|
149
|
+
|
|
150
|
+
/** An `@` keyword: `@` followed by letters. */
|
|
151
|
+
const atWord: P<string> = Parser.taken(
|
|
152
|
+
Parser.preceded(lit('@'), Token.takeWhile(TurtleGrammar.alpha, { min: 1 })),
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const atKeyword = (word: string): P<string> => atWord.pipe(Parser.filter((w) => w === word));
|
|
156
|
+
|
|
157
|
+
/** A `PN_PREFIX` not followed by `:` (a bare word such as `a`, `is`, `true`). */
|
|
158
|
+
const bareWord: P<string> = Parser.terminated(TurtleGrammar.pnPrefix, Parser.not(lit(':')));
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* The bare word `w`, checked by its first character before the word is
|
|
162
|
+
* read, so that the names tried as keywords on the way to a path are not
|
|
163
|
+
* each scanned as a word first.
|
|
164
|
+
*/
|
|
165
|
+
const word = (w: string): P<string> =>
|
|
166
|
+
Parser.preceded(Parser.peek(lit(w.slice(0, 1))), bareWord.pipe(Parser.filter((x) => x === w)));
|
|
167
|
+
|
|
168
|
+
// eslint-disable-next-line no-control-regex
|
|
169
|
+
const forbiddenInIri = /[\u0000- <>"{}|^`\\]/u;
|
|
170
|
+
|
|
171
|
+
/** IRIREF (escapes of characters not allowed in IRIs are rejected by the builder). */
|
|
172
|
+
const iriRef: P<IriNode> = Parser.seq(Parser.location, TurtleGrammar.iriRef, Parser.location).pipe(
|
|
173
|
+
Parser.map(([at, value, end]): IriNode => ({
|
|
174
|
+
_tag: 'IriRef',
|
|
175
|
+
value,
|
|
176
|
+
at,
|
|
177
|
+
escaped: end - at - 2 !== value.length,
|
|
178
|
+
})),
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
const pname: P<IriNode> = Parser.seq(Parser.location, TurtleGrammar.prefixedName).pipe(
|
|
182
|
+
Parser.map(([at, { prefix, local }]): IriNode => ({ _tag: 'PName', prefix, local, at })),
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
/** Records the offset at which a term starts (`b.at`), for its errors. */
|
|
186
|
+
const mark: P<void> = Parser.make<void>((state) => {
|
|
187
|
+
b.at = state.pos;
|
|
188
|
+
return undefined;
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
/** Records the offset at which an IRI reference ends (`b.end`). */
|
|
192
|
+
const markEnd: P<void> = Parser.make<void>((state) => {
|
|
193
|
+
b.end = state.pos;
|
|
194
|
+
return undefined;
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
/** An IRI reference as a term, made without an intermediate `IriNode`. */
|
|
198
|
+
const iriRefTerm: P<Model.N3Term> = Parser.delimited(mark, TurtleGrammar.iriRef, markEnd).pipe(
|
|
199
|
+
Parser.map((value) => b.namedRef(value)),
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* A prefixed name as a term: the `PNAME_LN` / `PNAME_NS` that
|
|
204
|
+
* `TurtleGrammar.prefixedName` reads, taken as one slice and split at its
|
|
205
|
+
* first `:` (which `PN_PREFIX` cannot contain).
|
|
206
|
+
*/
|
|
207
|
+
const pnameTerm: P<Model.N3Term> = Parser.preceded(
|
|
208
|
+
mark,
|
|
209
|
+
Parser.taken(
|
|
210
|
+
Parser.seq(Parser.opt(TurtleGrammar.pnPrefix), lit(':'), Parser.opt(TurtleGrammar.pnLocal)),
|
|
211
|
+
),
|
|
212
|
+
).pipe(Parser.map((name) => b.namedPName(name)));
|
|
213
|
+
|
|
214
|
+
/** `iri`: an IRI reference or a prefixed name. */
|
|
215
|
+
const iri: P<IriNode> = Parser.alt(iriRef, pname).pipe(Parser.expected('an IRI'));
|
|
216
|
+
|
|
217
|
+
const path: P<Model.N3Term> = Parser.suspend(() => pathDef);
|
|
218
|
+
const pol: P<void> = Parser.suspend(() => polDef);
|
|
219
|
+
const statementList = (inFormula: boolean): P<void> =>
|
|
220
|
+
Parser.suspend(() => (inFormula ? formulaStatements : documentStatements));
|
|
221
|
+
|
|
222
|
+
/** A parser that consumes nothing and runs `f` (on the builder's state). */
|
|
223
|
+
const act = (f: () => void): P<void> =>
|
|
224
|
+
Parser.make<void>(() => {
|
|
225
|
+
f();
|
|
226
|
+
return undefined;
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const TRUE = Term.literal('true', xsd.boolean);
|
|
230
|
+
const FALSE = Term.literal('false', xsd.boolean);
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Where a numeric literal can start: a digit, or `.`, `+` or `-` followed by
|
|
234
|
+
* one. Checking up front (without consuming input) reports errors at a `.`
|
|
235
|
+
* that ends a statement, rather than after it.
|
|
236
|
+
*/
|
|
237
|
+
const numberStart: P<void> = Parser.make<void>((state) => {
|
|
238
|
+
// SAFETY: the N3 parser runs on string input, never bytes.
|
|
239
|
+
const input = state.input;
|
|
240
|
+
const isDigit = (k: number) => {
|
|
241
|
+
const c = input.charCodeAt(k);
|
|
242
|
+
return c >= 0x30 && c <= 0x39;
|
|
243
|
+
};
|
|
244
|
+
const c = input.charCodeAt(state.pos);
|
|
245
|
+
const ok =
|
|
246
|
+
isDigit(state.pos) ||
|
|
247
|
+
(c === 0x2e && isDigit(state.pos + 1)) ||
|
|
248
|
+
((c === 0x2b || c === 0x2d) &&
|
|
249
|
+
(isDigit(state.pos + 1) ||
|
|
250
|
+
(input.charCodeAt(state.pos + 1) === 0x2e && isDigit(state.pos + 2))));
|
|
251
|
+
return ok ? undefined : state.backtrack('Token', expectedNumber);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const expectedNumber = ['a number'];
|
|
255
|
+
|
|
256
|
+
const numeric: P<Model.N3Term> = Parser.preceded(numberStart, TurtleGrammar.numericLiteral).pipe(
|
|
257
|
+
Parser.map(([lexical, type]) =>
|
|
258
|
+
Term.literal(
|
|
259
|
+
lexical,
|
|
260
|
+
type === 'double' ? xsd.double : type === 'decimal' ? xsd.decimal : xsd.integer,
|
|
261
|
+
),
|
|
262
|
+
),
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
/** What follows a string literal: a language tag (`''` for none) or a datatype. */
|
|
266
|
+
interface LiteralSuffix {
|
|
267
|
+
readonly language: string;
|
|
268
|
+
readonly datatype: Option.Option<IriNode>;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const noDatatype = Option.none<IriNode>();
|
|
272
|
+
const plainSuffix: LiteralSuffix = { language: '', datatype: noDatatype };
|
|
273
|
+
|
|
274
|
+
const rdfLiteral: P<Model.N3Term> = Parser.seq(
|
|
275
|
+
TurtleGrammar.stringLiteral,
|
|
276
|
+
Parser.alt(
|
|
277
|
+
Parser.preceded(Parser.peek(lit('@')), Parser.cut(TurtleGrammar.langTag)).pipe(
|
|
278
|
+
Parser.map((language): LiteralSuffix => ({ language, datatype: noDatatype })),
|
|
279
|
+
),
|
|
280
|
+
Parser.preceded(sym('^^'), Parser.cut(Parser.preceded(ws, iri))).pipe(
|
|
281
|
+
Parser.map((datatype): LiteralSuffix => ({ language: '', datatype: Option.some(datatype) })),
|
|
282
|
+
),
|
|
283
|
+
Parser.succeed(plainSuffix),
|
|
284
|
+
),
|
|
285
|
+
).pipe(Parser.map(([value, { language, datatype }]) => b.literal(value, language, datatype)));
|
|
286
|
+
|
|
287
|
+
const quickVar: P<Model.N3Term> = Parser.preceded(
|
|
288
|
+
lit('?'),
|
|
289
|
+
Parser.cut(
|
|
290
|
+
Parser.taken(
|
|
291
|
+
Parser.seq(Token.oneOf(TurtleGrammar.pnCharsU), Token.takeWhile(TurtleGrammar.pnChars)),
|
|
292
|
+
),
|
|
293
|
+
).pipe(Parser.expected('a variable name')),
|
|
294
|
+
).pipe(Parser.map((name) => b.variable(name)));
|
|
295
|
+
|
|
296
|
+
const blank: P<Model.N3Term> = Parser.preceded(
|
|
297
|
+
Parser.peek(lit('_:')),
|
|
298
|
+
Parser.cut(TurtleGrammar.blankNodeLabel.pipe(Parser.expected('a blank node label'))),
|
|
299
|
+
).pipe(Parser.map((label) => b.labelledBlank(label)));
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* `[ … ]`: an anonymous node, or `[ id <iri> … ]`. A new node is made when
|
|
303
|
+
* the bracket opens, before the nodes inside it, as the statements inside
|
|
304
|
+
* are about it.
|
|
305
|
+
*/
|
|
306
|
+
const bracket: P<Model.N3Term> = Parser.preceded(
|
|
307
|
+
lit('['),
|
|
308
|
+
Parser.cut(
|
|
309
|
+
Parser.alt(
|
|
310
|
+
sym(']').pipe(Parser.map(() => b.freshBlank())),
|
|
311
|
+
Parser.preceded(
|
|
312
|
+
Parser.tap(
|
|
313
|
+
Parser.preceded(Parser.seq(ws, word('id')), Parser.cut(Parser.preceded(ws, iri))),
|
|
314
|
+
(id) => b.open(b.named(id)),
|
|
315
|
+
),
|
|
316
|
+
Parser.cut(Parser.terminated(pol, closeBracket)),
|
|
317
|
+
).pipe(Parser.map(() => b.close())),
|
|
318
|
+
Parser.preceded(
|
|
319
|
+
act(() => b.open(b.freshBlank())),
|
|
320
|
+
Parser.terminated(pol, closeBracket),
|
|
321
|
+
).pipe(Parser.map(() => b.close())),
|
|
322
|
+
),
|
|
323
|
+
),
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
/** `( … )`: a collection. */
|
|
327
|
+
const collection: P<Model.N3Term> = Parser.delimited(
|
|
328
|
+
lit('('),
|
|
329
|
+
Parser.cut(Parser.repeat(Parser.preceded(Parser.not(sym(')')), path))),
|
|
330
|
+
Parser.cut(sym(')').pipe(Parser.expected("')'"))),
|
|
331
|
+
).pipe(Parser.map((items) => new Model.Collection(items)));
|
|
332
|
+
|
|
333
|
+
/** `{ … }`: a formula; an empty one is the literal `true` (N3 test suite: graph/empty_graph). */
|
|
334
|
+
const formula: P<Model.N3Term> = Parser.preceded(
|
|
335
|
+
lit('{'),
|
|
336
|
+
Parser.cut(
|
|
337
|
+
Parser.delimited(
|
|
338
|
+
act(() => b.openFormula()),
|
|
339
|
+
statementList(true),
|
|
340
|
+
Parser.cut(sym('}').pipe(Parser.expected("'}'"))),
|
|
341
|
+
),
|
|
342
|
+
),
|
|
343
|
+
).pipe(
|
|
344
|
+
Parser.map(() => {
|
|
345
|
+
const f = b.closeFormula();
|
|
346
|
+
return f.size === 0 ? TRUE : f;
|
|
347
|
+
}),
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
/** A prefixed name, or the bare words `true` and `false`. */
|
|
351
|
+
const TRAILING_DOTS = /\.+$/;
|
|
352
|
+
|
|
353
|
+
/** ASCII letters (`PN_CHARS_BASE` below 0x80). */
|
|
354
|
+
const isAsciiLetter = (c: number): boolean => (c >= 0x61 && c <= 0x7a) || (c >= 0x41 && c <= 0x5a);
|
|
355
|
+
|
|
356
|
+
/** ASCII name characters (`PN_CHARS` below 0x80): letters, digits, `_` and `-`. */
|
|
357
|
+
const isAsciiNameChar = (c: number): boolean =>
|
|
358
|
+
isAsciiLetter(c) || (c >= 0x30 && c <= 0x39) || c === 0x5f || c === 0x2d;
|
|
359
|
+
|
|
360
|
+
/** The scan in progress: its input and position (one pair of step functions serves every scan). */
|
|
361
|
+
let scanInput = '';
|
|
362
|
+
let scanPos = 0;
|
|
363
|
+
|
|
364
|
+
const prefixStep = (): boolean => {
|
|
365
|
+
if (!isAsciiNameChar(scanInput.charCodeAt(scanPos))) return false;
|
|
366
|
+
scanPos++;
|
|
367
|
+
return true;
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
const localStep = (): boolean => {
|
|
371
|
+
const c = scanInput.charCodeAt(scanPos);
|
|
372
|
+
if (!isAsciiNameChar(c) && c !== 0x2e && c !== 0x3a) return false;
|
|
373
|
+
scanPos++;
|
|
374
|
+
return true;
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
/** Where the run of characters that `step` accepts, from `pos`, ends. */
|
|
378
|
+
const scanTo = (step: () => boolean, input: string, pos: number): number => {
|
|
379
|
+
scanInput = input;
|
|
380
|
+
scanPos = pos;
|
|
381
|
+
loop(step);
|
|
382
|
+
return scanPos;
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* A prefixed name that is plain ASCII, scanned by hand: a prefix of letters,
|
|
387
|
+
* digits, `_` and `-` (or none), `:`, and a local name of those and `:` and
|
|
388
|
+
* `.` (without trailing dots). It backtracks, having changed nothing, at
|
|
389
|
+
* anything else (`.` in the prefix, `%`, `\`, a character from 0x80, no
|
|
390
|
+
* `:`), so that `pnameTerm` reads the name, with the same result.
|
|
391
|
+
*/
|
|
392
|
+
const asciiPName: P<Model.N3Term> = Parser.make((state) => {
|
|
393
|
+
const input = state.input;
|
|
394
|
+
const start = state.pos;
|
|
395
|
+
const colon = isAsciiLetter(input.charCodeAt(start))
|
|
396
|
+
? scanTo(prefixStep, input, start + 1)
|
|
397
|
+
: start;
|
|
398
|
+
if (input.charCodeAt(colon) !== 0x3a) return state.backtrack('Token');
|
|
399
|
+
// A local name does not start with `-` or `.`
|
|
400
|
+
const first = input.charCodeAt(colon + 1);
|
|
401
|
+
const i =
|
|
402
|
+
first === 0x2d || first === 0x2e || !(isAsciiNameChar(first) || first === 0x3a)
|
|
403
|
+
? colon + 1
|
|
404
|
+
: scanTo(localStep, input, colon + 2);
|
|
405
|
+
const c = input.charCodeAt(i);
|
|
406
|
+
if (c === 0x25 || c === 0x5c || c >= 0x80) return state.backtrack('Token');
|
|
407
|
+
// A dot cannot end a name (it ends the statement)
|
|
408
|
+
const local =
|
|
409
|
+
input.charCodeAt(i - 1) === 0x2e && i > colon + 1
|
|
410
|
+
? input.slice(colon + 1, i).replace(TRAILING_DOTS, '')
|
|
411
|
+
: input.slice(colon + 1, i);
|
|
412
|
+
b.at = start;
|
|
413
|
+
state.pos = colon + 1 + local.length;
|
|
414
|
+
return b.namedPNameParts(input.slice(start, colon), local);
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
const nameItem: P<Model.N3Term> = Parser.alt(
|
|
418
|
+
Parser.alt(asciiPName, pnameTerm),
|
|
419
|
+
Parser.seq(Parser.location, bareWord).pipe(
|
|
420
|
+
Parser.map(([at, w]) =>
|
|
421
|
+
w === 'true'
|
|
422
|
+
? TRUE
|
|
423
|
+
: w === 'false'
|
|
424
|
+
? FALSE
|
|
425
|
+
: b.error(`Unexpected keyword or undeclared prefix '${w}'`, at),
|
|
426
|
+
),
|
|
427
|
+
),
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* A grammar rule compiled to a function of its own. Formulas, collections and
|
|
432
|
+
* `[ … ]` nest, so the compiled functions on that path recurse; keeping the
|
|
433
|
+
* leaf terms out of them keeps their stack frames small, and the nesting
|
|
434
|
+
* depth the parser supports large.
|
|
435
|
+
*/
|
|
436
|
+
const rule = <A>(p: P<A>): P<A> => Parser.suspend(() => p);
|
|
437
|
+
|
|
438
|
+
const leafItem: P<Model.N3Term> = rule(
|
|
439
|
+
Parser.alt(
|
|
440
|
+
iriRefTerm,
|
|
441
|
+
rdfLiteral,
|
|
442
|
+
quickVar,
|
|
443
|
+
atKeyword('@true').pipe(Parser.as<Model.N3Term>(TRUE)),
|
|
444
|
+
atKeyword('@false').pipe(Parser.as<Model.N3Term>(FALSE)),
|
|
445
|
+
blank,
|
|
446
|
+
numeric,
|
|
447
|
+
nameItem,
|
|
448
|
+
),
|
|
449
|
+
);
|
|
450
|
+
|
|
451
|
+
const pathItem: P<Model.N3Term> = Parser.preceded(
|
|
452
|
+
ws,
|
|
453
|
+
Parser.alt(bracket, collection, formula, leafItem).pipe(Parser.expected('a term')),
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
/** A path: an item, then `!` (forward) and `^` (backward) steps, each applied as it is read. */
|
|
457
|
+
const pathDef: P<Model.N3Term> = Parser.preceded(
|
|
458
|
+
Parser.tap(pathItem, (head) => b.paths.push(head)),
|
|
459
|
+
Parser.repeat(
|
|
460
|
+
Parser.preceded(
|
|
461
|
+
Parser.tap(
|
|
462
|
+
Parser.preceded(
|
|
463
|
+
ws,
|
|
464
|
+
Parser.alt(lit('!'), Parser.terminated(lit('^'), Parser.not(lit('^')))),
|
|
465
|
+
),
|
|
466
|
+
(dir) => b.dirs.push(dir),
|
|
467
|
+
),
|
|
468
|
+
Parser.tap(Parser.cut(pathItem), (step) => b.step(step)),
|
|
469
|
+
),
|
|
470
|
+
),
|
|
471
|
+
).pipe(Parser.map(() => b.endPath()));
|
|
472
|
+
|
|
473
|
+
const fixedVerb: P<Model.N3Term> = rule(
|
|
474
|
+
Parser.alt(
|
|
475
|
+
lit('=>').pipe(Parser.as<Model.N3Term>(log.implies)),
|
|
476
|
+
lit('=').pipe(Parser.as<Model.N3Term>(sameAs)),
|
|
477
|
+
// `<=` unless the `<` starts an IRI reference.
|
|
478
|
+
Parser.preceded(Parser.seq(Parser.peek(lit('<=')), Parser.not(iriRef)), lit('<=')).pipe(
|
|
479
|
+
Parser.as<Model.N3Term>(log.isImpliedBy),
|
|
480
|
+
),
|
|
481
|
+
Parser.alt(word('a'), atKeyword('@a')).pipe(Parser.as<Model.N3Term>(rdf.type)),
|
|
482
|
+
),
|
|
483
|
+
);
|
|
484
|
+
|
|
485
|
+
/** A verb, which becomes the predicate (and direction) of the objects after it. */
|
|
486
|
+
const verb: P<void> = Parser.preceded(
|
|
487
|
+
ws,
|
|
488
|
+
Parser.asVoid<Model.N3Term, Fail, never, string>(
|
|
489
|
+
Parser.alt(
|
|
490
|
+
Parser.tap(fixedVerb, (predicate) => b.verb(predicate, false)),
|
|
491
|
+
Parser.tap(
|
|
492
|
+
Parser.preceded(
|
|
493
|
+
Parser.seq(Parser.peek(lit('<-')), Parser.not(iriRef), lit('<-')),
|
|
494
|
+
Parser.cut(path),
|
|
495
|
+
),
|
|
496
|
+
(predicate) => b.verb(predicate, true),
|
|
497
|
+
),
|
|
498
|
+
Parser.tap(
|
|
499
|
+
Parser.preceded(Parser.alt(word('has'), atKeyword('@has')), Parser.cut(path)),
|
|
500
|
+
(predicate) => b.verb(predicate, false),
|
|
501
|
+
),
|
|
502
|
+
Parser.preceded(
|
|
503
|
+
Parser.alt(word('is'), atKeyword('@is')),
|
|
504
|
+
Parser.cut(
|
|
505
|
+
Parser.terminated(
|
|
506
|
+
path,
|
|
507
|
+
Parser.preceded(ws, Parser.alt(word('of'), atKeyword('@of'))).pipe(
|
|
508
|
+
Parser.expected("'of' after 'is ...'"),
|
|
509
|
+
),
|
|
510
|
+
),
|
|
511
|
+
),
|
|
512
|
+
).pipe(Parser.tap((predicate) => b.verb(predicate, true))),
|
|
513
|
+
Parser.tap(path, (predicate) => b.verb(predicate, false)),
|
|
514
|
+
),
|
|
515
|
+
),
|
|
516
|
+
);
|
|
517
|
+
|
|
518
|
+
const objectList: P<unknown> = Parser.separated(
|
|
519
|
+
Parser.tap(path, (object) => b.object(object)),
|
|
520
|
+
sym(','),
|
|
521
|
+
{ min: 1 },
|
|
522
|
+
).pipe(Parser.expected('an object'));
|
|
523
|
+
|
|
524
|
+
const semicolons = Parser.repeat(sym(';'), { min: 1 });
|
|
525
|
+
|
|
526
|
+
const polDef: P<void> = Parser.asVoid(
|
|
527
|
+
Parser.terminated(
|
|
528
|
+
Parser.seq(
|
|
529
|
+
Parser.seq(verb, Parser.cut(objectList)),
|
|
530
|
+
Parser.repeat(
|
|
531
|
+
Parser.preceded(
|
|
532
|
+
semicolons,
|
|
533
|
+
Parser.preceded(Parser.not(endOf('.]}')), Parser.cut(Parser.seq(verb, objectList))),
|
|
534
|
+
),
|
|
535
|
+
),
|
|
536
|
+
),
|
|
537
|
+
Parser.opt(semicolons),
|
|
538
|
+
),
|
|
539
|
+
);
|
|
540
|
+
|
|
541
|
+
const triples: P<void> = Parser.preceded(
|
|
542
|
+
Parser.tap(path, (subject) => b.open(subject)),
|
|
543
|
+
Parser.alt(Parser.preceded(Parser.peek(endOf('.}')), Parser.succeed(undefined)), pol),
|
|
544
|
+
).pipe(Parser.tap(() => void b.close()));
|
|
545
|
+
|
|
546
|
+
/** The body of `@prefix` / `PREFIX`: `PN_PREFIX? ':' IRIREF`. */
|
|
547
|
+
const prefixBody: P<void> = Parser.asVoid(
|
|
548
|
+
Parser.seq(
|
|
549
|
+
Parser.preceded(
|
|
550
|
+
ws,
|
|
551
|
+
Parser.terminated(
|
|
552
|
+
Parser.opt(TurtleGrammar.pnPrefix),
|
|
553
|
+
lit(':').pipe(Parser.expected('a prefix name ending in ":"')),
|
|
554
|
+
),
|
|
555
|
+
),
|
|
556
|
+
Parser.preceded(ws, iriRef),
|
|
557
|
+
).pipe(
|
|
558
|
+
Parser.tap(([prefix, ref]) =>
|
|
559
|
+
b.prefix(
|
|
560
|
+
Option.getOrElse(prefix, () => ''),
|
|
561
|
+
ref,
|
|
562
|
+
),
|
|
563
|
+
),
|
|
564
|
+
),
|
|
565
|
+
);
|
|
566
|
+
|
|
567
|
+
const baseBody: P<void> = Parser.asVoid(
|
|
568
|
+
Parser.preceded(ws, iriRef).pipe(
|
|
569
|
+
Parser.tap((ref) => {
|
|
570
|
+
b.base = Option.some(b.iri(ref));
|
|
571
|
+
}),
|
|
572
|
+
),
|
|
573
|
+
);
|
|
574
|
+
|
|
575
|
+
const quantifier = (universal: boolean): P<void> =>
|
|
576
|
+
Parser.alt(
|
|
577
|
+
Parser.preceded(Parser.peek(endOf('.}')), Parser.succeed<ReadonlyArray<IriNode>>([])),
|
|
578
|
+
Parser.separated(Parser.preceded(ws, iri), sym(','), { min: 1 }),
|
|
579
|
+
).pipe(
|
|
580
|
+
Parser.tap((iris) => b.quantify(universal, iris)),
|
|
581
|
+
Parser.asVoid,
|
|
582
|
+
);
|
|
583
|
+
|
|
584
|
+
/** `PREFIX` / `BASE` (case-insensitive, no trailing `.`). */
|
|
585
|
+
const sparqlDirective: P<void> = rule(
|
|
586
|
+
Parser.preceded(
|
|
587
|
+
ws,
|
|
588
|
+
Parser.alt(
|
|
589
|
+
Parser.preceded(
|
|
590
|
+
Parser.terminated(
|
|
591
|
+
Ascii.caseless('PREFIX'),
|
|
592
|
+
Parser.not(Token.oneOf([':.', TurtleGrammar.pnChars])),
|
|
593
|
+
),
|
|
594
|
+
Parser.cut(prefixBody),
|
|
595
|
+
),
|
|
596
|
+
Parser.preceded(
|
|
597
|
+
Parser.terminated(
|
|
598
|
+
Ascii.caseless('BASE'),
|
|
599
|
+
Parser.not(Token.oneOf([':.', TurtleGrammar.pnChars])),
|
|
600
|
+
),
|
|
601
|
+
Parser.cut(baseBody),
|
|
602
|
+
),
|
|
603
|
+
),
|
|
604
|
+
),
|
|
605
|
+
);
|
|
606
|
+
|
|
607
|
+
const atDirective: P<void> = rule(
|
|
608
|
+
Parser.alt(
|
|
609
|
+
Parser.preceded(atKeyword('@prefix'), Parser.cut(prefixBody)),
|
|
610
|
+
Parser.preceded(atKeyword('@base'), Parser.cut(baseBody)),
|
|
611
|
+
Parser.preceded(atKeyword('@forAll'), Parser.cut(quantifier(true))),
|
|
612
|
+
Parser.preceded(atKeyword('@forSome'), Parser.cut(quantifier(false))),
|
|
613
|
+
Parser.preceded(
|
|
614
|
+
Parser.peek(atKeyword('@keywords')),
|
|
615
|
+
Parser.cut(
|
|
616
|
+
Parser.location.pipe(
|
|
617
|
+
Parser.tryMap((at) => fail<void>('@keywords is not supported by Notation3', at)),
|
|
618
|
+
),
|
|
619
|
+
),
|
|
620
|
+
),
|
|
621
|
+
),
|
|
622
|
+
);
|
|
623
|
+
|
|
624
|
+
const statement: P<void> = Parser.preceded(ws, Parser.alt(atDirective, triples));
|
|
625
|
+
|
|
626
|
+
/** Statements, each ended by `.` (optional before the `}` of a formula). */
|
|
627
|
+
const statements = (inFormula: boolean): P<void> =>
|
|
628
|
+
Parser.asVoid(
|
|
629
|
+
Parser.repeat(
|
|
630
|
+
Parser.preceded(
|
|
631
|
+
Parser.not(inFormula ? endOf('}') : Parser.preceded(ws, Parser.eof)),
|
|
632
|
+
Parser.alt(
|
|
633
|
+
sparqlDirective,
|
|
634
|
+
Parser.cut(
|
|
635
|
+
Parser.terminated(
|
|
636
|
+
statement,
|
|
637
|
+
(inFormula ? Parser.alt(sym('.'), Parser.peek(sym('}'))) : sym('.')).pipe(
|
|
638
|
+
Parser.expected("'.'"),
|
|
639
|
+
),
|
|
640
|
+
),
|
|
641
|
+
),
|
|
642
|
+
),
|
|
643
|
+
),
|
|
644
|
+
),
|
|
645
|
+
);
|
|
646
|
+
|
|
647
|
+
const formulaStatements = statements(true);
|
|
648
|
+
const documentStatements = statements(false);
|
|
649
|
+
|
|
650
|
+
const document = Compiler.jit(
|
|
651
|
+
Parser.terminated(documentStatements, Parser.preceded(ws, Parser.eof)),
|
|
652
|
+
);
|
|
653
|
+
|
|
654
|
+
// -----------------------------------------------------------------------------
|
|
655
|
+
// Builder
|
|
656
|
+
// -----------------------------------------------------------------------------
|
|
657
|
+
|
|
658
|
+
const PN_LOCAL_ESC = /\\(.)/gu;
|
|
659
|
+
|
|
660
|
+
const I18N_DATATYPE = /^([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)_(ltr|rtl)$/;
|
|
661
|
+
|
|
662
|
+
/** The subject whose statements are being read, with the predicate and direction in force. */
|
|
663
|
+
class Frame {
|
|
664
|
+
subject: Model.N3Term = rdf.nil;
|
|
665
|
+
predicate: Model.N3Term = rdf.nil;
|
|
666
|
+
inverse = false;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
/**
|
|
670
|
+
* What depends on the document so far (prefixes, the base IRI, blank node
|
|
671
|
+
* labels and counters, quantifier scopes, the open formulas and subjects),
|
|
672
|
+
* updated by the grammar's callbacks as it reads, so that statements are
|
|
673
|
+
* made in document order without a syntax tree. An error found here is
|
|
674
|
+
* kept and reported once the grammar has read the whole document, so that a
|
|
675
|
+
* syntax error anywhere comes first.
|
|
676
|
+
*/
|
|
677
|
+
class Builder {
|
|
678
|
+
readonly prefixes = MutableHashMap.empty<string, string>();
|
|
679
|
+
base: Option.Option<string>;
|
|
680
|
+
private readonly bnodePrefix: string;
|
|
681
|
+
private readonly bnodes = MutableHashMap.empty<string, Term.BlankNode>();
|
|
682
|
+
/** The blank node labels written in the document (as keys). */
|
|
683
|
+
private readonly reserved = MutableHashMap.empty<string, boolean>();
|
|
684
|
+
private anonCounter = 0;
|
|
685
|
+
/** Statement collectors, one per open formula (innermost last). */
|
|
686
|
+
private readonly out: Array<Array<Model.Statement>> = [];
|
|
687
|
+
/**
|
|
688
|
+
* Explicit quantifier scopes (legacy `@forAll` / `@forSome`), innermost
|
|
689
|
+
* last, each with the depth of the formula it belongs to: only formulas
|
|
690
|
+
* that quantify something have one, so a document without quantifiers
|
|
691
|
+
* looks nothing up.
|
|
692
|
+
*/
|
|
693
|
+
private readonly scopes: Array<
|
|
694
|
+
readonly [depth: number, scope: MutableHashMap.MutableHashMap<string, Model.N3Term>]
|
|
695
|
+
> = [];
|
|
696
|
+
/** How many formulas are open. */
|
|
697
|
+
private depth = 0;
|
|
698
|
+
/**
|
|
699
|
+
* The variables made so far, by name: quick variables (one node per name,
|
|
700
|
+
* so that the copies of a rule compare by identity when a formula removes
|
|
701
|
+
* duplicate statements) and those made for `@forAll`, whose names avoid
|
|
702
|
+
* these.
|
|
703
|
+
*/
|
|
704
|
+
private readonly variables = MutableHashMap.empty<string, Term.Variable>();
|
|
705
|
+
/** The subjects being described, innermost last (`depthOfFrames` of them are in use). */
|
|
706
|
+
private readonly frames: Array<Frame> = [];
|
|
707
|
+
private openFrames = 0;
|
|
708
|
+
/** The items of the paths being read, and the directions of their steps, innermost last. */
|
|
709
|
+
readonly paths: Array<Model.N3Term> = [];
|
|
710
|
+
readonly dirs: Array<string> = [];
|
|
711
|
+
/** Where the term being read starts, and (for an IRI reference) ends. */
|
|
712
|
+
at = 0;
|
|
713
|
+
end = 0;
|
|
714
|
+
/** The first error found (none while it is empty). */
|
|
715
|
+
readonly errors: Array<{ readonly message: string; readonly at: number }> = [];
|
|
716
|
+
|
|
717
|
+
readonly input: string;
|
|
718
|
+
constructor(input: string, options: ParserOptions) {
|
|
719
|
+
this.input = input;
|
|
720
|
+
this.base = options.baseIri;
|
|
721
|
+
this.bnodePrefix = options.blankNodePrefix;
|
|
722
|
+
// Labels written in the document; generated labels avoid them.
|
|
723
|
+
Iterable.forEach(input.matchAll(/_:([^\s<>"{}()[\],;^!]+)/g), ([, label]) => {
|
|
724
|
+
MutableHashMap.set(this.reserved, `${this.bnodePrefix}${label ?? ''}`, true);
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/** Keeps the first error, returning a stand-in term so that reading can go on. */
|
|
729
|
+
error(message: string, at: number): Model.N3Term {
|
|
730
|
+
if (Arr.isReadonlyArrayEmpty(this.errors)) this.errors.push({ message, at });
|
|
731
|
+
return rdf.nil;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
openFormula(): void {
|
|
735
|
+
this.out.push([]);
|
|
736
|
+
this.depth++;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
closeFormula(): Model.Formula {
|
|
740
|
+
if (this.scopes.at(-1)?.[0] === this.depth) this.scopes.pop();
|
|
741
|
+
this.depth--;
|
|
742
|
+
return new Model.Formula(this.out.pop() ?? []);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/** Starts describing `subject` (a statement's subject, or the node of a `[ … ]`). */
|
|
746
|
+
open(subject: Model.N3Term): void {
|
|
747
|
+
const frame = (this.frames[this.openFrames++] ??= new Frame());
|
|
748
|
+
frame.subject = subject;
|
|
749
|
+
frame.predicate = rdf.nil;
|
|
750
|
+
frame.inverse = false;
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
/** Stops describing the current subject, returning it. */
|
|
754
|
+
close(): Model.N3Term {
|
|
755
|
+
const frame = this.frames[--this.openFrames];
|
|
756
|
+
return frame === undefined ? rdf.nil : frame.subject;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
verb(predicate: Model.N3Term, inverse: boolean): void {
|
|
760
|
+
const frame = this.frames[this.openFrames - 1];
|
|
761
|
+
if (frame === undefined) return;
|
|
762
|
+
frame.predicate = predicate;
|
|
763
|
+
frame.inverse = inverse;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/** A statement about the current subject, with the current predicate, of `object`. */
|
|
767
|
+
object(object: Model.N3Term): void {
|
|
768
|
+
const frame = this.frames[this.openFrames - 1];
|
|
769
|
+
if (frame === undefined) return;
|
|
770
|
+
if (frame.inverse) this.emit(object, frame.predicate, frame.subject);
|
|
771
|
+
else this.emit(frame.subject, frame.predicate, object);
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
/** A `!` or `^` step from the current path's item to a new blank node, which replaces it. */
|
|
775
|
+
step(predicate: Model.N3Term): void {
|
|
776
|
+
const dir = this.dirs.pop();
|
|
777
|
+
const item = this.paths.pop() ?? rdf.nil;
|
|
778
|
+
const node = this.freshBlank();
|
|
779
|
+
if (dir === '!') this.emit(item, predicate, node);
|
|
780
|
+
else this.emit(node, predicate, item);
|
|
781
|
+
this.paths.push(node);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
endPath(): Model.N3Term {
|
|
785
|
+
return this.paths.pop() ?? rdf.nil;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
prefix(prefix: string, ref: IriNode): void {
|
|
789
|
+
MutableHashMap.set(this.prefixes, prefix, this.iri(ref));
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
quantify(universal: boolean, iris: ReadonlyArray<IriNode>): void {
|
|
793
|
+
const scope = this.scope();
|
|
794
|
+
iris.forEach((node) => {
|
|
795
|
+
const quantified = this.iri(node);
|
|
796
|
+
MutableHashMap.set(
|
|
797
|
+
scope,
|
|
798
|
+
quantified,
|
|
799
|
+
universal ? this.variableFor(quantified) : this.freshBlank(),
|
|
800
|
+
);
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
variable(name: string): Term.Variable {
|
|
805
|
+
const known = this.variables.backing.get(name);
|
|
806
|
+
if (known !== undefined) return known;
|
|
807
|
+
const node = new Term.Variable(name);
|
|
808
|
+
MutableHashMap.set(this.variables, name, node);
|
|
809
|
+
return node;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
/** A literal: with `language` unless it is `''`, else of `datatype` if there is one. */
|
|
813
|
+
literal(value: string, language: string, datatype: Option.Option<IriNode>): Term.Literal {
|
|
814
|
+
if (language !== '') return Term.literal(value, language);
|
|
815
|
+
if (Option.isNone(datatype)) return Term.literal(value);
|
|
816
|
+
const type = this.iri(datatype.value);
|
|
817
|
+
const dir = type.startsWith(i18n.base)
|
|
818
|
+
? I18N_DATATYPE.exec(type.slice(i18n.base.length))
|
|
819
|
+
: null;
|
|
820
|
+
if (dir !== null) {
|
|
821
|
+
// The base-direction regex only captures `ltr` or `rtl`.
|
|
822
|
+
return Term.literal(value, {
|
|
823
|
+
language: dir[1] ?? '',
|
|
824
|
+
direction: dir[2] === 'rtl' ? 'rtl' : 'ltr',
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
return Term.literal(value, new Term.NamedNode(type));
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
iri(node: IriNode): string {
|
|
831
|
+
if (Predicate.isTagged(node, 'IriRef')) {
|
|
832
|
+
if (node.escaped && forbiddenInIri.test(node.value)) {
|
|
833
|
+
this.error('Invalid escaped character in IRI', node.at);
|
|
834
|
+
return node.value;
|
|
835
|
+
}
|
|
836
|
+
return this.resolveIri(node.value);
|
|
837
|
+
}
|
|
838
|
+
const ns = this.prefixes.backing.get(node.prefix);
|
|
839
|
+
if (ns !== undefined) return ns + node.local;
|
|
840
|
+
// The empty prefix defaults to `<#>` (the current document), as in cwm.
|
|
841
|
+
if (node.prefix === '') return this.resolveIri('#') + node.local;
|
|
842
|
+
this.error(`Undeclared prefix '${node.prefix}:'`, node.at);
|
|
843
|
+
return node.local;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
private resolveIri(value: string): string {
|
|
847
|
+
return Option.isNone(this.base) ? value : Iri.resolve(value, this.base.value);
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
/** The quantifier scope of the innermost formula, made on first use. */
|
|
851
|
+
private scope(): MutableHashMap.MutableHashMap<string, Model.N3Term> {
|
|
852
|
+
const top = this.scopes.at(-1);
|
|
853
|
+
if (top !== undefined && top[0] === this.depth) return top[1];
|
|
854
|
+
const scope = MutableHashMap.empty<string, Model.N3Term>();
|
|
855
|
+
this.scopes.push([this.depth, scope]);
|
|
856
|
+
return scope;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
/**
|
|
860
|
+
* The nodes made so far, by IRI and (for prefixed names) by namespace and
|
|
861
|
+
* local name, so that a name written again is neither concatenated nor
|
|
862
|
+
* hashed anew, and each IRI's key (which formulas deduplicate by) is
|
|
863
|
+
* computed once.
|
|
864
|
+
*/
|
|
865
|
+
private readonly iriNodes = MutableHashMap.empty<string, Term.NamedNode>();
|
|
866
|
+
private readonly localNodes = MutableHashMap.empty<
|
|
867
|
+
string,
|
|
868
|
+
Array<readonly [string, Term.NamedNode]>
|
|
869
|
+
>();
|
|
870
|
+
|
|
871
|
+
/** The term an IRI reference read at `at`…`end` stands for. */
|
|
872
|
+
namedRef(value: string): Model.N3Term {
|
|
873
|
+
if (this.end - this.at - 2 !== value.length && forbiddenInIri.test(value)) {
|
|
874
|
+
return this.error('Invalid escaped character in IRI', this.at);
|
|
875
|
+
}
|
|
876
|
+
return this.scoped(this.iriNodeOf(this.resolveIri(value)));
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
/** The term a prefixed name read at `at` stands for. */
|
|
880
|
+
namedPName(name: string): Model.N3Term {
|
|
881
|
+
const colon = name.indexOf(':');
|
|
882
|
+
const raw = name.slice(colon + 1);
|
|
883
|
+
// `PN_LOCAL_ESC`s are decoded, as `TurtleGrammar.pnLocal` does
|
|
884
|
+
return this.namedPNameParts(
|
|
885
|
+
name.slice(0, colon),
|
|
886
|
+
raw.includes('\\') ? raw.replace(PN_LOCAL_ESC, '$1') : raw,
|
|
887
|
+
);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
/** The term of a prefixed name read at `at`, given its prefix and decoded local name. */
|
|
891
|
+
namedPNameParts(prefix: string, local: string): Model.N3Term {
|
|
892
|
+
const ns = this.prefixes.backing.get(prefix);
|
|
893
|
+
if (ns !== undefined) return this.scoped(this.localNode(ns, local));
|
|
894
|
+
return this.named({ _tag: 'PName', prefix, local, at: this.at });
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
/** The term an IRI as written stands for: its node, or a quantified variable or blank node. */
|
|
898
|
+
named(node: IriNode): Model.N3Term {
|
|
899
|
+
return this.scoped(this.iriNode(node));
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
/** `named`, or the variable or blank node it is quantified as. */
|
|
903
|
+
private scoped(named: Term.NamedNode): Model.N3Term {
|
|
904
|
+
// Usually no formula quantifies anything, and there is nothing to look up
|
|
905
|
+
if (Arr.isReadonlyArrayEmpty(this.scopes)) return named;
|
|
906
|
+
const scope = this.scopes.findLast(([, quantified]) =>
|
|
907
|
+
MutableHashMap.has(quantified, named.value),
|
|
908
|
+
);
|
|
909
|
+
return scope?.[1].backing.get(named.value) ?? named;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
private iriNode(node: IriNode): Term.NamedNode {
|
|
913
|
+
if (Predicate.isTagged(node, 'PName')) {
|
|
914
|
+
const ns = this.prefixes.backing.get(node.prefix);
|
|
915
|
+
if (ns !== undefined) return this.localNode(ns, node.local);
|
|
916
|
+
}
|
|
917
|
+
return this.iriNodeOf(this.iri(node));
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
private iriNodeOf(value: string): Term.NamedNode {
|
|
921
|
+
const known = this.iriNodes.backing.get(value);
|
|
922
|
+
if (known !== undefined) return known;
|
|
923
|
+
const named = new Term.NamedNode(value);
|
|
924
|
+
MutableHashMap.set(this.iriNodes, value, named);
|
|
925
|
+
return named;
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
/** The node of `ns` + `local`, by local name and then namespace (a local name rarely has two). */
|
|
929
|
+
private localNode(ns: string, local: string): Term.NamedNode {
|
|
930
|
+
let byNamespace = this.localNodes.backing.get(local);
|
|
931
|
+
if (byNamespace === undefined) {
|
|
932
|
+
byNamespace = [];
|
|
933
|
+
MutableHashMap.set(this.localNodes, local, byNamespace);
|
|
934
|
+
}
|
|
935
|
+
const known = byNamespace.find(([namespace]) => namespace === ns);
|
|
936
|
+
if (known !== undefined) return known[1];
|
|
937
|
+
const named = new Term.NamedNode(ns + local);
|
|
938
|
+
byNamespace.push([ns, named]);
|
|
939
|
+
return named;
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
private emit(subject: Model.N3Term, predicate: Model.N3Term, object: Model.N3Term): void {
|
|
943
|
+
this.out.at(-1)?.push(new Model.Statement(subject, predicate, object));
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
freshBlank(): Term.BlankNode {
|
|
947
|
+
const label = this.freshLabel();
|
|
948
|
+
// Usually the first label is free
|
|
949
|
+
return new Term.BlankNode(this.reserved.backing.has(label) ? this.freeLabel() : label);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
private freshLabel(): string {
|
|
953
|
+
return `${this.bnodePrefix}b${(this.anonCounter++).toString(36)}`;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
/** The next generated label that the document does not use. */
|
|
957
|
+
private freeLabel(): string {
|
|
958
|
+
let label = this.freshLabel();
|
|
959
|
+
loop(() => {
|
|
960
|
+
if (!this.reserved.backing.has(label)) return false;
|
|
961
|
+
label = this.freshLabel();
|
|
962
|
+
return true;
|
|
963
|
+
});
|
|
964
|
+
return label;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
labelledBlank(label: string): Term.BlankNode {
|
|
968
|
+
const known = this.bnodes.backing.get(label);
|
|
969
|
+
if (known !== undefined) return known;
|
|
970
|
+
const node = new Term.BlankNode(`${this.bnodePrefix}${label}`);
|
|
971
|
+
MutableHashMap.set(this.bnodes, label, node);
|
|
972
|
+
return node;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
private variableFor(quantified: string): Term.Variable {
|
|
976
|
+
const local = /[^#/:]*$/.exec(quantified)?.[0] ?? '';
|
|
977
|
+
const base = /^[A-Za-z_][A-Za-z0-9_]*$/.test(local) ? local : 'v';
|
|
978
|
+
let name = base;
|
|
979
|
+
if (MutableHashMap.has(this.variables, base)) {
|
|
980
|
+
loop((i) => {
|
|
981
|
+
name = `${base}_${i + 1}`;
|
|
982
|
+
return MutableHashMap.has(this.variables, name);
|
|
983
|
+
});
|
|
984
|
+
}
|
|
985
|
+
const node = new Term.Variable(name);
|
|
986
|
+
MutableHashMap.set(this.variables, name, node);
|
|
987
|
+
return node;
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
/** The builder of the document being parsed (the grammar's callbacks update it). */
|
|
992
|
+
let b: Builder = new Builder('', { baseIri: Option.none(), blankNodePrefix: '' });
|
|
993
|
+
|
|
994
|
+
// -----------------------------------------------------------------------------
|
|
995
|
+
// Entry point
|
|
996
|
+
// -----------------------------------------------------------------------------
|
|
997
|
+
|
|
998
|
+
const failAt = (input: string, message: string, at: number): never => {
|
|
999
|
+
const end = Math.min(at, input.length);
|
|
1000
|
+
// The lines before `at`: the last is the one it is on
|
|
1001
|
+
const lines = input.slice(0, end).split('\n');
|
|
1002
|
+
const column = (lines.at(-1) ?? '').length + 1;
|
|
1003
|
+
throw new SyntaxFailure(message, lines.length, column);
|
|
1004
|
+
};
|
|
1005
|
+
|
|
1006
|
+
const describe = (input: string, at: number): string =>
|
|
1007
|
+
at >= input.length ? 'end of input' : `'${String.fromCodePoint(input.codePointAt(at) ?? 0)}'`;
|
|
1008
|
+
|
|
1009
|
+
/** @internal */
|
|
1010
|
+
export const parse = (input: string, options: ParserOptions): Model.Document => {
|
|
1011
|
+
b = new Builder(input, options);
|
|
1012
|
+
b.openFormula();
|
|
1013
|
+
const result = Parser.parse(document, input);
|
|
1014
|
+
if (Result.isFailure(result)) {
|
|
1015
|
+
const error = result.failure;
|
|
1016
|
+
if (error.cause !== undefined) return failAt(input, error.cause.message, error.cause.at);
|
|
1017
|
+
const found = describe(input, error.offset);
|
|
1018
|
+
const expected = error.expected.filter((e) => e !== WHITESPACE);
|
|
1019
|
+
const message =
|
|
1020
|
+
Arr.isReadonlyArrayEmpty(expected) || expected.length > 3
|
|
1021
|
+
? `Unexpected ${found}`
|
|
1022
|
+
: `Expected ${expected.join(' or ')} but found ${found}`;
|
|
1023
|
+
return failAt(input, message, error.offset);
|
|
1024
|
+
}
|
|
1025
|
+
const error = b.errors.at(0);
|
|
1026
|
+
if (error !== undefined) return failAt(input, error.message, error.at);
|
|
1027
|
+
return {
|
|
1028
|
+
formula: b.closeFormula(),
|
|
1029
|
+
prefixes: PrefixMap.make(b.prefixes),
|
|
1030
|
+
baseIri: Option.getOrUndefined(b.base),
|
|
1031
|
+
};
|
|
1032
|
+
};
|