Support for Sublime Text YAML syntax definitions

Sublime Text YAML syntax definitions use the .sublime-syntax file extension

Most syntax files declare a YAML 1.2 syntax although they are YAML 1.1 compatible
Thus, the YAML version header is stripped off before parsing
Displays a warning if parsing fails

In .sublime-syntax files, the scope is under the 'scope' key -- as opposed to the usual 'scopeName' key
This commit is contained in:
Paul Chaignon
2016-06-26 19:30:23 +02:00
parent 5ac2cdde50
commit 4a031107ac
3 changed files with 18 additions and 7 deletions

View File

@@ -42,7 +42,7 @@ class DirectoryPackage
case File.extname(path.downcase)
when '.plist'
path.split('/')[-2] == 'Syntaxes'
when '.tmlanguage'
when '.tmlanguage', '.sublime-syntax'
true
when '.cson', '.json'
path.split('/')[-2] == 'grammars'
@@ -114,7 +114,7 @@ class SVNPackage
def fetch(tmp_dir)
`svn export -q "#{url}/Syntaxes" "#{tmp_dir}/Syntaxes"`
raise "Failed to export SVN repository: #{url}: #{$?.to_s}" unless $?.success?
Dir["#{tmp_dir}/Syntaxes/*.{plist,tmLanguage,tmlanguage}"]
Dir["#{tmp_dir}/Syntaxes/*.{plist,tmLanguage,tmlanguage,sublime-syntax}"]
end
end
@@ -148,6 +148,17 @@ def load_grammar(path)
case File.extname(path.downcase)
when '.plist', '.tmlanguage'
Plist::parse_xml(path)
when '.sublime-syntax'
content = File.read(path)
# Attempt to parse YAML file even if it has a YAML 1.2 header
if content.lines[0] =~ /^%YAML[ :]1\.2/
content = content.lines[1..-1].join
end
begin
YAML.load(content)
rescue Psych::SyntaxError => e
$stderr.puts "Failed to parse YAML grammar '#{path}'"
end
when '.cson'
cson = `"#{CSONC}" "#{path}"`
raise "Failed to convert CSON grammar '#{path}': #{$?.to_s}" unless $?.success?
@@ -169,7 +180,7 @@ def load_grammars(tmp_dir, source, all_scopes)
else
SingleFile.new(source)
end
elsif source.end_with?('.tmLanguage', '.plist')
elsif source.end_with?('.tmLanguage', '.plist', '.sublime-syntax')
SingleGrammar.new(source)
elsif source.start_with?('https://github.com')
GitHubPackage.new(source)
@@ -185,7 +196,7 @@ def load_grammars(tmp_dir, source, all_scopes)
p.fetch(tmp_dir).map do |path|
grammar = load_grammar(path)
scope = grammar['scopeName']
scope = grammar['scopeName'] || grammar['scope']
if all_scopes.key?(scope)
unless all_scopes[scope] == p.url
@@ -204,7 +215,7 @@ def install_grammars(grammars, path)
installed = []
grammars.each do |grammar|
scope = grammar['scopeName']
scope = grammar['scopeName'] || grammar['scope']
File.write(File.join(GRAMMARS_PATH, "#{scope}.json"), JSON.pretty_generate(grammar))
installed << scope
end