Closed smikitky closed 4 years ago
rx`(?:${japaneseRegExp}.*)([\(\)])`
は元からあるような気がするので、他の正規表現で英語のみでもマッチするようになってしまったのかな?
/cc @massongit
- rx`(?:${japaneseRegExp})([\(\)])`
+ rx`(?:${japaneseRegExp}.*)([\(\)])`
.*
が増えてたんですね。見落としてた
これは (English text in half-width parens) です。2.3.5でのみエラー。
📝 これが2.3.4でエラーにならないのは、中身じゃなくて (xxx)
の外側スペースによる判定抜けに見える。
とりあえず、次の文がエラーとならないように 2.3.5の変更をrevertした 2.3.6をリリースしました。
これは (English text in half-width parens) です。
2.3.5で200か所以上出ていたエラーが2.3.6で出なくなることを確認しました。ありがとうございました。
どうも半角カッコが状況により許容されるという現在の挙動自体が想定外だったということみたいですが、個人的にはその挙動は便利に使っていましたので設定で残ると助かります…。InDesignとか使ってる一般書籍組版系の人は全角に問答無用で統一しがちな印象がありますが、LaTeXとか技術系で英文の多い組版をしている人は、ベースラインに合わせるために中身によって括弧を意図的に使い分けている人も多いと思います。
OK: これは (English text in half-width parens) です。
NG: これは(English text in half-width parens)です。
カッコの前後の空白を無くした状態で英文のみの半角カッコを用いるとエラーになりますが、これは意図した通りの挙動なのかが気になりました。
カッコの前後の空白を無くした状態で英文のみの半角カッコを用いるとエラーになりますが、これは意図した通りの挙動なのかが気になりました。
現在の実装は、括弧の中が日本語なら括弧も日本語の全角括弧にするというイメージで実装されていると思います。 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: これは (日本語) です。
2.3.4までは以下のものが(意図的かどうかはともかく)エラーでしたが、今後はこれを許容するということでしょうか。
これは(English text in half-width parens)です。
今まで大丈夫だったものをエラーにしているわけではありませんが、今までエラーだったものを許容しはじめるのもBreaking Changeにならないでしょうか。Wikipediaルールとしてはこれは誤りですし、普通の英文のルール的にもスペースを入れるのが当然ではあります。
「JTFガイド無関係だし本パッケージのスコープ外のことなので知ったこっちゃない、スペースがあるとエラーにならないという過去の挙動はあくまでバグだったのだ」という方針でもいいとは思いますし、うちでは別プラグインを立てて解決できると思いますが…。
今までエラーだったものを許容しはじめるのもBreaking Changeにならないでしょうか。
この考え方も正しいと思いますが、バグ修正もすべてmajorアップデートしないといけなくなりますね。 Majorアップデートの方が妥当という意見が多いならMajorアップデートでもいいと思います。
このリンク先の話は英文におけるルールであって、 これは(English text in half-width parens)です。
のような全角と半角に対するルールについて書かれているものではないように見えます。
Wikipediaはこの辺でしょうか。
「JTFガイド無関係だし本パッケージのスコープ外のことなので知ったこっちゃない、スペースがあるとエラーにならないという過去の挙動はあくまでバグだったのだ」
4.3.1.丸かっこ のルールの範囲外という話でした。 少なくてもこの4.3.1.丸かっこ ルールで前後のスペースのエラーとするのは責務として不適切だと思います。 JTFガイドでは全角と半角の間に対するスペースと、かっこ類と隣接する文字の間のスペースのルールがあります。
どう解決するのが適切だと思いますか?
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 ではないと主張はできますし、それでも筋は通っていると思います。(その場合、ユーザである自分はこのルールを単に無効化し、この辺をチェックする別のルールを探すか自作することになると思います。)
(追記) まとめると以下のような感じです。
'allowHalfWidthWithNoSpaces': 英字のみ含むカッコは半角を許容し、周囲のスペースを許容しない。
基本的にはルールは例外を許容するオプションを増やせる形として、オプションによってルールと関係していないルールを増やしてしまうのは避けています。
allowHalfWidthWithSpaces
の場合は、かっこについて扱うはずの4.3.1.丸かっこ() に対して、スペースを必ず入れるという制約が増えているので、textlint --fix
で修正しないと不自然に見えるかもしれないという懸念があります。
現在の実装は、次のような文に対して半角のかっこ()が使用されています。全角のかっこ()を使用してください。
というエラーになりますが、スペースを入れる修正はしていないため、これは新しいルール(制約)の追加になります。
これは(English text in half-width parens)です。
そのため、次のような実装に変更したいです。
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. かっこ類と隣接する文字の間のスペースの有無 の実装の変更と次のようなオプションを加える形はどうでしょうか?
A (xxx) B
みたいなケースをエラーとするallowOuterHalfParentheses
)
A (xxx) B
みたいなケースをOKとするオプションrequireOuterHalfParentheses
)
A(xxx)B
みたいなケースをエラーとしてA (xxx) B
みたいなケースをOKとするオプション(fixに対応できる)allowOuterHalfParentheses
をデフォルト値に設定
まとめると次のようになります。
allowOuterHalfParentheses
?) するrequireOuterHalfParentheses
?) するallowOuterHalfParentheses
?) をデフォルト値に設定
書いていて思い出してきたのですが、ルールの実装で日本語以外なら単純に無視するという例外になっていることが多いのは、
日本語の以外の言語での誤検知を減らすためだと思います。
JTFガイドは"外国語から日本語に翻訳する際の日本語表記ガイドライン"なので、日本語以外(英語やフランス語などいろいろな言語)の文字列が文中に混ざってきた場合に、それをエラーとしてしまうと誤検知を起こしやすくなってしまいます。
たとえば、(
と )
の外側にスペースを入れない英語ではない言語が存在する可能性を考慮したり、Page(s)
のようなケースなど、言語の数だけ対応しないといけない可能性がでてきてしまいます。
(スペースを半角かっこの外側に入れる場合には、Wikipediaのルールで規定されているような例外をすべて実装しないといけません)
そのため、文が日本語なら(japaneseRegExp
にマッチするなら)、JTFガイドのルールに合うように修正する実装にしていたんだと思います。
関連:
概ね良い方針のように思いました。いくつか。
Wikipediaルール等は これらのキーワード(constまたはlet)は
のようにカッコ内に1文字でも日本語を含む場合、カッコが全角になります。なので
4.3.1.丸かっこ() で かっこに隣接する内側または外側が日本語以外なら、例外として半角かっこをエラーにしない
これは例外としても緩くしすぎのように思います。
4.3.1のこの例外処理は、上記で挙げられている It's
や Jack-o-lantern
のようなJTFルールに対する自明で普遍的な例外ではないと思います。カッコ内容に関わらず全角カッコを使うルールの人も多いと思います(特に雑誌組版系の人など)。4.3.1にも将来デフォルト化することを見据えた strict
のオプションはあってもいいかなと思いました。(私個人は必要としていませんが)
outer は前置詞ではないので requireOuterHalfParentheses
(「外側半角カッコを要求する」)ではなく requireOutsideHalfParentheses
(「半角カッコの外側では要求する」)の方が良いと思います。allow~
も同様です。parentheses を parens に省略するのもよく見ます(prettierの arrowParens
オプションなど)。
現在の挙動は allowOuterHalfParentheses
よりも requireOuterHalfParentheses
に近くないでしょうか(意図的ではないにせよ)
ありがとうございます。
* 現在の挙動は `allowOuterHalfParentheses` よりも `requireOuterHalfParentheses` に近くないでしょうか(意図的ではないにせよ)
はい。ただし
現在の実装は、次のような文に対して
半角のかっこ()が使用されています。全角のかっこ()を使用してください。
というエラーになります
というエラーになっているので スペースを要求していると解釈するのは難しい気がしますね ただの誤検知だと思います。
大まかな方針は問題なさそうであるため、 #81 の方にあらためて対応するIssueを作成しました。
タイトルと話題が異なるので、こちらのIssueの方はCloseします。続きは #81 の方でよろしくおねがいします。
2.3.4から2.3.5にアップグレードして急に大量のエラーが出始めたことで気付いたのですが、英文のみを含む半角カッコに対するエラー検出の挙動が(既に)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