From b830309052a45b00742f0a5a1b9d98e2423a97f9 Mon Sep 17 00:00:00 2001 From: Akiyo974 Date: Tue, 20 Oct 2026 07:47:00 -0400 Subject: [PATCH] fix(html): support unicode characters in html and xml tag names --- src/Languages/Html/Patterns/HtmlCloseTagPattern.php | 5 ++++- src/Languages/Html/Patterns/HtmlOpenTagPattern.php | 5 ++++- src/Languages/Xml/Patterns/XmlCloseTagPattern.php | 5 ++++- src/Languages/Xml/Patterns/XmlOpenTagPattern.php | 5 ++++- tests/Languages/Html/HtmlLanguageTest.php | 2 ++ tests/Languages/Xml/XmlLanguageTest.php | 2 ++ 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/Languages/Html/Patterns/HtmlCloseTagPattern.php b/src/Languages/Html/Patterns/HtmlCloseTagPattern.php index c8ee301d..ec2fc122 100644 --- a/src/Languages/Html/Patterns/HtmlCloseTagPattern.php +++ b/src/Languages/Html/Patterns/HtmlCloseTagPattern.php @@ -14,7 +14,10 @@ #[PatternTest(input: '', output: 'CamelCase')] #[PatternTest(input: '', output: 'x-hello')] #[PatternTest(input: '', output: 'a')] +#[PatternTest(input: '', output: 'math-α')] +#[PatternTest(input: '', output: 'emotion-😍-emoji')] # The following are not HTML valid +#[PatternTest(input: '', output: null)] #[PatternTest(input: '', output: null)] #[PatternTest(input: '', output: null)] #[PatternTest(input: '', output: null)] @@ -27,7 +30,7 @@ public function getPattern(): string { - return '<\/(?[a-zA-Z][a-zA-Z0-9\-]*(?![:_\.\w]))'; + return '<\/(?[a-zA-Z][a-zA-Z0-9\-\x80-\xFF]*(?![:_\.\w\x80-\xFF]))'; } public function getTokenType(): TokenTypeEnum diff --git a/src/Languages/Html/Patterns/HtmlOpenTagPattern.php b/src/Languages/Html/Patterns/HtmlOpenTagPattern.php index ee7c488d..bb5f9c25 100644 --- a/src/Languages/Html/Patterns/HtmlOpenTagPattern.php +++ b/src/Languages/Html/Patterns/HtmlOpenTagPattern.php @@ -14,7 +14,10 @@ #[PatternTest(input: '', output: 'CamelCase')] #[PatternTest(input: '', output: 'a-component')] #[PatternTest(input: '', output: 'a')] +#[PatternTest(input: '', output: 'math-α')] +#[PatternTest(input: '', output: 'emotion-😍-emoji')] # The following are not HTML valid +#[PatternTest(input: '<αtag>', output: null)] #[PatternTest(input: '<_private>', output: null)] #[PatternTest(input: '', output: null)] #[PatternTest(input: '', output: null)] @@ -27,7 +30,7 @@ public function getPattern(): string { - return '<(?[a-zA-Z][a-zA-Z0-9\-]*(?![:_\.\w]))'; + return '<(?[a-zA-Z][a-zA-Z0-9\-\x80-\xFF]*(?![:_\.\w\x80-\xFF]))'; } public function getTokenType(): TokenTypeEnum diff --git a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php index f784f131..d6033c21 100644 --- a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php @@ -18,6 +18,9 @@ #[PatternTest(input: '', output: 'point.x')] #[PatternTest(input: '', output: 'point_y')] #[PatternTest(input: '', output: '_private')] +#[PatternTest(input: '', output: 'données')] +#[PatternTest(input: '', output: 'élément')] +#[PatternTest(input: '', output: '数据')] # The following are not valid XML tags #[PatternTest(input: '', output: null)] #[PatternTest(input: '', output: null)] @@ -27,7 +30,7 @@ public function getPattern(): string { - return '<\/(?[a-zA-Z_][\w\-\:\.]*)'; + return '<\/(?[a-zA-Z_\x80-\xFF][\w\-\:\.\x80-\xFF]*)'; } public function getTokenType(): TokenTypeEnum diff --git a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php index 0fb7fb8b..3c6b4c28 100644 --- a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php @@ -19,6 +19,9 @@ #[PatternTest(input: '', output: 'point.x')] #[PatternTest(input: '', output: 'point_y')] #[PatternTest(input: '<_private>', output: '_private')] +#[PatternTest(input: '', output: 'données')] +#[PatternTest(input: '<élément>', output: 'élément')] +#[PatternTest(input: '<数据>', output: '数据')] # The following are not valid XML tags #[PatternTest(input: '<1tag>', output: null)] #[PatternTest(input: '<-tag>', output: null)] @@ -28,7 +31,7 @@ public function getPattern(): string { - return '<(?[a-zA-Z_][\w\-\:\.]*)'; + return '<(?[a-zA-Z_\x80-\xFF][\w\-\:\.\x80-\xFF]*)'; } public function getTokenType(): TokenTypeEnum diff --git a/tests/Languages/Html/HtmlLanguageTest.php b/tests/Languages/Html/HtmlLanguageTest.php index 3653fa12..719e50bf 100644 --- a/tests/Languages/Html/HtmlLanguageTest.php +++ b/tests/Languages/Html/HtmlLanguageTest.php @@ -48,6 +48,8 @@ public static function provide_highlight_cases(): iterable <?php foo(); ?> </tag> TXT], + ['', '<math-α></math-α>'], + ['', '<emotion-😍-emoji></emotion-😍-emoji>'], ]; } } diff --git a/tests/Languages/Xml/XmlLanguageTest.php b/tests/Languages/Xml/XmlLanguageTest.php index aa0ed1f4..f423ce23 100644 --- a/tests/Languages/Xml/XmlLanguageTest.php +++ b/tests/Languages/Xml/XmlLanguageTest.php @@ -40,6 +40,8 @@ public static function provide_highlight_cases(): iterable TXT], ["", '<ns:tag><tag></tag></ns:tag>'], ['', '<root xmlns:ns="...">'], + ['1', '<données>1</données>'], + ['<élément>', '<élément></élément>'], ]; } }