#!/usr/bin/perl -w # (C)2009 Willem Hengeveld itsme@xs4all.nl use strict; use MIME::Base64; local $/; # script to convert macosx .plist xml files to perl, this makes them much more readable # # # # with the below commented out perl code, you can then execute the generated perl in your perl interpreter. # use strict; # use warnings; # use Data::Dumper; # $Data::Dumper::Sortkeys= 1; # $Data::Dumper::Indent= 1; # sub plhex { return pack 'H*', $_[0]; } # sub pldate { return $_[0]; } # sub true { return 1; } # sub false { return 0; } # -> print Dumper( ... ) my %str; my %int; my $deref=1; while (<>) { s/(.*?)<\/key>[\s\n\r]*/squote(unescape($1))."=>"/ges; s/(.*?)<\/string>/dquote(unescape($1)).","/ges; s/(.*?)<\/integer>/$1,/g; s/(.*?)<\/integer>/"$1",/g; if ($deref) { s/(.*?)<\/string>/$str{$1}=$2; dquote(unescape($2)).","/ges; s//dquote(unescape($str{$1})).","/ges; s/(.*?)<\/integer>/$int{$1}=$2; "$2,"/ge; s//$int{$1},/g; } else { s/(.*?)<\/string>/"[$1,".dquote(unescape($2))."],"/ges; s//[$1],/gs; s/(.*?)<\/integer>/[$1,$2],/g; s//[$1],/g; } s/(.*?)<\/real>/$1,/g; s/(.*?)<\/date>/pldate("$1"),/g; s/(.*?)<\/data>/sprintf("plhex(\"%s\"),",unpack('H*',decode_base64($1)))/ges; s//{/g; s/<\/dict>/},/g; s//{},/g; s//[/g; s/<\/array>/],/g; s//[],/g; s//true,/g; s//false,/g; s/<\/?plist[^>]*>//g; s/]*>//; s/<\?xml[^>]*>//; s/^\n+//s; s/\n},/\n};/gs; print "# $ARGV\n"; print $_; } sub squote { my $txt=shift; $txt =~ s/['\\]/\\$&/g; $txt =~ s/\n/\\n/g; $txt =~ s/\r/\\r/g; $txt =~ s/\t/\\t/g; $txt =~ s/\0/\\0/g; return ($txt =~ /^[a-zA-Z_]\w*$/) ? $txt : "'$txt'"; } sub dquote { my $txt=shift; $txt =~ s/["\\@]/\\$&/g; $txt =~ s/\n/\\n/g; $txt =~ s/\r/\\r/g; $txt =~ s/\t/\\t/g; $txt =~ s/\0/\\0/g; return "\"$txt\""; } sub unescape { my $txt=shift; $txt=~s/<//g; $txt=~s/"/"/g; $txt=~s/&#(\d\w+);/chr(eval($1))/g; $txt=~s/&/&/g; return $txt; }