2008-12-02 7 views
0

У меня есть несколько календарей Google, которые я хотел бы объединить и разместить на своем рабочем столе Windows, используя Samurize. Я попытался использовать Samurize's Scrapper для плагина, но, похоже, это не проблема.Слияние нескольких каналов Календаря Google для отображения на моем рабочем столе

Я могу получить Samurize для запуска сценария и разместить его на рабочем столе, но я не уверен , какие лучшие инструменты для этого.

Все URL, у меня есть имеют вид:

http://www.google.com/calendar/feeds/example%40gmail.com/private-REMOVED/basic?futureevents=true&orderby=starttime&sortorder=ascending&singleevents=true 

Так что я мог принести их с помощью завиток, но мне нужно фильтровать их.

Я хочу что-то, что выглядит как:

2009 12 02 Event from calendar 1's description 
2009 12 03 Event from calendar 2's description 
2009 12 04 Event from calendar 1's description 
2009 12 05 Event from calendar 3's description 
2009 12 06 Event from calendar 1's description 

Однако даты в календаре каналы отформатированы, как это:

<title type='html'>Event from calendar 1's description</title><summary type='html'>When: Fri 5 Dec 2008&lt;br&gt; 

Так как я отфильтровывать даты и описания, и конвертировать даты?

(У меня установлен cygwin, поэтому что-то с помощью perl или sed/awk было бы идеальным, поскольку я достаточно знаком с ними, что буду уверенно изменить их в будущем, но я открыт для предложений.)

+0

Спасибо Джоэл, по какой-то причине Firefox не запомнит проверку орфографии ввода Title, и я только предположил, что это было. – 2008-12-02 22:18:47

ответ

1

Основываясь на сценарии Джона W в этом является то, что я с использованием

#!c:\cygwin\bin\perl.exe -w 
use strict; 
use LWP::Simple qw(get); 

my %calendars = ("Sam Hasler", "http://www.google.com/calendar/feeds/blah/blah/basic" 
       , "Family ", "http://www.google.com/calendar/feeds/blah/blah/basic" 
       , "Work  ", "http://www.google.com/calendar/feeds/blah/blah/basic" 
       ); 

my $params = "?futureevents=true&orderby=starttime&sortorder=ascending&singleevents=true"; 

my %months = ("Jan", "01", "Feb", "02", "Mar", "03", "Apr", "04" 
      , "May", "05", "Jun", "06", "Jul", "07", "Aug", "08" 
      , "Sep", "09", "Oct", "10", "Nov", "11", "Dec", "12"); 

my $calendar_name; 
my $calendar_url; 
my @lines; 

while (($calendar_name, $calendar_url) = each(%calendars)){ 
    my $calendar_data = get "$calendar_url$params"; 
    @lines = split(/\n/, $calendar_data); 

    foreach (@lines) { 
     if (/<title type='html'>([\d\D]*)<\/title><summary type='html'>When: (\S+) (\S+) (\S+) (\S+)&lt;br&gt;/) 
     { 
      my $day = "$3"; 
      if ($3 < 10) { 
       $day = "0$3"; 
      } 

      print "$5 $months{$4} $day\t$calendar_name\t$1\n"; 
     } 
    } 

} 

Я просто подключаю выход через sort, чтобы получить его в порядке.

Обновление: Я преобразовал свой сценарий в плагин и отправил его на веб-сайт Samurize: Merge Google Calendar feeds.

1

Я учусь Perl поэтому, пожалуйста, не смейтесь слишком трудно, но вот что-то, что мог бы получить большую часть пути к разбору:

#!C:\Perl\bin -w 
use strict; 

my %months = ("Jan", "01", "Feb", "02", "Mar", "03", ... etc. etc. ... "Dec", "12"); 

$_ = "<title type='html'>Event from calendar 1's description</title><summary type='html'>When: Fri 5 Dec 2008<br>"; 

if (/<title type='html'>([\d\D]*)<\/title><summary type='html'>When: (\S+) (\S+) (\S+) (\S+)<br>/) 
{ 
    print "$5 $months{$4} $3 $1\n"; 
} 
+0

, который выглядит многообещающим, я попробую и вернусь к вам. – 2008-12-02 22:58:47

+0

Просто не забудьте заполнить остальную часть хэша. ;) – John 2008-12-02 23:00:24

+0

Спасибо, я смог получить то, что сработало именно так, как я этого хотел. См. Мой ответ для сценария, в котором я закончил использование – 2008-12-03 00:25:42

1

Две идеи.

Вы можете использовать Yahoo Pipes (см this article.)

Или, если вы не хотите ждать, пока Yahoo, чтобы обновить свои данные, here скрипт, питона в стадии разработки, чтобы объединить Ical файлы.