diff --git a/components/prism-shell-session.js b/components/prism-shell-session.js index 893fdb26b4..8abbd62dd1 100644 --- a/components/prism-shell-session.js +++ b/components/prism-shell-session.js @@ -18,25 +18,37 @@ ].join('|'); Prism.languages['shell-session'] = { + 'info': { + // foo@bar:~/files$ exit + // foo@bar$ exit + pattern: /^(?:[^\r\n$#*!]+)(?=[$#])/m, + alias: 'punctuation', + inside: { + 'path': { + pattern: /(:)[\s\S]+/, + lookbehind: true + }, + 'user': /^[^\s@:$#*!/\\]+@[^\s@:$#*!/\\]+(?=:|$)/, + 'punctuation': /:/ + } + }, 'command': { - pattern: RegExp(/\$(?:[^\r\n'"<]|<>)+/.source.replace(/<>/g, strings)), + pattern: RegExp(/[$#](?:[^\r\n'"<]|<>)+/.source.replace(/<>/g, strings)), + greedy: true, inside: { 'bash': { - pattern: /(\$\s*)[\s\S]+/, + pattern: /(^[$#]\s*)[\s\S]+/, lookbehind: true, alias: 'language-bash', inside: Prism.languages.bash }, - 'sh': { - pattern: /^\$/, + 'shell-symbol': { + pattern: /^[$#]/, alias: 'important' } } }, - 'output': { - pattern: /.(?:.*(?:\r\n?|\n|.$))*/ - // output highlighting? - } + 'output': /.(?:.*(?:\r\n?|\n|.$))*/ }; }(Prism)); diff --git a/components/prism-shell-session.min.js b/components/prism-shell-session.min.js index f7b9129c80..9bf45bc05a 100644 --- a/components/prism-shell-session.min.js +++ b/components/prism-shell-session.min.js @@ -1 +1 @@ -!function(s){var n=["([\"'])(?:\\\\[\\s\\S]|\\$\\([^)]+\\)|`[^`]+`|(?!\\1)[^\\\\])*\\1","<<-?\\s*(\\w+?)\\s*(?:\r?\n|\r)[\\s\\S]*?(?:\r?\n|\r)\\2","<<-?\\s*([\"'])(\\w+)\\3\\s*(?:\r?\n|\r)[\\s\\S]*?(?:\r?\n|\r)\\4"].join("|");s.languages["shell-session"]={command:{pattern:RegExp("\\$(?:[^\r\\n'\"<]|<>)+".replace(/<>/g,n)),inside:{bash:{pattern:/(\$\s*)[\s\S]+/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},sh:{pattern:/^\$/,alias:"important"}}},output:{pattern:/.(?:.*(?:\r\n?|\n|.$))*/}}}(Prism); \ No newline at end of file +!function(s){var n=["([\"'])(?:\\\\[\\s\\S]|\\$\\([^)]+\\)|`[^`]+`|(?!\\1)[^\\\\])*\\1","<<-?\\s*(\\w+?)\\s*(?:\r?\n|\r)[\\s\\S]*?(?:\r?\n|\r)\\2","<<-?\\s*([\"'])(\\w+)\\3\\s*(?:\r?\n|\r)[\\s\\S]*?(?:\r?\n|\r)\\4"].join("|");s.languages["shell-session"]={info:{pattern:/^(?:[^\r\n$#*!]+)(?=[$#])/m,alias:"punctuation",inside:{path:{pattern:/(:)[\s\S]+/,lookbehind:!0},user:/^[^\s@:$#*!/\\]+@[^\s@:$#*!/\\]+(?=:|$)/,punctuation:/:/}},command:{pattern:RegExp("[$#](?:[^\r\\n'\"<]|<>)+".replace(/<>/g,n)),greedy:!0,inside:{bash:{pattern:/(^[$#]\s*)[\s\S]+/,lookbehind:!0,alias:"language-bash",inside:s.languages.bash},"shell-symbol":{pattern:/^[$#]/,alias:"important"}}},output:/.(?:.*(?:\r\n?|\n|.$))*/}}(Prism); \ No newline at end of file diff --git a/examples/prism-shell-session.html b/examples/prism-shell-session.html index 35501fe646..07c9ce4c3d 100644 --- a/examples/prism-shell-session.html +++ b/examples/prism-shell-session.html @@ -8,3 +8,11 @@

Full example

> Bar" Foo Bar + +

bash and sh console sessions are fully supported.

+ +
foo@bar:/$ cd ~
+foo@bar:~$ sudo -i
+[sudo] password for foo:
+root@bar:~# echo "hello!"
+hello!
diff --git a/tests/languages/shell-session/command_feature.test b/tests/languages/shell-session/command_feature.test index 6a768e4f76..df721eeae8 100644 --- a/tests/languages/shell-session/command_feature.test +++ b/tests/languages/shell-session/command_feature.test @@ -1,31 +1,44 @@ -$ git checkout master -Switched to branch 'master' -Your branch is up-to-date with 'origin/master'. -$ git push -Everything up-to-date - ----------------------------------------------------- - -[ - ["command", [ - ["sh", "$"], - ["bash", [ - ["function", "git"], - " checkout master" - ]] - ]], - ["output", "Switched to branch 'master'\nYour branch is up-to-date with 'origin/master'.\n"], - - ["command", [ - ["sh", "$"], - ["bash", [ - ["function", "git"], - " push" - ]] - ]], - ["output", "Everything up-to-date"] -] - ----------------------------------------------------- - -Checks for commands. +$ git checkout master +Switched to branch 'master' +Your branch is up-to-date with 'origin/master'. +$ git push +Everything up-to-date +# echo "root" +root + +---------------------------------------------------- + +[ + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["function", "git"], + " checkout master" + ]] + ]], + ["output", "Switched to branch 'master'\r\nYour branch is up-to-date with 'origin/master'.\r\n"], + + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["function", "git"], + " push" + ]] + ]], + ["output", "Everything up-to-date\r\n"], + + ["command", [ + ["shell-symbol", "#"], + ["bash", [ + ["builtin", "echo"], + ["string", [ + "\"root\"" + ]] + ]] + ]], + ["output", "root"] +] + +---------------------------------------------------- + +Checks for commands. diff --git a/tests/languages/shell-session/command_string_feature.test b/tests/languages/shell-session/command_string_feature.test index d84afec018..95a12191e7 100644 --- a/tests/languages/shell-session/command_string_feature.test +++ b/tests/languages/shell-session/command_string_feature.test @@ -1,66 +1,66 @@ -$ echo 'Foo -> Bar' -$ echo "Foo -> Bar" - -$ echo <<- STRING_END -foo -bar -STRING_END - -$ echo <<- "STRING_END" -foo -bar -STRING_END - ----------------------------------------------------- - -[ - ["command", [ - ["sh", "$"], - ["bash", [ - ["builtin", "echo"], - ["string", [ - "'Foo\n> Bar'" - ]] - ]] - ]], - - ["command", [ - ["sh", "$"], - ["bash", [ - ["builtin", "echo"], - ["string", [ - "\"Foo\n> Bar\"" - ]] - ]] - ]], - - ["command", [ - ["sh", "$"], - ["bash", [ - ["builtin", "echo"], - ["operator", [ - "<<-" - ]], - ["string", [ - "STRING_END\nfoo\nbar\nSTRING_END" - ]] - ]] - ]], - - ["command", [ - ["sh", "$"], - ["bash", [ - ["builtin", "echo"], - ["operator", [ - "<<-" - ]], - ["string", "\"STRING_END\"\nfoo\nbar\nSTRING_END"] - ]] - ]] -] - ----------------------------------------------------- - -Checks for multi-line strings inside commands. +$ echo 'Foo +> Bar' +$ echo "Foo +> Bar" + +$ echo <<- STRING_END +foo +bar +STRING_END + +$ echo <<- "STRING_END" +foo +bar +STRING_END + +---------------------------------------------------- + +[ + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["builtin", "echo"], + ["string", [ + "'Foo\r\n> Bar'" + ]] + ]] + ]], + + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["builtin", "echo"], + ["string", [ + "\"Foo\r\n> Bar\"" + ]] + ]] + ]], + + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["builtin", "echo"], + ["operator", [ + "<<-" + ]], + ["string", [ + "STRING_END\r\nfoo\r\nbar\r\nSTRING_END" + ]] + ]] + ]], + + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["builtin", "echo"], + ["operator", [ + "<<-" + ]], + ["string", "\"STRING_END\"\r\nfoo\r\nbar\r\nSTRING_END"] + ]] + ]] +] + +---------------------------------------------------- + +Checks for multi-line strings inside commands. diff --git a/tests/languages/shell-session/info_feature.test b/tests/languages/shell-session/info_feature.test new file mode 100644 index 0000000000..446c8b3910 --- /dev/null +++ b/tests/languages/shell-session/info_feature.test @@ -0,0 +1,68 @@ +foo@bar:/var/local$ cd ~ +foo@bar:~$ sudo -i +[sudo] password for foo: +root@bar:~# echo "hello!" +hello! + +foo@bar$ exit + +---------------------------------------------------- + +[ + ["info", [ + ["user", "foo@bar"], + ["punctuation", ":"], + ["path", "/var/local"] + ]], + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["builtin", "cd"], + " ~" + ]] + ]], + + ["info", [ + ["user", "foo@bar"], + ["punctuation", ":"], + ["path", "~"] + ]], + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["function", "sudo"], + " -i" + ]] + ]], + ["output", "[sudo] password for foo:\r\n"], + + ["info", [ + ["user", "root@bar"], + ["punctuation", ":"], + ["path", "~"] + ]], + ["command", [ + ["shell-symbol", "#"], + ["bash", [ + ["builtin", "echo"], + ["string", [ + "\"hello!\"" + ]] + ]] + ]], + ["output", "hello!\r\n\r\n"], + + ["info", [ + ["user", "foo@bar"] + ]], + ["command", [ + ["shell-symbol", "$"], + ["bash", [ + ["builtin", "exit"] + ]] + ]] +] + +---------------------------------------------------- + +Checks for the info bash outputs.