summaryrefslogtreecommitdiffstats
path: root/examples/gdl/glyph.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/gdl/glyph.py')
-rw-r--r--examples/gdl/glyph.py174
1 files changed, 174 insertions, 0 deletions
diff --git a/examples/gdl/glyph.py b/examples/gdl/glyph.py
new file mode 100644
index 0000000..0f16af4
--- /dev/null
+++ b/examples/gdl/glyph.py
@@ -0,0 +1,174 @@
+#!/usr/bin/env python
+'Corresponds to a glyph, for analysis purposes, for GDL generation'
+__url__ = 'https://github.com/silnrsi/pysilfont'
+__copyright__ = 'Copyright (c) 2012 SIL International (https://www.sil.org)'
+__license__ = 'Released under the MIT License (https://opensource.org/licenses/MIT)'
+
+import re, traceback
+from silfont.gdl.psnames import Name
+from xml.etree.cElementTree import SubElement
+
+# Convert from Graphite AP name to the standard name, eg upperM -> _upper
+def gr_ap(txt) :
+ if txt.endswith('M') :
+ return "_" + txt[:-1]
+ elif txt.endswith('S') :
+ return txt[:-1]
+ else :
+ return txt
+
+# Convert from standard AP name to the Graphite name, eg _upper -> upperM
+def ap_gr(txt) :
+ if txt.startswith('_') :
+ return txt[1:] + 'M'
+ else :
+ return txt + 'S'
+
+
+class Glyph(object) :
+
+ isDia = False
+
+ def __init__(self, name, gid = 0) :
+ self.clear()
+ self.setName(name)
+ self.gdl = None
+ self.gid = gid
+ self.uid = "" # this is a string!
+ self.comment = ""
+ self.isDia = False
+
+ def clear(self) :
+ self.anchors = {}
+ self.classes = set()
+ self.gdl_properties = {}
+ self.properties = {}
+
+ def setName(self, name) :
+ self.psname = name
+ self.name = next(self.parseNames())
+
+ def setAnchor(self, name, x, y, t = None) :
+ send = True
+ if name in self.anchors :
+ if x is None and y is None :
+ del self.anchors[name]
+ return True
+ if x is None : x = self.anchors[name][0]
+ if y is None : y = self.anchors[name][1]
+ send = self.anchors[name] != (x, y)
+ self.anchors[name] = (x, y)
+ return send
+ # if not name.startswith("_") and t != 'basemark' :
+ # self.isBase = True
+
+ def parseNames(self) :
+ if self.psname :
+ for name in self.psname.split("/") :
+ res = Name(name)
+ yield res
+ else :
+ yield None
+
+ def GDLName(self) :
+ if self.gdl :
+ return self.gdl
+ elif self.name :
+ return self.name.GDL()
+ else :
+ return None
+
+ def setGDL(self, name) :
+ self.gdl = name
+
+ def readAP(self, elem, font) :
+ self.uid = elem.get('UID', None)
+ for p in elem.iterfind('property') :
+ n = p.get('name')
+ if n == 'GDLName' :
+ self.setGDL(p.get('value'))
+ elif n.startswith('GDL_') :
+ self.gdl_properties[n[4:]] = p.get('value')
+ else :
+ self.properties[n] = p.get('value')
+ for p in elem.iterfind('point') :
+ l = p.find('location')
+ self.setAnchor(ap_gr(p.get('type')), int(l.get('x', 0)), int(l.get('y', 0)))
+ p = elem.find('note')
+ if p is not None and p.text :
+ self.comment = p.text
+ if 'classes' in self.properties :
+ for c in self.properties['classes'].split() :
+ if c not in self.classes :
+ self.classes.add(c)
+ font.addGlyphClass(c, self, editable = True)
+
+ def createAP(self, elem, font, autoGdlFile) :
+ e = SubElement(elem, 'glyph')
+ if self.psname : e.set('PSName', self.psname)
+ if self.uid : e.set('UID', self.uid)
+ if self.gid is not None : e.set('GID', str(self.gid))
+ ce = None
+ if 'classes' in self.properties and self.properties['classes'].strip() :
+ tempClasses = self.properties['classes']
+ self.properties['classes'] = " ".join(font.filterAutoClasses(self.properties['classes'].split(), autoGdlFile))
+
+ for k in sorted(self.anchors.keys()) :
+ v = self.anchors[k]
+ p = SubElement(e, 'point')
+ p.set('type', gr_ap(k))
+ p.text = "\n "
+ l = SubElement(p, 'location')
+ l.set('x', str(v[0]))
+ l.set('y', str(v[1]))
+ l.tail = "\n "
+ if ce is not None : ce.tail = "\n "
+ ce = p
+
+ for k in sorted(self.gdl_properties.keys()) :
+ if k == "*skipPasses*" : continue # not set in GDL
+
+ v = self.gdl_properties[k]
+ if v :
+ p = SubElement(e, 'property')
+ p.set('name', 'GDL_' + k)
+ p.set('value', v)
+ if ce is not None : ce.tail = "\n "
+ ce = p
+
+ if self.gdl and (not self.name or self.gdl != self.name.GDL()) :
+ p = SubElement(e, 'property')
+ p.set('name', 'GDLName')
+ p.set('value', self.GDLName())
+ if ce is not None : ce.tail = "\n "
+ ce = p
+
+ for k in sorted(self.properties.keys()) :
+ v = self.properties[k]
+ if v :
+ p = SubElement(e, 'property')
+ p.set('name', k)
+ p.set('value', v)
+ if ce is not None : ce.tail = "\n "
+ ce = p
+
+ if self.comment :
+ p = SubElement(e, 'note')
+ p.text = self.comment
+ if ce is not None : ce.tail = "\n "
+ ce = p
+
+ if 'classes' in self.properties and self.properties['classes'].strip() :
+ self.properties['classes'] = tempClasses
+ if ce is not None :
+ ce.tail = "\n"
+ e.text = "\n "
+ e.tail = "\n"
+ return e
+
+def isMakeGDLSpecialClass(name) :
+# if re.match(r'^cn?(Takes)?.*?Dia$', name) : return True
+# if name.startswith('clig') : return True
+# if name.startswith('cno_') : return True
+ if re.match(r'^\*GC\d+\*$', name) : return True # auto-pseudo glyph with name = *GCXXXX*
+ return False