@@ -10,6 +10,10 @@ use Path::Tiny ();
10
10
use Date::Format ();
11
11
use Scalar::Util ();
12
12
use Text::MicroTemplate;
13
+ use XML::Atom::Feed;
14
+ use XML::Atom::Entry;
15
+ use XML::Atom::Person;
16
+ use XML::Atom::Link;
13
17
14
18
use Text::Xatena;
15
19
use Text::Xatena::Inline;
@@ -75,7 +79,7 @@ sub build_entries {
75
79
$self -> build_categories($src_list );
76
80
$self -> build_tags($src_list );
77
81
# $self->build_sitemap(\@entries);
78
- # $self->build_atom(\@entries );
82
+ $self -> build_atom_feed( $src_list );
79
83
}
80
84
81
85
@@ -126,6 +130,36 @@ sub build_entry {
126
130
$self -> diag(" Created entry $dest \n " );
127
131
}
128
132
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
+
129
163
sub entry_text {
130
164
my ($self , $src ) = @_ ;
131
165
my $matter = $self -> front_matter($src );
@@ -273,14 +307,8 @@ sub build_tag {
273
307
my $file = Path::Tiny::path($_ );
274
308
my $matter = $self -> front_matter($file );
275
309
my $title = $matter -> title;
310
+ my $href = $self -> entry_url_path($file );
276
311
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
- };
284
312
{
285
313
file => $file ,
286
314
matter => $matter ,
@@ -308,9 +336,56 @@ sub build_sitemap {
308
336
... # TODO
309
337
}
310
338
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 " );
314
389
}
315
390
316
391
sub diag {
@@ -365,6 +440,9 @@ sub format_text {
365
440
$parser -> html_footer(' ' );
366
441
$parser -> parse_string_document(" =pod\n\n $text " );
367
442
}
443
+ elsif ($format eq ' html' ) {
444
+ return $text ;
445
+ }
368
446
else {
369
447
die " unsupported format: $format " ;
370
448
}
0 commit comments