Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
smikitky opened this issue Sep 29, 2020 · 15 comments
Closed
Labels
Type: Bug Bug or Bug fixes

Comments

@smikitky
Copy link

smikitky commented Sep 29, 2020

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の両方でエラー。

多分 b8cdd16#diff-ec1c2f771587857e6319a869c62e2887R36 が原因のような気がします。

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

Ref: #78 / #76

@azu
Copy link
Member

azu commented Sep 29, 2020

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

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

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

/cc @massongit

@azu
Copy link
Member

azu commented Sep 29, 2020

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

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

@azu
Copy link
Member

azu commented Sep 29, 2020

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

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

@azu
Copy link
Member

azu commented Sep 29, 2020

とりあえず、次の文がエラーとならないように 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
Copy link
Author

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

@smikitky
Copy link
Author

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

@massongit
Copy link
Contributor

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

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

@azu
Copy link
Member

azu commented Sep 30, 2020

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

現在の実装は、括弧の中が日本語なら括弧も日本語の全角括弧にするというイメージで実装されていると思います。
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
Copy link
Author

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

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

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

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

@azu
Copy link
Member

azu commented Oct 1, 2020

今までエラーだったものを許容しはじめるのも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ガイドでは全角と半角の間に対するスペースと、かっこ類と隣接する文字の間のスペースのルールがあります。

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

@azu azu reopened this Oct 1, 2020
@smikitky
Copy link
Author

smikitky commented Oct 1, 2020

Wikipediaルールはこれです。

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

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

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

  • true | 'allowHalfWidthWithSpaces': 現在の挙動通り。英字のみ含むカッコは半角を許容し、他の約物が連続するのでない限り半角スペースを入れる。
  • 'strict': 常に全角カッコのみを使う。JTF準拠性を重視するなら将来の major version で true の場合のデフォルト挙動にする。
  • 'allowHalfWidthWithNoSpaces': 英字のみ含むカッコは半角を許容し、周囲のスペースを許容しない。
  • 'allowHalfWidth: 英字のみ含むカッコは半角を許容し、周囲のスペースの有無は気にしない。
  • false: ルールを無効化し半角カッコは常に許容する(他の lint ルールにチェックを任せる場合を含む)

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


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

  • 英文字のみ含む半角カッコを例外として許容しつつ、半角カッコ周囲のスペースの挙動についても例外の一環として現在のリーズナブルな挙動を保つ → 実用性と互換性が保たれるというメリットがある
  • 半角カッコを全部禁止し、半角カッコが欲しい人には別のルールを使わせる → JTF準拠度が高まるというメリットがある
  • 半角カッコを使うかどうかの部分ではJTFに対する例外を認めつつ、半角カッコ周りのスペースの処理に関してはJTFに記載がないとの理由で処理を変える → 半角カッコを使う時点でそもそもJTF準拠ではないにも関わらず実用性と互換性も失われるため、デメリットしかない

@azu
Copy link
Member

azu commented Oct 3, 2020

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

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

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

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

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

  • 4.3.1.丸かっこ() で かっこに隣接する内側または外側が日本語以外なら、例外として半角かっこをエラーにしない
    • 現在は rx`(?:${japaneseRegExp})([\(\)])` という中途半端な実装になっている

現在は これは(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. かっこ類と隣接する文字の間のスペースの有無 の実装の変更と次のようなオプションを加える形はどうでしょうか?

  • "3.3. かっこ類と隣接する文字の間のスペースの有無" を半角かっこを検知する実装にする
    • A (xxx) B みたいなケースをエラーとする
  • 半角かっこのときに外側のスペースを許容するというオプションを作成 (allowOuterHalfParentheses)
    • A (xxx) B みたいなケースをOKとするオプション
  • 半角かっこのときに外側のスペースを必須にするというオプションを作成 (requireOuterHalfParentheses)
    • A(xxx)B みたいなケースをエラーとして
    • A (xxx) B みたいなケースをOKとするオプション(fixに対応できる)
  • allowOuterHalfParentheses をデフォルト値に設定
    • 現在の実装と互換性をたもつため

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


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

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

関連:

@smikitky
Copy link
Author

smikitky commented Oct 4, 2020

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

  • Wikipediaルール等は これらのキーワード(constまたはlet)は のようにカッコ内に1文字でも日本語を含む場合、カッコが全角になります。なので

    4.3.1.丸かっこ() で かっこに隣接する内側または外側が日本語以外なら、例外として半角かっこをエラーにしない

    これは例外としても緩くしすぎのように思います。

  • 4.3.1のこの例外処理は、上記で挙げられている It'sJack-o-lantern のようなJTFルールに対する自明で普遍的な例外ではないと思います。カッコ内容に関わらず全角カッコを使うルールの人も多いと思います(特に雑誌組版系の人など)。4.3.1にも将来デフォルト化することを見据えた strict のオプションはあってもいいかなと思いました。(私個人は必要としていませんが)

  • outer は前置詞ではないので requireOuterHalfParentheses (「外側半角カッコを要求する」)ではなく requireOutsideHalfParentheses (「半角カッコの外側では要求する」)の方が良いと思います。allow~ も同様です。parentheses を parens に省略するのもよく見ます(prettierの arrowParens オプションなど)。

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

@azu
Copy link
Member

azu commented Oct 4, 2020

ありがとうございます。

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

はい。ただし

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

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

@azu
Copy link
Member

azu commented Oct 4, 2020

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Type: Bug Bug or Bug fixes
Projects
None yet
Development

No branches or pull requests

3 participants