textlint-ja / textlint-rule-preset-JTF-style

JTF日本語標準スタイルガイド for textlint.
https://efcl.info/2015/10/19/textlint-plugin-JTF-style/
MIT License
188 stars 18 forks source link

英文のみを含む半角カッコに関するv2.3.5でのBreaking Change #79

Closed smikitky closed 4 years ago

smikitky commented 4 years ago

2.3.4から2.3.5にアップグレードして急に大量のエラーが出始めたことで気付いたのですが、英文のみを含む半角カッコに対するエラー検出の挙動が(既に)2.3.5で変わってしまっているようです。2.3.4 までは内部が英文のみの場合は半角カッコが許容されていたのですが、2.3.5 以降ではカッコ内の内容に関わらず文章内に半角カッコが現れると問答無用でエラーとなっています。

これは(全角カッコの中に全角文字)の文章。OK。
これは (English text in half-width parens) です。2.3.5でのみエラー。
これは (半角カッコの中に全角文字) です。2.3.4と2.3.5の両方でエラー。

多分 https://github.com/textlint-ja/textlint-rule-preset-JTF-style/commit/b8cdd16ec0c5ae353b8c84e80a6ed084100a24a3#diff-ec1c2f771587857e6319a869c62e2887R36 が原因のような気がします。

「中身が英文のみの場合は半角カッコ推奨/OK」というのは、そもそも2.3.4までの挙動がそれですし、例えばWikipediaのスタイルもそうなっているなど、JTFはともかく慣習的には現に比較的広く使われているルールだと認識しています。できれば「JTF的には問題ないからこのまま」ではなく、上記の2番目のような例は許容するように直していただけると個人的には助かります。

Ref: #78 / #76

azu commented 4 years ago

78 はまだマージしてないので、意図してない変更ですね。

rx`(?:${japaneseRegExp}.*)([\(\)])`

は元からあるような気がするので、他の正規表現で英語のみでもマッチするようになってしまったのかな?

/cc @massongit

azu commented 4 years ago
- rx`(?:${japaneseRegExp})([\(\)])`
+ rx`(?:${japaneseRegExp}.*)([\(\)])`

.* が増えてたんですね。見落としてた

azu commented 4 years ago

これは (English text in half-width parens) です。2.3.5でのみエラー。

📝 これが2.3.4でエラーにならないのは、中身じゃなくて (xxx) の外側スペースによる判定抜けに見える。

azu commented 4 years ago

とりあえず、次の文がエラーとならないように 2.3.5の変更をrevertした 2.3.6をリリースしました。

これは (English text in half-width parens) です。

Release v2.3.6 · textlint-ja/textlint-rule-preset-JTF-style

smikitky commented 4 years ago

2.3.5で200か所以上出ていたエラーが2.3.6で出なくなることを確認しました。ありがとうございました。

smikitky commented 4 years ago

どうも半角カッコが状況により許容されるという現在の挙動自体が想定外だったということみたいですが、個人的にはその挙動は便利に使っていましたので設定で残ると助かります…。InDesignとか使ってる一般書籍組版系の人は全角に問答無用で統一しがちな印象がありますが、LaTeXとか技術系で英文の多い組版をしている人は、ベースラインに合わせるために中身によって括弧を意図的に使い分けている人も多いと思います。

massongit commented 4 years ago
OK: これは (English text in half-width parens) です。
NG: これは(English text in half-width parens)です。

カッコの前後の空白を無くした状態で英文のみの半角カッコを用いるとエラーになりますが、これは意図した通りの挙動なのかが気になりました。

azu commented 4 years ago

カッコの前後の空白を無くした状態で英文のみの半角カッコを用いるとエラーになりますが、これは意図した通りの挙動なのかが気になりました。

現在の実装は、括弧の中が日本語なら括弧も日本語の全角括弧にするというイメージで実装されていると思います。 JTFの4.3.1.丸かっこ ルールに、前後のスペースについては特に記述されてないので、前後のスペースに依存しない実装となるのが正しいと思います。つまり括弧の中身だけを見る形。

なので

というルールであれば、互換性はありつつ意図した形になる気がします。

NG: これは (日本語) です。
NG: これは(日本語)です。

OK: これは (English text in half-width parens) です。
OK: これは(English text in half-width parens)です。
OK: これは(English text in half-width parens)です。
OK: これは(日本語)です。
OK: これは (日本語) です。
smikitky commented 4 years ago

2.3.4までは以下のものが(意図的かどうかはともかく)エラーでしたが、今後はこれを許容するということでしょうか。

これは(English text in half-width parens)です。

今まで大丈夫だったものをエラーにしているわけではありませんが、今までエラーだったものを許容しはじめるのもBreaking Changeにならないでしょうか。Wikipediaルールとしてはこれは誤りですし、普通の英文のルール的にもスペースを入れるのが当然ではあります。

「JTFガイド無関係だし本パッケージのスコープ外のことなので知ったこっちゃない、スペースがあるとエラーにならないという過去の挙動はあくまでバグだったのだ」という方針でもいいとは思いますし、うちでは別プラグインを立てて解決できると思いますが…。

azu commented 4 years ago

今までエラーだったものを許容しはじめるのもBreaking Changeにならないでしょうか。

この考え方も正しいと思いますが、バグ修正もすべてmajorアップデートしないといけなくなりますね。 Majorアップデートの方が妥当という意見が多いならMajorアップデートでもいいと思います。

普通の英文のルール

このリンク先の話は英文におけるルールであって、 これは(English text in half-width parens)です。 のような全角と半角に対するルールについて書かれているものではないように見えます。

https://ja.wikipedia.org/wiki/Wikipedia:%E8%A1%A8%E8%A8%98%E3%82%AC%E3%82%A4%E3%83%89#%E6%8B%AC%E5%BC%A7%E9%A1%9E

Wikipediaはこの辺でしょうか。

「JTFガイド無関係だし本パッケージのスコープ外のことなので知ったこっちゃない、スペースがあるとエラーにならないという過去の挙動はあくまでバグだったのだ」

4.3.1.丸かっこ のルールの範囲外という話でした。 少なくてもこの4.3.1.丸かっこ ルールで前後のスペースのエラーとするのは責務として不適切だと思います。 JTFガイドでは全角と半角の間に対するスペースと、かっこ類と隣接する文字の間のスペースのルールがあります。

どう解決するのが適切だと思いますか?

smikitky commented 4 years ago

Wikipediaルールはこれです。

  • 括弧の中にいわゆる半角の文字だけがある場合は、いわゆる半角の括弧を用います。
  • いわゆる半角の括弧を用いる場合は、以下の例外を除き、括弧の外側に空白を入れます

「内部が英文のみの場合半角カッコを許容する」という例外は、既にその時点でJTFから逸脱しているものですよね。それでもこの例外は現に有用だし、互換性の問題もあるから例外として残そう、という流れだと認識しています。であれば、JTFの例外部分の挙動をJTFに言及がないことを根拠に変更するというのは、妙ではないでしょうか。元より例外なので言及がないのは当然です。

要するに個人的には現状を認めて当面維持するのでいいと思うのですが、理想的には、4.3.1ルールを true | false だけではなく細分化するようなことを思いつきます(設計思想的にこういうのが無しということでしたら申し訳ありません)。

もちろんJTF準拠を厳密にやるなら、「半角カッコが時々許容されること自体JTF的に全部『バグ』だった」と宣言して上記の strict の挙動だけ残すようなことをしても breaking change ではないと主張はできますし、それでも筋は通っていると思います。(その場合、ユーザである自分はこのルールを単に無効化し、この辺をチェックする別のルールを探すか自作することになると思います。)


(追記) まとめると以下のような感じです。

azu commented 4 years ago

'allowHalfWidthWithNoSpaces': 英字のみ含むカッコは半角を許容し、周囲のスペースを許容しない。

基本的にはルールは例外を許容するオプションを増やせる形として、オプションによってルールと関係していないルールを増やしてしまうのは避けています。 allowHalfWidthWithSpaces の場合は、かっこについて扱うはずの4.3.1.丸かっこ() に対して、スペースを必ず入れるという制約が増えているので、textlint --fix で修正しないと不自然に見えるかもしれないという懸念があります。

現在の実装は、次のような文に対して半角のかっこ()が使用されています。全角のかっこ()を使用してください。というエラーになりますが、スペースを入れる修正はしていないため、これは新しいルール(制約)の追加になります。

これは(English text in half-width parens)です。

そのため、次のような実装に変更したいです。

現在は これは(English text in half-width parens)です。 がエラーと扱われますが、 これを例外としてエラーにしない修正となります。

もし、allowHalfWidthWithSpaces のようなオプションをかっことスペースに関する動作を実装するならば、3.3. かっこ類と隣接する文字の間のスペースの有無で扱う方が適切に思えます。

4.3.1.丸かっこ のルールの範囲外という話でした。 少なくてもこの4.3.1.丸かっこ ルールで前後のスペースのエラーとするのは責務として不適切だと思います。

と書いていたのは、4.3.1.丸かっこ() ではなく3.3. かっこ類と隣接する文字の間のスペースの有無 で扱うのが良いのではないでしょうか?という意図でした。

3.3 の原則では次のようになっています。

3.3.かっこ類と隣接する文字の間のスペースの有無 かっこの外側、内側ともにスペースを入れません

現在の 3.3 実装は、 が 半角かっこを見ていないので、半角かっこの前後のスペースを検知できていないのだと思います。 (これは、4.3.1.丸かっこ() 側で半角かっこを修正しているという前提があるからですね)

この3.3. かっこ類と隣接する文字の間のスペースの有無 の実装の変更と次のようなオプションを加える形はどうでしょうか?

まとめると次のようになります。


書いていて思い出してきたのですが、ルールの実装で日本語以外なら単純に無視するという例外になっていることが多いのは、 日本語の以外の言語での誤検知を減らすためだと思います。 JTFガイドは"外国語から日本語に翻訳する際の日本語表記ガイドライン"なので、日本語以外(英語やフランス語などいろいろな言語)の文字列が文中に混ざってきた場合に、それをエラーとしてしまうと誤検知を起こしやすくなってしまいます。 たとえば、() の外側にスペースを入れない英語ではない言語が存在する可能性を考慮したり、Page(s) のようなケースなど、言語の数だけ対応しないといけない可能性がでてきてしまいます。 (スペースを半角かっこの外側に入れる場合には、Wikipediaのルールで規定されているような例外をすべて実装しないといけません)

そのため、文が日本語なら(japaneseRegExpにマッチするなら)、JTFガイドのルールに合うように修正する実装にしていたんだと思います。

関連:

smikitky commented 4 years ago

概ね良い方針のように思いました。いくつか。

azu commented 4 years ago

ありがとうございます。

* 現在の挙動は `allowOuterHalfParentheses` よりも `requireOuterHalfParentheses` に近くないでしょうか(意図的ではないにせよ)

はい。ただし

現在の実装は、次のような文に対して半角のかっこ()が使用されています。全角のかっこ()を使用してください。というエラーになります

というエラーになっているので スペースを要求していると解釈するのは難しい気がしますね ただの誤検知だと思います。

azu commented 4 years ago

大まかな方針は問題なさそうであるため、 #81 の方にあらためて対応するIssueを作成しました。

タイトルと話題が異なるので、こちらのIssueの方はCloseします。続きは #81 の方でよろしくおねがいします。