diff --git a/src/parser/htmlScanner.ts b/src/parser/htmlScanner.ts index 80f45db..69cf50c 100644 --- a/src/parser/htmlScanner.ts +++ b/src/parser/htmlScanner.ts @@ -172,7 +172,7 @@ export function createScanner(input: string, initialOffset = 0, initialState: Sc let lastTypeValue: string | undefined; function nextElementName(): string { - return stream.advanceIfRegExp(/^[_:\w][_:\w-.\d]*/).toLowerCase(); + return stream.advanceIfRegExp(/^[_:\w][_:\w.\d-]*/).toLowerCase(); } function nextAttributeName(): string { diff --git a/src/test/scanner.test.ts b/src/test/scanner.test.ts index 93b2558..0928a12 100644 --- a/src/test/scanner.test.ts +++ b/src/test/scanner.test.ts @@ -831,4 +831,49 @@ suite('HTML Scanner', () => { }]); }); + test('Tag with Hyphenated Name (Vue custom element)', () => { + assertTokens([{ + input: 'content', + tokens: [ + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 's-c-feature' }, + { offset: 12, type: TokenType.StartTagClose }, + { offset: 13, type: TokenType.Content }, + { offset: 20, type: TokenType.EndTagOpen }, + { offset: 22, type: TokenType.EndTag, content: 's-c-feature' }, + { offset: 33, type: TokenType.EndTagClose } + ] + } + ]); + }); + + test('Self-closing Tag with Hyphenated Name', () => { + assertTokens([{ + input: '', + tokens: [ + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'my-component' }, + { offset: 13, type: TokenType.Whitespace }, + { offset: 14, type: TokenType.StartTagSelfClose } + ] + } + ]); + }); + + test('Tag with Hyphenated Name and Attributes', () => { + assertTokens([{ + input: '', + tokens: [ + { offset: 0, type: TokenType.StartTagOpen }, + { offset: 1, type: TokenType.StartTag, content: 'el-button' }, + { offset: 10, type: TokenType.Whitespace }, + { offset: 11, type: TokenType.AttributeName }, + { offset: 15, type: TokenType.DelimiterAssign }, + { offset: 16, type: TokenType.AttributeValue }, + { offset: 25, type: TokenType.StartTagClose } + ] + } + ]); + }); + }); \ No newline at end of file