Thread Modul für iCal parsen und erzeugen gesucht
(13 answers)
Opened by bianca at 2014-01-26 19:03
Und so ginge es auch (rudimentär).
Du musst halt bezüglich der korrekten Ausgabe als iCalendar (siehe __DATA__) noch eben in die sub was einfügen, dir noch ein paar kleine Konvertierungsroutinen schreiben, damit du die Elementnamen nicht so kryptisch in den Hash schreiben musst, und ein paar kleine Subs für verschiedene Zeitformate. ;) Das kannst du. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 use strict; use warnings; sub ical_parse { my $fh = shift; my %ical_hash; my ( $lastelement, $lastdata ); my %event; while (<$fh>) { chomp; if (/^\s+(.+)/) { } if (/^(METHOD|PRODID|VERSION):(.+)/) { $ical_hash{$1} = $2; } if ( /^BEGIN:VEVENT/ .. /^END:VEVENT/ ) { if (/^BEGIN:/) { %event = (); next; } if (/^END:/) { $ical_hash{_events_}{$event{SUMMARY}} = { %event }; %event = (); next; } if (/^(\w[^:]+):(.+)/) { $event{$1} = $2; next; } } } return %ical_hash; } sub ical_add_event { my ($to_hash) = shift; my (%event) = @_; # entweder die Daten werden hier drin umgewandelt oder richtig übergeben # und weiterer Code ;) #... # die "iCal entry $event{SUMMARY} exists!" if exists $to_hash->{_events_}{$event{SUMMARY}}; $to_hash->{_events_}{$event{SUMMARY}} = \%event; } sub ISO_datetime { my ($time) = shift // time; # 0 1 2 3 4 5 6 7 8 my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time); return sprintf '%4d%02d%02dT%02d%02d%02dZ',$year+1900,$mon+1,$mday,$hour,$min,$sec; } my %hash = ical_parse(*DATA); use Data::Dumper; say Dumper( \%hash ); ical_add_event( \%hash, CREATED => ISO_datetime(), 'LAST-MODIFIED' => ISO_datetime(), 'DTSTART;VALUE=DATE' => '20140101', 'DTEND;VALUE=DATE' => '20140101', SUMMARY => 'Sylvesterferien', DESCRIPTION => 'Sonderferien in Bayern', URL => 'http://mydomain.tld/', # einzigartige Zeichenfolge! + @ + domain UID => 'Sonderferien_in_Bayern1235473253483773463535353@mydomain.tld', TRANSP => 'TRANSPARENT', DTSTAMP => ISO_datetime(), ); say Dumper( \%hash ); __DATA__ BEGIN:VCALENDAR METHOD:PUBLISH PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN VERSION:2.0 BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Winterferien Bayern DTSTART;VALUE=DATE:20140303 DTEND;VALUE=DATE:20140308 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Winterferien-Bayern-201403081093325744@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Osterferien Bayern DTSTART;VALUE=DATE:20140414 DTEND;VALUE=DATE:20140427 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Osterferien-Bayern-201404271062227588@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Pfingstferien Bayern DTSTART;VALUE=DATE:20140610 DTEND;VALUE=DATE:20140622 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Pfingstferien-Bayern-201406221052186503@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Sommerferien Bayern DTSTART;VALUE=DATE:20140730 DTEND;VALUE=DATE:20140916 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Sommerferien-Bayern-201409161222283686@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Herbstferien Bayern DTSTART;VALUE=DATE:20141027 DTEND;VALUE=DATE:20141101 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Herbstferien-Bayern-201411011005635868@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Weihnachtsferien Bayern DTSTART;VALUE=DATE:20140101 DTEND;VALUE=DATE:20140105 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Weihnachtsferien-Bayern-201401051129637466@schulferien.org END:VEVENT BEGIN:VEVENT CREATED:20130104T150430Z LAST-MODIFIED:20130104T150430Z DTSTAMP:20130104T150430Z SUMMARY:Weihnachtsferien Bayern DTSTART;VALUE=DATE:20141224 DTEND;VALUE=DATE:20150101 URL:http://www.schulferien.org DESCRIPTION:Alle Termine auf www.schulferien.org TRANSP:TRANSPARENT UID:Weihnachtsferien-Bayern-201501011322846554@schulferien.org END:VEVENT END:VCALENDAR //EDIT: Zeile 12 ist für die verabritung längerer Zeilen > 70 zeichen, da musst du den gematchten Wert dem Element der Zeile davor hinzufügen. Last edited: 2014-01-27 14:39:52 +0100 (CET) |