OSDN Git Service

a801a45d98cf6cd097a24fdd3027156dd38855d6
[mubot4fb/mubot4fb.git] / lib / Mubot4FB / Atom.pm
1 #!/usr/bin/perl
2 #
3 # Copyright (c) 2012 ISHIKAWA Mutsumi <ishikawa@hanzubon.jp>
4 # This program is covered by the GNU General Public License 2
5 #
6 package Mubot4FB::Atom;
7 use strict;
8 use utf8;
9
10 use XML::Atom::Feed;
11 use XML::Atom::Entry;
12 use XML::Atom::Link;
13 use POSIX qw/strftime/;
14
15 sub new {
16         my ($proto, $cfg) = @_;
17         my $class = ref $proto || $proto;
18         my $self = {cfg => $cfg, feed => XML::Atom::Feed->new( Version => '1.0' )};
19         bless $self, $class;
20
21         $self->init();
22         return $self;
23 }
24
25 sub init {
26         my ($me) = @_;
27
28         $me->{feed}->title($me->{cfg}->{atom}->{title} ? $me->{cfg}->{atom}->{title} : 'unknown');
29         $me->{feed}->id($me->{cfg}->{atom}->{id_base});
30         $me->{feed}->updated(strftime("%Y-%m-%dT%H:%M:%SZ", gmtime));
31         $me->{feed}->author($me->{cfg}->{atom}->{author} ? $me->{cfg}->{atom}->{author} : 'unknown');
32
33         my $html_link = XML::Atom::Link->new;
34         $html_link->type('text/html');
35         $html_link->rel('alternate');
36         $html_link->href($me->{cfg}->{fb_page_url});
37         $me->{feed}->add_link($html_link);
38
39         my $self_link = XML::Atom::Link->new;
40         $self_link->type('application/atom+xml');
41         $self_link->rel('self');
42         $self_link->href($me->{cfg}->{atom}->{url});
43         $me->{feed}->add_link($self_link);
44
45         my $hub_link = XML::Atom::Link->new;
46         $hub_link->rel('hub');
47         $hub_link->href($me->{cfg}->{hub});
48         $me->{feed}->add_link($hub_link);
49
50         return $me->{feed};
51 }
52
53 sub add_entry {
54         my ($me, $data) = @_;
55
56         my $entry = XML::Atom::Entry->new;
57         foreach my $i ('id', 'title', 'content', 'published', 'summary', 'updated', 'auther', 'issued') {
58                 $entry->$i($data->{$i}) if (defined $data->{$i});
59         }
60         if (defined $data->{link}) {
61                 my $links = ref $data->{link} eq 'ARRAY' ? $data->{link} : [$data->{link}];
62                 foreach my $l (@$links) {
63                         my $link = XML::Atom::Link->new;
64                         $link->href($l);
65                         $entry->add_link($link);
66                 }
67         }
68
69         $me->{feed}->add_entry($entry);
70         return $me->{feed};
71 }
72
73 sub as_xml {
74         my ($me) = @_;
75         return $me->{feed}->as_xml;
76 }
77
78 sub print {
79         my ($me, $fh) = @_;
80
81         if (defined $fh) {
82             print $fh $me->{feed}->as_xml;
83         } else {
84             print $me->{feed}->as_xml;
85         }
86 }
87
88 1;