1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
from sys import version_info
if version_info[0:2] > (2, 2):
from unicodedata import normalize
else:
normalize = None
from rdflib.Identifier import Identifier
from rdflib.exceptions import Error
class Literal(Identifier):
"""
http://www.w3.org/TR/rdf-concepts/#section-Graph-Literal
"""
def __new__(cls, value, lang='', datatype=''):
value = unicode(value)
return Identifier.__new__(cls, value)
def __init__(self, value, lang='', datatype=''):
if normalize and value:
if not isinstance(value, unicode):
value = unicode(value)
if value != normalize("NFC", value):
raise Error("value must be in NFC normalized form.")
if datatype:
lang = ''
self.language = lang
self.datatype = datatype
def __add__(self, val):
s = super(Literal, self).__add__(val)
return Literal(s, self.language, self.datatype)
def n3(self):
language = self.language
datatype = self.datatype
encoded = self.encode('unicode-escape')
if language:
if datatype:
return '"%s"@%s^^<%s>' % (encoded, language, datatype)
else:
return '"%s"@%s' % (encoded, language)
else:
if datatype:
return '"%s"^^<%s>' % (encoded, datatype)
else:
return '"%s"' % encoded
def __eq__(self, other):
if other==None:
return 0
elif isinstance(other, Literal):
result = self.__cmp__(other)==0
if result==1:
if self.language==other.language:
return 1
else:
return 0
else:
return result
elif isinstance(other, Identifier):
return 0
else:
return unicode(self)==other
|