Skip to content

Commit 3ec4894

Browse files
authored
Add support for JSON5 as extension of json.js. (#4259)
1 parent 2ceb591 commit 3ec4894

File tree

8 files changed

+68
-7
lines changed

8 files changed

+68
-7
lines changed

CHANGES.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Core Grammars:
1616
- fix(ex) adds support for `?'` char literal and missing `defguardp` keyword [Kevin Bloch][]
1717
- fix(diff) fix unified diff hunk header regex to allow unpaired numbers [Chris Wilson][]
1818
- enh(php) support single line and hash comments in attributes, constructor and functions [Antoine Musso][]
19+
- enh(json) add json5 support [Kerry Shetline][]
1920

2021
Documentation:
2122

@@ -34,7 +35,7 @@ CONTRIBUTORS
3435
[Adam Lui]: https://github.com/adamlui
3536
[Sebastiaan Speck]: https://github.com/sebastiaanspeck
3637
[Filip Hoffmann]: https://github.com/folospior
37-
38+
[Kerry Shetline]: https://github.com/kshetline
3839

3940
## Version 11.11.1
4041

SUPPORTED_LANGUAGES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ The table below shows the full list of languages (and corresponding classes/alia
112112
| Inform7 | inform7, i7 | |
113113
| Ini, TOML | ini, toml | |
114114
| Iptables | iptables | [highlightjs-iptables](https://github.com/highlightjs/highlightjs-iptables) |
115+
| JSON | json, jsonc, json5 | |
116+
| JSONata | jsonata | [highlightjs-jsonata](https://github.com/DevDimov/highlightjs-jsonata) |
115117
| IRPF90 | irpf90 | |
116118
| Java | java, jsp | |
117119
| JavaScript | javascript, js, jsx | |

src/languages/javascript.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ export default function(hljs) {
457457
keywords: KEYWORDS,
458458
// this will be extended by TypeScript
459459
exports: { PARAMS_CONTAINS, CLASS_REFERENCE },
460-
illegal: /#(?![$_A-z])/,
460+
illegal: /#(?![$_A-Za-z])/,
461461
contains: [
462462
hljs.SHEBANG({
463463
label: "shebang",

src/languages/json.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
/*
22
Language: JSON
33
Description: JSON (JavaScript Object Notation) is a lightweight data-interchange format.
4-
Author: Ivan Sagalaev <[email protected]>
5-
Website: http://www.json.org
4+
Websites: http://www.json.org, https://www.json5.org
65
Category: common, protocols, web
76
*/
87

8+
import { EXTENDED_NUMBER_MODE } from "./lib/ecmascript";
9+
910
export default function(hljs) {
1011
const ATTRIBUTE = {
1112
className: 'attr',
12-
begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/,
13+
begin: /(("(\\.|[^\\"\r\n])*")|('(\\.|[^\\'\r\n])*'))(?=\s*:)/,
1314
relevance: 1.01
1415
};
1516
const PUNCTUATION = {
@@ -34,16 +35,17 @@ export default function(hljs) {
3435

3536
return {
3637
name: 'JSON',
37-
aliases: ['jsonc'],
38+
aliases: ['jsonc', 'json5'],
3839
keywords:{
3940
literal: LITERALS,
4041
},
4142
contains: [
4243
ATTRIBUTE,
4344
PUNCTUATION,
45+
hljs.APOS_STRING_MODE,
4446
hljs.QUOTE_STRING_MODE,
4547
LITERALS_MODE,
46-
hljs.C_NUMBER_MODE,
48+
EXTENDED_NUMBER_MODE,
4749
hljs.C_LINE_COMMENT_MODE,
4850
hljs.C_BLOCK_COMMENT_MODE
4951
],

src/languages/lib/ecmascript.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
export const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
2+
export const EXTENDED_NUMBER_RE = '([-+]?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)|NaN|[-+]?Infinity'; // 0x..., 0..., decimal, float
3+
4+
export const EXTENDED_NUMBER_MODE = {
5+
scope: 'number',
6+
match: EXTENDED_NUMBER_RE,
7+
relevance: 0
8+
};
9+
210
const KEYWORDS = [
311
"as", // for exports
412
"in",

test/detect/json5/default.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[
2+
{
3+
"title": "apples",
4+
"count": [12000, 20000],
5+
"description": {"text": "...", "sensitive": false}
6+
},
7+
{ // Like JSON, but can also include comments and unquoted identifiers.
8+
title: "oranges",
9+
// Hexadecimal allowed, + before numbers, leading/trailing decimal point, NaN, Infinity
10+
'count': [17500, null, 0x1F2B, +5, -10, .6, 6., NaN, Infinity, +Infinity, -Infinity],
11+
description: {'text': '...', 'sensitive': true} /* Single-quoted strings allowed */,
12+
multi_line: "Strings can\
13+
escape\
14+
new lines"
15+
}, // Trailing commas allowed
16+
]

test/markup/json5/default.expect.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<span class="hljs-punctuation">[</span>
2+
<span class="hljs-punctuation">{</span>
3+
<span class="hljs-attr">&quot;title&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;apples&quot;</span><span class="hljs-punctuation">,</span>
4+
<span class="hljs-attr">&quot;count&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-number">12000</span><span class="hljs-punctuation">,</span> <span class="hljs-number">20000</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
5+
<span class="hljs-attr">&quot;description&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-attr">&quot;text&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;...&quot;</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">&quot;sensitive&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">false</span></span><span class="hljs-punctuation">}</span>
6+
<span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
7+
<span class="hljs-punctuation">{</span> <span class="hljs-comment">// Like JSON, but can also include comments and unquoted identifiers.</span>
8+
title<span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;oranges&quot;</span><span class="hljs-punctuation">,</span>
9+
<span class="hljs-comment">// Hexadecimal allowed, + before numbers, leading/trailing decimal point, NaN, Infinity</span>
10+
<span class="hljs-attr">&#x27;count&#x27;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-number">17500</span><span class="hljs-punctuation">,</span> <span class="hljs-literal"><span class="hljs-keyword">null</span></span><span class="hljs-punctuation">,</span> <span class="hljs-number">0x1F2B</span><span class="hljs-punctuation">,</span> <span class="hljs-number">+5</span><span class="hljs-punctuation">,</span> <span class="hljs-number">-10</span><span class="hljs-punctuation">,</span> <span class="hljs-number">.6</span><span class="hljs-punctuation">,</span> <span class="hljs-number">6.</span><span class="hljs-punctuation">,</span> <span class="hljs-number">NaN</span><span class="hljs-punctuation">,</span> <span class="hljs-number">Infinity</span><span class="hljs-punctuation">,</span> <span class="hljs-number">+Infinity</span><span class="hljs-punctuation">,</span> <span class="hljs-number">-Infinity</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
11+
description<span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-attr">&#x27;text&#x27;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&#x27;...&#x27;</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">&#x27;sensitive&#x27;</span><span class="hljs-punctuation">:</span> <span class="hljs-literal"><span class="hljs-keyword">true</span></span><span class="hljs-punctuation">}</span> <span class="hljs-comment">/* Single-quoted strings allowed */</span><span class="hljs-punctuation">,</span>
12+
multi_line<span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Strings can\
13+
escape\
14+
new lines&quot;</span>
15+
<span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// Trailing commas allowed</span>
16+
<span class="hljs-punctuation">]</span>

test/markup/json5/default.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[
2+
{
3+
"title": "apples",
4+
"count": [12000, 20000],
5+
"description": {"text": "...", "sensitive": false}
6+
},
7+
{ // Like JSON, but can also include comments and unquoted identifiers.
8+
title: "oranges",
9+
// Hexadecimal allowed, + before numbers, leading/trailing decimal point, NaN, Infinity
10+
'count': [17500, null, 0x1F2B, +5, -10, .6, 6., NaN, Infinity, +Infinity, -Infinity],
11+
description: {'text': '...', 'sensitive': true} /* Single-quoted strings allowed */,
12+
multi_line: "Strings can\
13+
escape\
14+
new lines"
15+
}, // Trailing commas allowed
16+
]

0 commit comments

Comments
 (0)