Skip to content

Commit 84a614a

Browse files
Adds a new tag-forbid-attr rule (#101)
* Adds a new tag-forbid-attr rule * Adds a description for tag-forbid-attr * Update list-of-rules.md
1 parent 7b90860 commit 84a614a

File tree

3 files changed

+81
-2
lines changed

3 files changed

+81
-2
lines changed

docs/list-of-rules.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@
2121
| [htmlacademy/no-px-size](../rules/no-px-size/README.md) | Атрибуты `width` и `height` содержат только цифры, без единиц измерения |
2222
| [htmlacademy/req-charset-utf](../rules/req-charset-utf/README.md) | Требует `UTF-8` для `<meta charset="">` |
2323
| [htmlacademy/req-head-styles](../rules/req-head-styles/README.md) | Запрещает подключение стилей вне `<head>` |
24-
| [htmlacademy/req-mailto](../rules/req-mailto/README.md) | Требует `mailto:` для ссылок c email-текстом |
24+
| [htmlacademy/req-mailto](../rules/req-mailto/README.md) | Требует `mailto:` для ссылок c email-текстом |
2525
| [htmlacademy/req-meta-viewport](../rules/req-meta-viewport/README.md) | Проверяет наличие `<meta name="viewport" content="width=device-width,initial-scale=1">` в `<head>` |
2626
| [htmlacademy/req-single-styles](../rules/req-single-styles/README.md) | Разрешает не более одного `link rel="stylesheet"` в `<head>` |
27-
| [htmlacademy/req-stylesheet-link](../rules/req-stylesheet-link/README.md) | Проверяет наличие `<link rel="stylesheet" href="">` с непустым `href` |
27+
| [htmlacademy/req-stylesheet-link](../rules/req-stylesheet-link/README.md) | Проверяет наличие `<link rel="stylesheet" href="">` с непустым `href` |
2828
| [htmlacademy/section-has-heading](../rules/section-has-heading/README.md) | Требует добавление заголовка любого уровня в `<section>` |
2929
| [htmlacademy/space-between-comments](../rules/space-between-comments/README.md) | Проверят пробелы у комментария `<!-- Это комментарий -->` |
30+
| [htmlacademy/tag-forbid-attr](../rules/tag-forbid-attr/README.md) | Указанные атрибуты должны отсутствовать в указанном теге |
3031
| [htmlacademy/tag-name-lowercase](../rules/tag-name-lowercase/README.md) | Имена тегов должны быть строчными |
3132
| [htmlacademy/tag-req-attr](../rules/tag-req-attr/README.md) | Указанные атрибуты должны присутствовать в указанном теге |
3233
| [htmlacademy/tag-self-close](../rules/tag-self-close/README.md) | Одиночные элементы не должны быть закрыты, `<br>` вместо `<br/>` |

rules/tag-forbid-attr/README.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# htmlacademy/tag-forbid-attr
2+
3+
Если установлено, указанные атрибуты должны отсутствовать в указанном теге.
4+
5+
## true
6+
7+
```json
8+
{
9+
"tag-forbid-attr": [
10+
true,
11+
{
12+
"picture": [
13+
{
14+
"name": "class"
15+
}
16+
],
17+
"body": [
18+
{
19+
"name": "class"
20+
}
21+
]
22+
}
23+
]
24+
}
25+
```
26+
27+
Нарушениями считаются следующие модели:
28+
29+
```html
30+
<body class="page__body">
31+
</body>
32+
```
33+
34+
```html
35+
<picture class="product__image">
36+
<img width="200" height="68" src="" alt="">
37+
</picture>
38+
```
39+
40+
Следующие детали **не** считаются нарушениями:
41+
42+
```html
43+
<body>
44+
ё
45+
</body>
46+
```
47+
48+
```html
49+
<picture>
50+
<img class="product__image" width="200" height="68" src="" alt="">
51+
</picture>
52+
```

rules/tag-forbid-attr/index.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
const { is_tag_node, has_attribute } = require('@linthtml/dom-utils');
3+
4+
const checkForbiddenAttributes = (node, forbiddenAttributes, report) => {
5+
forbiddenAttributes.forEach(({ name }) => {
6+
if (has_attribute(node, name)) {
7+
report({
8+
position: node.loc,
9+
message: `The attribute '${name}' should not be present in the <${node.name}> tag.`
10+
});
11+
}
12+
});
13+
};
14+
15+
module.exports = {
16+
name: 'htmlacademy/tag-forbid-attr',
17+
// eslint-disable-next-line camelcase
18+
lint(node, rule_config, { report }) {
19+
// eslint-disable-next-line camelcase
20+
if (is_tag_node(node) && rule_config[node.name]) {
21+
// eslint-disable-next-line camelcase
22+
const forbiddenAttributes = rule_config[node.name];
23+
checkForbiddenAttributes(node, forbiddenAttributes, report);
24+
}
25+
},
26+
};

0 commit comments

Comments
 (0)