Skip to content

Commit c13d6e7

Browse files
JS: Template strings: Increased bracket count of interpolations (#1845)
This increases the number of nested braces which can be matched by JS's template pattern to supported nested objects within interpolation expressions.
1 parent 9e16493 commit c13d6e7

File tree

5 files changed

+68
-22
lines changed

5 files changed

+68
-22
lines changed

components/prism-javascript.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ Prism.languages.insertBefore('javascript', 'keyword', {
6161

6262
Prism.languages.insertBefore('javascript', 'string', {
6363
'template-string': {
64-
pattern: /`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,
64+
pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|[^\\`])*`/,
6565
greedy: true,
6666
inside: {
6767
'interpolation': {
68-
pattern: /\${[^}]+}/,
68+
pattern: /\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,
6969
inside: {
7070
'interpolation-punctuation': {
7171
pattern: /^\${|}$/,

components/prism-javascript.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/prism-javascript.html

+4-1
Original file line numberDiff line numberDiff line change
@@ -73,5 +73,8 @@ <h2>Known failures</h2>
7373
</p>
7474

7575
<h3>String interpolation containing a closing brace</h3>
76-
<pre><code>`${ {foo:'bar'}.foo }`
76+
<pre><code>`${ /* } */ a + b }`
7777
`${ '}' }`</code></pre>
78+
79+
<h3>String interpolation with deeply nested braces</h3>
80+
<pre><code>`${foo({ a: { b: { c: true } } })}`</code></pre>

prism.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -822,11 +822,11 @@ Prism.languages.insertBefore('javascript', 'keyword', {
822822

823823
Prism.languages.insertBefore('javascript', 'string', {
824824
'template-string': {
825-
pattern: /`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,
825+
pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|[^\\`])*`/,
826826
greedy: true,
827827
inside: {
828828
'interpolation': {
829-
pattern: /\${[^}]+}/,
829+
pattern: /\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,
830830
inside: {
831831
'interpolation-punctuation': {
832832
pattern: /^\${|}$/,

tests/languages/javascript/template-string_feature.test

+59-16
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ bar`
66
"foo `a` `b` `c` `d` bar"
77
"test // test" `template`
88

9+
console.log(`This is ${it.with({ type: false })}!`)
10+
`${ {foo:'bar'}.foo }`
11+
912
----------------------------------------------------
1013

1114
[
@@ -27,23 +30,63 @@ bar`
2730
["string", "`"]
2831
]],
2932
["template-string", [
30-
["string", "`"],
31-
["interpolation", [
32-
["interpolation-punctuation", "${"],
33-
["function", "foo"],
34-
["punctuation", "("],
35-
["punctuation", ")"],
36-
["interpolation-punctuation", "}"]
37-
]],
38-
["string", "`"]
39-
]],
40-
["string", "\"foo `a` `b` `c` `d` bar\""],
41-
["string", "\"test // test\""],
42-
["template-string", [
43-
["string", "`template`"]
44-
]]
33+
["string", "`"],
34+
["interpolation", [
35+
["interpolation-punctuation", "${"],
36+
["function", "foo"],
37+
["punctuation", "("],
38+
["punctuation", ")"],
39+
["interpolation-punctuation", "}"]
40+
]],
41+
["string", "`"]
42+
]],
43+
["string", "\"foo `a` `b` `c` `d` bar\""],
44+
["string", "\"test // test\""],
45+
["template-string", [
46+
["string", "`template`"]
47+
]],
48+
49+
"\r\n\r\nconsole",
50+
["punctuation", "."],
51+
["function", "log"],
52+
["punctuation", "("],
53+
["template-string", [
54+
["string", "`This is "],
55+
["interpolation", [
56+
["interpolation-punctuation", "${"],
57+
"it",
58+
["punctuation", "."],
59+
["function", "with"],
60+
["punctuation", "("],
61+
["punctuation", "{"],
62+
" type",
63+
["punctuation", ":"],
64+
["boolean", "false"],
65+
["punctuation", "}"],
66+
["punctuation", ")"],
67+
["interpolation-punctuation", "}"]
68+
]],
69+
["string", "!`"]
70+
]],
71+
["punctuation", ")"],
72+
73+
["template-string", [
74+
["string", "`"],
75+
["interpolation", [
76+
["interpolation-punctuation", "${"],
77+
["punctuation", "{"],
78+
"foo",
79+
["punctuation", ":"],
80+
["string", "'bar'"],
81+
["punctuation", "}"],
82+
["punctuation", "."],
83+
"foo ",
84+
["interpolation-punctuation", "}"]
85+
]],
86+
["string", "`"]
87+
]]
4588
]
4689

4790
----------------------------------------------------
4891

49-
Checks for single-line and multi-line template strings.
92+
Checks for single-line and multi-line template strings.

0 commit comments

Comments
 (0)