1 min read

npm run newpostで記事を作成する

nabeen

Bleda には新規記事作成用の script が付属している。なので、新しく記事を書く時にコピペで作ったり、自前で組んだりすることなく、シュッとファイルを生成することが出来る。

{
  "scripts": {
    "newpost": "node scripts/newPost.js"
  }
}

まぁなければ自分で書くだけなんだけど、こういうのがビルトインで組み込んであるのは、なかなか好感が持てる。

スクリプトの紹介

中身の script 自体は、記事タイトルを引数にとって YAML の部分を定義してファイルに書き出すという、非常にシンプルなものになっている。

const fs = require('fs');
const moment = require('moment');
const slugify = require('@sindresorhus/slugify');

const title = process.argv[2];
const blogdir = './content/posts';
const postDate = moment().format('YYYY-MM-DD HH:mm:ss');

if (!title) {
  console.log('❌  Please specify a post title.');
  return;
}

const basename = `${moment().format('YYYY-MM-DD')}-${slugify(title)}`;

const contents = `---
title: "${title}"
slug:
description: ""
date: ${postDate}
author: bleda-gridsome
tags:
cover:
fullscreen: false
---
`;

fs.writeFile(`${blogdir}/${basename}.md`, contents, () =>
  console.log(`✔ Created ${blogdir}/${basename}.md`)
);

これをこのまま使う、でもいいんだけど、少なくとも僕のユースケースには若干合わず。

例えば、引数はマルチバイトでは渡さないし slug に入れた方がいいよねーとか、全プロパティにデフォルト値は欲しいよねーとか、ファイルは別の場所に作りたいんだよなぁ、とかとか。

スクリプトの修正

ということで、修正したものがこちらです(3 分間クッキング風)。

const fs = require('fs');
const moment = require('moment');
const slugify = require('@sindresorhus/slugify');

const title = process.argv[2];
const blogdir =
  './content/posts/' + moment().format('YYYY') + '/' + moment().format('MM');
const postDate = moment().format('YYYY-MM-DD 00:00:00');

if (!title) {
  console.log('❌  Please specify a post title.');
  return;
}

const basename = `${moment().format('YYYY-MM-DD')}-${slugify(title)}`;

const contents = `---
title: ''
slug: '${title}'
description: ''
date: ${postDate}
author: nabeen
tags: ['']
cover: ''
fullscreen: false
---
`;

fs.writeFile(`${blogdir}/${basename}.md`, contents, () =>
  console.log(`✔ Created ${blogdir}/${basename}.md`)
);

具体的には、以下の部分を変えている。

  • 引数は slug に設定
  • 作成日時は00:00:00に固定
  • ファイルの作成場所を./content/posts/:year/:month/*.mdに変更

これで、こんな感じで叩くだけでシュッと新規記事を書き始めることが出来るようになった。

$ npm run newpost use-create-script

非常に楽でいい。

ちなみにこの記事も上記のスクリプトを使って生成している。

P.S.

昨日から真面目に Gridsome で記事書いたり開発したりしてるんだけど、最初「最高やん!」と思った部分も、意外と細かい部分が気になってきてしまっている。

今はまだ楽しみながら開発出来ているけど、飽きてきた時がこわい。