Skip to content

Commit 1936dbd

Browse files
authored
enh(toml)(ini) Improve parsing of complex keys (#2595)
Fixes: #2594
1 parent adb813c commit 1936dbd

File tree

4 files changed

+80
-1
lines changed

4 files changed

+80
-1
lines changed

CHANGES.md

+2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ Language Improvements:
4848
- enh(erlang) Add underscore separators to numeric literals (#2554) [Sergey Prokhorov][]
4949
- enh(handlebars) Support for sub-expressions, path-expressions, hashes, block-parameters and literals (#2344) [Nils Knappmeier][]
5050
- enh(protobuf) Support multiline comments (#2597) [Pavel Evstigneev][]
51+
- fix(toml) Improve key parsing (#2595) [Antoine du Hamel][]
5152

5253
[Josh Goebel]: https://github.com/yyyc514
5354
[Peter Plantinga]: https://github.com/pplantinga
@@ -62,6 +63,7 @@ Language Improvements:
6263
[Jim Mason]: https://github.com/RocketMan
6364
[lioshi]: https://github.com/lioshi
6465
[Pavel Evstigneev]: https://github.com/Paxa
66+
[Antoine du Hamel]: https://github.com/aduh95
6567

6668

6769
## Version 10.0.2

src/languages/ini.js

+14-1
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+
ANY_KEY, '(\\s*\\.\\s*', ANY_KEY, ')*',
67+
regex.lookahead(/\s*=\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

+32
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

+32
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)