Skip to content

Commit 0bfbf60

Browse files
committed
fix(toml) Improve key parsing
Fixes: #2594
1 parent adb813c commit 0bfbf60

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

src/languages/ini.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import * as regex from '../lib/regex';
2+
13
/*
24
Language: TOML, also INI
35
Description: TOML aims to be a minimal configuration file format that's easy to read due to obvious semantics.
@@ -54,6 +56,17 @@ export default function(hljs) {
5456
relevance:0
5557
};
5658

59+
var BARE_KEY = /[A-Za-z0-9_-]+/;
60+
var QUOTED_KEY_DOUBLE_QUOTE = /"(\\"|[^"])*"/;
61+
var QUOTED_KEY_SINGLE_QUOTE = /'[^']*'/;
62+
var ANY_KEY = regex.either(
63+
BARE_KEY, QUOTED_KEY_DOUBLE_QUOTE, QUOTED_KEY_SINGLE_QUOTE
64+
);
65+
var DOTTED_KEY = regex.concat(
66+
'(?<=^\s*)', ANY_KEY, '(\s*\.\s*', ANY_KEY, ')+',
67+
regex.lookahead('\s*=\s*')
68+
);
69+
5770
return {
5871
name: 'TOML, also INI',
5972
aliases: ['toml'],
@@ -66,7 +79,7 @@ export default function(hljs) {
6679
begin: /\[+/, end: /\]+/
6780
},
6881
{
69-
begin: /^[a-z0-9\[\]_\.-]+(?=\s*=\s*)/,
82+
begin: DOTTED_KEY,
7083
className: 'attr',
7184
starts: {
7285
end: /$/,

test/markup/ini/keys.expect.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<span class="hljs-comment"># Bare keys:</span>
2+
<span class="hljs-attr">key</span> = <span class="hljs-string">&quot;value&quot;</span>
3+
<span class="hljs-attr">bare_key</span> = <span class="hljs-string">&quot;value&quot;</span>
4+
<span class="hljs-attr">bare-key</span> = <span class="hljs-string">&quot;value&quot;</span>
5+
<span class="hljs-attr">1234</span> = <span class="hljs-string">&quot;value&quot;</span>
6+
7+
<span class="hljs-comment"># Quoted keys:</span>
8+
<span class="hljs-attr">&quot;127.0.0.1&quot;</span> = <span class="hljs-string">&quot;value&quot;</span>
9+
<span class="hljs-attr">&quot;character encoding&quot;</span> = <span class="hljs-string">&quot;value&quot;</span>
10+
<span class="hljs-attr">&quot;ʎǝʞ&quot;</span> = <span class="hljs-string">&quot;value&quot;</span>
11+
<span class="hljs-attr">&#x27;key2&#x27;</span> = <span class="hljs-string">&quot;value&quot;</span>
12+
<span class="hljs-attr">&#x27;quoted &quot;value&quot;&#x27;</span> = <span class="hljs-string">&quot;value&quot;</span>
13+
14+
<span class="hljs-attr">&quot;key \&quot;containing\&quot; backslash&quot;</span> = <span class="hljs-number">6</span>
15+
<span class="hljs-attr">&#x27;key \&quot;containing&quot; backslash\&#x27;</span> = <span class="hljs-number">6</span>
16+
17+
<span class="hljs-comment"># empty quoted key is allowed</span>
18+
<span class="hljs-attr">&quot;&quot;</span> = <span class="hljs-string">&quot;blank&quot;</span> <span class="hljs-comment"># VALID but discouraged</span>
19+
<span class="hljs-attr">&#x27;&#x27;</span> = <span class="hljs-string">&#x27;blank&#x27;</span> <span class="hljs-comment"># VALID but discouraged</span>
20+
21+
<span class="hljs-comment"># Dotted keys:</span>
22+
<span class="hljs-attr">name</span> = <span class="hljs-string">&quot;Orange&quot;</span>
23+
<span class="hljs-attr">physical.color</span> = <span class="hljs-string">&quot;orange&quot;</span>
24+
<span class="hljs-attr">physical.shape</span> = <span class="hljs-string">&quot;round&quot;</span>
25+
<span class="hljs-attr">site.&quot;google.com&quot;</span> = <span class="hljs-literal">true</span>
26+
<span class="hljs-attr">3.14159</span> = <span class="hljs-string">&quot;pi&quot;</span>
27+
28+
<span class="hljs-comment"># Whitespace around dot-separated parts is ignored:</span>
29+
<span class="hljs-attr">hello . world</span> = <span class="hljs-string">&quot;!&quot;</span>
30+
31+
<span class="hljs-comment"># Whitespace is ignored around key names and values</span>
32+
<span class="hljs-attr">hello</span> = <span class="hljs-string">&quot;World!&quot;</span>

test/markup/ini/keys.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Bare keys:
2+
key = "value"
3+
bare_key = "value"
4+
bare-key = "value"
5+
1234 = "value"
6+
7+
# Quoted keys:
8+
"127.0.0.1" = "value"
9+
"character encoding" = "value"
10+
"ʎǝʞ" = "value"
11+
'key2' = "value"
12+
'quoted "value"' = "value"
13+
14+
"key \"containing\" backslash" = 6
15+
'key \"containing" backslash\' = 6
16+
17+
# empty quoted key is allowed
18+
"" = "blank" # VALID but discouraged
19+
'' = 'blank' # VALID but discouraged
20+
21+
# Dotted keys:
22+
name = "Orange"
23+
physical.color = "orange"
24+
physical.shape = "round"
25+
site."google.com" = true
26+
3.14159 = "pi"
27+
28+
# Whitespace around dot-separated parts is ignored:
29+
hello . world = "!"
30+
31+
# Whitespace is ignored around key names and values
32+
hello = "World!"

0 commit comments

Comments
 (0)