ž „’f¹9c@swdZdddddddgZdd lZdd lZdd lmZdd lZd d„Zd d„Zd d„Z dd„Z Gdd„dƒZ ej dej ƒZdd„Zdd„Zej dƒZdd„ZdZGdd„de ƒZGdd„deƒZGdd„deƒZGdd„deƒZd d!d"„ZGd#d„dƒZGd$d%„d%ƒZd S(&uplistlib.py -- a tool to generate and parse MacOSX .plist files. The property list (.plist) file format is a simple XML pickle supporting basic object types, like dictionaries, lists, numbers and strings. Usually the top level object is a dictionary. To write out a plist file, use the writePlist(rootObject, pathOrFile) function. 'rootObject' is the top level object, 'pathOrFile' is a filename or a (writable) file object. To parse a plist from a file, use the readPlist(pathOrFile) function, with a file name or a (readable) file object as the only argument. It returns the top level object (again, usually a dictionary). To work with plist data in bytes objects, you can use readPlistFromBytes() and writePlistToBytes(). Values can be strings, integers, floats, booleans, tuples, lists, dictionaries (but only with string keys), Data or datetime.datetime objects. String values (including dictionary keys) have to be unicode strings -- they will be written out as UTF-8. The plist type is supported through the Data class. This is a thin wrapper around a Python bytes object. Use 'Data' if your strings contain control characters. Generate Plist example: pl = dict( aString = "Doodah", aList = ["A", "B", 12, 32.1, [1, 2, 3]], aFloat = 0.1, anInt = 728, aDict = dict( anotherString = "", aUnicodeValue = "M\xe4ssig, Ma\xdf", aTrueValue = True, aFalseValue = False, ), someData = Data(b""), someMoreData = Data(b"" * 10), aDate = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())), ) writePlist(pl, fileName) Parse Plist example: pl = readPlist(pathOrFile) print pl["aKey"] u readPlistu writePlistureadPlistFromBytesuwritePlistToBytesuPlistuDatauDictiN(uBytesIOc Csdd}zCt|tƒr0t|dƒ}d}ntƒ}|j|ƒ}Wd|r_|jƒnX|S(u„Read a .plist file. 'pathOrFile' may either be a file name or a (readable) file object. Return the unpacked root object (which usually is a dictionary). urbNFT(uFalseu isinstanceustruopenuTrueu PlistParseruparseuclose(u pathOrFileudidOpenupu rootObject((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu readPlistAs  c Csd}z^t|tƒr0t|dƒ}d}nt|ƒ}|jdƒ|j|ƒ|jdƒWd|rz|jƒnXdS(uqWrite 'rootObject' to a .plist file. 'pathOrFile' may either be a file name or a (writable) file object. uwbuuNFT( uFalseu isinstanceustruopenuTrueu PlistWriteruwritelnu writeValueuclose(u rootObjectu pathOrFileudidOpenuwriter((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu writePlistSs    cCstt|ƒƒS(uCRead a plist data from a bytes object. Return the root object. (u readPlistuBytesIO(udata((u-/opt/alt/python33/lib64/python3.3/plistlib.pyureadPlistFromBytesescCs tƒ}t||ƒ|jƒS(u;Return 'rootObject' as a plist-formatted bytes object. (uBytesIOu writePlistugetvalue(u rootObjectuf((u-/opt/alt/python33/lib64/python3.3/plistlib.pyuwritePlistToBytesks  cBsY|EeZdZdddd„Zdd„Zdd„Zd d d „Zd d „Zd S(u DumbXMLWriteriu cCs(||_g|_||_||_dS(N(ufileustacku indentLeveluindent(uselfufileu indentLeveluindent((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu__init__ts   uDumbXMLWriter.__init__cCs4|jj|ƒ|jd|ƒ|jd7_dS(Nu<%s>i(ustackuappenduwritelnu indentLevel(uselfuelement((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu beginElementzsuDumbXMLWriter.beginElementcCsT|jdkst‚|jjƒ|ks0t‚|jd8_|jd|ƒdS(Niiu(u indentLeveluAssertionErrorustackupopuwriteln(uselfuelement((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu endElementsuDumbXMLWriter.endElementcCsJ|dk r5t|ƒ}|jd|||fƒn|jd|ƒdS(Nu <%s>%su<%s/>(uNoneu_escapeuwriteln(uselfuelementuvalue((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu simpleElement…s  uDumbXMLWriter.simpleElementcCsh|rTt|tƒr'|jdƒ}n|jj|j|jƒ|jj|ƒn|jjdƒdS(Nuutf-8s (u isinstanceustruencodeufileuwriteu indentLeveluindent(uselfuline((u-/opt/alt/python33/lib64/python3.3/plistlib.pyuwritelnŒs uDumbXMLWriter.writelnN( u__name__u __module__u __qualname__u__init__u beginElementu endElementuNoneu simpleElementuwriteln(u __locals__((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu DumbXMLWriterss   u DumbXMLWriteru{(?P\d\d\d\d)(?:-(?P\d\d)(?:-(?P\d\d)(?:T(?P\d\d)(?::(?P\d\d)(?::(?P\d\d))?)?)?)?)?ZcCsld}tj|ƒjƒ}g}x;|D]3}||}|dkrHPn|jt|ƒƒq(Wtj|ŒS(Nuyearumonthudayuhouruminuteusecond(uyearumonthudayuhouruminuteusecond(u _dateParserumatchu groupdictuNoneuappenduintudatetime(usuorderugdulstukeyuval((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu_dateFromString›s   u_dateFromStringcCs,d|j|j|j|j|j|jfS(Nu%04d-%02d-%02dT%02d:%02d:%02dZ(uyearumonthudayuhouruminuteusecond(ud((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu _dateToString¦su _dateToStringuv[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]cCsˆtj|ƒ}|dk r*tdƒ‚n|jddƒ}|jddƒ}|jddƒ}|jddƒ}|jd d ƒ}|S( NuDstrings can't contains control characters; use plistlib.Data insteadu u u u&u&uu>(u_controlCharPatusearchuNoneu ValueErrorureplace(utextum((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu_escape²s u_escapesŽ cBsY|EeZdZddddd„Zdd„Zdd „Zd d „Zd d „ZdS(u PlistWriteris icCs0|r|jtƒntj||||ƒdS(N(uwriteu PLISTHEADERu DumbXMLWriteru__init__(uselfufileu indentLeveluindentu writeHeader((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu__init__ĘsuPlistWriter.__init__cCsMt|tƒr"|jd|ƒn't|tƒrW|rG|jdƒqI|jdƒnņt|tƒr}|jdd|ƒnĢt|tƒr„|jdt|ƒƒn¤t|tƒrÄ|j|ƒn…t|t ƒrć|j |ƒnft|t j ƒr|jdt |ƒƒn;t|t tfƒr3|j|ƒntdt|ƒƒ‚dS( Nustringutrueufalseuintegeru%durealudateuunsupported type: %s(u isinstanceustru simpleElementubooluintufloatureprudictu writeDictuDatau writeDataudatetimeu _dateToStringutupleulistu writeArrayu TypeErrorutype(uselfuvalue((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu writeValueĖs&uPlistWriter.writeValuecCs¤|jdƒ|jd8_tddt|jjdd ƒ|jƒƒ}x6|j|ƒjdƒD]}|rd|j|ƒqdqdW|jd7_|j dƒdS( NudataiiiLs s is s ( u beginElementu indentLevelumaxulenuindentureplaceuasBase64usplituwritelnu endElement(uselfudatau maxlinelengthuline((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu writeDataäs uPlistWriter.writeDatacCs˜|r‡|jdƒt|jƒƒ}xO|D]G\}}t|tƒsVtdƒ‚n|jd|ƒ|j|ƒq,W|jdƒn |jdƒdS(Nudictukeys must be stringsukey( u beginElementusorteduitemsu isinstanceustru TypeErroru simpleElementu writeValueu endElement(uselfuduitemsukeyuvalue((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu writeDictļs uPlistWriter.writeDictcCsR|rA|jdƒx|D]}|j|ƒqW|jdƒn |jdƒdS(Nuarray(u beginElementu writeValueu endElementu simpleElement(uselfuarrayuvalue((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu writeArrayüs   uPlistWriter.writeArrayN(u__name__u __module__u __qualname__u__init__u writeValueu writeDatau writeDictu writeArray(u __locals__((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu PlistWriterÄs   u PlistWritercBs8|EeZdZdd„Zdd„Zdd„ZdS(u _InternalDictc CsSy||}Wntk r.t|ƒ‚YnXddlm}|dtdƒ|S(Ni(uwarnuLAttribute access from plist dicts is deprecated, use d[key] notation insteadi(uKeyErroruAttributeErroruwarningsuwarnuDeprecationWarning(uselfuattruvalueuwarn((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu __getattr__ s  u_InternalDict.__getattr__cCs.ddlm}|dtdƒ||||j|kSt|ƒt|ƒkSdS(N(u isinstanceu __class__udataustruid(uselfuother((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu__eq__bs  u Data.__eq__cCsd|jjt|jƒfS(Nu%s(%s)(u __class__u__name__ureprudata(uself((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu__repr__jsu Data.__repr__N( u__name__u __module__u __qualname__u__doc__u__init__u classmethodu fromBase64uasBase64u__eq__u__repr__(u __locals__((u-/opt/alt/python33/lib64/python3.3/plistlib.pyuDataPs   cBsų|EeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'S((u PlistParsercCsg|_d|_d|_dS(N(ustackuNoneu currentKeyuroot(uself((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu__init__os  uPlistParser.__init__cCs`ddlm}|ƒ|_|j|j_|j|j_|j|j_|jj |ƒ|j S(Ni(u ParserCreate( uxml.parsers.expatu ParserCreateuparseruhandleBeginElementuStartElementHandleruhandleEndElementuEndElementHandleru handleDatauCharacterDataHandleru ParseFileuroot(uselfufileobju ParserCreate((u-/opt/alt/python33/lib64/python3.3/plistlib.pyuparsets uPlistParser.parsecCs<g|_t|d|dƒ}|dk r8||ƒndS(Nubegin_(udataugetattruNone(uselfuelementuattrsuhandler((u-/opt/alt/python33/lib64/python3.3/plistlib.pyuhandleBeginElement}s  uPlistParser.handleBeginElementcCs0t|d|dƒ}|dk r,|ƒndS(Nuend_(ugetattruNone(uselfuelementuhandler((u-/opt/alt/python33/lib64/python3.3/plistlib.pyuhandleEndElementƒs uPlistParser.handleEndElementcCs|jj|ƒdS(N(udatauappend(uselfudata((u-/opt/alt/python33/lib64/python3.3/plistlib.pyu handleDataˆsuPlistParser.handleDatacCsĘ|jdk rdt|jdtiƒƒsDtd|jjƒ‚n||jd|j2s2        &   B