Thread Modul für iCal parsen und erzeugen gesucht (13 answers)
Opened by bianca at 2014-01-26 19:03

GwenDragon
 2014-01-27 14:13
#173234 #173234
User since
2005-01-17
14848 Artikel
Admin1
[Homepage]
user image
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.

more (35.0kb):
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)

View full thread Modul für iCal parsen und erzeugen gesucht