Skip to content

Commit caedf1b

Browse files
authored
Merge pull request #7 from perl-users-jp/tag-page
タグページの用意
2 parents 5060609 + 5644b68 commit caedf1b

File tree

5 files changed

+134
-10
lines changed

5 files changed

+134
-10
lines changed

Diff for: layouts/entry.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
<head>
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6-
<meta name="description" content="<?= $vars->{description} ?>">
7-
<meta name="author" content="<?= $vars->{author} ?>">
6+
<meta name="description" content="<?= $vars->{matter}->description ?>">
7+
<meta name="author" content="<?= $vars->{matter}->author ?>">
88
<title><?= $vars->{subtitle} ? "$vars->{title} - $vars->{subtitle}" : $vars->{title} ?></title>
99
<link rel="icon" href="/img/favicon.ico">
1010
<link href="TODO" rel="stylesheet">
1111
</head>
1212
<body>
1313
<h1><?= $vars->{title} ?></h1>
14+
tag
15+
? for my $tag ($vars->{matter}->tags->@*) {
16+
<a href='<?= "/tag/$tag" ?>'><?= $tag ?></a>
17+
? }
1418

1519
<?= $vars->{text} ?>
1620
<script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js?lang=css&amp;skin=sunburst"></script>

Diff for: layouts/tag.html

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<!doctype html>
2+
<html lang="ja">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6+
<meta name="description" content="<?= $vars->{description} ?>">
7+
<title><?= $vars->{title} ?></title>
8+
<link rel="icon" href="/img/favicon.ico">
9+
<link href="TODO" rel="stylesheet">
10+
</head>
11+
<body>
12+
<h1><?= $vars->{tag} ?></h1>
13+
<ul>
14+
? for (@{$vars->{files}}) {
15+
<li>
16+
<a href="<?= $_->{href} ?>">
17+
<?= $_->{title} ?>
18+
</a>
19+
</li>
20+
? }
21+
</ul>
22+
23+
<a href="/tag">タグ一覧</a>
24+
<a href="/">HOME</a>
25+
26+
</body>
27+
</html>

Diff for: layouts/tag_index.html

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!doctype html>
2+
<html lang="ja">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6+
<meta name="description" content="cription} ?>">
7+
<title>タグ一覧</title>
8+
<link rel="icon" href="/img/favicon.ico">
9+
<link href="TODO" rel="stylesheet">
10+
</head>
11+
<body>
12+
<h1>タグ一覧</h1>
13+
<ul>
14+
? for my $tag (@{$vars->{tags}}) {
15+
<li>
16+
<a href=<?= "/tag/$tag" ?>>
17+
<?= $tag ?>
18+
</a>
19+
</li>
20+
? }
21+
</ul>
22+
23+
<a href="/">HOME</a>
24+
25+
</body>
26+
</html>

Diff for: lib/PerlUsersJP/Builder.pm

+73-7
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ sub build_entries {
7373
}
7474

7575
$self->build_categories($src_list);
76-
# TODO
77-
#$self->build_tags(\@entries);
76+
$self->build_tags($src_list);
7877
#$self->build_sitemap(\@entries);
7978
#$self->build_atom(\@entries);
8079
}
@@ -118,8 +117,7 @@ sub build_entry {
118117
text => $self->entry_text($src),
119118
title => $matter->title,
120119
subtitle => $self->entry_subtitle($src),
121-
author => $matter->author,
122-
description => $matter->description,
120+
matter => $matter,
123121
});
124122
$dest->spew_utf8($html);
125123
$sub_dest->spew_utf8($html) if $sub_dest;
@@ -162,7 +160,8 @@ sub build_categories {
162160
my ($self, $src_list) = @_;
163161

164162
my %src_list_map;
165-
for my $src ($src_list->@*) {
163+
for ($src_list->@*) {
164+
my $src = $_;
166165
my $category = $src->parent;
167166
while ($category ne $self->content_dir) {
168167
$src_list_map{$category}{$src} = 1;
@@ -233,8 +232,75 @@ sub category_description {
233232
}
234233

235234
sub build_tags {
236-
my ($self, $entries) = @_;
237-
... # TODO
235+
my ($self, $src_list) = @_;
236+
237+
my %tag_map;
238+
for my $src ($src_list->@*) {
239+
my $matter = $self->front_matter($src);
240+
next unless $matter->exists;
241+
242+
for my $tag ($matter->tags->@*) {
243+
push $tag_map{$tag}->@*, $src;
244+
}
245+
}
246+
247+
$self->build_tag_index([keys %tag_map]);
248+
249+
for my $tag (keys %tag_map) {
250+
my $src_list = $tag_map{$tag};
251+
$self->build_tag($tag, $src_list);
252+
}
253+
}
254+
255+
sub build_tag_index {
256+
my ($self, $tags) = @_;
257+
258+
my $html = $self->_render_string('tag_index.html', {
259+
tags => [sort { $a cmp $b } $tags->@*],
260+
});
261+
262+
my $tag_dir = $self->public_dir->child('tag');
263+
my $dest = $tag_dir->child('index.html');
264+
$tag_dir->mkpath unless $tag_dir->is_dir;
265+
$dest->spew_utf8($html);
266+
$self->diag("Created tag_list $dest\n");
267+
}
268+
269+
sub build_tag {
270+
my ($self, $tag, $src_list) = @_;
271+
272+
my @src_list = map {
273+
my $file = Path::Tiny::path($_);
274+
my $matter = $self->front_matter($file);
275+
my $title = $matter->title;
276+
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+
{
285+
file => $file,
286+
matter => $matter,
287+
title => $title,
288+
href => $href,
289+
}
290+
} $src_list->@*;
291+
292+
my $html = $self->_render_string('tag.html', {
293+
tag => $tag,
294+
description => $tag,
295+
title => $tag,
296+
files => [ sort { $a->{title} cmp $b->{title} } @src_list ],
297+
});
298+
299+
my $tag_dir = $self->public_dir->child('tag', $tag);
300+
my $dest = $tag_dir->child('index.html');
301+
$tag_dir->mkpath unless $tag_dir->is_dir;
302+
$dest->spew_utf8($html);
303+
$self->diag("Created tag $dest\n");
238304
}
239305

240306
sub build_sitemap {

Diff for: lib/PerlUsersJP/FrontMatter.pm

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,12 @@ sub BUILDARGS {
3535
return {
3636
format => $format,
3737
title => $data->{title} // '',
38+
tags => [], # TODO HTMLでもタグ対応したいね
3839
}
3940
}
4041
else {
4142
my $data = _parse_text_entry($file);
42-
my $tags = $data->{tags} ? [split ',', $data->{tags}] : [];
43+
my $tags = $data->{tags} ? [ grep { $_ } map { s!\s*!!; s!\s*$!!; $_ } split /[,\s]/, $data->{tags} ] : [];
4344

4445
return {
4546
body => $data->{body},

0 commit comments

Comments
 (0)