Word ファイルは less で読むに限る

## optex -Mtextconv

以前、こういう記事を書いた。

https://qiita.com/kaz-utashiro/items/23fd825bd325240592c2

簡単に言うと、Word のファイルを通常のテキストファイルとして扱うことができるというものだ。実際には、Word だけではなくて、PowerPoint や PDF など、様々なファイルタイプにも対応している。というものの、PDF はやはり PDF ビューアで見た方がいいし、テキスト情報を取り出して処理しようとしても、レイアウトによって元の文章のコンテキストが破壊されていて、思ったような結果が得られないことが多い。PowerPoint も似たような感じだ。

その点、Word のファイルからは、テキスト情報を素直に抜き出して良質のデータソースとして利用することができる。パラグラフの途中で改行していないので、プレインテキストのファイルよりも処理しやすいくらいだ。しかも、Word の文書は Word アプリで読んだ方がいいかというとそうでもない。起動に時間がかかるし、ドキュメントビューアとしてはイマイチだし、余計な機能がゴチャゴチャ付いててうるさい。第一、僕の MacBook には Word のアプリなんか入ってないのだ。だから Pages が立ち上がるわけだが、これがまたどうも冴えない。

`optex` の `textconv` モジュールを使うと、Word のファイルをテキストファイルと同じように扱うことができる。たとえば、

```sh
optex -Mtextconv less foo.docx
```

とするだけで、ファイルの中身を less で見ることができる。`-Mtextconv` が長すぎれば `-Mtc` でもいい。僕は

```
alias tc='optex -Mtextconv'
```

という alias を作っているので、実行したいコマンドの最初に `tc` を付けるだけでなんでもできる。なんなら、less で直接 docx ファイルを開けるように設定することもできる[^optex-less]。

[^optex-less]: `optex --ln less` すると `~/.optex.d/bin/less` というシンボリックリンクが作られる。このディレクトリを `PATH` に入れて、`~/.optex.d/less.rc` の中に `option --tc -Mtextconv $<move>` という行を入れておくと less で `--tc` オプションが使えるようになる。さらに、`option default --tc` を追加すれば、常にそれが有効になる。

[デジ庁のサイト](https://www.digital.go.jp/resources/open_data/)に[オープンデータ基本指針](https://www.digital.go.jp/assets/contents/node/basic_page/field_ref_resources/f7fde41d-ffca-4b2a-9b25-94b8a701a037/20210615_resources_data_guideline_02.docx)というファイルがあるので、これを読むとこんな感じだ。

![スクリーンショット 2023-06-27 12.20.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/b610848e-403f-7f79-86cc-9670c1218ee5.png)

実際には次のようにして、`ansicolumn -DPC2` というコマンドを使って2カラムに表示している。こうしないと、横長の画面では視線の移動が大きくなって読みにくい。`-D` オプションが指定されていると、禁則処理も行う。

```sh
tc ansicolumn -DPC2 20210615_resources_data_guideline_02.docx | less
```

ここまでは既に書いてきた内容だが、今までと違うのは上の例で赤く色付けした部分だ。これは脚注の番号で、別のコマンドで処理して色付けしてある。

## 脚注対応

`textconv` モジュールは、テキストデータを抜き出して、検索したり校正したりするのが主な用途で、そのまま読むことはあまり考えていなかった。そもそも表やら図やらが含まれていても見えないので実用的ではない。しかし、このような文章だけのドキュメントであれば、PDF で整形した結果を読むよりも、むしろ読みやすくはないだろうか。

読むのが目的なら脚注番号もなければ困るだろうということで、今までは無視していたものを表示するようにした。実際の脚注は、ページではなく文書の最後にまとめて付けられる。

![スクリーンショット 2023-06-27 12.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/c3607ba5-5690-d41a-9131-95c323c2e7ab.png)

脚注番号が2からはじまっているのは、データファイルの中にそう書いてあるからだ。Word で表示すると1からになるが、どういうルールなのか不明だ。

大きな画面があれば、文書全体を表示することもできる。全体を俯瞰して見たい場合には有効だと思う。

![スクリーンショット 2023-06-27 13.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/ce2db4ff-1b47-c807-6558-08e8a05191fe.png)

## XSLT の使用をやめた

今回のリリースで、大きく変更した部分がある。Office ファイルは OOXML という形式の XML ファイルでできていて、textconv モジュールの最初の実装は、そのデータから半ば力づくでデータを抜き出す方式だった。その後、XSLT という XML データを変換するフレームワークがあることがわかったので、同じことを XSLT で実装して、可能であればそちらを実行するようになっていた。

しかし、この XSLT がどうもトラブルの元だ。まず、ライブラリがインストールできない。macOS の場合、標準でインストールされているのでいいのだが、新しいバージョンを入れようとすると失敗する。GitHub Actions のテスト環境でもデカいライブラリをインストールしようとして時間かけた挙句にコケる。

それよりなにより、プログラムがまったく読めない。XML を変換するルールを XML で書こうと決めたのは一体全体どういう了見なんだろうか。見よう見まねで書いてはみたものの、後から読んでもさっぱり理解不能だ。Perl のプログラムも読みにくいと言われるが、そんなレベルではない。そもそも XML が人が読むためのものではないし、ましてや人が書くものではないのだろう。いやいや、XSLT にもこんないい面があるんだという話があったら、どうかご教授願いたい。

今回、脚注を処理するために以前より複雑な処理が必要になったこともあり、XSLT でそれを実装するのは止めて、標準インストールの手順からも外した。というわけで、元の力づくの方法に戻っているが、極めて単純なロジックで実装されていて高速に動作する。だから、処理速度的にはまったく問題はない。

## リポジトリ

https://github.com/kaz-utashiro/optex-textconv

インストールは `cpanm` で。

    cpanm App::optex::textconv

## 関連記事

以前書いたこの環境も最新バージョンに対応しているので、Docker が使えれば手軽に試すことができる。

https://qiita.com/kaz-utashiro/items/1b9e155d6ae0620ab4dd

    cpanm App::Greple::xlate

して

    xlate -C

するだけで、カレントディレクトリをマウントして Docker 上でシェルが立ち上がる。ただ、これだと `cpanm App::optex::textconv` するのと変わらないか。インストールしないで Docker だけで使う方法は記事の中に書いてあるのでよかったらどうぞ。