PHPでiCalendarなデータをパースする

Pocket

PukiWikiにGoogleカレンダーのデータを表示したかったんだけど、それらしいプラグインがいまいち見つからなかったので自前で書くことにした。

Googleカレンダーでicsファイルへのリンクを取得して、それをプラグインで読み込んで、あとはてきとうにパースして整形して〜と思っていたけど、パース書くの面倒だなぁと思ってぐぐったら、File_IMCを使えば良いようなので使うことにした。

File_IMCはPearを通してインストールする…がPearもデフォルトでは入っていないのでインストールしよう。

環境はUbuntu 16.04.2

$ sudo apt-get install php-pear
$ pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.4.0 stable
Console_Getopt 1.4.1 stable
PEAR 1.10.1 stable
PEAR_Manpages 1.10.0 stable
Structures_Graph 1.1.1 stable
XML_Util 1.3.0 stable
$ pear install File_IMC
Failed to download pear/File_IMC within preferred state "stable", latest release is version 0.5.0, stability "beta", use "channel://pear.php.net/File_IMC-0.5.0" to install
install failed
$ pear install File_IMC-0.5.0 [Ret:1 16:11:41]
Cannot install, php_dir for channel "pear.php.net" is not writeable by the current user
$ sudo pear install File_IMC-0.5.0 [Ret:1 16:11:54]
downloading File_IMC-0.5.0.tgz ...
Starting to download File_IMC-0.5.0.tgz (32,161 bytes)
.....done: 32,161 bytes
install ok: channel://pear.php.net/File_IMC-0.5.0

以上でFile_IMCのインストールはおしまい。

 

使ってみる。

require_once('File/IMC.php');
$ical = file_get_contents('うんたらかんたら.ics');
$parse = File_IMC::parse('vCalendar');
$parse->fromText($ical);
$events = $parse->getEvents();

$data = array();
while ($events->valid()) {
$event = $events->current();
$data[] = array(
'start' => $event->getStart(),
'end' => $event->getEnd(),
'summary' => $event->getSummary(),
'description' => $event->getDescription()
);
$events->next();
}

print_r($data);

startの値でソートしたければ、

foreach((array) $data as $key => $value) {
$sort[$key] = $value['start'];
}
array_multisort($sort, SORT_ASC, $data);

 

あとはてきとうに整形するなりなんなりでいいんだけど…Googleカレンダーでは場所情報が記録できるのに、File_IMCにgetLocation()つーメソッドは無い。

見たとこイベント開始/終了時刻、タイトル(summary)、詳細(description)しか拾えないっぽいので強引になんとかしてやるぜ!

/usr/share/php/File/IMC/Parse/Vcalendar/Event.phpに各メソッドが記述されているので、これをそれらしく書き換えればなんとかなるのでは?

というわけで下記コードをてきとうに追加

public function getLocation()
{
return $this->data['LOCATION'][0]['value'][0][0];
}

あとは同じ感覚で$event->getLocation()とかすれば拾い出せるはず。

PHP欠片も勉強しないで触ってもなんとかなるもんだね(目的のプラグインが作れたので)

まーセキュリティは何も考えてないんですけど

お茶漬け

たまーに飲み屋で食べるお茶漬けめちゃウマい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です