From 0d76a8216e151a45065f5c5d4557db928f8b08a8 Mon Sep 17 00:00:00 2001 From: Adrien Furnari Date: Thu, 12 Feb 2026 11:43:25 +0100 Subject: [PATCH 1/8] fix(xml): for attribute, allowing single quote and whitespaces around the equal sign --- src/Languages/Xml/Patterns/XmlAttributePattern.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Languages/Xml/Patterns/XmlAttributePattern.php b/src/Languages/Xml/Patterns/XmlAttributePattern.php index b9454a7..7dc5eca 100644 --- a/src/Languages/Xml/Patterns/XmlAttributePattern.php +++ b/src/Languages/Xml/Patterns/XmlAttributePattern.php @@ -13,13 +13,24 @@ #[PatternTest(input: '', output: 'href')] #[PatternTest(input: '', output: 'data-type')] #[PatternTest(input: '', output: 'xmlns:xsl')] +#[PatternTest(input: "", output: 'attr')] +#[PatternTest(input: '', output: 'id')] +#[PatternTest(input: '', output: 'type')] +#[PatternTest(input: '', output: 'a')] final readonly class XmlAttributePattern implements Pattern { use IsPattern; public function getPattern(): string { - return '(?[\w\-\:]+)="'; + return '(?[\w\-\:]+)\s*=\s*["\']'; } public function getTokenType(): TokenTypeEnum From b8832a9f52f59264a803afc423ba16354413380a Mon Sep 17 00:00:00 2001 From: Adrien Furnari Date: Thu, 12 Feb 2026 11:54:21 +0100 Subject: [PATCH 2/8] fix(xml): allowing point char in the tag --- src/Languages/Xml/Patterns/XmlCloseTagPattern.php | 3 ++- src/Languages/Xml/Patterns/XmlOpenTagPattern.php | 3 ++- tests/targets/xml.md | 6 ++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php index b49c413..cf0a70b 100644 --- a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php @@ -12,13 +12,14 @@ #[PatternTest(input: '', output: 'x-hello')] #[PatternTest(input: '', output: 'a')] #[PatternTest(input: '', output: 'ns:tag')] +#[PatternTest(input: '', output: 'point.x')] final readonly class XmlCloseTagPattern implements Pattern { use IsPattern; public function getPattern(): string { - return '<\/(?[\w\-\:]+)'; + return '<\/(?[\w\-\:\.]+)'; } public function getTokenType(): TokenTypeEnum diff --git a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php index 98009fe..b1f5717 100644 --- a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php @@ -13,13 +13,14 @@ #[PatternTest(input: '', output: 'a')] #[PatternTest(input: '
', output: 'br')] #[PatternTest(input: '', output: 'ns:tag')] +#[PatternTest(input: '', output: 'point.x')] final readonly class XmlOpenTagPattern implements Pattern { use IsPattern; public function getPattern(): string { - return '<(?[\w\-\:]+)'; + return '<(?[\w\-\:\.]+)'; } public function getTokenType(): TokenTypeEnum diff --git a/tests/targets/xml.md b/tests/targets/xml.md index 11ac16d..02e678e 100644 --- a/tests/targets/xml.md +++ b/tests/targets/xml.md @@ -51,6 +51,12 @@ + + + 123.45 + 42,15 + + Back to no namespace From 2d657b9d3b15a2a51bf1402af81c32de9152c414 Mon Sep 17 00:00:00 2001 From: Adrien Furnari Date: Thu, 12 Feb 2026 12:01:26 +0100 Subject: [PATCH 3/8] feat(xml): added a test for tag with underscore (already green) --- src/Languages/Xml/Patterns/XmlCloseTagPattern.php | 1 + src/Languages/Xml/Patterns/XmlOpenTagPattern.php | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php index cf0a70b..09cab91 100644 --- a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php @@ -13,6 +13,7 @@ #[PatternTest(input: '
', output: 'a')] #[PatternTest(input: '', output: 'ns:tag')] #[PatternTest(input: '', output: 'point.x')] +#[PatternTest(input: '', output: 'point_y')] final readonly class XmlCloseTagPattern implements Pattern { use IsPattern; diff --git a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php index b1f5717..5483854 100644 --- a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php @@ -14,6 +14,7 @@ #[PatternTest(input: '
', output: 'br')] #[PatternTest(input: '', output: 'ns:tag')] #[PatternTest(input: '', output: 'point.x')] +#[PatternTest(input: '', output: 'point_y')] final readonly class XmlOpenTagPattern implements Pattern { use IsPattern; From e780030d9432465363e89dd70cf455d0f07cde98 Mon Sep 17 00:00:00 2001 From: Adrien Furnari Date: Thu, 12 Feb 2026 12:07:42 +0100 Subject: [PATCH 4/8] feat(xml): added simple tests for "basic" xml tags --- src/Languages/Xml/Patterns/XmlCloseTagPattern.php | 3 +++ src/Languages/Xml/Patterns/XmlOpenTagPattern.php | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php index 09cab91..c5cfe04 100644 --- a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php @@ -9,6 +9,9 @@ use Tempest\Highlight\PatternTest; use Tempest\Highlight\Tokens\TokenTypeEnum; +#[PatternTest(input: '', output: 'simple')] +#[PatternTest(input: '', output: 'UPPERCASE')] +#[PatternTest(input: '', output: 'CamelCase')] #[PatternTest(input: '', output: 'x-hello')] #[PatternTest(input: '', output: 'a')] #[PatternTest(input: '', output: 'ns:tag')] diff --git a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php index 5483854..20fdab8 100644 --- a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php @@ -9,6 +9,9 @@ use Tempest\Highlight\PatternTest; use Tempest\Highlight\Tokens\TokenTypeEnum; +#[PatternTest(input: '', output: 'simple')] +#[PatternTest(input: '', output: 'UPPERCASE')] +#[PatternTest(input: '', output: 'CamelCase')] #[PatternTest(input: '', output: 'x-hello')] #[PatternTest(input: '', output: 'a')] #[PatternTest(input: '
', output: 'br')] From 5297f41f6f786ad54d69a53cf783d441bf4c2f00 Mon Sep 17 00:00:00 2001 From: Adrien Furnari Date: Thu, 12 Feb 2026 13:06:57 +0100 Subject: [PATCH 5/8] feat(xml): handled not allowed patterns and tag starting with underscore --- src/Languages/Xml/Patterns/XmlCloseTagPattern.php | 6 +++++- src/Languages/Xml/Patterns/XmlOpenTagPattern.php | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php index c5cfe04..f784f13 100644 --- a/src/Languages/Xml/Patterns/XmlCloseTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlCloseTagPattern.php @@ -17,13 +17,17 @@ #[PatternTest(input: '', output: 'ns:tag')] #[PatternTest(input: '', output: 'point.x')] #[PatternTest(input: '', output: 'point_y')] +#[PatternTest(input: '', output: '_private')] +# The following are not valid XML tags +#[PatternTest(input: '', output: null)] +#[PatternTest(input: '', output: null)] final readonly class XmlCloseTagPattern implements Pattern { use IsPattern; public function getPattern(): string { - return '<\/(?[\w\-\:\.]+)'; + return '<\/(?[a-zA-Z_][\w\-\:\.]*)'; } public function getTokenType(): TokenTypeEnum diff --git a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php index 20fdab8..0fb7fb8 100644 --- a/src/Languages/Xml/Patterns/XmlOpenTagPattern.php +++ b/src/Languages/Xml/Patterns/XmlOpenTagPattern.php @@ -18,13 +18,17 @@ #[PatternTest(input: '', output: 'ns:tag')] #[PatternTest(input: '', output: 'point.x')] #[PatternTest(input: '', output: 'point_y')] +#[PatternTest(input: '<_private>', output: '_private')] +# The following are not valid XML tags +#[PatternTest(input: '<1tag>', output: null)] +#[PatternTest(input: '<-tag>', output: null)] final readonly class XmlOpenTagPattern implements Pattern { use IsPattern; public function getPattern(): string { - return '<(?[\w\-\:\.]+)'; + return '<(?[a-zA-Z_][\w\-\:\.]*)'; } public function getTokenType(): TokenTypeEnum From bdf23d8233b1ea8d9123b66e5945fc68068147a3 Mon Sep 17 00:00:00 2001 From: Adrien Furnari Date: Thu, 12 Feb 2026 15:14:28 +0100 Subject: [PATCH 6/8] feat(html): implemented a separate Html lang highlighter --- src/Languages/Html/HtmlLanguage.php | 12 ++++- .../Html/Patterns/HtmlAttributePattern.php | 46 +++++++++++++++++++ .../Html/Patterns/HtmlCloseTagPattern.php | 37 +++++++++++++++ .../Html/Patterns/HtmlOpenTagPattern.php | 37 +++++++++++++++ 4 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 src/Languages/Html/Patterns/HtmlAttributePattern.php create mode 100644 src/Languages/Html/Patterns/HtmlCloseTagPattern.php create mode 100644 src/Languages/Html/Patterns/HtmlOpenTagPattern.php diff --git a/src/Languages/Html/HtmlLanguage.php b/src/Languages/Html/HtmlLanguage.php index 41ebf90..bc2a7af 100644 --- a/src/Languages/Html/HtmlLanguage.php +++ b/src/Languages/Html/HtmlLanguage.php @@ -5,14 +5,18 @@ namespace Tempest\Highlight\Languages\Html; use Override; +use Tempest\Highlight\Languages\Base\BaseLanguage; use Tempest\Highlight\Languages\Html\Injections\CssAttributeInHtmlInjection; use Tempest\Highlight\Languages\Html\Injections\CssInHtmlInjection; use Tempest\Highlight\Languages\Html\Injections\JavaScriptInHtmlInjection; use Tempest\Highlight\Languages\Html\Injections\PhpInHtmlInjection; use Tempest\Highlight\Languages\Html\Injections\PhpShortEchoInHtmlInjection; -use Tempest\Highlight\Languages\Xml\XmlLanguage; +use Tempest\Highlight\Languages\Html\Patterns\HtmlAttributePattern; +use Tempest\Highlight\Languages\Html\Patterns\HtmlCloseTagPattern; +use Tempest\Highlight\Languages\Html\Patterns\HtmlOpenTagPattern; +use Tempest\Highlight\Languages\Xml\Patterns\XmlCommentPattern; -class HtmlLanguage extends XmlLanguage +class HtmlLanguage extends BaseLanguage { #[Override] public function getName(): string @@ -38,6 +42,10 @@ public function getPatterns(): array { return [ ...parent::getPatterns(), + new HtmlOpenTagPattern(), + new HtmlCloseTagPattern(), + new HtmlAttributePattern(), + new XmlCommentPattern(), ]; } } diff --git a/src/Languages/Html/Patterns/HtmlAttributePattern.php b/src/Languages/Html/Patterns/HtmlAttributePattern.php new file mode 100644 index 0000000..09c0247 --- /dev/null +++ b/src/Languages/Html/Patterns/HtmlAttributePattern.php @@ -0,0 +1,46 @@ +', output: 'attr')] +#[PatternTest(input: '
', output: 'href')] +#[PatternTest(input: '', output: 'data-type')] +#[PatternTest(input: '', output: 'xmlns:xsl')] +#[PatternTest(input: "", output: 'attr')] +#[PatternTest(input: "", output: 'simple')] +#[PatternTest(input: "", output: 'with-hyphen')] +#[PatternTest(input: "
", output: ['class', 'style'])] +#[PatternTest(input: '', output: 'id')] +#[PatternTest(input: '', output: 'type')] +#[PatternTest(input: '', output: 'a')] +#[PatternTest(input: '

', output: null)] +# Not yet implemented +# #[PatternTest(input: "