ディレクトリとファイル名

Hexo では、 source/_posts のディレクトリ内に、フラットにファイルが置かれる。
もちろん設定で変更できる。

というわけで、変更してみる。

これは調べている時に見た方法で、どこで見たのかはわからなくなってしまった。
よくあることだけど。
改めて検索すると見つからないんだよね…。

_config.yml
1
new_post_name: :year/:month/:day/:title.md

new_post_name は、初期設定は :title.md だけなので、タイトルがそのままファイル名になる。

なお、この設定は hexo new post <title> とした時に、 <title> に書いた文字列がそのままタイトルとされる。

なので、記事を書こうと思ったらタイトルを書かなければならない。
…というのはあんまりじゃないかと思ってタイトル無しでコマンドを実行すると post が指定されたことになるようだ。

ファイル名は後で変更することにしているので、とりあえず post というタイトルで書き始め、あとでタイトルを設定する、というのが、なんとなく良さげな感じに思えてきた。

大体、記事を書いているとタイトルと合わなくなってくるので、タイトルは最後に書きたい派です。

話がそれた。

で、元々、日本語のURLが嫌だったので、WordPressのURLはタイムスタンプで決まるようにしていた。

1
2
# カスタム構造
/%year%/%monthnum%/%day%/%hour%%minute%%second%

まあ、雰囲気で書くと /年/月/日/時分秒 みたいな。

Hexo ではファイルはフラットに置かれるが、URLは/年/月/日/ の配下になるため、URLを想定して 時分秒.md みたいにすると、ファイル名が衝突する可能性が結構高い。

なので、ファイル自体もURLと同じように配置することで衝突を回避することができる。

というわけで、リネームツールも一部変更した。

tools/rename_posts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env perl
use utf8;
use strict;
use warnings;
use Path::Tiny qw(path);
use YAML qw(Load);
use Time::Moment;
my $root = path(__FILE__)->absolute->parent(2);
# 記事を取得
my $posts_dir = path($root, 'source', '_posts');
my $iterator = $posts_dir->iterator(+{recurse => 1});
# 記事から時間を取得して、名称変更
while (my $post = $iterator->()) {
next unless $post->is_file;
my ($yaml) = split /\n---/, $post->slurp_utf8;
my $info = Load($yaml);
my $date = join('T', split(/\s/, $info->{date})) . '+09';
my $tm = Time::Moment->from_string($date);
my $basename = $tm->strftime('%Y/%m/%d/%H%M%S');
my $new_post = path($posts_dir, qq{$basename.md})->absolute;
$new_post->parent->mkpath;
$post->move($new_post->stringify);
}