diff --git a/pygments/lexers/configs.py b/pygments/lexers/configs.py index 241623d3aa..8b67ebafd4 100644 --- a/pygments/lexers/configs.py +++ b/pygments/lexers/configs.py @@ -302,8 +302,10 @@ class ApacheConfLexer(RegexLexer): 'root': [ (r'\s+', Text), (r'#(.*\\\n)+.*$|(#.*?)$', Comment), - (r'(<[^\s>]+)(?:(\s+)(.*))?(>)', + (r'(<[^\s>/][^\s>]*)(?:(\s+)(.*))?(>)', bygroups(Name.Tag, Text, String, Name.Tag)), + (r'(]+)(>)', + bygroups(Name.Tag, Name.Tag)), (r'[a-z]\w*', Name.Builtin, 'value'), (r'\.+', Text), ], diff --git a/tests/test_apache_conf.py b/tests/test_apache_conf.py index 4ec33936e3..a19cb84288 100644 --- a/tests/test_apache_conf.py +++ b/tests/test_apache_conf.py @@ -99,3 +99,36 @@ def test_fix_lock_absolute_path(lexer): (Token.Text, '\n'), ] assert list(lexer.get_tokens(fragment)) == tokens + +def test_normal_scoped_directive(lexer): + fragment = '\n' + tokens = [ + (Token.Name.Tag, ''), + (Token.Text, '\n'), + (Token.Name.Tag, ''), + (Token.Text, '\n') + ] + assert list(lexer.get_tokens(fragment)) == tokens + +def test_malformed_scoped_directive_closing_tag(lexer): + fragment = '\n' + tokens = [ + (Token.Name.Tag, ''), + (Token.Text, '\n'), + (Token.Error, '<'), + (Token.Error, '/'), + (Token.Name.Builtin, 'VirtualHost'), + (Token.Text, ''), + (Token.Text, '\n'), + (Token.Error, '>'), + (Token.Text, '\n') + ] + assert list(lexer.get_tokens(fragment)) == tokens +