Property List

plist.plist soubory se v OS X vyskují více než hojně. Nejčastěji na ně pravděpodobně narazíte v podobě konfiguračního souboru nějaké aplikace. Jejich využítí je však mnohem širší.

Property List je XML soubor s pevnou strukturou obsahu definovanou v DTD. Data organizuje pomocí datových typů ekvivaletním k typům proměnných v programovacím frameworku Core Foundation (CF). Programátor používající CF ve své OS X nebo iOS aplikaci může velmi snadno zapsat datové objekty do souboru a načíst je zpět. Z povahy XML formátu je zřejmě, že tento proces není vhodný pro binární data. Stačí se podívat na .plist obsahující informace o uživeteli, kde je nacpaný profilový obrázek v JPG. (hledejte v /var/db/dslocal/nodes/Default/users s rootem :-))

Struktura .plistu

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
</dict>
</plist>

#1 Hlavička označující XML dokument
#2 Definice struktury dokumentu pomocí DTD
#3 Kořenový element XML dokumentu -> zde začíná obsah plistu
#4 Začátek slovníku

Slovníku (Dictionary) je datová strukura, krerá obsahuje prvky identifikované klíčem (key). Každý prvek má nějaký obsah (value). U plistů se často používá termín “key-value pair” = klíč hodnota. Uvnitř můžete potkat následující konstrukce:

Řetězec (CFString)

<key>retezec</key>
<string>obsahretezce</string>

Celé a desetinné číslo (CFNumber)

<key>width</key>
<celecislo>181</integer>
<key>realnecislo</key>
<real>0.0</real>

Datum (CFDate)

<key>datum</key>
<date>2012-12-24T21:56:18Z</date>

Boolean (CFBoolean)

<key>jetopravda</key>
<true/>
<key>nenitopravda</key>
<false/>

Binární data (CFData)

<key>spatialData</key>
<data>
XgIAACgAAAD///////8AAA==
</data>

Data lze seskupovat do polí a slovníků, které mohou být víceúrovňové. (CFArray a CFDictionary)

<key>poloe</key>
<array>
 <string>polozka1</string>
 <string>polozka2</string>
 <string>polozka3</string
</array>

<key>slovnik</key>
 <dict>
 <key>klic</key>
 <string>hodnota</string>
 <key>macbook</key>
 <real>pro</real>
 <key>dalsipole</key>
 <array>
  <string>dalsipolozka1</string>
  <string>dalsipolozka2</string>
 </array>	
</dict>

Pojmenování klíčů a obsah proměnný je zcela v režiji tvůrce property listu. Musí však dodržet pravidla pro XML dokumenty a strukturu danou DTDčkem.

Více čtení v manuálové stránce -> man plist

Formáty

Vedle obyčejných textových souborů často potkáte binárně zakódovaný property list. Strojově se o něco lépe čte a učetří se pár bajtů na disku (i když to rozhodně nelze srovnávat se sofistikovanější komprimací). Někdy to pak může být problém, když potřebujete .plist editovat ručně. Buď lze sáhnout po sofistikovanějším nástroji pro editování těchto souborů (XCode, PlistEdit Pro, …) nebo .plist převézt z binární podoby do textové a zase zpět. K tomu slouží jednoduchá utilitka – plutil.

binary -> text
plutil -convert xml1 BINÁRNÍ_PLIST -o TEXTOVÝ_PLIST
text -> binary
plutil -convert binary1 BINÁRNÍ_PLIST -o TEXTOVÝ_PLIST

plutil umí převádět i do json formátu, ale konverze může v některých případech selhat. Plisty se v této podobě navíc prakticky nevyskytují.

Po úpravách je dobrým zvykem provést kontrolu
plutil -lint PLIST_KE_KONTROLE

Pár dalších přepínáčů v man stránce -> man plutil (link)

Další čtení

Wikipedia
Apple Dev Article
http://www.bresink.com/osx/300268194/Docs-en/pgs/PListIntro.html

Úvod do XML na zvon.org
Úvod do DTD na zvon.org