sublime_syntax_convertor 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.md +37 -0
- data/Rakefile +5 -0
- data/bin/sublime_syntax_convertor +45 -0
- data/lib/sublime_syntax_convertor.rb +6 -0
- data/lib/sublime_syntax_convertor/convertor.rb +111 -0
- data/lib/sublime_syntax_convertor/formatter.rb +93 -0
- data/lib/sublime_syntax_convertor/patterns.rb +58 -0
- data/lib/sublime_syntax_convertor/syntax_yaml.rb +108 -0
- data/lib/sublime_syntax_convertor/version.rb +3 -0
- data/sublime_syntax_convertor.gemspec +29 -0
- metadata +173 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bf748b7f3eb24b0659004f0e345516d014b2e0e8
|
4
|
+
data.tar.gz: 4799f199f90c2c46c458cc904a03e42913aeef05
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f55c140f42b040c21e3467958eeaeaeb8204a3aa709265a97185412b82c3dea213c339fc63aafa9e1e79b902642f463218af6aed6846cfb2635103b20f4d0d8d
|
7
|
+
data.tar.gz: 95c6b82b8b0327337c54bb47a952b5cc399188e22a69e63c6ee332c893e3d23be370695e4805e1e67ef70a25e2370d3e37769cc05da2006373bc79aac3a844d0
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2015 Allen A. Bargi
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Sublime Syntax Convertor
|
2
|
+
Converts `tmLanguage` to `sublime-syntax`
|
3
|
+
|
4
|
+
## Install
|
5
|
+
Add this line to your application's Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'sublime_syntax_convertor'
|
9
|
+
```
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
gem install sublime_syntax_convertor
|
18
|
+
|
19
|
+
## USAGE
|
20
|
+
|
21
|
+
### Command line
|
22
|
+
```bash
|
23
|
+
sublime_syntax_convertor files
|
24
|
+
sublime_syntax_convertor folder
|
25
|
+
```
|
26
|
+
|
27
|
+
### In your code
|
28
|
+
```ruby
|
29
|
+
require 'sublime_syntax_convertor'
|
30
|
+
file = File.read(tmLanguage_file)
|
31
|
+
convertor = SublimeSyntaxConvertor::Convertor.new(file)
|
32
|
+
sublime_syntax = convertor.to_yaml
|
33
|
+
```
|
34
|
+
|
35
|
+
|
36
|
+
---
|
37
|
+
© Copyright 2015 Allen Bargi. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'yaml'
|
3
|
+
require_relative '../lib/sublime_syntax_convertor'
|
4
|
+
|
5
|
+
def difference(a, b)
|
6
|
+
diff = (a.size >= b.size) ? a.to_a - b.to_a : b.to_a - a.to_a
|
7
|
+
Hash[*diff.flatten]
|
8
|
+
end
|
9
|
+
|
10
|
+
if ARGV.empty?
|
11
|
+
puts "USAGE: sublime_syntax_convertor files"
|
12
|
+
puts " sublime_syntax_convertor folder"
|
13
|
+
else
|
14
|
+
filenames = []
|
15
|
+
ARGV.each do |path|
|
16
|
+
path = File.expand_path(path)
|
17
|
+
if File.directory?(path)
|
18
|
+
filenames.push(*Dir[File.join(path, '*.tmLanguage')])
|
19
|
+
else
|
20
|
+
filenames.push(path)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
filenames.each do |fname|
|
25
|
+
outfile = File.join(File.dirname(fname), File.basename(fname, '.tmLanguage') + ".sublime-syntax")
|
26
|
+
if File.exist?(outfile)
|
27
|
+
puts "file already exists, deleting: #{outfile}"
|
28
|
+
File.delete(outfile)
|
29
|
+
end
|
30
|
+
|
31
|
+
convertor = SublimeSyntaxConvertor::Convertor.new(File.read(fname))
|
32
|
+
text = convertor.to_yaml
|
33
|
+
|
34
|
+
# verify that to_yaml produces valid yaml for this syntax
|
35
|
+
if convertor.syntax != YAML.load(text.gsub('%YAML 1.2', ''))
|
36
|
+
yaml = YAML.load(text.gsub('%YAML 1.2', ''))
|
37
|
+
syntax = convertor.syntax
|
38
|
+
diff = difference(yaml, syntax)
|
39
|
+
fail "Sorry, generated invalid YAML! #{fname}"
|
40
|
+
end
|
41
|
+
|
42
|
+
File.open(outfile, "w") { |f| f.write(text) }
|
43
|
+
puts "converted #{outfile}"
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require 'plist'
|
2
|
+
require_relative './sublime_syntax_convertor/version'
|
3
|
+
require_relative './sublime_syntax_convertor/formatter'
|
4
|
+
require_relative './sublime_syntax_convertor/patterns'
|
5
|
+
require_relative './sublime_syntax_convertor/syntax_yaml'
|
6
|
+
require_relative './sublime_syntax_convertor/convertor'
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module SublimeSyntaxConvertor
|
2
|
+
class Convertor
|
3
|
+
include Formatter
|
4
|
+
attr_reader :syntax
|
5
|
+
|
6
|
+
def initialize(lang)
|
7
|
+
@lang = Plist.parse_xml(lang)
|
8
|
+
@repository = @lang.fetch('repository', {})
|
9
|
+
@patterns = @lang.fetch('patterns', [])
|
10
|
+
@syntax = {}
|
11
|
+
normalize_repository
|
12
|
+
convert
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_yaml
|
16
|
+
SyntaxYaml.new(@syntax).yaml
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def normalize_repository
|
22
|
+
@repository.each do |key, value|
|
23
|
+
if value.key?('begin') || value.key?('match')
|
24
|
+
@repository[key] = [value]
|
25
|
+
else
|
26
|
+
@repository[key] = value['patterns']
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_contexts
|
32
|
+
contexts = {}
|
33
|
+
contexts['main'] = make_context(@lang['patterns'])
|
34
|
+
@repository.each do |key, value|
|
35
|
+
fail 'Double definition of main context' if key == 'main'
|
36
|
+
contexts[key] = make_context(value)
|
37
|
+
end
|
38
|
+
contexts
|
39
|
+
end
|
40
|
+
|
41
|
+
def convert
|
42
|
+
syntax = {}
|
43
|
+
syntax['comment'] = format_comment(@lang['comment']) if @lang.key?('comment')
|
44
|
+
syntax['first_line_match'] = format_regex(@lang['firstLineMatch']) if @lang.key?('firstLineMatch')
|
45
|
+
syntax['name'] = @lang['name'] if @lang.key?('name')
|
46
|
+
syntax['scope'] = @lang['scopeName'] if @lang.key?('scopeName')
|
47
|
+
syntax['file_extensions'] = @lang['fileTypes'] if @lang.key?('fileTypes')
|
48
|
+
syntax['hidden'] = @lang['hideFromUser'] if @lang.key?('hideFromUser')
|
49
|
+
syntax['hidden'] = @lang['hidden'] if @lang.key?('hidden')
|
50
|
+
syntax['contexts'] = create_contexts
|
51
|
+
@syntax = syntax
|
52
|
+
end
|
53
|
+
|
54
|
+
def handle_begin_pattern(pattern)
|
55
|
+
entry = BeginEndPattern.new('begin', pattern).to_h
|
56
|
+
entry['comment'] = format_comment(pattern['comment']) if pattern.key?('comment') && !format_comment(pattern['comment']).empty?
|
57
|
+
entry['push'] = handle_child_pattern(pattern)
|
58
|
+
entry
|
59
|
+
end
|
60
|
+
|
61
|
+
def handle_child_pattern(pattern)
|
62
|
+
end_entry = BeginEndPattern.new('end', pattern).to_h
|
63
|
+
child_patterns = pattern.key?('patterns') ? pattern["patterns"] : []
|
64
|
+
child = make_context(child_patterns)
|
65
|
+
apply_last = pattern.key?('applyEndPatternLast') && pattern['applyEndPatternLast'] == 1
|
66
|
+
apply_last ? child.push(end_entry) : child.unshift(end_entry)
|
67
|
+
child.unshift('meta_content_scope' => pattern['contentName']) if pattern.key?('contentName')
|
68
|
+
child.unshift('meta_scope' => pattern['name']) if pattern.key?('name')
|
69
|
+
if end_entry['match'].include? "\\G"
|
70
|
+
puts """WARNING:
|
71
|
+
pop pattern contains \\G, this will not work as expected
|
72
|
+
if it's intended to refer to the begin regex: #{end_entry['match']}"""
|
73
|
+
end
|
74
|
+
child
|
75
|
+
end
|
76
|
+
|
77
|
+
def handle_include_pattern(pattern)
|
78
|
+
key = pattern['include']
|
79
|
+
if key[0] == '#'
|
80
|
+
key = key[1..-1]
|
81
|
+
fail Exception("no entry in repository for #{key}") unless @repository.key?(key)
|
82
|
+
return { 'include' => key }
|
83
|
+
elsif key == '$self'
|
84
|
+
return { 'include' => 'main' }
|
85
|
+
elsif key == '$base'
|
86
|
+
return { 'include' => '$top_level_main' }
|
87
|
+
elsif key[0] == '$'
|
88
|
+
fail Exception "unknown include: #{key}"
|
89
|
+
else
|
90
|
+
return { 'include' => format_external_syntax(key) }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def make_context(patterns)
|
95
|
+
ctx = []
|
96
|
+
patterns.each do |pattern|
|
97
|
+
if pattern.key?('begin')
|
98
|
+
entry = handle_begin_pattern(pattern)
|
99
|
+
elsif pattern.key?('match')
|
100
|
+
entry = MatchPattern.new(pattern).to_h
|
101
|
+
elsif pattern.key?('include')
|
102
|
+
entry = handle_include_pattern(pattern)
|
103
|
+
else
|
104
|
+
fail Exception("unknown pattern type: #{pattern.keys}")
|
105
|
+
end
|
106
|
+
ctx.push(entry) if entry
|
107
|
+
end
|
108
|
+
ctx
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module SublimeSyntaxConvertor
|
2
|
+
module Formatter
|
3
|
+
def format_comment(str)
|
4
|
+
str = str.strip.gsub("\t", " ")
|
5
|
+
str = str.rstrip + "\n" if str.include?("\n")
|
6
|
+
str
|
7
|
+
end
|
8
|
+
|
9
|
+
def format_regex(str)
|
10
|
+
if str.include? "\n"
|
11
|
+
lines = str.split("\n")
|
12
|
+
# trim common indentation off of each line
|
13
|
+
if lines.size > 1
|
14
|
+
common_indent = leading_whitespace(lines[1])
|
15
|
+
lines[2..-1].each do |line|
|
16
|
+
cur_indent = leading_whitespace(line)
|
17
|
+
if cur_indent.start_with?(common_indent)
|
18
|
+
next
|
19
|
+
elsif common_indent.start_with?(cur_indent)
|
20
|
+
common_indent = cur_indent
|
21
|
+
else
|
22
|
+
common_indent = ''
|
23
|
+
end
|
24
|
+
end
|
25
|
+
# Generally the first line doesn't have any indentation, add some
|
26
|
+
lines[0] = common_indent + lines[0].lstrip unless lines[0].start_with?(common_indent)
|
27
|
+
else
|
28
|
+
common_indent = leading_whitespace(lines[0])
|
29
|
+
end
|
30
|
+
str = lines.map { |line| line[common_indent.size..-1] }.join("\n").rstrip
|
31
|
+
end
|
32
|
+
str
|
33
|
+
end
|
34
|
+
|
35
|
+
def format_captures(cap)
|
36
|
+
captures = {}
|
37
|
+
cap.each do |key, value|
|
38
|
+
unless value.key?('name')
|
39
|
+
puts "patterns and includes are not supported within captures: #{cap}"
|
40
|
+
next
|
41
|
+
end
|
42
|
+
|
43
|
+
begin
|
44
|
+
captures[key.to_i] = value['name']
|
45
|
+
rescue
|
46
|
+
puts 'named capture used, this is unsupported'
|
47
|
+
captures[key] = value['name']
|
48
|
+
end
|
49
|
+
end
|
50
|
+
captures
|
51
|
+
end
|
52
|
+
|
53
|
+
def format_external_syntax(key)
|
54
|
+
fail 'invalid external syntax name' if '#$'.include?(key[0])
|
55
|
+
if key.include?('#')
|
56
|
+
syntax, rule = key.split('#')
|
57
|
+
return "scope:#{syntax}##{rule}"
|
58
|
+
else
|
59
|
+
return "scope:#{key}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def needs_quoting?(str)
|
64
|
+
(
|
65
|
+
str == "" ||
|
66
|
+
str.start_with?('<<') ||
|
67
|
+
"\"'%-:?@`&*!,#|>0123456789=".include?(str[0]) ||
|
68
|
+
%w(true false null).include?(str) ||
|
69
|
+
str.include?("# ") ||
|
70
|
+
str.include?(': ') ||
|
71
|
+
str.include?('[') ||
|
72
|
+
str.include?(']') ||
|
73
|
+
str.include?('{') ||
|
74
|
+
str.include?('}') ||
|
75
|
+
str.include?("\n") ||
|
76
|
+
":#".include?(str[-1]) ||
|
77
|
+
str.strip != str
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
def quote(str)
|
82
|
+
if str.include?("\\") || str.include?('"')
|
83
|
+
return "'" + str.gsub("'", "''") + "'"
|
84
|
+
else
|
85
|
+
return '"' + str.gsub("\\", "\\\\").gsub('"', '\\"') + '"'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def leading_whitespace(str)
|
90
|
+
str[0...(str.size - str.lstrip.size)]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative './formatter'
|
2
|
+
|
3
|
+
module SublimeSyntaxConvertor
|
4
|
+
class MatchPattern
|
5
|
+
include Formatter
|
6
|
+
attr_reader :match, :scope, :captures, :comment
|
7
|
+
|
8
|
+
def initialize(pat)
|
9
|
+
@match = format_regex(pat['match'])
|
10
|
+
@scope = pat['name'] if pat.key?('name')
|
11
|
+
@captures = format_captures(pat['captures']) if pat.key?('captures')
|
12
|
+
@comment = format_comment(pat['comment']) if pat.key?('comment') && !format_comment(pat['comment']).empty?
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_h
|
16
|
+
hash = {}
|
17
|
+
hash['match'] = @match if @match
|
18
|
+
hash['scope'] = @scope if @scope
|
19
|
+
hash['captures'] = @captures if @captures
|
20
|
+
hash['comment'] = @comment if @comment
|
21
|
+
hash
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class BeginEndPattern
|
26
|
+
include Formatter
|
27
|
+
attr_reader :match, :pop, :captures
|
28
|
+
|
29
|
+
def initialize(type, pattern)
|
30
|
+
@pattern = pattern
|
31
|
+
@type = type
|
32
|
+
@match = format_regex(pattern[type])
|
33
|
+
@pop = true if type == 'end'
|
34
|
+
handle_captures
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_h
|
38
|
+
hash = {}
|
39
|
+
hash['match'] = @match if @match
|
40
|
+
hash['pop'] = @pop if @pop
|
41
|
+
hash['captures'] = @captures if @captures
|
42
|
+
hash
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def handle_captures
|
48
|
+
pattern_captures = @pattern["#{@type}Captures"] || @pattern["captures"]
|
49
|
+
return unless pattern_captures
|
50
|
+
captures = format_captures(pattern_captures)
|
51
|
+
if captures.key?('0')
|
52
|
+
entry['scope'] = captures['0']
|
53
|
+
captures.delete('0')
|
54
|
+
end
|
55
|
+
@captures = captures if captures.size > 0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require_relative './formatter'
|
2
|
+
|
3
|
+
module SublimeSyntaxConvertor
|
4
|
+
class SyntaxYaml
|
5
|
+
include Formatter
|
6
|
+
attr_reader :yaml
|
7
|
+
TAB_SIZE = 2
|
8
|
+
|
9
|
+
def initialize(val)
|
10
|
+
@yaml = to_yaml(val, false, 0)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def to_yaml(val, start_block_on_newline, indent)
|
16
|
+
out = ''
|
17
|
+
|
18
|
+
if indent == 0
|
19
|
+
out += "%YAML 1.2\n---\n"
|
20
|
+
out += "# http://www.sublimetext.com/docs/3/syntax.html\n"
|
21
|
+
end
|
22
|
+
|
23
|
+
if val.is_a?(Array)
|
24
|
+
out += array_to_yaml(val, start_block_on_newline, indent)
|
25
|
+
elsif val.is_a?(Hash)
|
26
|
+
out += hash_to_yaml(val, start_block_on_newline, indent)
|
27
|
+
elsif val.is_a?(String)
|
28
|
+
out += string_to_yaml(val, start_block_on_newline, indent)
|
29
|
+
elsif val.is_a?(TrueClass) || val.is_a?(FalseClass)
|
30
|
+
out += boolean_to_yaml(val)
|
31
|
+
else
|
32
|
+
out += "#{val}\n"
|
33
|
+
end
|
34
|
+
# to_yaml will leave some trailing whitespace, remove it
|
35
|
+
out.split("\n").map(&:rstrip).join("\n") + "\n"
|
36
|
+
end
|
37
|
+
|
38
|
+
def array_to_yaml(val, start_block_on_newline, indent)
|
39
|
+
out = ''
|
40
|
+
if val.size == 0
|
41
|
+
out += "[]\n"
|
42
|
+
else
|
43
|
+
out += "\n" if start_block_on_newline
|
44
|
+
val.each { |item| out += ' ' * indent + '- ' + to_yaml(item, false, indent + 2) }
|
45
|
+
end
|
46
|
+
out
|
47
|
+
end
|
48
|
+
|
49
|
+
def hash_to_yaml(val, start_block_on_newline, indent)
|
50
|
+
out = ''
|
51
|
+
out += "\n" if start_block_on_newline
|
52
|
+
first = true
|
53
|
+
order_keys(val.keys).each do |key|
|
54
|
+
value = val[key]
|
55
|
+
if !first || start_block_on_newline
|
56
|
+
out += ' ' * indent
|
57
|
+
else
|
58
|
+
first = false
|
59
|
+
end
|
60
|
+
|
61
|
+
if key.is_a?(Numeric)
|
62
|
+
out += key.to_s
|
63
|
+
elsif needs_quoting?(key)
|
64
|
+
out += quote(key)
|
65
|
+
else
|
66
|
+
out += key
|
67
|
+
end
|
68
|
+
|
69
|
+
out += ": "
|
70
|
+
out += to_yaml(value, true, indent + TAB_SIZE)
|
71
|
+
end
|
72
|
+
out
|
73
|
+
end
|
74
|
+
|
75
|
+
def string_to_yaml(val, start_block_on_newline, indent)
|
76
|
+
out = ''
|
77
|
+
if needs_quoting?(val)
|
78
|
+
if val.include?("\n")
|
79
|
+
fail unless start_block_on_newline
|
80
|
+
out += (val[-1] == "\n") ? "|\n" : "|-\n"
|
81
|
+
val.split("\n").each { |line| out += "#{' ' * indent}#{line}\n" }
|
82
|
+
else
|
83
|
+
out += "#{quote(val)}\n"
|
84
|
+
end
|
85
|
+
return out
|
86
|
+
else
|
87
|
+
return "#{val}\n"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def boolean_to_yaml(val)
|
92
|
+
val ? "true\n" : "false\n"
|
93
|
+
end
|
94
|
+
|
95
|
+
def order_keys(list)
|
96
|
+
key_order = %w(name main match comment file_extensions first_line_match hidden match scope main).reverse
|
97
|
+
list = list.sort
|
98
|
+
key_order.each do |key|
|
99
|
+
if list.include?(key)
|
100
|
+
list.delete_at(list.index(key))
|
101
|
+
list.insert(0, key)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
list
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'sublime_syntax_convertor/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'sublime_syntax_convertor'
|
8
|
+
spec.version = SublimeSyntaxConvertor::VERSION
|
9
|
+
spec.authors = ['Allen Bargi']
|
10
|
+
spec.email = ['allen.bargi@gmail.com']
|
11
|
+
spec.description = 'Converts tmLanguage to sublime-syntax'
|
12
|
+
spec.summary = 'Converts tmLanguage to sublime-syntax'
|
13
|
+
spec.homepage = 'https://github.com/aziz/SublimeSyntaxConvertor'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_dependency 'plist'
|
21
|
+
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
23
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
24
|
+
spec.add_development_dependency 'rspec'
|
25
|
+
spec.add_development_dependency 'awesome_print'
|
26
|
+
spec.add_development_dependency 'guard-rspec'
|
27
|
+
spec.add_development_dependency 'simplecov'
|
28
|
+
spec.add_development_dependency 'rubycritic'
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sublime_syntax_convertor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Allen Bargi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-08-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: plist
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.10'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: awesome_print
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubycritic
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: Converts tmLanguage to sublime-syntax
|
126
|
+
email:
|
127
|
+
- allen.bargi@gmail.com
|
128
|
+
executables:
|
129
|
+
- sublime_syntax_convertor
|
130
|
+
extensions: []
|
131
|
+
extra_rdoc_files: []
|
132
|
+
files:
|
133
|
+
- ".gitignore"
|
134
|
+
- ".rspec"
|
135
|
+
- ".travis.yml"
|
136
|
+
- Gemfile
|
137
|
+
- Gemfile.lock
|
138
|
+
- LICENSE
|
139
|
+
- README.md
|
140
|
+
- Rakefile
|
141
|
+
- bin/sublime_syntax_convertor
|
142
|
+
- lib/sublime_syntax_convertor.rb
|
143
|
+
- lib/sublime_syntax_convertor/convertor.rb
|
144
|
+
- lib/sublime_syntax_convertor/formatter.rb
|
145
|
+
- lib/sublime_syntax_convertor/patterns.rb
|
146
|
+
- lib/sublime_syntax_convertor/syntax_yaml.rb
|
147
|
+
- lib/sublime_syntax_convertor/version.rb
|
148
|
+
- sublime_syntax_convertor.gemspec
|
149
|
+
homepage: https://github.com/aziz/SublimeSyntaxConvertor
|
150
|
+
licenses:
|
151
|
+
- MIT
|
152
|
+
metadata: {}
|
153
|
+
post_install_message:
|
154
|
+
rdoc_options: []
|
155
|
+
require_paths:
|
156
|
+
- lib
|
157
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '0'
|
162
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
requirements: []
|
168
|
+
rubyforge_project:
|
169
|
+
rubygems_version: 2.4.6
|
170
|
+
signing_key:
|
171
|
+
specification_version: 4
|
172
|
+
summary: Converts tmLanguage to sublime-syntax
|
173
|
+
test_files: []
|