changeset 1381:f345d3d3ea00

patchN3SerializerToUseLessWhitespace Ignore-this: 573998c640109f48c1f07dbf5356a7b5
author Drew Perttula <drewp@bigasterisk.com>
date Thu, 09 Jun 2016 05:00:46 +0000
parents 5805056fdf93
children b4d81ecf055c
files light9/rdfdb/graphfile.py
diffstat 1 files changed, 51 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/light9/rdfdb/graphfile.py	Wed Jun 08 08:07:28 2016 +0000
+++ b/light9/rdfdb/graphfile.py	Thu Jun 09 05:00:46 2016 +0000
@@ -2,13 +2,63 @@
 from twisted.python.filepath import FilePath
 from twisted.internet import reactor
 from twisted.internet.inotify import humanReadableMask
-from rdflib import Graph
+from rdflib import Graph, RDF
 from light9.rdfdb.patch import Patch
 from light9.rdfdb.rdflibpatch import inContext
 
 log = logging.getLogger('graphfile')
 iolog = logging.getLogger('io')
 
+def patchN3SerializerToUseLessWhitespace():
+    # todo: make a n3serializer subclass with whitespace settings
+    from rdflib.plugins.serializers.turtle import TurtleSerializer, OBJECT
+    originalWrite = TurtleSerializer.write
+    def write(self, s):
+        lines = s.split('\n')
+        if len(lines) > 1:
+            self._column = len(lines[-1])
+        else:
+            self._column += len(lines[0])
+        return originalWrite(self, s)
+    TurtleSerializer.write = write
+    def predicateList(self, subject, newline=False):
+        properties = self.buildPredicateHash(subject)
+        propList = self.sortProperties(properties)
+        if len(propList) == 0:
+            return
+        self.verb(propList[0], newline=newline)
+        self.objectList(properties[propList[0]])
+        for predicate in propList[1:]:
+            self.write(';')
+            # can't do proper wrapping since we don't know how much is coming
+            if self._column > 50:
+                self.write('\n' + self.indent(1))
+            self.verb(predicate, newline=False)
+            self.objectList(properties[predicate])
+    def objectList(self, objects):
+        count = len(objects)
+        if count == 0:
+            return
+        depthmod = (count == 1) and 0 or 1
+        self.depth += depthmod
+        self.path(objects[0], OBJECT)
+        for obj in objects[1:]:
+            self.write(', ')
+            self.path(obj, OBJECT, newline=True)
+        self.depth -= depthmod
+
+    originalStatement = TurtleSerializer.statement
+    def statement(self, subject):
+        if list(self.store.triples((subject, RDF.type, None))):
+            self.write('\n')
+        originalStatement(self, subject)
+        return False         #  suppress blank line for 'minor' statements
+    TurtleSerializer.statement = statement
+    TurtleSerializer.predicateList = predicateList
+    TurtleSerializer.objectList = objectList
+
+patchN3SerializerToUseLessWhitespace()
+
 class GraphFile(object):
     """
     one rdf file that we read from, write to, and notice external changes to