From ca8cb948f3f69a7c03f80464b71c9dca0fba4471 Mon Sep 17 00:00:00 2001 From: Adam Roben Date: Fri, 7 Nov 2014 14:26:41 -0500 Subject: [PATCH] Add a grammar for .sh-session files These files show a shell session, complete with prompts, input, and output. --- grammars/shell-session.cson | 54 +++++++++++++++++++++ spec/shell-session-spec.coffee | 85 ++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 grammars/shell-session.cson create mode 100644 spec/shell-session-spec.coffee diff --git a/grammars/shell-session.cson b/grammars/shell-session.cson new file mode 100644 index 0000000..df376c8 --- /dev/null +++ b/grammars/shell-session.cson @@ -0,0 +1,54 @@ +'scopeName': 'text.shell-session' +'name': 'Shell Session' +'fileTypes': [ + 'sh-session' +] +'patterns': [ + { + 'match': '^(>)(.*)$' + 'captures': + '1': + 'name': 'punctuation.separator.prompt.shell-session' + '2': + 'name': 'source.shell' + 'patterns': [ + 'include': 'source.shell' + ] + } + { + 'match': '(?x) + ^ + (?: + ( + (?:\\(\\S+\\))? + (?: + | sh\\S*? + | \\w+\\S+[@:]\\S+(?:\\s+\\S+)? + | \\[\\S+[@:][^\\n]+\\].+ + ) + ) + \\s* + ) + ( + [$#%] + ) + \\s+ + (.*) + $ + ' + 'captures': + '1': + 'name': 'entity.other.prompt-prefix.shell-session' + '2': + 'name': 'punctuation.separator.prompt.shell-session' + '3': + 'name': 'source.shell' + 'patterns': [ + 'include': 'source.shell' + ] + } + { + 'match': '^.+$' + 'name': 'meta.output.shell-session' + } +] diff --git a/spec/shell-session-spec.coffee b/spec/shell-session-spec.coffee new file mode 100644 index 0000000..15e8ae5 --- /dev/null +++ b/spec/shell-session-spec.coffee @@ -0,0 +1,85 @@ +describe "Shell session grammar", -> + grammar = null + + beforeEach -> + waitsForPromise -> + atom.packages.activatePackage("language-shellscript") + + runs -> + grammar = atom.syntax.grammarForScopeName("text.shell-session") + + it "parses the grammar", -> + expect(grammar).toBeDefined() + expect(grammar.scopeName).toBe "text.shell-session" + + it "tokenizes > prompts", -> + tokens = grammar.tokenizeLines('> echo $FOO') + + expect(tokens[0][0].value).toBe '>' + expect(tokens[0][0].scopes).toEqual ['text.shell-session', 'punctuation.separator.prompt.shell-session'] + + expect(tokens[0][1].value).toBe ' ' + expect(tokens[0][1].scopes).toEqual ['text.shell-session'] + + expect(tokens[0][2].value).toBe 'echo' + expect(tokens[0][2].scopes).toEqual ['text.shell-session', 'support.function.builtin.shell'] + + it "tokenizes $ prompts", -> + tokens = grammar.tokenizeLines('$ echo $FOO') + + expect(tokens[0][0].value).toBe '$' + expect(tokens[0][0].scopes).toEqual ['text.shell-session', 'punctuation.separator.prompt.shell-session'] + + expect(tokens[0][1].value).toBe ' ' + expect(tokens[0][1].scopes).toEqual ['text.shell-session'] + + expect(tokens[0][2].value).toBe 'echo' + expect(tokens[0][2].scopes).toEqual ['text.shell-session', 'support.function.builtin.shell'] + + it "tokenizes pound prompts", -> + tokens = grammar.tokenizeLines('# echo $FOO') + + expect(tokens[0][0].value).toBe '#' + expect(tokens[0][0].scopes).toEqual ['text.shell-session', 'punctuation.separator.prompt.shell-session'] + + expect(tokens[0][1].value).toBe ' ' + expect(tokens[0][1].scopes).toEqual ['text.shell-session'] + + expect(tokens[0][2].value).toBe 'echo' + expect(tokens[0][2].scopes).toEqual ['text.shell-session', 'support.function.builtin.shell'] + + it "tokenizes % prompts", -> + tokens = grammar.tokenizeLines('% echo $FOO') + + expect(tokens[0][0].value).toBe '%' + expect(tokens[0][0].scopes).toEqual ['text.shell-session', 'punctuation.separator.prompt.shell-session'] + + expect(tokens[0][1].value).toBe ' ' + expect(tokens[0][1].scopes).toEqual ['text.shell-session'] + + expect(tokens[0][2].value).toBe 'echo' + expect(tokens[0][2].scopes).toEqual ['text.shell-session', 'support.function.builtin.shell'] + + it "tokenizes prompts with prefixes", -> + tokens = grammar.tokenizeLines('user@machine $ echo $FOO') + + expect(tokens[0][0].value).toBe 'user@machine' + expect(tokens[0][0].scopes).toEqual ['text.shell-session', 'entity.other.prompt-prefix.shell-session'] + + expect(tokens[0][1].value).toBe ' ' + expect(tokens[0][1].scopes).toEqual ['text.shell-session'] + + expect(tokens[0][2].value).toBe '$' + expect(tokens[0][2].scopes).toEqual ['text.shell-session', 'punctuation.separator.prompt.shell-session'] + + expect(tokens[0][3].value).toBe ' ' + expect(tokens[0][3].scopes).toEqual ['text.shell-session'] + + expect(tokens[0][4].value).toBe 'echo' + expect(tokens[0][4].scopes).toEqual ['text.shell-session', 'support.function.builtin.shell'] + + it "tokenizes shell output", -> + tokens = grammar.tokenizeLines('$ echo $FOO\nfoo') + + expect(tokens[1][0].value).toBe 'foo' + expect(tokens[1][0].scopes).toEqual ['text.shell-session', 'meta.output.shell-session']