◆ 管理画面のエディタをほとんど使ってないので それなら一切使わなくていいようにできるかも
◆ 普段から別記法で書いて HTML 変換して投稿してたので そのままの形で投稿できるようにしてみる
◆ とりあえず markdown をアップロードして記事はそれを参照して表示時に HTML 化して DOM を作る

普段このブログに投稿する内容を書くときにブログ管理画面のエディタはほとんど使ってません
独自の記法で書いてそれを HTML 化して投稿しています (記法は違うものの扱い的には markdown みたいなものです)
基本的に記事を後から修正することはほぼ無いので その記法のテキストは使い捨てで 投稿したら削除してます
なので少し修正したいとかがあれば標準のエディタで修正するくらいです

別にそれでも困ってなかったのですが ふと直接投稿できるようにして管理画面開かなくていいようにできないかなと思いました
一応 API は用意されていたので 思いつきですが少し試してみました
記法は変換できればなんでもいいので とりあえず一般的な markdown を使うことにしました

ファイルが多くなったのでリポジトリに置いてます
https://gitlab.com/nexpr/ldmd

試すために用意したサブブログはこれです
https://void-0.blog.jp/

試すために作っただけで残す必要はないので いつか消すかもしれません

投稿

リポジトリのルートで↓のようなコマンドを実行することで md ファイルを投稿します

node control.js up articles/00001.md

実際に使うには config.js で投稿先のブログ名や API キーを指定する必要があります

export default {
livedoor_id: "",
blog_name: "",
atom_pub_password: "",
file_manager_password: "",
}

投稿時に HTML 化して HTML として投稿することもできるのですが 今回は生の形式のままサーバに保存して表示時に HTML 化するようにしました
HTML 化して投稿だと HTML の方を直接編集できてしまい 次の更新時に直接編集していた部分が元に戻るということが出てくることがありますからね
あと毎回 HTML 化の処理を通すので後から一括して調整したいときにやりやすいです

markdown だとドキュメントのタイトルや著者みたいなメタデータを書く記法があると思ってましたが これは標準ではなく記法もいくつかあるようで markdown パーサでは対応してないのが多いようです
別のメタデータパーサでメタデータと本文を分離する前処理が必要になるようです
今回は VSCode のプレビューに合わせたくて markdown-it を使っていて このパーサだとサポートしてないみたいだったので メタデータ記法は使わないようにしました
代わりに HTML コメントを使って JSON を入れるという方法にしました

<!--{
"title": "タイトル"
}-->

# h1

テキストテキスト

という感じです

JSON の title が記事タイトルになるようにしています
タグも入れるつもりだったのですが 投稿するための API が古いせいかタグ情報はなくて対応してないみたいでした

ライブドアブログ API

ライブドアブログの API はこの 2 つがあり ファイルマネージャと記事で分かれています

https://help.blogpark.jp/archives/52491176.html
https://help.blogpark.jp/archives/52372407.html

ファイルマネージャの方は比較的新しいので JSON 形式です
ただ リクエストは multipart/form-data を使ってアップロードする必要がありました
面倒だなーと思ったものの 最近の Node.js だと blob を FormData に入れて fetch の body に渡せば細かいところは勝手にやってくれました

const { Blob } = require("buffer")
const fs = require("fs")
const url = `https://livedoor.blogcms.jp/blog/${blog_name}/file_manager/upload`

const form_data = new FormData()
form_data.append("dir_id", dir_id)
form_data.append("name", name)
const blob = new Blob([fs.readFileSync(file_path)])
form_data.append("upload_data", blob)

const result = await fetch(url, {
method: "POST",
headers: {
"X-LDBlog-Token": file_manager_password,
},
body: form_data,
}).then(res => res.json())
console.log(result)

さらに面倒だったのは記事本体の方です
AtomPub というものでした
名前は聞いたことありましたが 使ったことはなく昔のものという印象です
リクエストもレスポンスも XML です
ググってもあまり情報がなく 見つかるのも 10 年以上は前のものでした
この API のリリース時期が 2013 年らしいですし
もっと新しくて使いやすいものにしてほしいですね

実際タグの投稿はできなかったですし 「続きを読む」 に表示する部分の投稿もできません
管理画面で使われる内部 API を使ったほうができることが多くていいのかもしれないです

markdown の理由

ところで markdown にした理由ですが 試しなのでとりあえずというのもそうですが 他にもあったりします
markdown はパーサがいろいろあって 同じソースでも使うところによって異なる HTML になることは少なくないです
他にも機能は少なめだったりと問題点は多いと思います
類似の記法でもっとしっかりとしたものもあるので そこまで流行らず次のがすぐ出るだろうなーくらいに思ってました
しかし それから長く経ちますが相変わらずあちこちで使われています
むしろ使われてるところが増えてきているくらいです

これまで使っていたのは自作の独自記法な分 自由に拡張できるようにして色々機能入れたりしましたが 実際のところほとんど使ってませんし 複雑化しすぎて使い方を覚えてないです
プレビューはできるもののシンタックスハイライトは面倒で用意していないので 長くなってきたり複雑なものになると見づらいです
markdown 記法を使わざるをえない場所にコピペできず書き換えが必要になります
markdown はエディタ (VSCode) 標準で使えてプレビューもできるくらいですし いっそ markdown にしてしまっていいのかなという気もしてきています

終わり

試しに作ってみましたが 思いつきをとりあえず試しただけなので 結局使うかは微妙なところです
内部の記事の扱いや表示方法も変わるので こういう方法にするなら新ブログにしたいです
ただ それならもうライブドアブログにこだわる必要もなく Github や Gitlab の pages など静的ファイルホスティングサービスで良い気もします

それに上の通り markdown に切り替えも考えるところで もし markdown なら Gist とかもっと手軽なものもあります

ですが 一番の問題はサイトが増えていくと後々検索したいときに面倒ということなので なんだかんだこのままの可能性が高いです