Commit c83fd0b8c2364165d170d460bdd32779593d93ce

Michael Schmidt 2021-01-01T18:19:06

Shell session: Commands prefixed with a path are now detected (#2686)

diff --git a/components/prism-shell-session.js b/components/prism-shell-session.js
index f16b1b2..7e0f5e8 100644
--- a/components/prism-shell-session.js
+++ b/components/prism-shell-session.js
@@ -15,21 +15,19 @@
 
 	Prism.languages['shell-session'] = {
 		'command': {
-			pattern: RegExp(/^(?:[^\s@:$#*!/\\]+@[^\s@:$#*!/\\]+(?::[^\0-\x1F$#*?"<>:;|]+)?)?[$#](?:[^\\\r\n'"<]|\\.|<<str>>)+/.source.replace(/<<str>>/g, function () { return strings; }), 'm'),
+			pattern: RegExp(/^(?:[^\s@:$#*!/\\]+@[^\s@:$#*!/\\]+(?::[^\0-\x1F$#*?"<>:;|]+)?|[^\0-\x1F$#*?"<>:;|]+)?[$#](?:[^\\\r\n'"<]|\\.|<<str>>)+/.source.replace(/<<str>>/g, function () { return strings; }), 'm'),
 			greedy: true,
 			inside: {
 				'info': {
 					// foo@bar:~/files$ exit
 					// foo@bar$ exit
+					// ~/files$ exit
 					pattern: /^[^#$]+/,
 					alias: 'punctuation',
 					inside: {
-						'path': {
-							pattern: /(:)[\s\S]+/,
-							lookbehind: true
-						},
-						'user': /^[^:]+/,
-						'punctuation': /:/
+						'user': /^[^\s@:$#*!/\\]+@[^\s@:$#*!/\\]+/,
+						'punctuation': /:/,
+						'path': /[\s\S]+/
 					}
 				},
 				'bash': {
diff --git a/components/prism-shell-session.min.js b/components/prism-shell-session.min.js
index 98465f2..b21959c 100644
--- a/components/prism-shell-session.min.js
+++ b/components/prism-shell-session.min.js
@@ -1 +1 @@
-!function(s){var n=["([\"'])(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|(?!\\1)[^\\\\`$])*\\1","<<-?\\s*([\"']?)(\\w+)\\2\\s[^]*?[\r\n]\\3"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#*!/\\\\]+@[^\\s@:$#*!/\\\\]+(?::[^\0-\\x1F$#*?"<>:;|]+)?)?[$#](?:[^\\\\\r\n\'"<]|\\\\.|<<str>>)+'.replace(/<<str>>/g,function(){return n}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$]+/,alias:"punctuation",inside:{path:{pattern:/(:)[\s\S]+/,lookbehind:!0},user:/^[^:]+/,punctuation:/:/}},bash:{pattern:/(^[$#]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism);
\ No newline at end of file
+!function(s){var n=["([\"'])(?:\\\\[^]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|(?!\\1)[^\\\\`$])*\\1","<<-?\\s*([\"']?)(\\w+)\\2\\s[^]*?[\r\n]\\3"].join("|");s.languages["shell-session"]={command:{pattern:RegExp('^(?:[^\\s@:$#*!/\\\\]+@[^\\s@:$#*!/\\\\]+(?::[^\0-\\x1F$#*?"<>:;|]+)?|[^\0-\\x1F$#*?"<>:;|]+)?[$#](?:[^\\\\\r\n\'"<]|\\\\.|<<str>>)+'.replace(/<<str>>/g,function(){return n}),"m"),greedy:!0,inside:{info:{pattern:/^[^#$]+/,alias:"punctuation",inside:{user:/^[^\s@:$#*!/\\]+@[^\s@:$#*!/\\]+/,punctuation:/:/,path:/[\s\S]+/}},bash:{pattern:/(^[$#]\s*)\S[\s\S]*/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#]/,alias:"important"}}},output:/.(?:.*(?:[\r\n]|.$))*/},s.languages["sh-session"]=s.languages.shellsession=s.languages["shell-session"]}(Prism);
\ No newline at end of file
diff --git a/tests/languages/shell-session/issue2685.test b/tests/languages/shell-session/issue2685.test
new file mode 100644
index 0000000..1601e39
--- /dev/null
+++ b/tests/languages/shell-session/issue2685.test
@@ -0,0 +1,29 @@
+/home/user$ echo "Hello World"
+Hello World
+/home/user$ exit
+
+----------------------------------------------------
+
+[
+	["command", [
+		["info", [
+			["path", "/home/user"]
+		]],
+		["shell-symbol", "$"],
+		["bash", [
+			["builtin", "echo"],
+			["string", ["\"Hello World\""]]
+		]]
+	]],
+
+	["output", "Hello World\r\n"],
+	["command", [
+		["info", [
+			["path", "/home/user"]
+		]],
+		["shell-symbol", "$"],
+		["bash", [
+			["builtin", "exit"]
+		]]
+	]]
+]