textlint-rule / textlint-rule-sentence-length

textlint rule that limit maximum length of sentence.
MIT License
7 stars 3 forks source link

aタグなどの属性値を無視したい #13

Closed TAKEDA-Takashi closed 5 years ago

TAKEDA-Takashi commented 5 years ago

概要

aタグなどを文章中に含めた場合、そのaタグの属性値なども文字数としてカウントしてしまい、本来の文章よりも長く判定されてしまう。

期待する挙動

タグ自体は無視して、本来のテキスト部分でカウントしてほしい。

再現手順

$ mkdir test-textlint-maxlength && cd $_ && npm init -y
$ npm install -D textlint textlint-rule-sentence-length
$ cat > .textlintrc <<EOS
{
    "rules": {
        "sentence-length": true
    }
}
EOS

$ cat > index.md <<EOS
ではみなさんは、そういうふうに川だと云いわれたり、乳の流れたあとだと云われたりしていたこのぼんやりと白いものがほんとうは何かご承知ですか。

ではみなさんは、そういうふうに川だと云いわれたり、乳の流れたあとだと云われたりしていたこの<a href="https://www.aozora.gr.jp/cards/000081/files/456_15050.html" target="_blank" rel="noopener noreferrer">ぼんやりと白いもの</a>がほんとうは何かご承知ですか。
EOS

$ npx textlint index.md

/path/to/test-textlint-maxlength/index.md
  3:1  error  Line 3 sentence length(184) exceeds the maximum sentence length of 100.
Over 84 characters  sentence-length

✖ 1 problem (1 error, 0 warnings)
azu commented 5 years ago

簡単にやるならばHTMLタグ自体を全部無視ですね(おそらく昔の挙動はこれだった) https://github.com/textlint-rule/textlint-rule-sentence-length/pull/7 あたりで数え方が変わった。

ちゃんとやるならばら、 https://github.com/textlint/textlint-util-to-string がHTML nodeをそのままHTML文字列として返してしまってるので、この辺でHTMLとして表示したときの文字列(ぼんやりと白いもの)をどうにかして取得して返す感じですね。(Markdownの中のHTMLをパースして、表示文字列の位置情報を取得して扱うのが一番良いのだけど、rehypeしかその辺できないのかも。)

https://github.com/textlint/textlint-util-to-string/blob/f52e8713e15f29a0b6c37c826fe78dd05603fbbb/src/StringSource.js#L160-L172

azu commented 5 years ago

https://github.com/textlint-rule/textlint-rule-sentence-length/releases/tag/2.1.2 で修正してみました。

TAKEDA-Takashi commented 5 years ago

修正確認しました! 実際に利用しているのは https://github.com/textlint-ja/textlint-rule-preset-ja-technical-writing なのですが、パッケージの更新はbotで自動化しているみたいなので、反映待ってみます。 ありがとうございました!

azu commented 5 years ago

patchアップデートなので、npm update textlint-rule-sentence-length --depth 3 とかで子パッケージのアップデートができるかもしれないですね。(もしくはnpm rmしてnpm install)