From 0b719bfecf5797ed3fd295d51799b4e0c6273385 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Nathan Sobo Date: Thu, 21 Mar 2013 13:25:52 -0700 Subject: [PATCH] Atom packages can load cson grammars and TextMate packages can't --- spec/app/atom-package-spec.coffee | 20 +++++++++++++++++++ spec/app/text-mate-grammar-spec.coffee | 11 ---------- .../Snippets/test.cson | 4 ---- .../grammars}/alot.cson | 7 ++++++- src/app/atom-package.coffee | 16 +++++++++++++++ src/app/syntax.coffee | 9 +++++++++ src/app/text-mate-grammar.coffee | 2 +- src/app/text-mate-package.coffee | 16 ++------------- .../gfm.tmbundle/Preferences/indent.cson | 4 ---- .../Syntaxes => gfm/grammars}/gfm.cson | 5 +++++ .../Snippets => gfm/snippets}/bold.cson | 0 .../Snippets => gfm/snippets}/code.cson | 0 .../Snippets => gfm/snippets}/img.cson | 0 .../Snippets => gfm/snippets}/italic.cson | 0 .../Snippets => gfm/snippets}/link.cson | 0 .../spec/gfm-spec.coffee | 9 ++++----- src/packages/snippets/lib/snippets.coffee | 2 +- .../snippets/spec/snippets-spec.coffee | 15 -------------- .../Syntaxes => toml/grammars}/toml.cson | 0 .../spec/toml-spec.coffee | 7 +++---- 20 files changed, 67 insertions(+), 60 deletions(-) delete mode 100644 spec/fixtures/packages/package-with-a-cson-grammar.tmbundle/Snippets/test.cson rename spec/fixtures/packages/{package-with-a-cson-grammar.tmbundle/Syntaxes => package-with-a-cson-grammar/grammars}/alot.cson (59%) delete mode 100644 src/packages/gfm.tmbundle/Preferences/indent.cson rename src/packages/{gfm.tmbundle/Syntaxes => gfm/grammars}/gfm.cson (94%) rename src/packages/{gfm.tmbundle/Snippets => gfm/snippets}/bold.cson (100%) rename src/packages/{gfm.tmbundle/Snippets => gfm/snippets}/code.cson (100%) rename src/packages/{gfm.tmbundle/Snippets => gfm/snippets}/img.cson (100%) rename src/packages/{gfm.tmbundle/Snippets => gfm/snippets}/italic.cson (100%) rename src/packages/{gfm.tmbundle/Snippets => gfm/snippets}/link.cson (100%) rename src/packages/{gfm.tmbundle => gfm}/spec/gfm-spec.coffee (97%) rename src/packages/{toml.tmbundle/Syntaxes => toml/grammars}/toml.cson (100%) rename src/packages/{toml.tmbundle => toml}/spec/toml-spec.coffee (95%) diff --git a/spec/app/atom-package-spec.coffee b/spec/app/atom-package-spec.coffee index 795141e58..b71c001f6 100644 --- a/spec/app/atom-package-spec.coffee +++ b/spec/app/atom-package-spec.coffee @@ -76,3 +76,23 @@ describe "AtomPackage", -> window.loadPackage("package-with-module") expect(config.get('package-with-module.numbers.one')).toBe 1 expect(config.get('package-with-module.numbers.two')).toBe 2 + + describe "when the package has a grammars directory", -> + grammar = null + beforeEach -> + spyOn(syntax, 'addGrammar') + spyOn(syntax, 'addProperties') + window.loadPackage("package-with-a-cson-grammar") + expect(syntax.addGrammar).toHaveBeenCalled() + grammar = syntax.addGrammar.argsForCall[0][0] + + it "loads the grammar and correctly parses a keyword", -> + expect(grammar.scopeName).toBe "source.alot" + {tokens} = grammar.tokenizeLine("this is alot of code") + expect(tokens[1]).toEqual value: "alot", scopes: ["source.alot", "keyword.alot"] + + it "loads the properties included in the grammar files", -> + expect(syntax.addProperties).toHaveBeenCalled() + [selector, properties] = syntax.addProperties.argsForCall[0] + expect(selector).toBe ".source.alot" + expect(properties).toEqual {editor: increaseIndentPattern: '^a'} diff --git a/spec/app/text-mate-grammar-spec.coffee b/spec/app/text-mate-grammar-spec.coffee index 09d236487..d3834b543 100644 --- a/spec/app/text-mate-grammar-spec.coffee +++ b/spec/app/text-mate-grammar-spec.coffee @@ -258,14 +258,3 @@ describe "TextMateGrammar", -> {tokens, ruleStack} = grammar.tokenizeLine("if(1){if(1){m()}}") expect(tokens[5]).toEqual value: "if", scopes: ["source.c", "meta.block.c", "keyword.control.c"] expect(tokens[10]).toEqual value: "m", scopes: ["source.c", "meta.block.c", "meta.block.c", "meta.function-call.c", "support.function.any-method.c"] - - describe "when the grammar is CSON", -> - it "loads the grammar and correctly parses a keyword", -> - spyOn(syntax, 'addGrammar') - pack = new TextMatePackage(project.resolve("packages/package-with-a-cson-grammar.tmbundle")) - pack.load() - grammar = pack.grammars[0] - expect(grammar).toBeTruthy() - expect(grammar.scopeName).toBe "source.alot" - {tokens} = grammar.tokenizeLine("this is alot of code") - expect(tokens[1]).toEqual value: "alot", scopes: ["source.alot", "keyword.alot"] diff --git a/spec/fixtures/packages/package-with-a-cson-grammar.tmbundle/Snippets/test.cson b/spec/fixtures/packages/package-with-a-cson-grammar.tmbundle/Snippets/test.cson deleted file mode 100644 index a82d8447a..000000000 --- a/spec/fixtures/packages/package-with-a-cson-grammar.tmbundle/Snippets/test.cson +++ /dev/null @@ -1,4 +0,0 @@ -'name': 'Really' -'scope': 'source.alot' -'tabTrigger': 'really' -'content': 'I really like $1 alot$0' diff --git a/spec/fixtures/packages/package-with-a-cson-grammar.tmbundle/Syntaxes/alot.cson b/spec/fixtures/packages/package-with-a-cson-grammar/grammars/alot.cson similarity index 59% rename from spec/fixtures/packages/package-with-a-cson-grammar.tmbundle/Syntaxes/alot.cson rename to spec/fixtures/packages/package-with-a-cson-grammar/grammars/alot.cson index d30d33f56..f111b6a13 100644 --- a/spec/fixtures/packages/package-with-a-cson-grammar.tmbundle/Syntaxes/alot.cson +++ b/spec/fixtures/packages/package-with-a-cson-grammar/grammars/alot.cson @@ -1,6 +1,11 @@ -'fileTypes': ['alot'] +'fileTypes': ['alot', 'foobizbang'] 'name': 'Alot' 'scopeName': 'source.alot' + +'properties': + 'editor': + 'increaseIndentPattern': '^a' + 'patterns': [ { 'captures': diff --git a/src/app/atom-package.coffee b/src/app/atom-package.coffee index 162f4d7e5..97be32dcb 100644 --- a/src/app/atom-package.coffee +++ b/src/app/atom-package.coffee @@ -1,3 +1,4 @@ +TextMateGrammar = require 'text-mate-grammar' Package = require 'package' fs = require 'fs-utils' _ = require 'underscore' @@ -15,6 +16,7 @@ class AtomPackage extends Package @loadMetadata() @loadKeymaps() @loadStylesheets() + @loadGrammars() if @deferActivation = @metadata.activationEvents? @registerDeferredDeserializers() else @@ -43,6 +45,20 @@ class AtomPackage extends Package for stylesheetPath in fs.list(stylesheetDirPath) requireStylesheet(stylesheetPath) + loadGrammars: -> + grammarsDirPath = fs.join(@path, 'grammars') + for grammarPath in fs.list(grammarsDirPath) + continue unless fs.extension(grammarPath) in ['.cson', '.json'] + grammarContent = fs.readObject(grammarPath) + grammar = new TextMateGrammar(grammarContent) + syntax.addGrammar(grammar) + @loadPropertiesFromGrammar(grammarContent.scopeName, grammarContent.properties) + + loadPropertiesFromGrammar: (scopeSelector, properties) -> + return unless properties + cssSelector = syntax.cssSelectorFromScopeSelector(scopeSelector) + syntax.addProperties(cssSelector, properties) + activate: -> if @deferActivation @subscribeToActivationEvents() diff --git a/src/app/syntax.coffee b/src/app/syntax.coffee index 7f89a63fe..04d2d02ff 100644 --- a/src/app/syntax.coffee +++ b/src/app/syntax.coffee @@ -125,4 +125,13 @@ class Syntax else element[0] + cssSelectorFromScopeSelector: (scopeSelector) -> + scopeSelector.split(', ').map((commaFragment) -> + commaFragment.split(' ').map((spaceFragment) -> + spaceFragment.split('.').map((dotFragment) -> + '.' + dotFragment.replace(/\+/g, '\\+') + ).join('') + ).join(' ') + ).join(', ') + _.extend(Syntax.prototype, EventEmitter) diff --git a/src/app/text-mate-grammar.coffee b/src/app/text-mate-grammar.coffee index 59c294752..0174edb10 100644 --- a/src/app/text-mate-grammar.coffee +++ b/src/app/text-mate-grammar.coffee @@ -8,7 +8,7 @@ CSON = require 'cson' module.exports = class TextMateGrammar @readFromPath: (path) -> - fs.readObject(path) + fs.readPlist(path) name: null fileTypes: null diff --git a/src/app/text-mate-package.coffee b/src/app/text-mate-package.coffee index a6ddf0d03..d82469c1c 100644 --- a/src/app/text-mate-package.coffee +++ b/src/app/text-mate-package.coffee @@ -10,15 +10,6 @@ class TextMatePackage extends Package @testName: (packageName) -> /(\.|_|-)tmbundle$/.test(packageName) - @cssSelectorFromScopeSelector: (scopeSelector) -> - scopeSelector.split(', ').map((commaFragment) -> - commaFragment.split(' ').map((spaceFragment) -> - spaceFragment.split('.').map((dotFragment) -> - '.' + dotFragment.replace(/\+/g, '\\+') - ).join('') - ).join(' ') - ).join(', ') - constructor: -> super @preferencesPath = fs.join(@path, "Preferences") @@ -66,12 +57,12 @@ class TextMatePackage extends Package for grammar in @getGrammars() if properties = @propertiesFromTextMateSettings(grammar) - selector = @cssSelectorFromScopeSelector(grammar.scopeName) + selector = syntax.cssSelectorFromScopeSelector(grammar.scopeName) scopedProperties.push({selector, properties}) for {scope, settings} in @getTextMatePreferenceObjects() if properties = @propertiesFromTextMateSettings(settings) - selector = @cssSelectorFromScopeSelector(scope) if scope? + selector = syntax.cssSelectorFromScopeSelector(scope) if scope? scopedProperties.push({selector, properties}) scopedProperties @@ -101,6 +92,3 @@ class TextMatePackage extends Package foldEndPattern: textMateSettings.foldingStopMarker ) { editor: editorProperties } if _.size(editorProperties) > 0 - - cssSelectorFromScopeSelector: (scopeSelector) -> - @constructor.cssSelectorFromScopeSelector(scopeSelector) diff --git a/src/packages/gfm.tmbundle/Preferences/indent.cson b/src/packages/gfm.tmbundle/Preferences/indent.cson deleted file mode 100644 index 113cdcb96..000000000 --- a/src/packages/gfm.tmbundle/Preferences/indent.cson +++ /dev/null @@ -1,4 +0,0 @@ -'name': 'Indent' -'scope': 'source.gfm' -'settings': - 'increaseIndentPattern': '^\\s*([\\*\\+-])[ \\t]+' diff --git a/src/packages/gfm.tmbundle/Syntaxes/gfm.cson b/src/packages/gfm/grammars/gfm.cson similarity index 94% rename from src/packages/gfm.tmbundle/Syntaxes/gfm.cson rename to src/packages/gfm/grammars/gfm.cson index 1f6a5a3f7..31e3b2f96 100644 --- a/src/packages/gfm.tmbundle/Syntaxes/gfm.cson +++ b/src/packages/gfm/grammars/gfm.cson @@ -7,6 +7,11 @@ 'mkdown' 'ron' ] + +'properties': + 'editor': + 'increaseIndentPattern': '^\\s*([\\*\\+-])[ \\t]+' + 'patterns': [ { 'match': '(?:^|\\s)(\\*\\*[^\\*]+\\*\\*)' diff --git a/src/packages/gfm.tmbundle/Snippets/bold.cson b/src/packages/gfm/snippets/bold.cson similarity index 100% rename from src/packages/gfm.tmbundle/Snippets/bold.cson rename to src/packages/gfm/snippets/bold.cson diff --git a/src/packages/gfm.tmbundle/Snippets/code.cson b/src/packages/gfm/snippets/code.cson similarity index 100% rename from src/packages/gfm.tmbundle/Snippets/code.cson rename to src/packages/gfm/snippets/code.cson diff --git a/src/packages/gfm.tmbundle/Snippets/img.cson b/src/packages/gfm/snippets/img.cson similarity index 100% rename from src/packages/gfm.tmbundle/Snippets/img.cson rename to src/packages/gfm/snippets/img.cson diff --git a/src/packages/gfm.tmbundle/Snippets/italic.cson b/src/packages/gfm/snippets/italic.cson similarity index 100% rename from src/packages/gfm.tmbundle/Snippets/italic.cson rename to src/packages/gfm/snippets/italic.cson diff --git a/src/packages/gfm.tmbundle/Snippets/link.cson b/src/packages/gfm/snippets/link.cson similarity index 100% rename from src/packages/gfm.tmbundle/Snippets/link.cson rename to src/packages/gfm/snippets/link.cson diff --git a/src/packages/gfm.tmbundle/spec/gfm-spec.coffee b/src/packages/gfm/spec/gfm-spec.coffee similarity index 97% rename from src/packages/gfm.tmbundle/spec/gfm-spec.coffee rename to src/packages/gfm/spec/gfm-spec.coffee index a31b04360..7460dfea5 100644 --- a/src/packages/gfm.tmbundle/spec/gfm-spec.coffee +++ b/src/packages/gfm/spec/gfm-spec.coffee @@ -1,14 +1,13 @@ -fs = require 'fs-utils' TextMatePackage = require 'text-mate-package' describe "GitHub Flavored Markdown grammar", -> grammar = null beforeEach -> - spyOn(syntax, "addGrammar") - pack = new TextMatePackage(fs.resolveOnLoadPath("gfm.tmbundle")) - pack.load() - grammar = pack.grammars[0] + spyOn(syntax, "addGrammar").andCallThrough() + window.loadPackage("gfm") + expect(syntax.addGrammar).toHaveBeenCalled() + grammar = syntax.addGrammar.argsForCall[0][0] it "parses the grammar", -> expect(grammar).toBeTruthy() diff --git a/src/packages/snippets/lib/snippets.coffee b/src/packages/snippets/lib/snippets.coffee index 866f8a0cc..a2e785adf 100644 --- a/src/packages/snippets/lib/snippets.coffee +++ b/src/packages/snippets/lib/snippets.coffee @@ -91,7 +91,7 @@ module.exports = async.eachSeries(paths, loadSnippetFile, done) translateTextmateSnippet: ({ scope, name, content, tabTrigger }) -> - scope = TextMatePackage.cssSelectorFromScopeSelector(scope) if scope + scope = syntax.cssSelectorFromScopeSelector(scope) if scope scope ?= '*' snippetsByScope = {} snippetsByName = {} diff --git a/src/packages/snippets/spec/snippets-spec.coffee b/src/packages/snippets/spec/snippets-spec.coffee index 6f52314c0..c02a85f74 100644 --- a/src/packages/snippets/spec/snippets-spec.coffee +++ b/src/packages/snippets/spec/snippets-spec.coffee @@ -281,21 +281,6 @@ describe "Snippets extension", -> expect(console.warn).toHaveBeenCalled() expect(console.warn.calls.length).toBe 1 - it "loads CSON snippets from TextMate packages", -> - jasmine.unspy(snippets, 'loadTextMateSnippets') - spyOn(console, 'warn') - snippets.loaded = false - snippets.loadAll() - - waitsFor "CSON snippets to load", 5000, -> snippets.loaded - - runs -> - snippet = syntax.getProperty(['.source.alot'], 'snippets.really') - expect(snippet).toBeTruthy() - expect(snippet.prefix).toBe 'really' - expect(snippet.name).toBe 'Really' - expect(snippet.body).toBe "I really like alot" - describe "snippet body parser", -> it "breaks a snippet body into lines, with each line containing tab stops at the appropriate position", -> bodyTree = snippets.getBodyParser().parse """ diff --git a/src/packages/toml.tmbundle/Syntaxes/toml.cson b/src/packages/toml/grammars/toml.cson similarity index 100% rename from src/packages/toml.tmbundle/Syntaxes/toml.cson rename to src/packages/toml/grammars/toml.cson diff --git a/src/packages/toml.tmbundle/spec/toml-spec.coffee b/src/packages/toml/spec/toml-spec.coffee similarity index 95% rename from src/packages/toml.tmbundle/spec/toml-spec.coffee rename to src/packages/toml/spec/toml-spec.coffee index 41eaeec55..c9d07a4f6 100644 --- a/src/packages/toml.tmbundle/spec/toml-spec.coffee +++ b/src/packages/toml/spec/toml-spec.coffee @@ -1,4 +1,3 @@ -fs = require 'fs-utils' TextMatePackage = require 'text-mate-package' describe "TOML grammar", -> @@ -6,9 +5,9 @@ describe "TOML grammar", -> beforeEach -> spyOn(syntax, "addGrammar") - pack = new TextMatePackage(fs.resolveOnLoadPath("toml.tmbundle")) - pack.load() - grammar = pack.grammars[0] + window.loadPackage("toml") + expect(syntax.addGrammar).toHaveBeenCalled() + grammar = syntax.addGrammar.argsForCall[0][0] it "parses the grammar", -> expect(grammar).toBeTruthy()