Skip to content

Commit ec171ac

Browse files
authoredOct 29, 2021
feat(rules): add empty-tag-not-self-closed rule (#696)
Fixes #311.
1 parent 28069e5 commit ec171ac

6 files changed

+59
-2
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { Rule } from '../types'
2+
3+
export default {
4+
id: 'empty-tag-not-self-closed',
5+
description: 'Empty tags must not use self closed syntax.',
6+
init(parser, reporter) {
7+
const mapEmptyTags = parser.makeMap(
8+
'area,base,basefont,bgsound,br,col,frame,hr,img,input,isindex,link,meta,param,embed,track,command,source,keygen,wbr'
9+
) //HTML 4.01 + HTML 5
10+
11+
parser.addListener('tagstart', (event) => {
12+
const tagName = event.tagName.toLowerCase()
13+
if (mapEmptyTags[tagName] !== undefined) {
14+
if (event.close) {
15+
reporter.error(
16+
`The empty tag : [ ${tagName} ] must not use self closed syntax.`,
17+
event.line,
18+
event.col,
19+
this,
20+
event.raw
21+
)
22+
}
23+
}
24+
})
25+
},
26+
} as Rule

‎src/core/rules/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export { default as srcNotEmpty } from './src-not-empty'
2525
export { default as styleDisabled } from './style-disabled'
2626
export { default as tagPair } from './tag-pair'
2727
export { default as tagSelfClose } from './tag-self-close'
28+
export { default as emptyTagNotSelfClosed } from './empty-tag-not-self-closed'
2829
export { default as tagnameLowercase } from './tagname-lowercase'
2930
export { default as tagnameSpecialChars } from './tagname-specialchars'
3031
export { default as titleRequire } from './title-require'

‎src/core/rules/tag-self-close.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export default {
55
description: 'Empty tags must be self closed.',
66
init(parser, reporter) {
77
const mapEmptyTags = parser.makeMap(
8-
'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed,track,command,source,keygen,wbr'
8+
'area,base,basefont,bgsound,br,col,frame,hr,img,input,isindex,link,meta,param,embed,track,command,source,keygen,wbr'
99
) //HTML 4.01 + HTML 5
1010

1111
parser.addListener('tagstart', (event) => {

‎src/core/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export interface Ruleset {
2020
'attr-whitespace'?: boolean
2121
'doctype-first'?: boolean
2222
'doctype-html5'?: boolean
23+
'empty-tag-not-self-closed'?: boolean
2324
'head-script-disabled'?: boolean
2425
'href-abs-or-rel'?: 'abs' | 'rel'
2526
'id-class-ad-disabled'?: boolean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const expect = require('expect.js')
2+
3+
const HTMLHint = require('../../dist/htmlhint.js').HTMLHint
4+
5+
const ruldId = 'empty-tag-not-self-closed'
6+
const ruleOptions = {}
7+
8+
ruleOptions[ruldId] = true
9+
10+
describe(`Rules: ${ruldId}`, () => {
11+
it('The empty tag no closed should not result in an error', () => {
12+
const code = '<br><img src="test.jpg">'
13+
const messages = HTMLHint.verify(code, ruleOptions)
14+
expect(messages.length).to.be(0)
15+
})
16+
17+
it('Closed empty tag should result in an error', () => {
18+
const code = '<br /><img src="a.jpg"/>'
19+
const messages = HTMLHint.verify(code, ruleOptions)
20+
expect(messages.length).to.be(2)
21+
expect(messages[0].rule.id).to.be(ruldId)
22+
expect(messages[0].line).to.be(1)
23+
expect(messages[0].col).to.be(1)
24+
expect(messages[0].type).to.be('error')
25+
expect(messages[1].rule.id).to.be(ruldId)
26+
expect(messages[1].line).to.be(1)
27+
expect(messages[1].col).to.be(7)
28+
expect(messages[1].type).to.be('error')
29+
})
30+
})

‎test/rules/tag-self-close.spec.js

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ describe(`Rules: ${ruldId}`, () => {
1515
expect(messages[0].rule.id).to.be(ruldId)
1616
expect(messages[0].line).to.be(1)
1717
expect(messages[0].col).to.be(1)
18-
console.log('lll', messages[0].type)
1918
expect(messages[0].type).to.be('warning')
2019
expect(messages[1].rule.id).to.be(ruldId)
2120
expect(messages[1].line).to.be(1)

0 commit comments

Comments
 (0)
Please sign in to comment.