Support guidelines.
git-svn-id: http://svn.robofab.com/branches/ufo3k@286 b5fa9d6c-a76f-4ffd-b3cb-f825fc41095c
This commit is contained in:
parent
0f5645ddbe
commit
0709eaef85
@ -434,6 +434,47 @@ fontInfoVersion3 = {
|
|||||||
],
|
],
|
||||||
"firstKerningGroupPrefix" : "@kern1",
|
"firstKerningGroupPrefix" : "@kern1",
|
||||||
"secondKerningGroupPrefix" : "@kern2",
|
"secondKerningGroupPrefix" : "@kern2",
|
||||||
|
"guidelines" : [
|
||||||
|
# ints
|
||||||
|
dict(x=100, y=200, angle=45),
|
||||||
|
# floats
|
||||||
|
dict(x=100.5, y=200.5, angle=45.5),
|
||||||
|
# edges
|
||||||
|
dict(x=0, y=0, angle=0),
|
||||||
|
dict(x=0, y=0, angle=360),
|
||||||
|
dict(x=0, y=0, angle=360.0),
|
||||||
|
# no y
|
||||||
|
dict(x=100),
|
||||||
|
# no x
|
||||||
|
dict(y=200),
|
||||||
|
# name
|
||||||
|
dict(x=100, y=200, angle=45, name="foo"),
|
||||||
|
dict(x=100, y=200, angle=45, name=""),
|
||||||
|
# identifier
|
||||||
|
dict(x=100, y=200, angle=45, identifier="guide1"),
|
||||||
|
dict(x=100, y=200, angle=45, identifier="guide2"),
|
||||||
|
dict(x=100, y=200, angle=45, identifier=u"\x20"),
|
||||||
|
dict(x=100, y=200, angle=45, identifier=u"\x7E"),
|
||||||
|
# colors
|
||||||
|
dict(x=100, y=200, angle=45, color="0,0,0,0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="1,0,0,0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="1,1,1,1"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0,1,0,0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0,0,1,0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0,0,0,1"),
|
||||||
|
dict(x=100, y=200, angle=45, color="1, 0, 0, 0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0, 1, 0, 0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0, 0, 1, 0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0, 0, 0, 1"),
|
||||||
|
dict(x=100, y=200, angle=45, color=".5,0,0,0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0,.5,0,0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0,0,.5,0"),
|
||||||
|
dict(x=100, y=200, angle=45, color="0,0,0,.5"),
|
||||||
|
dict(x=100, y=200, angle=45, color=".5,1,1,1"),
|
||||||
|
dict(x=100, y=200, angle=45, color="1,.5,1,1"),
|
||||||
|
dict(x=100, y=200, angle=45, color="1,1,.5,1"),
|
||||||
|
dict(x=100, y=200, angle=45, color="1,1,1,.5"),
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedFontInfo1To2Conversion = {
|
expectedFontInfo1To2Conversion = {
|
||||||
|
@ -2426,6 +2426,167 @@ class ReadFontInfoVersion3TestCase(unittest.TestCase):
|
|||||||
reader = UFOReader(self.dstDir)
|
reader = UFOReader(self.dstDir)
|
||||||
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
|
||||||
|
def testGuidelinesRead(self):
|
||||||
|
# x
|
||||||
|
## not an int or float
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x="1")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
# y
|
||||||
|
## not an int or float
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(y="1")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
# angle
|
||||||
|
## < 0
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, y=0, angle=-1)]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
## > 360
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, y=0, angle=361)]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
# name
|
||||||
|
## not a string
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, name=1)]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
# color
|
||||||
|
## not a string
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color=1)]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
## not enough commas
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1 0, 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1 0 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1 0 0 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
## not enough parts
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color=", 0, 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1, , 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1, 0, , 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1, 0, 0, ")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color=", , , ")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
## not a number in all positions
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="r, 1, 1, 1")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1, g, 1, 1")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1, 1, b, 1")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1, 1, 1, a")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
## too many parts
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="1, 0, 0, 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
## < 0 in each position
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="-1, 0, 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="0, -1, 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="0, 0, -1, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="0, 0, 0, -1")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
## > 1 in each position
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="2, 0, 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="0, 2, 0, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="0, 0, 2, 0")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, color="0, 0, 0, 2")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
# identifier
|
||||||
|
## duplicate
|
||||||
|
info = dict(fontInfoVersion3)
|
||||||
|
info["guidelines"] = [dict(x=0, identifier="guide1"), dict(y=0, identifier="guide1")]
|
||||||
|
self._writeInfoToPlist(info)
|
||||||
|
reader = UFOReader(self.dstDir)
|
||||||
|
self.assertRaises(UFOLibError, reader.readInfo, TestInfoObject())
|
||||||
|
|
||||||
|
|
||||||
class WriteFontInfoVersion1TestCase(unittest.TestCase):
|
class WriteFontInfoVersion1TestCase(unittest.TestCase):
|
||||||
|
|
||||||
@ -4420,17 +4581,160 @@ class WriteFontInfoVersion3TestCase(unittest.TestCase):
|
|||||||
writer = UFOWriter(self.dstDir, formatVersion=3)
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
# overlap
|
# overlap
|
||||||
info = dict(fontInfoVersion3)
|
infoObject = self.makeInfoObject()
|
||||||
infoObject.firstKerningGroupPrefix = "@kern"
|
infoObject.firstKerningGroupPrefix = "@kern"
|
||||||
infoObject.secondKerningGroupPrefix = "@kern2"
|
infoObject.secondKerningGroupPrefix = "@kern2"
|
||||||
writer = UFOWriter(self.dstDir, formatVersion=3)
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
info = dict(fontInfoVersion3)
|
infoObject = self.makeInfoObject()
|
||||||
infoObject.firstKerningGroupPrefix = "@kern1"
|
infoObject.firstKerningGroupPrefix = "@kern1"
|
||||||
infoObject.secondKerningGroupPrefix = "@kern"
|
infoObject.secondKerningGroupPrefix = "@kern"
|
||||||
writer = UFOWriter(self.dstDir, formatVersion=3)
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
|
||||||
|
def testGuidelinesWrite(self):
|
||||||
|
# x
|
||||||
|
## not an int or float
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x="1")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
# y
|
||||||
|
## not an int or float
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(y="1")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
# angle
|
||||||
|
## < 0
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, y=0, angle=-1)]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## > 360
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, y=0, angle=361)]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
# name
|
||||||
|
## not a string
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, name=1)]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
# color
|
||||||
|
## not a string
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color=1)]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## not enough commas
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1 0, 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1 0 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1 0 0 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## not enough parts
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color=", 0, 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1, , 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1, 0, , 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1, 0, 0, ")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color=", , , ")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## not a number in all positions
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="r, 1, 1, 1")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1, g, 1, 1")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1, 1, b, 1")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1, 1, 1, a")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## too many parts
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="1, 0, 0, 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## < 0 in each position
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="-1, 0, 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="0, -1, 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="0, 0, -1, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="0, 0, 0, -1")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## > 1 in each position
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="2, 0, 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="0, 2, 0, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="0, 0, 2, 0")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, color="0, 0, 0, 2")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
# identifier
|
||||||
|
## duplicate
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, identifier="guide1"), dict(y=0, identifier="guide1")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## below min
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, identifier=u"\0x1F")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
## above max
|
||||||
|
infoObject = self.makeInfoObject()
|
||||||
|
infoObject.guidelines = [dict(x=0, identifier=u"\0x7F")]
|
||||||
|
writer = UFOWriter(self.dstDir, formatVersion=3)
|
||||||
|
self.assertRaises(UFOLibError, writer.writeInfo, info=infoObject)
|
||||||
|
|
||||||
|
|
||||||
class UFO3ReadDataTestCase(unittest.TestCase):
|
class UFO3ReadDataTestCase(unittest.TestCase):
|
||||||
|
|
||||||
|
@ -1405,6 +1405,106 @@ def _fontInfoKerningPrefixValidator(value):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def _fontInfoGuidelinesValidator(value):
|
||||||
|
"""
|
||||||
|
Version 3+.
|
||||||
|
"""
|
||||||
|
if not isinstance(value, list):
|
||||||
|
return True
|
||||||
|
identifiers = set()
|
||||||
|
for guide in value:
|
||||||
|
if not _fontInfoGuidelineValidator(guide):
|
||||||
|
return False
|
||||||
|
identifier = guide.get("identifier")
|
||||||
|
if identifier is not None:
|
||||||
|
if identifier in identifiers:
|
||||||
|
return False
|
||||||
|
identifiers.add(identifier)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _fontInfoGuidelineValidator(value):
|
||||||
|
"""
|
||||||
|
Version 3+.
|
||||||
|
"""
|
||||||
|
dictPrototype = dict(
|
||||||
|
x=((int, float), False), y=((int, float), False), angle=((int, float), False),
|
||||||
|
name=(basestring, False), color=(basestring, False), identifier=(basestring, False)
|
||||||
|
)
|
||||||
|
if not _fontInfoDictValidator(value, dictPrototype):
|
||||||
|
return False
|
||||||
|
x = value.get("x")
|
||||||
|
y = value.get("y")
|
||||||
|
angle = value.get("angle")
|
||||||
|
# x or y must be present
|
||||||
|
if x is None and y is None:
|
||||||
|
return False
|
||||||
|
# if x or y are None, angle must not be present
|
||||||
|
if x is None or y is None:
|
||||||
|
if angle is not None:
|
||||||
|
return False
|
||||||
|
# angle must be between 0 and 360
|
||||||
|
if angle is not None:
|
||||||
|
if angle < 0:
|
||||||
|
return False
|
||||||
|
if angle > 360:
|
||||||
|
return False
|
||||||
|
# identifier must be 1 or more characters
|
||||||
|
identifier = value.get("identifier")
|
||||||
|
if identifier is not None and not _fontInfoIdentifierValidator(identifier):
|
||||||
|
return False
|
||||||
|
# color must follow the proper format
|
||||||
|
color = value.get("color")
|
||||||
|
if color is not None and not _fontInfoColorValidator(color):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _fontInfoIdentifierValidator(value):
|
||||||
|
"""
|
||||||
|
Version 3+.
|
||||||
|
"""
|
||||||
|
validCharactersMin = 0x20
|
||||||
|
validCharactersMax = 0x7E
|
||||||
|
if not isinstance(value, basestring):
|
||||||
|
return False
|
||||||
|
if not value:
|
||||||
|
return False
|
||||||
|
for c in value:
|
||||||
|
c = ord(c)
|
||||||
|
if c < validCharactersMin or c > validCharactersMax:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def _fontInfoColorValidator(value):
|
||||||
|
"""
|
||||||
|
Version 3+.
|
||||||
|
"""
|
||||||
|
if not isinstance(value, basestring):
|
||||||
|
return False
|
||||||
|
parts = value.split(",")
|
||||||
|
if len(parts) != 4:
|
||||||
|
return False
|
||||||
|
for part in parts:
|
||||||
|
part = part.strip()
|
||||||
|
converted = False
|
||||||
|
try:
|
||||||
|
part = int(part)
|
||||||
|
converted = True
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
if not converted:
|
||||||
|
try:
|
||||||
|
part = float(part)
|
||||||
|
converted = True
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
if not converted:
|
||||||
|
return False
|
||||||
|
if part < 0:
|
||||||
|
return False
|
||||||
|
if part > 1:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
# Value Options
|
# Value Options
|
||||||
|
|
||||||
_fontInfoOpenTypeHeadFlagsOptions = range(0, 14)
|
_fontInfoOpenTypeHeadFlagsOptions = range(0, 14)
|
||||||
@ -1582,6 +1682,7 @@ _fontInfoAttributesVersion3ValueData.update({
|
|||||||
"woffMetadataExtensions" : dict(type=list, valueValidator=_fontInfoWOFFMetadataExtensionsValidator),
|
"woffMetadataExtensions" : dict(type=list, valueValidator=_fontInfoWOFFMetadataExtensionsValidator),
|
||||||
"firstKerningGroupPrefix" : dict(type=basestring, valueValidator=_fontInfoKerningPrefixValidator),
|
"firstKerningGroupPrefix" : dict(type=basestring, valueValidator=_fontInfoKerningPrefixValidator),
|
||||||
"secondKerningGroupPrefix" : dict(type=basestring, valueValidator=_fontInfoKerningPrefixValidator),
|
"secondKerningGroupPrefix" : dict(type=basestring, valueValidator=_fontInfoKerningPrefixValidator),
|
||||||
|
"guidelines" : dict(type=list, valueValidator=_fontInfoGuidelinesValidator)
|
||||||
})
|
})
|
||||||
|
|
||||||
# insert the type validator for all attrs that
|
# insert the type validator for all attrs that
|
||||||
|
Loading…
x
Reference in New Issue
Block a user