fonttools/Lib/ufoLib/plistFromTree.py
2016-02-27 17:04:58 +01:00

65 lines
1.6 KiB
Python

from __future__ import absolute_import
import sys
"""
Small helper module to parse Plist-formatted data from trees as created
by xmlTreeBuilder.
"""
__all__ = "readPlistFromTree"
try:
from plistlib import _PlistParser
if sys.version_info >= (3, 4):
class PlistParser(_PlistParser):
def __init__(self):
super().__init__(use_builtin_types=True, dict_type=dict)
def parseElement(self, *args, **kwargs):
super().parse_element(*args, **kwargs)
def handleBeginElement(self, *args, **kwargs):
super().handle_begin_element(*args, **kwargs)
def handleData(self, *args, **kwargs):
super().handle_data(*args, **kwargs)
def handleEndElement(self, *args, **kwargs):
super().handle_end_element(*args, **kwargs)
else:
PlistParser = _PlistParser
except ImportError:
from plistlib import PlistParser
def readPlistFromTree(tree):
"""
Given a (sub)tree created by xmlTreeBuilder, interpret it
as Plist-formatted data, and return the root object.
"""
parser = PlistTreeParser()
return parser.parseTree(tree)
class PlistTreeParser(PlistParser):
def parseTree(self, tree):
element, attributes, children = tree
self.parseElement(element, attributes, children)
return self.root
def parseElement(self, element, attributes, children):
self.handleBeginElement(element, attributes)
for child in children:
if isinstance(child, tuple):
self.parseElement(child[0], child[1], child[2])
else:
self.handleData(child)
self.handleEndElement(element)
if __name__ == "__main__":
from ufoLib.xmlTreeBuilder import buildTree
tree = buildTree("xxx.plist", stripData=0)
print(readPlistFromTree(tree))