changeset 68:108260060f2c

serialize n3 files with %g for prettier floating point values Ignore-this: c12167ab1c5f625eb70faf7cef3b5d51
author Drew Perttula <drewp@bigasterisk.com>
date Sat, 01 Jun 2019 20:03:05 +0000
parents 099c0a815bb7
children 6b01e1e5859b
files rdfdb/graphfile.py
diffstat 1 files changed, 24 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/rdfdb/graphfile.py	Sat Jun 01 20:02:47 2019 +0000
+++ b/rdfdb/graphfile.py	Sat Jun 01 20:03:05 2019 +0000
@@ -3,19 +3,20 @@
 from twisted.internet import reactor
 from twisted.internet.interfaces import IDelayedCall
 from twisted.internet.inotify import INotify, humanReadableMask
-from rdflib import Graph, RDF, URIRef
+from rdflib import Graph, RDF, URIRef, Literal, XSD
 from rdfdb.patch import Patch
 from rdfdb.rdflibpatch import inContext
 from typing import Dict, Optional
 from typing_extensions import Protocol
 
+
 log = logging.getLogger('graphfile')
 iolog = logging.getLogger('io')
 
 
-def patchN3SerializerToUseLessWhitespace(cutColumn=65):
+def patchN3SerializerToUseLessWhitespace(cutColumn=75):
     # todo: make a n3serializer subclass with whitespace settings
-    from rdflib.plugins.serializers.turtle import TurtleSerializer, OBJECT
+    from rdflib.plugins.serializers.turtle import TurtleSerializer, OBJECT, VERB, _GEN_QNAME_FOR_DT
     originalWrite = TurtleSerializer.write
 
     def write(self, s):
@@ -67,6 +68,26 @@
     TurtleSerializer.predicateList = predicateList  # type: ignore
     TurtleSerializer.objectList = objectList  # type: ignore
 
+    def custom_literal(node, qname_callback):
+        if node.datatype == XSD['double']:
+            num = node.toPython()
+            return '%g' % num
+        return node._literal_n3(use_plain=True, qname_callback=qname_callback)
+    
+    def label(self, node, position):
+        if node == RDF.nil:
+            return '()'
+        if position is VERB and node in self.keywords:
+            return self.keywords[node]
+        if isinstance(node, Literal):
+            return custom_literal(node, # <- switch to this
+                qname_callback=lambda dt: self.getQName(
+                    dt, _GEN_QNAME_FOR_DT))
+        else:
+            node = self.relativize(node)
+
+            return self.getQName(node, position == VERB) or node.n3()
+    TurtleSerializer.label = label  # type: ignore
 
 patchN3SerializerToUseLessWhitespace()