Skip to content

Commit b8236db

Browse files
Adds htmlacademy/req-stylesheet-link (#94)
* Adds rule * Fix link name
1 parent 401b8bf commit b8236db

File tree

5 files changed

+124
-0
lines changed

5 files changed

+124
-0
lines changed

docs/list-of-rules.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
| [htmlacademy/req-head-styles](../rules/req-head-styles/README.md) | Запрещает подключение стилей вне `<head>` |
2424
| [htmlacademy/req-meta-viewport](../rules/req-meta-viewport/README.md) | Проверяет наличие `<meta name="viewport" content="width=device-width,initial-scale=1">` в `<head>` |
2525
| [htmlacademy/req-single-styles](../rules/req-single-styles/README.md) | Разрешает не более одного `link rel="stylesheet"` в `<head>` |
26+
| [htmlacademy/req-stylesheet-link](../rules/req-stylesheet-link/README.md) | Проверяет наличие `<link rel="stylesheet" href="">` с непустым `href` |
2627
| [htmlacademy/section-has-heading](../rules/section-has-heading/README.md) | Требует добавление заголовка любого уровня в `<section>` |
2728
| [htmlacademy/space-between-comments](../rules/space-between-comments/README.md) | Проверят пробелы у комментария `<!-- Это комментарий -->` |
2829
| [htmlacademy/tag-name-lowercase](../rules/tag-name-lowercase/README.md) | Имена тегов должны быть строчными |

rules/req-stylesheet-link/README.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# htmlacademy/req-stylesheet-link
2+
3+
В `<head>` должны быть подключён файл стилей. Атрибут `href` не должен быть пустым.
4+
5+
Проблемными считаются следующие шаблоны:
6+
```html
7+
<head>
8+
<link rel="stylesheet" href="">
9+
</head>
10+
11+
<head>
12+
<link rel="stylesheet">
13+
</head>
14+
15+
<head>
16+
<link rel="style" href="styles/style.css">
17+
</head>
18+
```
19+
20+
Следующие шаблоны **не** считаются проблемами:
21+
```html
22+
<head>
23+
<link rel="stylesheet" href="styles/styles.css">
24+
</head>
25+
26+
<head>
27+
<link rel="stylesheet" href="styles/style.css" type="text/css" media="screen,projection">
28+
</head>
29+
30+
<head>
31+
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap">
32+
</head>
33+
```
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<head>
2+
</head>
3+
4+
<head>
5+
<link href="style.css">
6+
</head>
7+
8+
<head>
9+
<link rel="stylesheet">
10+
</head>
11+
12+
<head>
13+
<link rel="style" href="style.css">
14+
</head>
15+
16+
<head>
17+
<link rel="stylesheet" href="">
18+
</head>
19+
20+
<head>
21+
<title>My Page</title>
22+
<meta charset="UTF-8">
23+
</head>
24+
25+
<head>
26+
<link rel="icon" href="favicon.ico">
27+
</head>
28+
29+
30+
<head>
31+
</head>
32+
<body>
33+
<link rel="stylesheet" href="style.css">
34+
</body>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<head>
2+
<link rel="stylesheet" href="style.css">
3+
</head>
4+
5+
<head>
6+
<link rel="stylesheet" href="https://example.com/style.css">
7+
</head>
8+
9+
<head>
10+
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap">
11+
</head>
12+
13+
<head>
14+
<link rel="stylesheet" href="/css/style.css">
15+
</head>
16+
17+
<head>
18+
<link rel="stylesheet" href="print.css" media="print">
19+
</head>
20+
21+
<head>
22+
<link rel="stylesheet" href="style.css" type="text/css" media="screen,projection">
23+
</head>
24+
25+
<head>
26+
<link rel="stylesheet" href="style.css">
27+
<link rel="stylesheet" href="tablet.css" media="(min-width: 768px)">
28+
<link rel="stylesheet" href="desktop.css" media="(min-width: 1024px)">
29+
</head>
30+
31+
<head>
32+
<link rel="preload" href="style.css" as="style" onload="this.rel='stylesheet'">
33+
<noscript><link rel="stylesheet" href="style.css"></noscript>
34+
</head>

rules/req-stylesheet-link/index.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
'use strict';
2+
// eslint-disable-next-line camelcase
3+
const { is_tag_node, attribute_has_value, has_non_empty_attribute } = require('@linthtml/dom-utils');
4+
5+
module.exports = {
6+
name: 'htmlacademy/req-stylesheet-link',
7+
// eslint-disable-next-line camelcase
8+
lint(node, rule_config, { report }) {
9+
if (is_tag_node(node) && node.name === 'head') {
10+
const styles = node.children.filter((child) =>
11+
child.name === 'link' && attribute_has_value(child, 'rel', 'stylesheet') && has_non_empty_attribute(child, 'href')
12+
);
13+
14+
if (styles.length === 0) {
15+
report({
16+
position: node.loc,
17+
message: 'The <link> tag with rel="stylesheet" and a non-empty href attribute is missing.',
18+
});
19+
}
20+
}
21+
}
22+
};

0 commit comments

Comments
 (0)