高機能軽量マークアップ言語をサポートするperl modulino：wini.pmの2021年

# はじめに

2019年末、筆者は新規に高機能軽量マークアップ言語を考案し、それをHTML5に変換するperlスクリプトとしてwini.pmを開発・公開しました。

* [WINI ━ WIKIやMARKDOWNを超えた新しいマークアップ言語 - Qiita](https://qiita.com/doikoji/items/f6139b7d91b48e50dcef)

それから2年たったこの2021年末、大きな改修を施し、wini.pmをver.0からver.1にバージョンアップすることにしました。新たに二つの概念を導入し、それを基盤とした幾つかの重要機能を追加します。

当初の計画では11月末までに作業を完了し、カレンダーの中ではその新機能のご紹介を…と思っていたのですが……。

バグ取りがまだ終わらず＿|￣|○。正式にバージョンアップを宣言するには至っておりません。

そんな次第で本稿は「予告編」ということでご容赦願います。

# そもそもWINIって何だよ

WINIという名称は「WIKIに似た何か」に由来し、つまり「ウィキペディアに代表されるような『サイト』を構築するのに使われる何か」という意味合いです[^1]。以下の二つのどちらかを指しています。
<dl>
<dt>「軽量マークアップ言語」のひとつ（筆者オリジナル）</dt>
<dd>見やすさ・手軽さといった軽量マークアップの利点を維持しつつ、作表をはじめとする複雑多様な内容に対応すべく表現力の大幅強化が図られている。</dd>
<dt>上記の新規軽量マークアップ言語をHTML5に変換するperlスクリプト</dt>
<dd>perlのモジュールとして機能するほか、単体で CLI コマンドとしても実行可能。このように二つの機能を併せ持つスクリプトをModulinoと呼ぶということは、 @hkoba氏によるPerl Advent Calendar 2021の記事『[モジュール兼コマンド（Modulino）とは - モジュール兼コマンド（Modulino - モジュリーノ）再考](https://hkoba.github.io/perl/adv2021-1/book/)』で初めて知りました。
</dl>

[^1]: 開発を始めた当初はwikipediaで使われるWIKI Markupをかなり意識していたので、このような命名となりました。最近は筆者の中でこの情念が薄まり、markdownや各種CMS・SSGからの機能借用（というか模倣）が多くなっていることから、この命名は必ずしも実態に即さなくなっています。

[初版の紹介記事](https://qiita.com/doikoji/items/f6139b7d91b48e50dcef)でも説明しましたが、既存のマークアップ言語の良さは見習いつつも、高い表現力（とくに作表について）と環境設定の容易さを重視して車輪を最発明したのです。

## その何が嬉しい?

何か仕事中に、ややこしいレイアウトとかは度外視でシンプルなHTMLテキストが必要になったことありませんかね。そんなときコマンドラインツールとしてのwini.pmが役に立ちます。

例1: とりあえずhtml, head, bodyの各タグと一通りの書式設定を書きこんだCSSなどの基本的要素を含んだ鋳型用HTMLファイルが欲しい。

```
echo | wini.pm --whole > template.html
```

例2: tsvファイルの中身をHTMLテーブルとして出力したい。

```
 sed 's/^/| /; s/$/ |/; s/\t/ | /g' test.tsv | wini.pm --whole > table.html
```

もっと本格的なhtmlファイル構築ももちろん可能。最初に述べたように、WINIは作表機能を重視して開発されました。あちこちでセルが縦横に融合され箇条書きなテキストがしこたま詰め込まれた複雑怪奇な表がらくらく作成できるのです。

参照: [超複雑な表を超簡単に書く：マークアップ言語WINIの紹介（１） - Qiita](https://qiita.com/doikoji/items/16c2e554980b61610ce8)

# それで何がどうなった

今回のバージョンアップの概略を説明しましょう。

## wini.pmは三位一体スクリプトに進化

これまでのwini.pmは、

* WINIマークアップデータのHTML変換およびその支援に関わる関数群を提供する**モジュール**
* WINIマークアップ→HTML5変換を実現する**フィルタコマンド**

の2つの機能を持つmodulinoでした。

しかし、以下に述べる新機能の導入により、ここに**「サイト全体のデータ」を構築する「静的サイトジェネレータ（[SSG](https://qiita.com/tags/ssg)）」**という機能が付け加えられ、実態は一つだが三つの顔を使い分ける三位一体スクリプトへと進化します。


### 二つの新概念が導入される

ひとつは「変数」の導入。SSGのhugoなどで採用されている機能です。テンプレートの中で文字列の置換データを持たせておいたり、LANG環境変数の値に応じて日付の書式を切り替えたりといった処理ができるようになります。

もうひとつは「セクション」の導入。テキストをその意味的な塊に応じて分割し、それぞれを固有IDが振られたブロックとして管理できるようにします。このブロックのことを「セクション」と呼ぶことにします。各セクションはHTML5に変換される際にデフォルトではsectionタグの中に配置されます。オプション設定でfooter, header, aside, articleなどのタグも適用できるし、相互に自由に入れ子にもできます。これでまずWINIは「セマンティックwebに対応する軽量マークアップ言語」に進化したわけです。

また各セクションは固有の「変数空間」を持つことができます。これにより、日本語主体の文書の中でアブストラクトだけは英文で挿入するなどといった多国語混在のHTMLを作ったり、変数の値に応じてセクションの中身を出力するかしないか切り替えたりといった処理がスムーズにできるようになります。

### さらに新機能がいろいろ追加される

<dl>
<dt>テンプレート置換</dt>
<dd>HUGOなどの 
<a href="https://qiita.com/tags/ssg">SSG</a> の機能を模倣します。つまり、対象WINIファイルを直接HTML化するかわりに、そのデータを鋳型となるHTMLファイルの所定の位置に埋め込んでいくことによって成熟HTMLファイルを生成します。</dd>
<dt> 一括処理</dt>
<dd>これまでのwini.pmは入力元としてたった一つのファイルもしくは標準入力しか受け付けませんでしたが、新バージョンでは、指定ディレクトリ内の全部のソースファイルを一括してHTML変換できるようになります。</dd>
<dt>アドインライブラリのサポート</dt>
<dd>特定の目的に特化したマクロやCSSなどを「アドインパッケージ」としてまとめてwini.pmとは別の.pmファイルに書いておき、それらをour変数を介してwini.pm側に取り込んで利用できるようになります。</dd>
</dl>

# これからどうなる

## マクロとアドインの充実が図られる

まずはLaTeXやwikiマークアップが実現しているような参考文献の管理機能を追加したいと考えています。並行して図表への自動連番付与システムにもう少し手入れが必要でしょう。

また、フォーム用アドインパッケージ、印刷用アドインパッケージ、bootstrap4対応アドインパッケージなどの開発を企画しています。

## 「マークアップ言語」と「modulino」が明確に区別される

軽量マークアップとしてのWINIと、その軽量マークアップの変換ツールとしてのwini.pm。これまでこの二つを混然一体として考案し・開発し、また説明してきたのですが、ここにきてこの二つは明確に分割すべきではないかと考え始めています。

markdownがそうであるように、マークアップ言語としてのWINIはperlモジュールから離れて単体でも使われ、発展していってほしいとの願望が作者の中で強くなってきたのです。また、ちょっといろいろ詰め込み過ぎてWINIの全容がつかみづらくなりつつあり、話を見えやすくするためにも「マークアップ言語」と「変換ツール」を分離するべきではないかと。その場合、マークアップ言語としてのWINIには別の新しい名前を与えたいと考えています。

# 最後に

WINIは筆者自身の仕事上必要となった「HTMLファイル群を効率よく作り出す」ためのツールとして企画され、実際に自分のサイト構築に使いながら開発を続けてきました。サイト構築だけなく、作業日誌もWINIマークアップで書いています。自分でいうのも何ですがかなり使いやすいツールに仕上がりつつあり、日々の作業が快適に進められています。

高機能軽量マークアップ言語をサポートした高機能軽量perl modulinoであるwini.pmをぜひ皆さんにもお試しいただきたく思います。

入手はこちらから:
[GitHub - Koji-Doi/wini: WINI -- wiki-like easy markup language](https://github.com/Koji-Doi/wini)
2021年12月17日現在、masterブランチの「公式バージョン」は`ver. 0 rel. 20210809`。上で説明した新機能はv1ブランチに展開中です。