From ee3fc4164dc15db78bde54e59a608acce9de8e72 Mon Sep 17 00:00:00 2001 From: Soichiro Miki Date: Fri, 8 Feb 2019 15:54:02 +0900 Subject: [PATCH 1/5] Add custom textlint rule file under `textfile` dir --- package.json | 2 +- textlint/jp-reactjs-org-lint.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 textlint/jp-reactjs-org-lint.js diff --git a/package.json b/package.json index 9dfd80a65..689a82028 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "format:examples": "prettier --config examples/.prettierrc --write \"examples/**/*.js\"", "generate-ids": "node scripts/generateHeadingIDs.js content", "lint": "eslint .", - "lint:text": "textlint content/{docs,home,tutorial,warnings}/*.md", + "lint:text": "textlint --rulesdir=./textlint content/{docs,home,tutorial,warnings}/*.md", "netlify": "yarn --version && rimraf node_modules && yarn install --frozen-lockfile --check-files && yarn build", "nit:source": "prettier --config .prettierrc --list-different \"{gatsby-*.js,{flow-typed,plugins,src}/**/*.js}\"", "nit:examples": "prettier --config examples/.prettierrc --list-different \"examples/**/*.js\"", diff --git a/textlint/jp-reactjs-org-lint.js b/textlint/jp-reactjs-org-lint.js new file mode 100644 index 000000000..4be0fc1d2 --- /dev/null +++ b/textlint/jp-reactjs-org-lint.js @@ -0,0 +1,19 @@ +/** + * @param {RuleContext} context + */ +module.exports = context => { + return { + [context.Syntax.Str]: node => { + const text = context.getSource(node); + const match = /下さい/.exec(text); + if (match) { + context.report( + node, + new context.RuleError( + `「下さい」の代わりに「ください」を使ってください。`, + ), + ); + } + }, + }; +}; From 30abe94da34f6232f8f9aee8598c9c42d6037edd Mon Sep 17 00:00:00 2001 From: Soichiro Miki Date: Sat, 9 Feb 2019 03:35:55 +0900 Subject: [PATCH 2/5] Add local textlint rules regarding spaces --- textlint/jp-reactjs-org-lint.js | 77 ++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/textlint/jp-reactjs-org-lint.js b/textlint/jp-reactjs-org-lint.js index 4be0fc1d2..3cb7c95aa 100644 --- a/textlint/jp-reactjs-org-lint.js +++ b/textlint/jp-reactjs-org-lint.js @@ -1,19 +1,82 @@ -/** - * @param {RuleContext} context - */ +const toString = require('mdast-util-to-string'); + module.exports = context => { return { + // [context.Syntax.Header]: node => {}, + + [context.Syntax.Paragraph]: node => { + // Checks against paragraph-based rules. + + // Convert a paragraph to plain text, stripping any markups + const text = toString(node); + + enforceZenHanSpace(node, text, context); + noHanPunctSpace(node, text, context); + enforceQuestionSpace(node, text, context); + noLineEndSpace(node, text, context); + }, + [context.Syntax.Str]: node => { - const text = context.getSource(node); - const match = /下さい/.exec(text); - if (match) { + const text = toString(node); + const index = text.indexOf(' '); + if (index >= 0) { context.report( node, new context.RuleError( - `「下さい」の代わりに「ください」を使ってください。`, + 'いかなる場合も全角スペースは使用しないでください。', + {index}, ), ); } }, }; }; + +const enforceQuestionSpace = (node, text, context) => { + const markReg = /[!?](\u3000|[A-Za-z0-9]|[\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF]|[ぁ-んァ-ヶ])/; + if (markReg.exec(text)) { + context.report( + node, + new context.RuleError( + '全角の「!」「?」と次の文の間には半角スペースを挿入してください。', + ), + ); + } +}; + +const noHanPunctSpace = (node, text, context) => { + if (/[、。]( |\u3000)/.exec(text)) { + context.report( + node, + new context.RuleError( + '全角の句読点の直後にスペースを入れてはいけません。', + ), + ); + } +}; + +const enforceZenHanSpace = (node, text, context) => { + const hanZen = /[A-Za-z0-9](?:[\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF]|[ぁ-んァ-ヶ])/; + const zenHan = /(?:[\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF]|[ぁ-んァ-ヶ])[A-Za-z0-9]/; + + if (hanZen.exec(text) || zenHan.exec(text)) { + context.report( + node, + new context.RuleError( + '全角文字と半角英数字とが隣接しています。半角スペースを挿入してください。', + ), + ); + } +}; + +const noLineEndSpace = (node, text, context) => { + // This detects a line-end space *only when* the line contains Japanese characters. + const reg = /(?:[\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF]|[ぁ-んァ-ヶ]).?(\s|\u3000)$/; + + if (reg.exec(text)) { + context.report( + node, + new context.RuleError('行末にスペース文字を入れないでください。'), + ); + } +}; From 3d36b215c81a05d5874c4f0ac5e53cdaab57ccbf Mon Sep 17 00:00:00 2001 From: Soichiro Miki Date: Sat, 9 Feb 2019 03:36:10 +0900 Subject: [PATCH 3/5] Fix textlint errors newly detected by the new rules --- content/docs/add-react-to-a-website.md | 12 ++++++------ content/docs/addons-shallow-renderer.md | 2 +- content/docs/components-and-props.md | 6 +++--- content/docs/composition-vs-inheritance.md | 2 +- content/docs/create-a-new-react-app.md | 2 +- content/docs/faq-ajax.md | 4 ++-- content/docs/faq-build.md | 4 ++-- content/docs/forms.md | 10 +++++----- content/docs/fragments.md | 4 ++-- content/docs/handling-events.md | 2 +- content/docs/hooks-effect.md | 22 +++++++++++----------- content/docs/hooks-intro.md | 14 +++++++------- content/docs/hooks-state.md | 12 ++++++------ content/docs/introducing-jsx.md | 4 ++-- content/docs/lifting-state-up.md | 14 +++++++------- content/docs/lists-and-keys.md | 2 +- content/docs/portals.md | 2 +- content/docs/react-without-es6.md | 2 +- content/docs/reference-dom-elements.md | 4 ++-- content/docs/reference-events.md | 8 ++++---- content/docs/reference-glossary.md | 8 ++++---- content/docs/refs-and-the-dom.md | 8 ++++---- content/docs/render-props.md | 6 +++--- content/docs/rendering-elements.md | 2 +- content/docs/state-and-lifecycle.md | 8 ++++---- content/docs/thinking-in-react.md | 14 +++++++------- 26 files changed, 89 insertions(+), 89 deletions(-) diff --git a/content/docs/add-react-to-a-website.md b/content/docs/add-react-to-a-website.md index ec0f78a8d..389836199 100644 --- a/content/docs/add-react-to-a-website.md +++ b/content/docs/add-react-to-a-website.md @@ -25,7 +25,7 @@ React は段階的に導入することができるように最初からデザ 複雑なツール類や事前にインストールしておかなければいけないものはありません。**インターネットへの接続さえあれば、1 分間でこのセクションを終わらせることができます。** -オプション:[お手本をダウンロードする (2KB ZIP圧縮)](https://gist.github.com/gaearon/6668a1f6986742109c00a581ce704605/archive/f6c882b6ae18bde42dcf6fdb751aae93495a2275.zip) +オプション:[お手本をダウンロードする (2KB ZIP 圧縮)](https://gist.github.com/gaearon/6668a1f6986742109c00a581ce704605/archive/f6c882b6ae18bde42dcf6fdb751aae93495a2275.zip) ### ステップ 1:HTML に DOM コンテナを追加する {#step-1-add-a-dom-container-to-the-html} @@ -94,19 +94,19 @@ React の導入についてもっと知るには、次のセクションも見 **[完成したソースコードをみる](https://gist.github.com/gaearon/6668a1f6986742109c00a581ce704605)** -**[完成したソースコードをダウンロードする (2KB ZIP圧縮)](https://gist.github.com/gaearon/6668a1f6986742109c00a581ce704605/archive/f6c882b6ae18bde42dcf6fdb751aae93495a2275.zip)** +**[完成したソースコードをダウンロードする (2KB ZIP 圧縮)](https://gist.github.com/gaearon/6668a1f6986742109c00a581ce704605/archive/f6c882b6ae18bde42dcf6fdb751aae93495a2275.zip)** ### ヒント:コンポーネントを再利用する {#tip-reuse-a-component} -React コンポーネントを HTML ページの一箇所だけではなくいろいろな箇所で使いたくなることがあるかもしれません。そこで「いいね」ボタンを3回繰り返し表示し、さらにそこにちょっとしたデータを渡すプログラムを用意しました。 +React コンポーネントを HTML ページの一箇所だけではなくいろいろな箇所で使いたくなることがあるかもしれません。そこで「いいね」ボタンを 3 回繰り返し表示し、さらにそこにちょっとしたデータを渡すプログラムを用意しました。 [ソースコードをみる](https://gist.github.com/gaearon/faa67b76a6c47adbab04f739cba7ceda) -[ソースコードをダウンロードする (2KB ZIP圧縮)](https://gist.github.com/gaearon/faa67b76a6c47adbab04f739cba7ceda/archive/9d0dd0ee941fea05fd1357502e5aa348abb84c12.zip) +[ソースコードをダウンロードする (2KB ZIP 圧縮)](https://gist.github.com/gaearon/faa67b76a6c47adbab04f739cba7ceda/archive/9d0dd0ee941fea05fd1357502e5aa348abb84c12.zip) >補足 > ->このようなやり方は、主に React を利用する DOM コンテナがページ内でお互いに干渉していない場合において便利な手段です。 React 単体のコードとしては、[コンポーネントを組み合わせる](/docs/components-and-props.html#composing-components) やり方のほうが手軽です。 +>このようなやり方は、主に React を利用する DOM コンテナがページ内でお互いに干渉していない場合において便利な手段です。React 単体のコードとしては、[コンポーネントを組み合わせる](/docs/components-and-props.html#composing-components) やり方のほうが手軽です。 ### ヒント:本番環境用に JavaScript を圧縮する {#tip-minify-javascript-for-production} @@ -176,7 +176,7 @@ JSX をプロジェクトに追加するためには、バンドルツールや > >ここでは **JSX プリプロセッサをインストールするためだけに npm を使っています**。それ以外の用途では必要ありません。React のソースコードもアプリケーションコードも引き続き `