LibreOfficeというオープンソースのオフィススイートがあります.オフィススイートを使いたいときにはこれを使うことが多いです.
今回LibreOffice Writerでtextlintを使って日本語文章を校正したいなと思って少し試してみました.
まずLibreOffice Writerからtextlintを呼び出せないか調べましたが方法が見つかりません.
仕方がないのでリアルタイムプレビューは諦めてLibreOffice Writerの文章をプレーンテキストに変換してtextlintにかけることにしました.
LibreOffice Writerのファイルをプレーンテキストに変換
はじめLibreOffice同梱の soffice
コマンドを試しましたがSTDOUTに出力する方法がわかりませんでした.
$ soffice --headless --convert-to "txt:Text (encoded):UTF8" ./test.odt $ cat test.txt Github,youtubeとか 食べれますか?
次にPandocを試しました.STDOUTに出力してくれました.こちらのほうがリソースも少なくて済むでしょうしこちらのほうが良さそうです.
$ pandoc test.odt -t plain Github,youtubeとか 食べれますか?
標準入力からtextlint
Pandocからの出力を直にtextlintに渡してみます.いい感じそうです.
$ pandoc test.odt -t plain | textlint --color --stdin --stdin-filename text.txt text.txt 1:1 ✓ error Github, => GitHub, prh 1:7 ✓ error 全角のピリオドとカンマは使用しません。 jtf-style/1.2.2.ピリオド(.)とカンマ(,) 1:8 ✓ error youtube => YouTube prh 1:16 error 文末が"。"で終わっていません。 ja-technical-writing/ja-no-mixed-period 3:3 error ら抜き言葉を使用しています。 no-dropping-the-ra 3:7 error Disallow to use "?" ja-technical-writing/no-exclamation-question-mark 3:7 ✓ error 疑問符(?)を使用する場合は「全角」で表記します。 jtf-style/4.2.2.疑問符(?) ✖ 7 problems (7 errors, 0 warnings) ✓ 4 fixable problems. Try to run: $ textlint --fix [file]
保存したときに実行する
inotifywaitでLibreOfficeのファイルを監視して保存時に自動的にtextlintが走るようにします.
LibreOfficeの上で編集を行い, Ctrl+s で保存するとinotifywaitが反応して後ろの処理が走りプレーンテキストに変換,textlintでチェックまで動くようになりました.
$ inotifywait test.odt && pandoc test.odt -t plain | textlint --color --stdin --stdin-filename text.txt | aha | xsel -b Setting up watches. Watches established. test.odt OPEN text.txt 1:1 ✓ error Github, => GitHub, prh 1:7 ✓ error 全角のピリオドとカンマは使用しません。 jtf-style/1.2.2.ピリオド(.)とカンマ(,) 1:8 ✓ error youtube => YouTube prh 1:16 error 文末が"。"で終わっていません。 ja-technical-writing/ja-no-mixed-period 3:3 error ら抜き言葉を使用しています。 no-dropping-the-ra 3:7 error Disallow to use "?" ja-technical-writing/no-exclamation-question-mark 3:7 ✓ error 疑問符(?)を使用する場合は「全角」で表記します。 jtf-style/4.2.2.疑問符(?) ✖ 7 problems (7 errors, 0 warnings) ✓ 4 fixable problems. Try to run: $ textlint --fix [file]
無限ループ
無限ループの中に入れて保存のたびに走るようにしました.
$ while true; do inotifywait test.odt && pandoc test.odt -t plain | textlint --color --stdin --stdin-filename text.txt; done
shell script化
一応shell scriptにしておきます.
#!/bin/sh file="$1" if [ ! -r "$file" ]; then echo "file open error." exit 1 fi textfile=$(basename "${file}" .odt) dir=$(dirname "${file}") textfile=${dir}/${textfile}.txt while true do inotifywait "${file}" && pandoc "${file}" -t plain | textlint --color --stdin --stdin-filename "${textfile}" done
環境
$ dpkg-query -W libreoffice-writer pandoc libreoffice-writer 4:24.8.2-2 pandoc 3.1.11.1+ds-2 $ textlint -v v14.2.1 $ lsb_release -dr Description: Debian GNU/Linux trixie/sid Release: n/a $ arch x86_64