Skip to content

Commit 6c92180

Browse files
Shell session & bash: Highlight all commands after the start of any Heredoc string (#2509)
1 parent bafab63 commit 6c92180

File tree

6 files changed

+63
-15
lines changed

6 files changed

+63
-15
lines changed

components/prism-bash.js

+17-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,16 @@
44
// + make sure PS1..4 are here as they are not always set,
55
// - some useless things.
66
var envVars = '\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b';
7+
8+
var commandAfterHeredoc = {
9+
pattern: /(^(["']?)\w+\2)[ \t]+\S.*/,
10+
lookbehind: true,
11+
alias: 'punctuation', // this looks reasonably well in all themes
12+
inside: null // see below
13+
};
14+
715
var insideString = {
16+
'bash': commandAfterHeredoc,
817
'environment': {
918
pattern: RegExp("\\$" + envVars),
1019
alias: 'constant'
@@ -107,17 +116,20 @@
107116
'string': [
108117
// Support for Here-documents https://en.wikipedia.org/wiki/Here_document
109118
{
110-
pattern: /((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\2/,
119+
pattern: /((?:^|[^<])<<-?\s*)(\w+?)\s[\s\S]*?(?:\r?\n|\r)\2/,
111120
lookbehind: true,
112121
greedy: true,
113122
inside: insideString
114123
},
115124
// Here-document with quotes around the tag
116125
// → No expansion (so no “inside”).
117126
{
118-
pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)[\s\S]*?(?:\r?\n|\r)\3/,
127+
pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,
119128
lookbehind: true,
120-
greedy: true
129+
greedy: true,
130+
inside: {
131+
'bash': commandAfterHeredoc
132+
}
121133
},
122134
// “Normal” string
123135
{
@@ -172,6 +184,8 @@
172184
}
173185
};
174186

187+
commandAfterHeredoc.inside = Prism.languages.bash;
188+
175189
/* Patterns in command substitution. */
176190
var toBeCopied = [
177191
'comment',

components/prism-bash.min.js

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

components/prism-shell-session.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,8 @@
99
/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/.source,
1010

1111
// here doc
12-
// 1 capturing group
13-
/<<-?\s*(\w+?)[ \t]*(?!.)[\s\S]*?[\r\n]\2/.source,
14-
15-
// here doc quoted
16-
// 2 capturing group
17-
/<<-?\s*(["'])(\w+)\3[ \t]*(?!.)[\s\S]*?[\r\n]\4/.source
12+
// 2 capturing groups
13+
/<<-?\s*(["']?)(\w+)\2\s[\s\S]*?[\r\n]\3/.source
1814
].join('|');
1915

2016
Prism.languages['shell-session'] = {

components/prism-shell-session.min.js

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

tests/languages/bash/string_feature.test

+13-2
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,21 @@ STRING_END
9191
["punctuation", "\\"],
9292
"'a ",
9393
["comment", "# ' not a string"],
94+
9495
["operator", [
9596
"<<"
9697
]],
9798
["string", [
9899
"STRING_END\r\nfoo\r\nbar\r\nSTRING_END"
99100
]],
101+
100102
["operator", [
101103
"<<-"
102104
]],
103105
["string", [
104106
"STRING_END\r\nfoo\r\nbar\r\nSTRING_END"
105107
]],
108+
106109
["operator", [
107110
"<<"
108111
]],
@@ -111,20 +114,28 @@ STRING_END
111114
["variable", "$@"],
112115
"\r\nbar\r\nEOF"
113116
]],
117+
114118
["operator", [
115119
"<<"
116120
]],
117-
["string", "'EOF'\r\n'single quoted string'\r\n\"double quoted string\"\r\nEOF"],
121+
["string", [
122+
"'EOF'\r\n'single quoted string'\r\n\"double quoted string\"\r\nEOF"
123+
]],
124+
118125
["operator", [
119126
"<<"
120127
]],
121-
["string", "\"EOF\"\r\nfoo\r\n$bar\r\nEOF"],
128+
["string", [
129+
"\"EOF\"\r\nfoo\r\n$bar\r\nEOF"
130+
]],
131+
122132
["operator", [
123133
"<<"
124134
]],
125135
["string", [
126136
"STRING_END\r\n# comment\r\nSTRING_END"
127137
]],
138+
128139
["string", [
129140
"\" # comment \""
130141
]]

tests/languages/shell-session/command_string_feature.test

+29-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
$ echo 'Foo
22
> Bar'
3+
34
$ echo "Foo
45
> Bar"
56

@@ -15,6 +16,11 @@ STRING_END
1516

1617
$ echo \'a # '
1718

19+
$ cat << "EOF" > /etc/ipsec.secrets
20+
: RSA vpn-server-a.key
21+
# : RSA vpn-server-b.key
22+
EOF
23+
1824
----------------------------------------------------
1925

2026
[
@@ -58,7 +64,9 @@ $ echo \'a # '
5864
["operator", [
5965
"<<-"
6066
]],
61-
["string", "\"STRING_END\"\r\nfoo\r\nbar\r\nSTRING_END"]
67+
["string", [
68+
"\"STRING_END\"\r\nfoo\r\nbar\r\nSTRING_END"
69+
]]
6270
]]
6371
]],
6472

@@ -71,7 +79,26 @@ $ echo \'a # '
7179
["comment", "# "]
7280
]]
7381
]],
74-
["output", "'"]
82+
["output", "'\r\n\r\n"],
83+
["command", [
84+
["shell-symbol", "$"],
85+
["bash", [
86+
["function", "cat"],
87+
["operator", [
88+
"<<"
89+
]],
90+
["string", [
91+
"\"EOF\"",
92+
["bash", [
93+
["operator", [
94+
">"
95+
]],
96+
" /etc/ipsec.secrets"
97+
]],
98+
"\r\n: RSA vpn-server-a.key\r\n# : RSA vpn-server-b.key\r\nEOF"
99+
]]
100+
]]
101+
]]
75102
]
76103

77104
----------------------------------------------------

0 commit comments

Comments
 (0)