多分動くと思うからリリースしようぜ

というわけで、かねてよりやりたかった小説掲載先を個人サイトに切り替えるを達成すべく 半(なかば)文庫 というサイトを作りました。

これにともなって、なろう、カクヨムからは作品を引き上げてあります。なろう、カクヨムでお付き合いいただいた方にはあらためて感謝を。これまでありがとうございました。

名前

基本的に完結してないし自身の筆力もずっと発展途上なので「道半ばの文」という意味を込めて「半文」、そんな「半文」を納める「文庫」で「半文庫」です。たまたま .co*1 があったのでよかったね。

技術的な話

ホスティングサービスはいつもどおり Firebase Hosting です。完全に静的ビルドされた HTML をただ Firebase Hosting にデプロイしているだけです。

静的ビルドには 11ty を使っています。出力されるのは SPA でもなんでもない普通の HTML です。小説の各話ページは大半が本文なので、DOM 部分書き換えも HTML 全書き換えもたいして差がないと思うし、これでじゅうぶんに速いです。

ウェブフォントを使っていますが、静的ビルドされた HTML から自動的に使っている文字の一覧を吐き出して該当文字だけのサブセットを生成してこれをデプロイしています。本文用の標準書体で 1MB 切るので実用の範囲内ですね。作品が増えると多少変わるかもしれないですが、だとしてフルセットのフォントよりは効率的なのでこれでいいと思います。ローカルでの開発中はいちいちサブセット化していられないのでデプロイ直前の本番ビルド時だけ実行します。これはそこそこ時間がかかるので、できれば誤脱みたいな細かいところでビルドし直ししたくないですね。

原稿用のテキストフォーマット

以前作った Lazri のパーサを Peggy.js で書き直したことで、Lazri 形式のファイルを原稿として扱えるようになりました。当時の時点で見出しとセクション区切り、ルビ、傍点くらいしかサポートしてなかったですが、小説ならこれで足りるだろう思っています。

ただ、黄昏フォークロアの冒頭にあるような引用文は段落全体をインデントしたいと思っていたので、半角スペース8個でインデントされた行はインデントブロックとして扱うルールを追加しました。ついでに、半角スペース16個でインデントされた行を右寄せブロックとして扱うルールも追加しています。

あとは箇条書きとかほしい気はしますが、小説本文は HTML の li 要素の箇条書きじゃなくて普通にテキストでいい気はしますね。特に順序付きリストの場合、頭の数字も含めて表現になると思いますし。段落の字下げを p 要素のインデントではなく全角スペースを使うようにしているのも同じ理由です。

なんで Markdown じゃないかというと、Markdown和文でなく欧文を前提とした仕様になっているからです。たとえば改行の取り扱いは和文向きではなく(このはてなブログも形式段落を作ろうと思ったら強制改行が必要)、方言によってはこの挙動を切り替えられますが、どこでどの方言を使っているのか意識しながら書くのは無理です。だったら最初から Markdown ではなく和文向きに改行は改行として扱うフォーマットのほうがいいじゃん。後は欧文だと気にしないといけないようなことは和文だと無視できることが多いです。半角記号類は小説ではあまり使わないのでこういうものはマークアップ用の記号としてがんがん使ってよい。記号それ自体を使いたいときだけエスケープするようにすればよいわけです。という割り切った実装ができるので、Markdown を選択肢から外したのにはそれなりに理由がありますよ、という。

本文の CSS

ルビと傍点はブラウザ任せではなく、inline-flex でちゃんとスタイルを書き直しています。行間にルビが収まりきらないと行間が拡張されるんだけど、たとえば Chrome ではルビのサイズは 10px 以下にはできないので本文が 20px 未満だと確実に行間が揃わなくなります。というわけで自前でスタイルを書きました。十年前は flex なかったから position 使って無理やり位置揃えたりしていましたが、flex あれば均等割り付けもできるしすべての文字を flex で配置したほうがいいのではないかとさえ思ってしまった。

掲載作品

短めの話がまだ上がってなかったりしますが、一話完結の話をどういうフォルダ構造で配置するのがいいのかよくわからない、短編が増えるとトップページの作品一覧が膨らむ、などの理由でまだ作業中です。まあもともとそんなに読まれていた作品ではないのであまり急いでないです。

あと各作品の公開日は以前は基本的にその投稿サイトに投稿した日になっていたんですが、それは書いた時期からの乖離が激しいので、今回の移行にあわせて初出時の日付で扱うことにしました。たとえば朱襦は第二回東方紅楼夢で頒布した作品なので2006年の11月になっています。今のところ手元にある他人に読んでもらって大丈夫なレベルの作品は朱襦が最古なので、半文庫のコピーライトの年表記もこれに準じて2006年にしてあります。作品ごとに変えた方がいいような気はするし、ウェブサイトという著作物のコピーライトとしては適切ではないとも思うので、そのへんちょっと考えたいところですね。作品のコピーライトとサイトのコピーライトを併記するみたいな感じがいいのかも。

そういえば黄昏フォークロアの公開日が直ってないので後で直す予定。

この後の予定

作品の続きを書く前に、小説を読むときのフォントについて書体を変えたりサイズを変えたりできるようにしたいのと、各作品ごとに読んだところにしおりを挟めるようにしたいと思っています。このへんの設定はブラウザの localStorage に保存します。サーバに保存したりはしません。

あと欧文フォントは別のフォントにしたいですね。Libre Baskerville が OFL で使えるのでこのあたりが候補です。

ちなみに作品の続きを書いても特に更新通知とかはしないです。積極的に読んでもらいたいんだったらふつうに小説投稿サイトを使うのであって、そうではなくて積極的に読んでもらうつもりがなくて自サイトにひきこもろうというモチベーションなので、作品についてもそういう方針になります。不便にはなりますが、思い出したときに覗いてみて更新されてたら読むくらいの感じでいいと思います。

*1:コロンビアの国別tld