diff planemo/lib/python3.7/site-packages/rdflib/plugins/parsers/trig.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/planemo/lib/python3.7/site-packages/rdflib/plugins/parsers/trig.py	Fri Jul 31 00:32:28 2020 -0400
@@ -0,0 +1,166 @@
+from rdflib import ConjunctiveGraph
+from rdflib.parser import Parser
+from .notation3 import SinkParser, RDFSink
+
+
+def becauseSubGraph(*args, **kwargs): pass
+
+
+class TrigSinkParser(SinkParser):
+
+    def directiveOrStatement(self, argstr, h):
+
+        #import pdb; pdb.set_trace()
+
+        i = self.skipSpace(argstr, h)
+        if i < 0:
+            return i    # EOF
+
+        j = self.graph(argstr, i)
+        if j >= 0:
+            return j
+
+        j = self.sparqlDirective(argstr, i)
+        if j >= 0:
+            return j
+
+        j = self.directive(argstr, i)
+        if j >= 0:
+            return self.checkDot(argstr, j)
+
+        j = self.statement(argstr, i)
+        if j >= 0:
+            return self.checkDot(argstr, j)
+
+
+        return j
+
+    def labelOrSubject(self, argstr, i, res):
+        j = self.skipSpace(argstr, i)
+        if j < 0:
+            return j  # eof
+        i = j
+
+        j = self.uri_ref2(argstr, i, res)
+        if j >= 0:
+            return j
+
+        if argstr[i] == '[':
+            j = self.skipSpace(argstr, i+1)
+            if j < 0:
+                self.BadSyntax(argstr, i,
+                    "Expected ] got EOF")
+            if argstr[j] == ']':
+                res.append(self.blankNode())
+                return j+1
+        return -1
+
+    def graph(self, argstr, i):
+        """
+        Parse trig graph, i.e.
+
+           <urn:graphname> = { .. triples .. }
+
+        return -1 if it doesn't look like a graph-decl
+        raise Exception if it looks like a graph, but isn't.
+        """
+
+        #import pdb; pdb.set_trace()
+        j = self.sparqlTok('GRAPH', argstr, i) # optional GRAPH keyword
+        if j >= 0: i = j
+
+        r = []
+        j = self.labelOrSubject(argstr, i, r)
+        if j >= 0:
+            graph = r[0]
+            i = j
+        else:
+            graph = self._store.graph.identifier # hack
+
+
+        j = self.skipSpace(argstr, i)
+        if j < 0:
+            self.BadSyntax(argstr, i,
+                           "EOF found when expected graph")
+
+        if argstr[j:j + 1] == "=": # optional = for legacy support
+
+            i = self.skipSpace(argstr, j + 1)
+            if i < 0:
+                self.BadSyntax(argstr, i, "EOF found when expecting '{'")
+        else:
+            i = j
+
+        if argstr[i:i+1] != "{":
+            return -1 # the node wasn't part of a graph
+
+
+        j = i+1
+
+        oldParentContext = self._parentContext
+        self._parentContext = self._context
+        reason2 = self._reason2
+        self._reason2 = becauseSubGraph
+        self._context = self._store.newGraph(graph)
+
+        while 1:
+            i = self.skipSpace(argstr, j)
+            if i < 0:
+                self.BadSyntax(
+                    argstr, i, "needed '}', found end.")
+
+            if argstr[i:i + 1] == "}":
+                j = i + 1
+                break
+
+            j = self.directiveOrStatement(argstr, i)
+            if j < 0:
+                self.BadSyntax(
+                    argstr, i, "expected statement or '}'")
+
+        self._context = self._parentContext
+        self._reason2 = reason2
+        self._parentContext = oldParentContext
+        #res.append(subj.close())    # No use until closed
+        return j
+
+
+
+
+class TrigParser(Parser):
+    """
+    An RDFLib parser for TriG
+
+    """
+
+    def __init__(self):
+        pass
+
+    def parse(self, source, graph, encoding="utf-8"):
+
+        if encoding not in [None, "utf-8"]:
+            raise Exception(
+                ("TriG files are always utf-8 encoded, ",
+                 "I was passed: %s") % encoding)
+
+        # we're currently being handed a Graph, not a ConjunctiveGraph
+        assert graph.store.context_aware, "TriG Parser needs a context-aware store!"
+
+        conj_graph = ConjunctiveGraph(store=graph.store, identifier=graph.identifier)
+        conj_graph.default_context = graph  # TODO: CG __init__ should have a
+                                            # default_context arg
+         # TODO: update N3Processor so that it can use conj_graph as the sink
+        conj_graph.namespace_manager = graph.namespace_manager
+
+        sink = RDFSink(conj_graph)
+
+        baseURI = conj_graph.absolutize(
+            source.getPublicId() or source.getSystemId() or "")
+        p = TrigSinkParser(sink, baseURI=baseURI, turtle=True)
+
+        p.loadStream(source.getByteStream())
+
+        for prefix, namespace in list(p._bindings.items()):
+            conj_graph.bind(prefix, namespace)
+
+        # return ???