eslint-plugin-smarthr 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### [0.4.1](https://github.com/kufu/eslint-plugin-smarthr/compare/v0.4.0...v0.4.1) (2024-02-21)
6
+
7
+
8
+ ### Features
9
+
10
+ * a11y-numbered-text-within-olを追加する ([#105](https://github.com/kufu/eslint-plugin-smarthr/issues/105)) ([167b92f](https://github.com/kufu/eslint-plugin-smarthr/commit/167b92f0f29db8ee9a446d25e09e04a7b11ce340))
11
+ * ComboBoxなどのinputAttributesでtitle属性が指定された場合、擬似的にラベルが付いていると判定するように修正 ([#113](https://github.com/kufu/eslint-plugin-smarthr/issues/113)) ([5f3b594](https://github.com/kufu/eslint-plugin-smarthr/commit/5f3b5943ec64a18d094a9c66627ad1db2bbabe08))
12
+
5
13
  ## [0.4.0](https://github.com/kufu/eslint-plugin-smarthr/compare/v0.3.27...v0.4.0) (2024-02-05)
6
14
 
7
15
 
package/README.md CHANGED
@@ -7,6 +7,7 @@
7
7
  - [a11y-image-has-alt-attribute](https://github.com/kufu/eslint-plugin-smarthr/tree/main/rules/a11y-image-has-alt-attribute)
8
8
  - [a11y-input-has-name-attribute](https://github.com/kufu/eslint-plugin-smarthr/tree/main/rules/a11y-input-has-name-attribute)
9
9
  - [a11y-input-in-form-control](https://github.com/kufu/eslint-plugin-smarthr/tree/main/rules/a11y-input-in-form-control)
10
+ - [a11y-numbered-text-within-ol](https://github.com/kufu/eslint-plugin-smarthr/tree/main/rules/a11y-numbered-text-within-ol)
10
11
  - [a11y-prohibit-input-placeholder](https://github.com/kufu/eslint-plugin-smarthr/tree/main/rules/a11y-prohibit-input-placeholder)
11
12
  - [a11y-prohibit-useless-sectioning-fragment](https://github.com/kufu/eslint-plugin-smarthr/tree/main/rules/a11y-prohibit-useless-sectioning-fragment)
12
13
  - [a11y-trigger-has-button](https://github.com/kufu/eslint-plugin-smarthr/tree/main/rules/a11y-trigger-has-button)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-smarthr",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "author": "SmartHR",
5
5
  "license": "MIT",
6
6
  "description": "A sharable ESLint plugin for SmartHR",
@@ -6,7 +6,9 @@
6
6
  - URL遷移を行う場合、hrefが設定されていないとキーボード操作やコンテキストメニューからの遷移ができなくなります
7
7
  - これらの操作は href属性を参照します
8
8
  - 無効化されたリンクであることを表したい場合 `href={undefined}` を設定してください
9
- - checkTypeオプションに 'smart' を指定することで spread attributeが設定されている場合はcorrectに出来ます。
9
+ - checkTypeオプションに 'smart' を指定することで spread attributeが設定されている場合はcorrectに出来ます
10
+ - react-router-dom packageを利用している場合、a要素にto属性が指定されている場合、href属性が指定されているものとして許容します
11
+ - next/link コンポーネント直下のa要素にhref属性が指定されていないことを許容します
10
12
 
11
13
  ## rules
12
14
 
@@ -63,6 +63,7 @@ const IGNORE_INPUT_CHECK_PARENT_TYPE = /^(Program|ExportNamedDeclaration)$/
63
63
 
64
64
  const findRoleGroup = (a) => a.name?.name === 'role' && a.value.value === 'group'
65
65
  const findAsSectioning = (a) => a.name?.name.match(AS_REGEX) && a.value.value.match(BARE_SECTIONING_TAG_REGEX)
66
+ const findTitle = (i) => i.key.name === 'title'
66
67
 
67
68
  const SCHEMA = [
68
69
  {
@@ -121,6 +122,12 @@ module.exports = {
121
122
  case 'title':
122
123
  isPseudoLabel = true
123
124
  break
125
+ case 'inputAttributes': {
126
+ if (!isPseudoLabel && i.value.expression.type === 'ObjectExpression' && i.value.expression.properties.some(findTitle)) {
127
+ isPseudoLabel = true
128
+ }
129
+ break
130
+ }
124
131
  case 'type':
125
132
  switch (i.value.value) {
126
133
  case 'radio':
@@ -0,0 +1,82 @@
1
+ # smarthr/a11y-numbered-text-within-ol
2
+
3
+ - "1. hoge", "2. fuga" ... のように連番のテキストをもつコンポーネントはol要素でマークアップすることを促すルールです
4
+ - ol要素でマークアップすることで連番テキストをもつ要素同士の関係、順番に意味があることを適切に示すことが出来ます
5
+
6
+ ## rules
7
+
8
+ ```js
9
+ {
10
+ rules: {
11
+ 'smarthr/a11y-numbered-text-within-ol': 'error', // 'warn', 'off',
12
+ },
13
+ }
14
+ ```
15
+
16
+ ## ❌ Incorrect
17
+
18
+ ```jsx
19
+ // ol要素で囲まれていないためNG
20
+ <Any>1. hoge</Any>
21
+ <Any>2. fuga</Any>
22
+
23
+ // 属性でも同様にチェックする
24
+ <Any title="1. hoge" />
25
+ <Any title="2. fuga" />
26
+
27
+ // ol要素内で連番を設定しているとNG
28
+ <OrderedList>
29
+ <li>1. hoge</li>
30
+ <li>2. fuga</li>
31
+ </OrderedList>
32
+
33
+ // 同一のol要素で囲まれていないためNG
34
+ <OrderedList>
35
+ <li>hoge</li>
36
+ </OrderedList>
37
+ <OrderedList>
38
+ <li>fuga</li>
39
+ </OrderedList>>
40
+
41
+ ```
42
+
43
+ ## ✅ Correct
44
+
45
+ ```jsx
46
+ <ol>
47
+ <li>hoge</li>
48
+ <li>fuga</li>
49
+ </ol>
50
+
51
+ <OrderedList>
52
+ <Any title="hoge" />
53
+ <Any title="fuga" />
54
+ </OrderedList>
55
+
56
+ // デフォルトの連番からフォーマット、スタイルを変更したい場合
57
+ // counter-reset + counter-increment で表現する
58
+ // 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)
59
+ <OrderedList>
60
+ <li>
61
+ <NumberedHeading>hoge</NumberedHeading>
62
+ <Any />
63
+ </li>
64
+ <li>
65
+ <NumberedHeading>fuga</NumberedHeading>
66
+ <Any />
67
+ </li>
68
+ </OrderedList>
69
+
70
+ ...
71
+
72
+ const OrderedList = styled.ol`
73
+ list-style: none; // デフォルトのstyleを消す
74
+ counter-reset: hoge; // カウンターの名称。わかりやすいものなら何でもOK
75
+ `
76
+ const NumberedHeading = styled(Heading)`
77
+ &::before {
78
+ counter-increment: hoge; // hogeカウンターを+1する
79
+ content: "No " counter(hoge) ": "; // 表示される連番のフォーマット
80
+ }
81
+ `
82
+ ```
@@ -0,0 +1,134 @@
1
+ const { generateTagFormatter } = require('../../libs/format_styled_components')
2
+
3
+ const EXPECTED_NAMES = {
4
+ '(Ordered(.*)List|^ol)$': '(Ordered(.*)List)$',
5
+ '(S|s)elect$': '(Select)$',
6
+ }
7
+ const UNEXPECTED_NAMES = EXPECTED_NAMES
8
+
9
+ const NUMBERED_TEXT_REGEX = /^[\s\n]*(([1-9])([^1-9]{2})[^\s\n]*)/
10
+ const ORDERED_LIST_REGEX = /(Ordered(.*)List|^ol)$/
11
+ const SELECT_REGEX = /(S|s)elect$/
12
+
13
+ const searchOrderedList = (node) => {
14
+ if (node.type === 'JSXElement' && node.openingElement.name?.name) {
15
+ const name = node.openingElement.name.name
16
+
17
+ if (name.match(ORDERED_LIST_REGEX)) {
18
+ return node.openingElement
19
+ } else if (name.match(SELECT_REGEX)) {
20
+ // HINT: select要素の場合、optionのラベルに連番がついている場合がありえるのでignoreする
21
+ // 通常と処理を分けるためnullではなく0を返す
22
+ return 0
23
+ }
24
+ }
25
+
26
+ if (node.type === 'Program') {
27
+ return null
28
+ }
29
+
30
+ return searchOrderedList(node.parent)
31
+ }
32
+
33
+ const checkNumberedTextInOl = (result, node, context) => {
34
+ if (result) {
35
+ context.report({
36
+ node,
37
+ message: `${result.name.name} 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
38
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
39
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)`,
40
+ })
41
+ }
42
+ }
43
+
44
+ const renderTag = (node) => `\`${node.name.name}="${node.value.value}"\``
45
+ const renderNode = (node, matcher) => node.type === 'JSXText' ? `\`${matcher[1]}\`` : renderTag(node)
46
+
47
+ const SCHEMA = []
48
+
49
+ module.exports = {
50
+ meta: {
51
+ type: 'problem',
52
+ schema: SCHEMA,
53
+ },
54
+ create(context) {
55
+ let firstNumber = 0
56
+ let firstNumberedNode = null
57
+ let firstNumberedMatcher = null
58
+
59
+ function checker(node, matcher) {
60
+ if (matcher) {
61
+ const result = searchOrderedList(node)
62
+
63
+ if (result !== 0) {
64
+ checkNumberedTextInOl(result, node, context)
65
+
66
+ const nowNumber = matcher[2] * 1
67
+
68
+ if (firstNumberedNode && nowNumber !== firstNumber) {
69
+ if (nowNumber === firstNumber + 1) {
70
+ const resultFirst = searchOrderedList(firstNumberedNode)
71
+
72
+ if (!resultFirst) {
73
+ if (!result) {
74
+ context.report({
75
+ node: firstNumberedNode,
76
+ message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
77
+ - ${renderNode(firstNumberedNode, firstNumberedMatcher)} と ${renderNode(node, matcher)} が同じol要素内に存在するように修正してください
78
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります`,
79
+ })
80
+ } else {
81
+ context.report({
82
+ node: firstNumberedNode,
83
+ message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
84
+ - ${renderNode(firstNumberedNode, firstNumberedMatcher)} が ${renderNode(node, matcher)} を囲んでいるol要素内(<${result.name.name}>)に存在するように修正してください
85
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol要素内(<${result.name.name}>)に存在する必要があります`,
86
+ })
87
+ }
88
+ } else {
89
+ if (!result) {
90
+ context.report({
91
+ node,
92
+ message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
93
+ - ${renderNode(node, matcher)} が ${renderNode(firstNumberedNode, firstNumberedMatcher)} を囲んでいるol要素内(<${resultFirst.name.name}>)に存在するように修正してください
94
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol要素内(<${resultFirst.name.name}>)に存在する必要があります`,
95
+ })
96
+
97
+ firstNumberedNode = null
98
+ } else if (resultFirst !== result) {
99
+ context.report({
100
+ node,
101
+ message: `連番を含むテキストが同一のol要素でマークアップされていません。同一のol要素でマークアップすることでリスト内の要素関連性を正しく表せるためマークアップの修正を行ってください。
102
+ - ${renderNode(firstNumberedNode, firstNumberedMatcher)} と ${renderNode(node, matcher)} が同じol要素内に存在するように修正してください
103
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります`,
104
+ })
105
+ }
106
+ }
107
+ }
108
+
109
+ firstNumber = nowNumber
110
+ firstNumberedNode = node
111
+ firstNumberedMatcher = matcher
112
+ } else if (!firstNumberedNode || nowNumber === firstNumber) {
113
+ firstNumber = nowNumber
114
+ firstNumberedNode = node
115
+ firstNumberedMatcher = matcher
116
+ }
117
+ }
118
+ }
119
+ }
120
+
121
+ return {
122
+ ...generateTagFormatter({ context, EXPECTED_NAMES, UNEXPECTED_NAMES }),
123
+ JSXAttribute: (node) => {
124
+ if (node.value?.value) {
125
+ checker(node, node.value.value.match(NUMBERED_TEXT_REGEX))
126
+ }
127
+ },
128
+ JSXText: (node) => {
129
+ checker(node, node.value.match(NUMBERED_TEXT_REGEX))
130
+ },
131
+ }
132
+ },
133
+ }
134
+ module.exports.schema = SCHEMA
@@ -129,6 +129,8 @@ ruleTester.run('a11y-input-in-form-control', rule, {
129
129
  { code: '<HogeFieldset><HogeCheckBox /><HogeInput title="any" /></HogeFieldset>' },
130
130
  { code: '<FugaSection><HogeInput title="any" /></FugaSection>' },
131
131
  { code: '<HogeTextarea title="any" />' },
132
+ { code: '<HogeComboBox inputAttributes={{ title: "any" }} />' },
133
+ { code: '<HogeComboBox inputAttributes={{ title }} />' },
132
134
  { code: '<Fieldset><HogeRadioButtons /></Fieldset>' },
133
135
  { code: '<Fieldset><HogeRadioButtonPanels /></Fieldset>' },
134
136
  { code: '<Fieldset><HogeCheckBoxs /></Fieldset>' },
@@ -154,6 +156,7 @@ ruleTester.run('a11y-input-in-form-control', rule, {
154
156
  { code: '<HogeSelect />', errors: [ { message: noLabeledSelect('HogeSelect') } ] },
155
157
  { code: '<HogeInputFile />', errors: [ { message: noLabeledInput('HogeInputFile') } ] },
156
158
  { code: '<HogeComboBox />', errors: [ { message: noLabeledInput('HogeComboBox') } ] },
159
+ { code: '<HogeComboBox inputAttributes={{ any }} />', errors: [ { message: noLabeledInput('HogeComboBox') } ] },
157
160
  { code: '<HogeDatePicker />', errors: [ { message: noLabeledInput('HogeDatePicker') } ] },
158
161
  { code: '<HogeFormControl><Input type="checkbox" /><Input type="checkbox" /></HogeFormControl>', errors: [ { message: invalidPureCheckboxInFormControl('Input') } ] },
159
162
  { code: '<HogeFormControl><HogeCheckBox /><Input /></HogeFormControl>', errors: [ { message: invalidMultiInputsInFormControl() } ] },
@@ -0,0 +1,111 @@
1
+ const rule = require('../rules/a11y-numbered-text-within-ol')
2
+ const RuleTester = require('eslint').RuleTester
3
+
4
+ const ruleTester = new RuleTester({
5
+ parserOptions: {
6
+ ecmaVersion: 2018,
7
+ ecmaFeatures: {
8
+ experimentalObjectRestSpread: true,
9
+ jsx: true,
10
+ },
11
+ sourceType: 'module',
12
+ },
13
+ })
14
+
15
+ ruleTester.run('a11y-numbered-text-within-ol', rule, {
16
+ valid: [
17
+ { code: `const HogeOrderedFugaList = styled.ol` },
18
+ { code: `const HogeOrderedFugaList = styled(HogeOrderedList)` },
19
+ { code: `<p>1: hoge</p>` },
20
+ { code: `<p title="2. hoge" />` },
21
+ { code: `<><p>2: hoge</p><p>1: hoge</p></>` },
22
+ { code: `<ol><li>abc</li><li>def</li></ol>` },
23
+ { code: `<OrderedList><li>abc</li><li>def</li></OrderedList>` },
24
+ { code: `<Select><optgroup><option value="hoge">1. hoge</option><option value="fuga">2. fuga</option></optgroup></Select>` },
25
+ ],
26
+ invalid: [
27
+ { code: `<><p>1: hoge</p><p>2: hoge</p></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
28
+ - \`1: hoge\` と \`2: hoge\` が同じol要素内に存在するように修正してください
29
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
30
+ { code: `
31
+ <>
32
+ <div>
33
+ 1. abc
34
+ </div>
35
+ <p>
36
+ 2. def
37
+ </p>
38
+ </>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
39
+ - \`1. abc\` と \`2. def\` が同じol要素内に存在するように修正してください
40
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
41
+ { code: `<><p>2: hoge</p><p>1: hoge</p><p>2: hoge</p></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
42
+ - \`1: hoge\` と \`2: hoge\` が同じol要素内に存在するように修正してください
43
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
44
+ { code: `<><p>1: hoge</p><ol><li>2: hoge</li></ol></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
45
+ - \`1: hoge\` が \`2: hoge\` を囲んでいるol要素内(<ol>)に存在するように修正してください
46
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol要素内(<ol>)に存在する必要があります` }, { message: `ol 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
47
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
48
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)` } ] },
49
+ { code: `<><p>1: hoge</p><p title="2. hoge" /></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
50
+ - \`1: hoge\` と \`title="2. hoge"\` が同じol要素内に存在するように修正してください
51
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
52
+ { code: `<><ol><li>1: hoge</li></ol><p>2: hoge</p></>`, errors: [ { message: `ol 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
53
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
54
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)` }, { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
55
+ - \`2: hoge\` が \`1: hoge\` を囲んでいるol要素内(<ol>)に存在するように修正してください
56
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol要素内(<ol>)に存在する必要があります` } ] },
57
+ { code: `<><ol><li>1: hoge</li></ol><ol><li>2: hoge</li></ol></>`, errors: [ { message: `ol 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
58
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
59
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)` }, { message: `ol 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
60
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
61
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)` }, { message: `連番を含むテキストが同一のol要素でマークアップされていません。同一のol要素でマークアップすることでリスト内の要素関連性を正しく表せるためマークアップの修正を行ってください。
62
+ - \`1: hoge\` と \`2: hoge\` が同じol要素内に存在するように修正してください
63
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
64
+ { code: `<><Hoge any="1: hoge" /><Hoge any="2: hoge" /></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
65
+ - \`any="1: hoge"\` と \`any="2: hoge"\` が同じol要素内に存在するように修正してください
66
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
67
+ { code: `<><Hoge any="2: hoge" /><Hoge any="1: hoge" /><Hoge any="2: hoge" /></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
68
+ - \`any="1: hoge"\` と \`any="2: hoge"\` が同じol要素内に存在するように修正してください
69
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
70
+ { code: `<><Hoge any="1: hoge" /><ol><li><Hoge any="2: hoge" /></li></ol></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
71
+ - \`any="1: hoge"\` が \`any="2: hoge"\` を囲んでいるol要素内(<ol>)に存在するように修正してください
72
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol要素内(<ol>)に存在する必要があります` }, { message: `ol 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
73
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
74
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)` } ] },
75
+ { code: `<><ol><li><Hoge any="1: hoge" /></li></ol><Hoge any="2: hoge" /></>`, errors: [ { message: `ol 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
76
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
77
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)` }, { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
78
+ - \`any="2: hoge"\` が \`any="1: hoge"\` を囲んでいるol要素内(<ol>)に存在するように修正してください
79
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol要素内(<ol>)に存在する必要があります` } ] },
80
+ { code: `<><ol><li><Hoge any="1: hoge" /></li></ol><ol><li><Hoge any="2: hoge" /></li></ol></>`, errors: [ { message: `ol 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
81
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
82
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)` }, { message: `ol 内で連番がテキストとして記述されています。連番はol要素で表現できるため、削除してください。
83
+ - ol要素のデフォルトで表示される連番のフォーマット、スタイルから変更したい場合、counter-reset と counter-increment を利用してください
84
+ - 参考: [MDN CSS カウンターの使用](https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters)` }, { message: `連番を含むテキストが同一のol要素でマークアップされていません。同一のol要素でマークアップすることでリスト内の要素関連性を正しく表せるためマークアップの修正を行ってください。
85
+ - \`any="1: hoge"\` と \`any="2: hoge"\` が同じol要素内に存在するように修正してください
86
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
87
+ { code: `<><Hoge any="1: hoge" /><Hoge any="2: hoge" /><Hoge any="3: hoge" /><Hoge any="4: hoge" /></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
88
+ - \`any="1: hoge"\` と \`any="2: hoge"\` が同じol要素内に存在するように修正してください
89
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` }, { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
90
+ - \`any="2: hoge"\` と \`any="3: hoge"\` が同じol要素内に存在するように修正してください
91
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` }, { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
92
+ - \`any="3: hoge"\` と \`any="4: hoge"\` が同じol要素内に存在するように修正してください
93
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
94
+ { code: `<><Hoge any="1: hoge" /><Hoge any="3: hoge" /><Hoge any="4: hoge" /><Hoge any="6: hoge" /></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
95
+ - \`any="3: hoge"\` と \`any="4: hoge"\` が同じol要素内に存在するように修正してください
96
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
97
+ { code: `<><p>1: hoge</p><p>2: hoge</p><p>3: hoge</p><p>4: hoge</p></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
98
+ - \`1: hoge\` と \`2: hoge\` が同じol要素内に存在するように修正してください
99
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` }, { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
100
+ - \`2: hoge\` と \`3: hoge\` が同じol要素内に存在するように修正してください
101
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` }, { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
102
+ - \`3: hoge\` と \`4: hoge\` が同じol要素内に存在するように修正してください
103
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
104
+ { code: `<><p>1: hoge</p><p>3: hoge</p><p>4: hoge</p><p>6: hoge</p></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
105
+ - \`3: hoge\` と \`4: hoge\` が同じol要素内に存在するように修正してください
106
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
107
+ { code: `<><p>3: hoge</p><select><option value="hoge">1: hoge</option></select><p>4: hoge</p></>`, errors: [ { message: `連番を含むテキストがol要素でマークアップされていません。ol要素でマークアップすることで関連する順番に意味のある要素を適切にマークアップできるため以下の方法で修正してください。
108
+ - \`3: hoge\` と \`4: hoge\` が同じol要素内に存在するように修正してください
109
+ - 上記以外にも関連する連番をふくむ要素が存在する場合、それらも同じol内に存在する必要があります` } ] },
110
+ ]
111
+ })