annotate Lib/plistlib.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents b36cb4602e21
children a389700fbc74
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52903
3889d9528601 Merged revisions 71058,71149-71150,71212,71214-71216,71222,71225,71234,71237-71238,71240-71241,71243,71249,71251 via svnmerge from
Georg Brandl <georg@python.org>
parents: 46967
diff changeset
1 r"""plistlib.py -- a tool to generate and parse MacOSX .plist files.
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
2
44839
8f15f8de4218 #1555501: document plistlib and move it to the general library.
Georg Brandl <georg@python.org>
parents: 44786
diff changeset
3 The PropertyList (.plist) file format is a simple XML pickle supporting
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
4 basic object types, like dictionaries, lists, numbers and strings.
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
5 Usually the top level object is a dictionary.
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
6
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
7 To write out a plist file, use the writePlist(rootObject, pathOrFile)
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
8 function. 'rootObject' is the top level object, 'pathOrFile' is a
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
9 filename or a (writable) file object.
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
10
33835
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
11 To parse a plist from a file, use the readPlist(pathOrFile) function,
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
12 with a file name or a (readable) file object as the only argument. It
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
13 returns the top level object (again, usually a dictionary).
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
14
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
15 To work with plist data in strings, you can use readPlistFromString()
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
16 and writePlistToString().
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
17
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
18 Values can be strings, integers, floats, booleans, tuples, lists,
33836
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
19 dictionaries, Data or datetime.datetime objects. String values (including
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
20 dictionary keys) may be unicode strings -- they will be written out as
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
21 UTF-8.
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
22
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
23 The <data> plist type is supported through the Data class. This is a
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
24 thin wrapper around a Python string.
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
25
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
26 Generate Plist example:
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
27
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
28 pl = dict(
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
29 aString="Doodah",
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
30 aList=["A", "B", 12, 32.1, [1, 2, 3]],
44857
29643fbe1150 Follow PEP 8 in module docstring.
Walter Dörwald <walter@livinglogic.de>
parents: 44839
diff changeset
31 aFloat=0.1,
29643fbe1150 Follow PEP 8 in module docstring.
Walter Dörwald <walter@livinglogic.de>
parents: 44839
diff changeset
32 anInt=728,
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
33 aDict=dict(
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
34 anotherString="<hello & hi there!>",
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
35 aUnicodeValue=u'M\xe4ssig, Ma\xdf',
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
36 aTrueValue=True,
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
37 aFalseValue=False,
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
38 ),
44857
29643fbe1150 Follow PEP 8 in module docstring.
Walter Dörwald <walter@livinglogic.de>
parents: 44839
diff changeset
39 someData=Data("<binary gunk>"),
29643fbe1150 Follow PEP 8 in module docstring.
Walter Dörwald <walter@livinglogic.de>
parents: 44839
diff changeset
40 someMoreData=Data("<lots of binary gunk>" * 10),
29643fbe1150 Follow PEP 8 in module docstring.
Walter Dörwald <walter@livinglogic.de>
parents: 44839
diff changeset
41 aDate=datetime.datetime.fromtimestamp(time.mktime(time.gmtime())),
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
42 )
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
43 # unicode keys are possible, but a little awkward to use:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
44 pl[u'\xc5benraa'] = "That was a unicode key."
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
45 writePlist(pl, fileName)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
46
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
47 Parse Plist example:
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
48
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
49 pl = readPlist(pathOrFile)
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
50 print pl["aKey"]
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
51 """
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
52
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
53
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
54 __all__ = [
33835
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
55 "readPlist", "writePlist", "readPlistFromString", "writePlistToString",
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
56 "readPlistFromResource", "writePlistToResource",
33836
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
57 "Plist", "Data", "Dict"
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
58 ]
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
59 # Note: the Plist and Dict classes have been deprecated.
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
60
33842
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
61 import binascii
33835
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
62 import datetime
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
63 from cStringIO import StringIO
33976
4394463510fb reordered a couple of things
Just van Rossum <just@letterror.com>
parents: 33842
diff changeset
64 import re
46967
6df0394abbf1 Add warnings to and deprecated all those Mac modules
Benjamin Peterson <benjamin@python.org>
parents: 44857
diff changeset
65 import warnings
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
66
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
67
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
68 def readPlist(pathOrFile):
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
69 """Read a .plist file. 'pathOrFile' may either be a file name or a
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
70 (readable) file object. Return the unpacked root object (which
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
71 usually is a dictionary).
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
72 """
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
73 didOpen = 0
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
74 if isinstance(pathOrFile, (str, unicode)):
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
75 pathOrFile = open(pathOrFile)
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
76 didOpen = 1
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
77 p = PlistParser()
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
78 rootObject = p.parse(pathOrFile)
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
79 if didOpen:
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
80 pathOrFile.close()
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
81 return rootObject
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
82
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
83
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
84 def writePlist(rootObject, pathOrFile):
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
85 """Write 'rootObject' to a .plist file. 'pathOrFile' may either be a
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
86 file name or a (writable) file object.
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
87 """
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
88 didOpen = 0
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
89 if isinstance(pathOrFile, (str, unicode)):
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
90 pathOrFile = open(pathOrFile, "w")
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
91 didOpen = 1
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
92 writer = PlistWriter(pathOrFile)
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
93 writer.writeln("<plist version=\"1.0\">")
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
94 writer.writeValue(rootObject)
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
95 writer.writeln("</plist>")
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
96 if didOpen:
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
97 pathOrFile.close()
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
98
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
99
33835
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
100 def readPlistFromString(data):
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
101 """Read a plist data from a string. Return the root object.
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
102 """
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
103 return readPlist(StringIO(data))
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
104
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
105
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
106 def writePlistToString(rootObject):
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
107 """Return 'rootObject' as a plist-formatted string.
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
108 """
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
109 f = StringIO()
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
110 writePlist(rootObject, f)
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
111 return f.getvalue()
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
112
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
113
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
114 def readPlistFromResource(path, restype='plst', resid=0):
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
115 """Read plst resource from the resource fork of path.
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
116 """
53903
a36fa2ce61b1 Merged revisions 72458 via svnmerge from
Philip Jenvey <pjenvey@underboss.org>
parents: 52903
diff changeset
117 warnings.warnpy3k("In 3.x, readPlistFromResource is removed.",
a36fa2ce61b1 Merged revisions 72458 via svnmerge from
Philip Jenvey <pjenvey@underboss.org>
parents: 52903
diff changeset
118 stacklevel=2)
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
119 from Carbon.File import FSRef, FSGetResourceForkName
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
120 from Carbon.Files import fsRdPerm
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
121 from Carbon import Res
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
122 fsRef = FSRef(path)
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
123 resNum = Res.FSOpenResourceFile(fsRef, FSGetResourceForkName(), fsRdPerm)
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
124 Res.UseResFile(resNum)
33835
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
125 plistData = Res.Get1Resource(restype, resid).data
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
126 Res.CloseResFile(resNum)
33835
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
127 return readPlistFromString(plistData)
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
128
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
129
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
130 def writePlistToResource(rootObject, path, restype='plst', resid=0):
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
131 """Write 'rootObject' as a plst resource to the resource fork of path.
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
132 """
53903
a36fa2ce61b1 Merged revisions 72458 via svnmerge from
Philip Jenvey <pjenvey@underboss.org>
parents: 52903
diff changeset
133 warnings.warnpy3k("In 3.x, writePlistToResource is removed.", stacklevel=2)
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
134 from Carbon.File import FSRef, FSGetResourceForkName
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
135 from Carbon.Files import fsRdWrPerm
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
136 from Carbon import Res
33835
991d3490f698 - added two more convenience functions: readPlistFromString() and
Just van Rossum <just@letterror.com>
parents: 33830
diff changeset
137 plistData = writePlistToString(rootObject)
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
138 fsRef = FSRef(path)
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
139 resNum = Res.FSOpenResourceFile(fsRef, FSGetResourceForkName(), fsRdWrPerm)
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
140 Res.UseResFile(resNum)
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
141 try:
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
142 Res.Get1Resource(restype, resid).RemoveResource()
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
143 except Res.Error:
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
144 pass
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
145 res = Res.Resource(plistData)
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
146 res.AddResource(restype, resid, '')
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
147 res.WriteResource()
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
148 Res.CloseResFile(resNum)
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
149
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
150
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
151 class DumbXMLWriter:
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
152
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
153 def __init__(self, file, indentLevel=0, indent="\t"):
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
154 self.file = file
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
155 self.stack = []
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
156 self.indentLevel = indentLevel
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
157 self.indent = indent
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
158
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
159 def beginElement(self, element):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
160 self.stack.append(element)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
161 self.writeln("<%s>" % element)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
162 self.indentLevel += 1
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
163
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
164 def endElement(self, element):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
165 assert self.indentLevel > 0
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
166 assert self.stack.pop() == element
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
167 self.indentLevel -= 1
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
168 self.writeln("</%s>" % element)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
169
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
170 def simpleElement(self, element, value=None):
29799
e5b99e605926 don't optimize empty strings
Just van Rossum <just@letterror.com>
parents: 29727
diff changeset
171 if value is not None:
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
172 value = _escapeAndEncode(value)
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
173 self.writeln("<%s>%s</%s>" % (element, value, element))
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
174 else:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
175 self.writeln("<%s/>" % element)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
176
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
177 def writeln(self, line):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
178 if line:
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
179 self.file.write(self.indentLevel * self.indent + line + "\n")
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
180 else:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
181 self.file.write("\n")
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
182
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
183
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
184 # Contents should conform to a subset of ISO 8601
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
185 # (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'. Smaller units may be omitted with
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
186 # a loss of precision)
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
187 _dateParser = re.compile(r"(?P<year>\d\d\d\d)(?:-(?P<month>\d\d)(?:-(?P<day>\d\d)(?:T(?P<hour>\d\d)(?::(?P<minute>\d\d)(?::(?P<second>\d\d))?)?)?)?)?Z")
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
188
33836
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
189 def _dateFromString(s):
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
190 order = ('year', 'month', 'day', 'hour', 'minute', 'second')
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
191 gd = _dateParser.match(s).groupdict()
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
192 lst = []
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
193 for key in order:
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
194 val = gd[key]
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
195 if val is None:
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
196 break
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
197 lst.append(int(val))
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
198 return datetime.datetime(*lst)
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
199
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
200 def _dateToString(d):
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
201 return '%04d-%02d-%02dT%02d:%02d:%02dZ' % (
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
202 d.year, d.month, d.day,
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
203 d.hour, d.minute, d.second
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
204 )
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
205
33976
4394463510fb reordered a couple of things
Just van Rossum <just@letterror.com>
parents: 33842
diff changeset
206
33979
f92616f8c33c On second thought: "Errors should never pass silently", so barf when a
Just van Rossum <just@letterror.com>
parents: 33977
diff changeset
207 # Regex to find any control chars, except for \t \n and \r
f92616f8c33c On second thought: "Errors should never pass silently", so barf when a
Just van Rossum <just@letterror.com>
parents: 33977
diff changeset
208 _controlCharPat = re.compile(
33977
dcda06cb078a - \f is not a valid XML character
Just van Rossum <just@letterror.com>
parents: 33976
diff changeset
209 r"[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f"
dcda06cb078a - \f is not a valid XML character
Just van Rossum <just@letterror.com>
parents: 33976
diff changeset
210 r"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]")
33976
4394463510fb reordered a couple of things
Just van Rossum <just@letterror.com>
parents: 33842
diff changeset
211
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
212 def _escapeAndEncode(text):
33979
f92616f8c33c On second thought: "Errors should never pass silently", so barf when a
Just van Rossum <just@letterror.com>
parents: 33977
diff changeset
213 m = _controlCharPat.search(text)
f92616f8c33c On second thought: "Errors should never pass silently", so barf when a
Just van Rossum <just@letterror.com>
parents: 33977
diff changeset
214 if m is not None:
f92616f8c33c On second thought: "Errors should never pass silently", so barf when a
Just van Rossum <just@letterror.com>
parents: 33977
diff changeset
215 raise ValueError("strings can't contains control characters; "
f92616f8c33c On second thought: "Errors should never pass silently", so barf when a
Just van Rossum <just@letterror.com>
parents: 33977
diff changeset
216 "use plistlib.Data instead")
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
217 text = text.replace("\r\n", "\n") # convert DOS line endings
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
218 text = text.replace("\r", "\n") # convert Mac line endings
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
219 text = text.replace("&", "&amp;") # escape '&'
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
220 text = text.replace("<", "&lt;") # escape '<'
33841
105bfe1769b7 also escape '>', to closer match Apple's plist output
Just van Rossum <just@letterror.com>
parents: 33837
diff changeset
221 text = text.replace(">", "&gt;") # escape '>'
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
222 return text.encode("utf-8") # encode as UTF-8
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
223
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
224
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
225 PLISTHEADER = """\
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
226 <?xml version="1.0" encoding="UTF-8"?>
60785
d7feffa78fa0 Fix for issue 7852: the DTD for OSX Plists has changed due
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 53903
diff changeset
227 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
228 """
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
229
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
230 class PlistWriter(DumbXMLWriter):
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
231
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
232 def __init__(self, file, indentLevel=0, indent="\t", writeHeader=1):
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
233 if writeHeader:
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
234 file.write(PLISTHEADER)
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
235 DumbXMLWriter.__init__(self, file, indentLevel, indent)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
236
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
237 def writeValue(self, value):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
238 if isinstance(value, (str, unicode)):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
239 self.simpleElement("string", value)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
240 elif isinstance(value, bool):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
241 # must switch for bool before int, as bool is a
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
242 # subclass of int...
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
243 if value:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
244 self.simpleElement("true")
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
245 else:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
246 self.simpleElement("false")
44786
4ac484249bd1 Backport r59688.
Georg Brandl <georg@python.org>
parents: 33979
diff changeset
247 elif isinstance(value, (int, long)):
4ac484249bd1 Backport r59688.
Georg Brandl <georg@python.org>
parents: 33979
diff changeset
248 self.simpleElement("integer", "%d" % value)
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
249 elif isinstance(value, float):
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
250 self.simpleElement("real", repr(value))
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
251 elif isinstance(value, dict):
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
252 self.writeDict(value)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
253 elif isinstance(value, Data):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
254 self.writeData(value)
33836
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
255 elif isinstance(value, datetime.datetime):
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
256 self.simpleElement("date", _dateToString(value))
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
257 elif isinstance(value, (tuple, list)):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
258 self.writeArray(value)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
259 else:
29727
962f443ae1d9 - replaced a couple of asserts with proper exceptions
Just van Rossum <just@letterror.com>
parents: 28545
diff changeset
260 raise TypeError("unsuported type: %s" % type(value))
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
261
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
262 def writeData(self, data):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
263 self.beginElement("data")
33842
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
264 self.indentLevel -= 1
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
265 maxlinelength = 76 - len(self.indent.replace("\t", " " * 8) *
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
266 self.indentLevel)
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
267 for line in data.asBase64(maxlinelength).split("\n"):
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
268 if line:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
269 self.writeln(line)
33842
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
270 self.indentLevel += 1
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
271 self.endElement("data")
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
272
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
273 def writeDict(self, d):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
274 self.beginElement("dict")
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
275 items = d.items()
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
276 items.sort()
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
277 for key, value in items:
29727
962f443ae1d9 - replaced a couple of asserts with proper exceptions
Just van Rossum <just@letterror.com>
parents: 28545
diff changeset
278 if not isinstance(key, (str, unicode)):
962f443ae1d9 - replaced a couple of asserts with proper exceptions
Just van Rossum <just@letterror.com>
parents: 28545
diff changeset
279 raise TypeError("keys must be strings")
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
280 self.simpleElement("key", key)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
281 self.writeValue(value)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
282 self.endElement("dict")
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
283
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
284 def writeArray(self, array):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
285 self.beginElement("array")
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
286 for value in array:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
287 self.writeValue(value)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
288 self.endElement("array")
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
289
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
290
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
291 class _InternalDict(dict):
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
292
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
293 # This class is needed while Dict is scheduled for deprecation:
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
294 # we only need to warn when a *user* instantiates Dict or when
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
295 # the "attribute notation for dict keys" is used.
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
296
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
297 def __getattr__(self, attr):
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
298 try:
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
299 value = self[attr]
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
300 except KeyError:
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
301 raise AttributeError, attr
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
302 from warnings import warn
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
303 warn("Attribute access from plist dicts is deprecated, use d[key] "
53903
a36fa2ce61b1 Merged revisions 72458 via svnmerge from
Philip Jenvey <pjenvey@underboss.org>
parents: 52903
diff changeset
304 "notation instead", PendingDeprecationWarning, 2)
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
305 return value
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
306
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
307 def __setattr__(self, attr, value):
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
308 from warnings import warn
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
309 warn("Attribute access from plist dicts is deprecated, use d[key] "
53903
a36fa2ce61b1 Merged revisions 72458 via svnmerge from
Philip Jenvey <pjenvey@underboss.org>
parents: 52903
diff changeset
310 "notation instead", PendingDeprecationWarning, 2)
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
311 self[attr] = value
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
312
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
313 def __delattr__(self, attr):
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
314 try:
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
315 del self[attr]
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
316 except KeyError:
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
317 raise AttributeError, attr
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
318 from warnings import warn
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
319 warn("Attribute access from plist dicts is deprecated, use d[key] "
53903
a36fa2ce61b1 Merged revisions 72458 via svnmerge from
Philip Jenvey <pjenvey@underboss.org>
parents: 52903
diff changeset
320 "notation instead", PendingDeprecationWarning, 2)
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
321
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
322 class Dict(_InternalDict):
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
323
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
324 def __init__(self, **kwargs):
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
325 from warnings import warn
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
326 warn("The plistlib.Dict class is deprecated, use builtin dict instead",
53903
a36fa2ce61b1 Merged revisions 72458 via svnmerge from
Philip Jenvey <pjenvey@underboss.org>
parents: 52903
diff changeset
327 PendingDeprecationWarning, 2)
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
328 super(Dict, self).__init__(**kwargs)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
329
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
330
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
331 class Plist(_InternalDict):
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
332
33842
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
333 """This class has been deprecated. Use readPlist() and writePlist()
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
334 functions instead, together with regular dict objects.
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
335 """
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
336
33829
6c41695284f6 Deprecate Plist class
Just van Rossum <just@letterror.com>
parents: 33828
diff changeset
337 def __init__(self, **kwargs):
6c41695284f6 Deprecate Plist class
Just van Rossum <just@letterror.com>
parents: 33828
diff changeset
338 from warnings import warn
6c41695284f6 Deprecate Plist class
Just van Rossum <just@letterror.com>
parents: 33828
diff changeset
339 warn("The Plist class is deprecated, use the readPlist() and "
53903
a36fa2ce61b1 Merged revisions 72458 via svnmerge from
Philip Jenvey <pjenvey@underboss.org>
parents: 52903
diff changeset
340 "writePlist() functions instead", PendingDeprecationWarning, 2)
33829
6c41695284f6 Deprecate Plist class
Just van Rossum <just@letterror.com>
parents: 33828
diff changeset
341 super(Plist, self).__init__(**kwargs)
6c41695284f6 Deprecate Plist class
Just van Rossum <just@letterror.com>
parents: 33828
diff changeset
342
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
343 def fromFile(cls, pathOrFile):
33829
6c41695284f6 Deprecate Plist class
Just van Rossum <just@letterror.com>
parents: 33828
diff changeset
344 """Deprecated. Use the readPlist() function instead."""
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
345 rootObject = readPlist(pathOrFile)
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
346 plist = cls()
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
347 plist.update(rootObject)
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
348 return plist
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
349 fromFile = classmethod(fromFile)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
350
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
351 def write(self, pathOrFile):
33829
6c41695284f6 Deprecate Plist class
Just van Rossum <just@letterror.com>
parents: 33828
diff changeset
352 """Deprecated. Use the writePlist() function instead."""
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
353 writePlist(self, pathOrFile)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
354
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
355
33842
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
356 def _encodeBase64(s, maxlinelength=76):
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
357 # copied from base64.encodestring(), with added maxlinelength argument
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
358 maxbinsize = (maxlinelength//4)*3
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
359 pieces = []
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
360 for i in range(0, len(s), maxbinsize):
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
361 chunk = s[i : i + maxbinsize]
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
362 pieces.append(binascii.b2a_base64(chunk))
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
363 return "".join(pieces)
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
364
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
365 class Data:
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
366
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
367 """Wrapper for binary data."""
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
368
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
369 def __init__(self, data):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
370 self.data = data
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
371
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
372 def fromBase64(cls, data):
33842
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
373 # base64.decodestring just calls binascii.a2b_base64;
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
374 # it seems overkill to use both base64 and binascii.
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
375 return cls(binascii.a2b_base64(data))
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
376 fromBase64 = classmethod(fromBase64)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
377
33842
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
378 def asBase64(self, maxlinelength=76):
993b128d4e29 Made <data> output match Apple's exactly. To do that I had to add a custom
Just van Rossum <just@letterror.com>
parents: 33841
diff changeset
379 return _encodeBase64(self.data, maxlinelength)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
380
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
381 def __cmp__(self, other):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
382 if isinstance(other, self.__class__):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
383 return cmp(self.data, other.data)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
384 elif isinstance(other, str):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
385 return cmp(self.data, other)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
386 else:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
387 return cmp(id(self), id(other))
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
388
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
389 def __repr__(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
390 return "%s(%s)" % (self.__class__.__name__, repr(self.data))
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
391
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
392
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
393 class PlistParser:
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
394
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
395 def __init__(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
396 self.stack = []
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
397 self.currentKey = None
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
398 self.root = None
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
399
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
400 def parse(self, fileobj):
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
401 from xml.parsers.expat import ParserCreate
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
402 parser = ParserCreate()
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
403 parser.StartElementHandler = self.handleBeginElement
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
404 parser.EndElementHandler = self.handleEndElement
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
405 parser.CharacterDataHandler = self.handleData
33826
28ef0a3f57f6 Patch from Bob Ippolito, slighly edited:
Just van Rossum <just@letterror.com>
parents: 33650
diff changeset
406 parser.ParseFile(fileobj)
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
407 return self.root
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
408
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
409 def handleBeginElement(self, element, attrs):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
410 self.data = []
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
411 handler = getattr(self, "begin_" + element, None)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
412 if handler is not None:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
413 handler(attrs)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
414
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
415 def handleEndElement(self, element):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
416 handler = getattr(self, "end_" + element, None)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
417 if handler is not None:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
418 handler()
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
419
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
420 def handleData(self, data):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
421 self.data.append(data)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
422
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
423 def addObject(self, value):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
424 if self.currentKey is not None:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
425 self.stack[-1][self.currentKey] = value
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
426 self.currentKey = None
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
427 elif not self.stack:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
428 # this is the root object
33645
0c4f095863b9 Which reminds me, I've had a much improved plistlib.py lying around for
Just van Rossum <just@letterror.com>
parents: 29799
diff changeset
429 self.root = value
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
430 else:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
431 self.stack[-1].append(value)
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
432
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
433 def getData(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
434 data = "".join(self.data)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
435 try:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
436 data = data.encode("ascii")
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
437 except UnicodeError:
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
438 pass
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
439 self.data = []
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
440 return data
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
441
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
442 # element handlers
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
443
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
444 def begin_dict(self, attrs):
33837
bd558211ba55 Deprecating Dict class; going through a few hoops to get the warnings right.
Just van Rossum <just@letterror.com>
parents: 33836
diff changeset
445 d = _InternalDict()
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
446 self.addObject(d)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
447 self.stack.append(d)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
448 def end_dict(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
449 self.stack.pop()
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
450
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
451 def end_key(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
452 self.currentKey = self.getData()
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
453
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
454 def begin_array(self, attrs):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
455 a = []
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
456 self.addObject(a)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
457 self.stack.append(a)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
458 def end_array(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
459 self.stack.pop()
26884
f0f9acca4164 Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
Jack Jansen <jack.jansen@cwi.nl>
parents:
diff changeset
460
28545
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
461 def end_true(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
462 self.addObject(True)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
463 def end_false(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
464 self.addObject(False)
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
465 def end_integer(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
466 self.addObject(int(self.getData()))
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
467 def end_real(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
468 self.addObject(float(self.getData()))
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
469 def end_string(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
470 self.addObject(self.getData())
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
471 def end_data(self):
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
472 self.addObject(Data.fromBase64(self.getData()))
017d2e3ea2ae Detabbed.
Jack Jansen <jack.jansen@cwi.nl>
parents: 26884
diff changeset
473 def end_date(self):
33836
dc8ecf724488 - Removed Date class. We don't really need it for b/w compatibility since
Just van Rossum <just@letterror.com>
parents: 33835
diff changeset
474 self.addObject(_dateFromString(self.getData()))