Skip to content

Commit d5268f1

Browse files
committed
add feed.atom
1 parent caedf1b commit d5268f1

File tree

2 files changed

+90
-11
lines changed

2 files changed

+90
-11
lines changed

Diff for: cpanfile

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ requires 'Class::Tiny';
44
requires 'Date::Format';
55
requires 'Path::Tiny';
66
requires 'Text::MicroTemplate';
7+
requires 'XML::Atom';
78

89
requires 'Text::Xatena';
910
requires 'Text::Markdown';

Diff for: lib/PerlUsersJP/Builder.pm

+89-11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ use Path::Tiny ();
1010
use Date::Format ();
1111
use Scalar::Util ();
1212
use Text::MicroTemplate;
13+
use XML::Atom::Feed;
14+
use XML::Atom::Entry;
15+
use XML::Atom::Person;
16+
use XML::Atom::Link;
1317

1418
use Text::Xatena;
1519
use Text::Xatena::Inline;
@@ -75,7 +79,7 @@ sub build_entries {
7579
$self->build_categories($src_list);
7680
$self->build_tags($src_list);
7781
#$self->build_sitemap(\@entries);
78-
#$self->build_atom(\@entries);
82+
$self->build_atom_feed($src_list);
7983
}
8084

8185

@@ -126,6 +130,36 @@ sub build_entry {
126130
$self->diag("Created entry $dest\n");
127131
}
128132

133+
# content/foo/bar.txt => /foo/bar
134+
sub entry_url_path {
135+
my ($self, $src) = @_;
136+
137+
my $content_dir = $self->content_dir;
138+
my $path = "$src";
139+
$path =~ s!$content_dir!!;
140+
$path =~ s!\.([^.]+)$!!;
141+
return $path;
142+
}
143+
144+
sub entry_url {
145+
my ($self, $src) = @_;
146+
return "https://perl-users.jp" . $self->entry_url_path($src);
147+
}
148+
149+
sub entry_updated {
150+
my ($self, $src) = @_;
151+
return Date::Format::time2str('%a, %d %b %Y %H:%M:%S %z', $src->stat->mtime);
152+
}
153+
154+
sub entry_published {
155+
my ($self, $src) = @_;
156+
157+
# FIXME
158+
#my $matter = $self->front_matter($src);
159+
#$matter->date
160+
return Date::Format::time2str('%a, %d %b %Y %H:%M:%S %z', $src->stat->mtime);
161+
}
162+
129163
sub entry_text {
130164
my ($self, $src) = @_;
131165
my $matter = $self->front_matter($src);
@@ -273,14 +307,8 @@ sub build_tag {
273307
my $file = Path::Tiny::path($_);
274308
my $matter = $self->front_matter($file);
275309
my $title = $matter->title;
310+
my $href = $self->entry_url_path($file);
276311

277-
# content/foo/bar.txt => /foo/bar
278-
my $href = do {
279-
my $content_dir = $self->content_dir;
280-
my $path = $file =~ s!$content_dir!!r;
281-
my $href = $path =~ s!\.([^.]+)$!!r;
282-
$href;
283-
};
284312
{
285313
file => $file,
286314
matter => $matter,
@@ -308,9 +336,56 @@ sub build_sitemap {
308336
... # TODO
309337
}
310338

311-
sub build_atom {
312-
my ($self, $entries) = @_;
313-
... # TODO
339+
sub build_atom_feed {
340+
my ($self, $src_list) = @_;
341+
342+
my $feed = XML::Atom::Feed->new;
343+
$feed->title('新着記事 - Perl Users JP');
344+
$feed->id('tag:perl-users.jp,2020:/feed');
345+
#$feed->description('Perl Users JPの新着記事');
346+
$feed->link('https://perl-users.jp');
347+
348+
my @sorted = sort { $b->stat->mtime <=> $a->stat->mtime } $src_list->@*;
349+
my @new_src_list = splice @sorted, 0, 10;
350+
for my $src (@new_src_list) {
351+
my $entry = XML::Atom::Entry->new;
352+
353+
my $matter = $self->front_matter($src);
354+
my $path = $self->entry_url_path($src);
355+
356+
$entry->title($matter->title);
357+
$entry->id("tag:perl-users.jp,2020:$path");
358+
$entry->updated($self->entry_updated($src)); # TODO: format
359+
$entry->published($self->entry_published($src)); # TODO: format
360+
$entry->content(
361+
$self->entry_text($src)
362+
);
363+
364+
my $author = XML::Atom::Person->new;
365+
$author->name($matter->author);
366+
$entry->author($author);
367+
368+
my $url = $self->entry_url($src);
369+
#$entry->url($url);
370+
371+
my $link = XML::Atom::Link->new;
372+
$link->type('text/html');
373+
$link->rel('alternate');
374+
$link->href($url);
375+
376+
$feed->add_entry($entry);
377+
}
378+
379+
my $first_src = $new_src_list[0];
380+
$feed->updated($self->entry_updated($first_src));
381+
382+
my $xml = $feed->as_xml;
383+
384+
my $atom_dir = $self->public_dir->child();
385+
my $dest = $atom_dir->child('feed.atom');
386+
$atom_dir->mkpath unless $atom_dir->is_dir;
387+
$dest->spew_utf8($xml);
388+
$self->diag("Created atom $dest\n");
314389
}
315390

316391
sub diag {
@@ -365,6 +440,9 @@ sub format_text {
365440
$parser->html_footer('');
366441
$parser->parse_string_document("=pod\n\n$text");
367442
}
443+
elsif ($format eq 'html') {
444+
return $text;
445+
}
368446
else {
369447
die "unsupported format: $format";
370448
}

0 commit comments

Comments
 (0)