tmx-parser 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a95740797f7386113397902ddd8b2293066e1929
4
+ data.tar.gz: ad8ce82161502d6e3746889cc13e66d11869b0b6
5
+ SHA512:
6
+ metadata.gz: 275c81a33ea76c4cac5e4d17e20d6b5478820991375bb739266ae820bfc52a142a83bc2d0712b823df4b7c8e2e381d6b11d71f2737a9dbd4fef8c65a39880d3c
7
+ data.tar.gz: 549f44444e7746edb4d3140294d73bfae5cb29d27010103966470777f570e0df6966cc1296e7ff9e62f1f47a24db1fb2361805eaecd8947c32e89b6a2abaab6d
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
data/History.txt ADDED
@@ -0,0 +1,3 @@
1
+ == 1.0.0
2
+
3
+ * Birthday!
data/README.md ADDED
@@ -0,0 +1,113 @@
1
+ tmx-parser
2
+ =================
3
+
4
+ Parser for the Translation Memory eXchange (.tmx) file format.
5
+
6
+ ## Installation
7
+
8
+ `gem install tmx-parser`
9
+
10
+ ## Usage
11
+
12
+ ```ruby
13
+ require 'tmx-parser'
14
+ ```
15
+
16
+ ## Functionality
17
+
18
+ Got a .tmx file you need to parse? Just use the `TmxParser#load` method. It'll return an enumerable `TmxParser::Document` object for your iterating pleasure:
19
+
20
+ ```ruby
21
+ doc = TmxParser.load(File.open('path/to/my.tmx'))
22
+ doc.each do |unit|
23
+ ...
24
+ end
25
+ ```
26
+
27
+ You can also pass a string to `#load`:
28
+
29
+ ```ruby
30
+ doc = TmxParser.load(File.read('path/to/my.tmx'))
31
+ ```
32
+
33
+ The parser works in a streaming fashion, meaning it tries not to hold the entire source document in memory all at once. It will instead yield each translation unit incrementally.
34
+
35
+ ## Translation Units
36
+
37
+ Translation units are simple Ruby objects that contain properties (tmx `<prop>` elements) and variants (tmx `tuv` elements). You can also retrieve the tuid (translation unit id) and segtype (segment type). Given this document:
38
+
39
+ ```xml
40
+ <tmx version="1.4">
41
+ <body>
42
+ <tu tuid="79b371014a8382a3b6efb86ec6ea97d9" segtype="block">
43
+ <prop type="x-segment-id">0</prop>
44
+ <prop type="x-some-property">six.hours</prop>
45
+ <tuv xml:lang="en-US"><seg>6 hours</seg></tuv>
46
+ <tuv xml:lang="de-DE"><seg>6 Stunden</seg></tuv>
47
+ </tu>
48
+ </body>
49
+ </tmx>
50
+ ```
51
+
52
+ Here's what you can do:
53
+
54
+ ```ruby
55
+ doc.each do |unit|
56
+ unit.tuid # => "79b371014a8382a3b6efb86ec6ea97d9"
57
+ unit.segtype # => "block"
58
+
59
+ unit.properties.keys # => ["x-segment-id", "x-some-property"]
60
+ unit.properties['x-segment-id'].value # => "0"
61
+
62
+ variant = unit.variants.first
63
+ variant.locale # => "en-US"
64
+ variant.elements # => ["6 hours"]
65
+ end
66
+ ```
67
+
68
+ ## Placeholders
69
+
70
+ Let's consider a different document:
71
+
72
+ ```xml
73
+ <tmx version="1.4">
74
+ <body>
75
+ <tu tuid="#{tuid}" segtype="block">
76
+ <prop type="x-segment-id">0</prop>
77
+ <tuv xml:lang="en-US">
78
+ <seg><ph type="x-placeholder">{0}</ph> sessions</seg>
79
+ </tuv>
80
+ <tuv xml:lang="de-DE">
81
+ <seg><ph type="x-placeholder">{0}</ph> Einheiten</seg>
82
+ </tuv>
83
+ </tu>
84
+ </body>
85
+ </tmx>
86
+ ```
87
+
88
+ The placeholders will be added to the variant's `elements` array:
89
+
90
+ ```ruby
91
+ doc.each do |unit|
92
+ variant = unit.variants.first
93
+ variant.elements # => ["#<TmxParser::Placeholder:0x5ad5be4a @text="{0}", @type="x-placeholder">", " sessions"]
94
+ end
95
+ ```
96
+
97
+ Begin paired tags (tmx `bpt` elements) and end paired tags (tmx `ept` elements) are handled the same way.
98
+
99
+ ## See Also
100
+
101
+ * TMX file format: [http://www.gala-global.org/oscarStandards/tmx/tmx14b.html](http://www.gala-global.org/oscarStandards/tmx/tmx14b.html)
102
+
103
+ ## Requirements
104
+
105
+ No external requirements.
106
+
107
+ ## Running Tests
108
+
109
+ `bundle exec rspec` should do the trick :)
110
+
111
+ ## Authors
112
+
113
+ * Cameron C. Dutro: http://github.com/camertron
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ # encoding: UTF-8
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), 'lib')
4
+
5
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
6
+
7
+ require 'bundler'
8
+ require 'rspec/core/rake_task'
9
+ require 'rubygems/package_task'
10
+
11
+ require 'tmx-parser'
12
+
13
+ Bundler::GemHelper.install_tasks
14
+
15
+ task :default => :spec
16
+
17
+ desc 'Run specs'
18
+ RSpec::Core::RakeTask.new do |t|
19
+ t.pattern = './spec/**/*_spec.rb'
20
+ end
data/lib/tmx-parser.rb ADDED
@@ -0,0 +1,20 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'nokogiri'
4
+
5
+ module TmxParser
6
+ autoload :Document, 'tmx-parser/document'
7
+ autoload :SaxDocument, 'tmx-parser/sax_document'
8
+ autoload :Listener, 'tmx-parser/listener'
9
+ autoload :TagNames, 'tmx-parser/tag_names'
10
+ autoload :Unit, 'tmx-parser/elements'
11
+ autoload :PropertyValue, 'tmx-parser/elements'
12
+ autoload :Variant, 'tmx-parser/elements'
13
+ autoload :Placeholder, 'tmx-parser/elements'
14
+ autoload :BeginPair, 'tmx-parser/elements'
15
+ autoload :EndPair, 'tmx-parser/elements'
16
+
17
+ def self.load(string_or_file_handle)
18
+ Document.new(string_or_file_handle)
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+
3
+ module TmxParser
4
+ class Document
5
+
6
+ include Enumerable
7
+
8
+ attr_reader :string_or_file_handle
9
+
10
+ def initialize(string_or_file_handle)
11
+ @string_or_file_handle = string_or_file_handle
12
+ end
13
+
14
+ def each(&block)
15
+ if block_given?
16
+ listener = Listener.new(&block)
17
+ document = SaxDocument.new(listener)
18
+ parser = Nokogiri::XML::SAX::Parser.new(document)
19
+ parser.parse(string_or_file_handle)
20
+ else
21
+ to_enum(__method__)
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,85 @@
1
+ # encoding: UTF-8
2
+
3
+ module TmxParser
4
+
5
+ class Unit
6
+ attr_reader :tuid, :segtype, :properties, :variants
7
+
8
+ def initialize(tuid, segtype)
9
+ @tuid = tuid
10
+ @segtype = segtype
11
+ @properties = {}
12
+ @variants = []
13
+ end
14
+ end
15
+
16
+ class PropertyValue
17
+ attr_accessor :value
18
+
19
+ def initialize
20
+ @value = ''
21
+ end
22
+
23
+ def receive_text(str)
24
+ @value << str
25
+ end
26
+ end
27
+
28
+ class Variant
29
+ attr_reader :locale
30
+ attr_accessor :elements
31
+
32
+ def initialize(locale)
33
+ @locale = locale
34
+ @elements = []
35
+ end
36
+
37
+ def receive_text(str)
38
+ @elements << str
39
+ end
40
+ end
41
+
42
+ class Placeholder
43
+ attr_reader :type, :text
44
+ attr_accessor :start, :length
45
+
46
+ def initialize(type)
47
+ @type = type
48
+ @text = ''
49
+ end
50
+
51
+ def receive_text(str)
52
+ @text << str
53
+ end
54
+ end
55
+
56
+ class Pair
57
+ attr_reader :text, :i
58
+
59
+ def initialize(i)
60
+ @i = i
61
+ @text = ''
62
+ end
63
+
64
+ def receive_text(str)
65
+ @text << str
66
+ end
67
+
68
+ def type
69
+ raise NotImplementedError
70
+ end
71
+ end
72
+
73
+ class BeginPair < Pair
74
+ def type
75
+ :begin
76
+ end
77
+ end
78
+
79
+ class EndPair < Pair
80
+ def type
81
+ :end
82
+ end
83
+ end
84
+
85
+ end
@@ -0,0 +1,80 @@
1
+ # encoding: UTF-8
2
+
3
+ module TmxParser
4
+
5
+ class Listener
6
+ include TagNames
7
+
8
+ attr_reader :units, :proc
9
+
10
+ def initialize(&block)
11
+ @stack = []
12
+ @proc = block
13
+ end
14
+
15
+ def unit(tuid, segtype)
16
+ @current_unit = Unit.new(tuid, segtype)
17
+ end
18
+
19
+ def variant(locale)
20
+ variant = Variant.new(locale)
21
+ current_unit.variants << variant
22
+ stack.push(variant)
23
+ end
24
+
25
+ def property(name)
26
+ val = PropertyValue.new
27
+ current_unit.properties[name] = val
28
+ stack.push(val)
29
+ end
30
+
31
+ def text(str)
32
+ if last = stack.last
33
+ last.receive_text(str)
34
+ end
35
+ end
36
+
37
+ def done(tag_name)
38
+ if tag_name == UNIT_TAG
39
+ proc.call(current_unit)
40
+ else
41
+ if tag_name_for(stack.last) == tag_name
42
+ stack.pop
43
+ end
44
+ end
45
+ end
46
+
47
+ def placeholder(type)
48
+ placeholder = Placeholder.new(type)
49
+ current_unit.variants.last.elements << placeholder
50
+ stack.push(placeholder)
51
+ end
52
+
53
+ def begin_paired_tag(i)
54
+ begin_pair = BeginPair.new(i)
55
+ current_unit.variants.last.elements << begin_pair
56
+ stack.push(begin_pair)
57
+ end
58
+
59
+ def end_paired_tag(i)
60
+ end_pair = EndPair.new(i)
61
+ current_unit.variants.last.elements << end_pair
62
+ stack.push(end_pair)
63
+ end
64
+
65
+ private
66
+
67
+ def tag_name_for(obj)
68
+ case obj
69
+ when Variant then VARIANT_TAG
70
+ when PropertyValue then PROPERTY_TAG
71
+ when Placeholder then PLACEHOLDER_TAG
72
+ when BeginPair then BEGIN_PAIRED_TAG
73
+ when EndPair then END_PAIRED_TAG
74
+ end
75
+ end
76
+
77
+ attr_reader :current_unit, :stack
78
+
79
+ end
80
+ end
@@ -0,0 +1,73 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'nokogiri'
4
+
5
+ module TmxParser
6
+
7
+ class SaxDocument < Nokogiri::XML::SAX::Document
8
+ include TagNames
9
+
10
+ attr_reader :listener
11
+
12
+ def initialize(listener)
13
+ @listener = listener
14
+ @capture_stack = [false]
15
+ @text = ''
16
+ end
17
+
18
+ def start_element(name, attrs = [])
19
+ case name
20
+ when UNIT_TAG
21
+ listener.unit(
22
+ get_attr('tuid', attrs), get_attr('segtype', attrs)
23
+ )
24
+ when VARIANT_TAG
25
+ locale = get_attr('xml:lang', attrs)
26
+ listener.variant(locale)
27
+ when SEGMENT_TAG
28
+ capture_text
29
+ when PROPERTY_TAG
30
+ capture_text
31
+ listener.property(get_attr('type', attrs))
32
+ when BEGIN_PAIRED_TAG
33
+ capture_text
34
+ listener.begin_paired_tag(get_attr('i', attrs))
35
+ when END_PAIRED_TAG
36
+ capture_text
37
+ listener.end_paired_tag(get_attr('i', attrs))
38
+ when PLACEHOLDER_TAG
39
+ capture_text
40
+ listener.placeholder(get_attr('type', attrs))
41
+ end
42
+ end
43
+
44
+ def end_element(name)
45
+ @capture_stack.pop
46
+ send_text
47
+ listener.done(name)
48
+ end
49
+
50
+ def characters(str)
51
+ @text += str if @capture_stack.last
52
+ end
53
+
54
+ private
55
+
56
+ def send_text
57
+ listener.text(@text) unless @text.empty?
58
+ @text = ''
59
+ end
60
+
61
+ def capture_text
62
+ send_text
63
+ @capture_stack.push(true)
64
+ end
65
+
66
+ def get_attr(name, attrs)
67
+ if found = attrs.find { |a| a.first == name }
68
+ found.last
69
+ end
70
+ end
71
+ end
72
+
73
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: UTF-8
2
+
3
+ module TmxParser
4
+ module TagNames
5
+ UNIT_TAG = 'tu'
6
+ VARIANT_TAG = 'tuv'
7
+ PROPERTY_TAG = 'prop'
8
+ SEGMENT_TAG = 'seg'
9
+ PLACEHOLDER_TAG = 'ph'
10
+ BEGIN_PAIRED_TAG = 'bpt'
11
+ END_PAIRED_TAG = 'ept'
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: UTF-8
2
+
3
+ module TmxParser
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'pry-nav'
4
+ require 'rspec'
5
+ require 'tmx-parser'
6
+
7
+ RSpec.configure do |config|
8
+ end
@@ -0,0 +1,199 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe TmxParser do
6
+ let(:parser) { TmxParser }
7
+ let(:tuid) { '79b371014a8382a3b6efb86ec6ea97d9' }
8
+
9
+ def find_variant(locale, unit)
10
+ unit.variants.find { |v| v.locale == locale }
11
+ end
12
+
13
+ context 'with a basic tmx document' do
14
+ let(:document) do
15
+ %Q{
16
+ <tmx version="1.4">
17
+ <body>
18
+ <tu tuid="#{tuid}" segtype="block">
19
+ <prop type="x-segment-id">0</prop>
20
+ <prop type="x-some-property">six.hours</prop>
21
+ <tuv xml:lang="en-US"><seg>6 hours</seg></tuv>
22
+ <tuv xml:lang="de-DE"><seg>6 Stunden</seg></tuv>
23
+ </tu>
24
+ </body>
25
+ </tmx>
26
+ }
27
+ end
28
+
29
+ it 'identifies the tuid and segtype' do
30
+ parser.load(document).to_a.tap do |units|
31
+ expect(units.size).to eq(1)
32
+
33
+ units.first.tap do |unit|
34
+ expect(unit.tuid).to eq(tuid)
35
+ expect(unit.segtype).to eq('block')
36
+ end
37
+ end
38
+ end
39
+
40
+ it 'identifies the correct variants' do
41
+ parser.load(document).to_a.first.tap do |unit|
42
+ expect(unit.variants.size).to eq(2)
43
+ expect(find_variant('en-US', unit).elements).to eq(['6 hours'])
44
+ expect(find_variant('de-DE', unit).elements).to eq(['6 Stunden'])
45
+
46
+ unit.variants.each do |variant|
47
+ expect(variant).to be_a(TmxParser::Variant)
48
+ end
49
+ end
50
+ end
51
+
52
+ it 'identifies properties' do
53
+ parser.load(document).to_a.first.tap do |unit|
54
+ expect(unit.properties.size).to eq(2)
55
+ expect(unit.properties).to include('x-segment-id')
56
+ expect(unit.properties).to include('x-some-property')
57
+ expect(unit.properties['x-segment-id'].value).to eq('0')
58
+ expect(unit.properties['x-some-property'].value).to eq('six.hours')
59
+ end
60
+ end
61
+ end
62
+
63
+ context 'with a tmx document that contains a property that makes jruby cry' do
64
+ # For some reason, jruby doesn't like square brackets in property values.
65
+ # See: https://github.com/sparklemotion/nokogiri/issues/1261
66
+
67
+ let(:document) do
68
+ %Q{
69
+ <tmx version="1.4">
70
+ <body>
71
+ <tu tuid="#{tuid}" segtype="block">
72
+ <prop type="x-segment-id">0</prop>
73
+ <prop type="x-some-property">en:#:daily-data:#:[3]:#:times</prop>
74
+ <tuv xml:lang="en-US"><seg>6 hours</seg></tuv>
75
+ <tuv xml:lang="de-DE"><seg>6 Stunden</seg></tuv>
76
+ </tu>
77
+ </body>
78
+ </tmx>
79
+ }
80
+ end
81
+
82
+ it 'identifies the property correctly' do
83
+ parser.load(document).to_a.first.tap do |unit|
84
+ expect(unit.properties).to include('x-some-property')
85
+ expect(unit.properties['x-some-property']).to be_a(TmxParser::PropertyValue)
86
+ expect(unit.properties['x-some-property'].value).to eq(
87
+ 'en:#:daily-data:#:[3]:#:times'
88
+ )
89
+ end
90
+ end
91
+ end
92
+
93
+ context 'with a tmx document that contains placeholders' do
94
+ let(:document) do
95
+ %Q{
96
+ <tmx version="1.4">
97
+ <body>
98
+ <tu tuid="#{tuid}" segtype="block">
99
+ <prop type="x-segment-id">0</prop>
100
+ <tuv xml:lang="en-US">
101
+ <seg><ph type="x-placeholder">{0}</ph> sessions</seg>
102
+ </tuv>
103
+ <tuv xml:lang="de-DE">
104
+ <seg><ph type="x-placeholder">{0}</ph> Einheiten</seg>
105
+ </tuv>
106
+ </tu>
107
+ </body>
108
+ </tmx>
109
+ }
110
+ end
111
+
112
+ it 'identifies the placeholders' do
113
+ parser.load(document).to_a.first.tap do |unit|
114
+ expect(unit.variants.size).to eq(2)
115
+
116
+ find_variant('en-US', unit).tap do |en_variant|
117
+ expect(en_variant.elements.size).to eq(2)
118
+
119
+ en_variant.elements.first.tap do |first_element|
120
+ expect(first_element.type).to eq('x-placeholder')
121
+ expect(first_element.text).to eq('{0}')
122
+ end
123
+
124
+ en_variant.elements.last.tap do |last_element|
125
+ expect(last_element).to be_a(String)
126
+ expect(last_element).to eq(' sessions')
127
+ end
128
+ end
129
+
130
+ find_variant('de-DE', unit).tap do |en_variant|
131
+ expect(en_variant.elements.size).to eq(2)
132
+
133
+ en_variant.elements.first.tap do |first_element|
134
+ expect(first_element).to be_a(TmxParser::Placeholder)
135
+ expect(first_element.type).to eq('x-placeholder')
136
+ expect(first_element.text).to eq('{0}')
137
+ end
138
+
139
+ en_variant.elements.last.tap do |last_element|
140
+ expect(last_element).to be_a(String)
141
+ expect(last_element).to eq(' Einheiten')
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+
148
+ context 'with a tmx document that contains paired tags' do
149
+ let(:document) do
150
+ %Q{
151
+ <tmx version="1.4">
152
+ <body>
153
+ <tu tuid="#{tuid}" segtype="block">
154
+ <prop type="x-segment-id">0</prop>
155
+ <tuv xml:lang="en-US">
156
+ <seg>Build your healthy habit of daily training with <bpt i="3">&lt;strong&gt;</bpt>email training reminders.<ept i="3">&lt;/strong&gt;</ept></seg>
157
+ </tuv>
158
+ <tuv xml:lang="de-DE">
159
+ <seg><bpt i="3">&lt;strong&gt;</bpt>Mit Erinnerungen per E-Mail<ept i="3">&lt;/strong&gt;</ept> können Sie das tägliche Training zu einer schönen Angewohnheit werden lassen.</seg>
160
+ </tuv>
161
+ </tu>
162
+ </body>
163
+ </tmx>
164
+ }
165
+ end
166
+
167
+ it 'identifies the tags' do
168
+ parser.load(document).to_a.first.tap do |unit|
169
+ expect(unit.variants.size).to eq(2)
170
+
171
+ find_variant('en-US', unit).tap do |en_variant|
172
+ expect(en_variant.elements.size).to eq(4)
173
+
174
+ en_variant.elements[0].tap do |element|
175
+ expect(element).to be_a(String)
176
+ expect(element).to eq('Build your healthy habit of daily training with ')
177
+ end
178
+
179
+ en_variant.elements[1].tap do |element|
180
+ expect(element).to be_a(TmxParser::BeginPair)
181
+ expect(element.i).to eq('3')
182
+ expect(element.text).to eq('<strong>')
183
+ end
184
+
185
+ en_variant.elements[2].tap do |element|
186
+ expect(element).to be_a(String)
187
+ expect(element).to eq('email training reminders.')
188
+ end
189
+
190
+ en_variant.elements[3].tap do |element|
191
+ expect(element).to be_a(TmxParser::EndPair)
192
+ expect(element.i).to eq('3')
193
+ expect(element.text).to eq('</strong>')
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: UTF-8
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), 'lib')
4
+ require 'tmx-parser/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "tmx-parser"
8
+ s.version = ::TmxParser::VERSION
9
+ s.authors = ["Cameron Dutro"]
10
+ s.email = ["camertron@gmail.com"]
11
+ s.homepage = "http://github.com/camertron"
12
+
13
+ s.description = s.summary = "Parser for the Translation Memory eXchange (.tmx) file format."
14
+
15
+ s.platform = Gem::Platform::RUBY
16
+ s.has_rdoc = true
17
+
18
+ s.require_path = 'lib'
19
+ s.files = Dir["{lib,spec}/**/*", "Gemfile", "History.txt", "README.md", "Rakefile", "tmx-parser.gemspec"]
20
+
21
+ s.add_dependency 'nokogiri', '~> 1.6.0'
22
+ s.add_development_dependency 'pry-nav', '~> 0.2.0'
23
+ s.add_development_dependency 'rspec', '~> 3.2.0'
24
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tmx-parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Cameron Dutro
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry-nav
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.2.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.2.0
55
+ description: Parser for the Translation Memory eXchange (.tmx) file format.
56
+ email:
57
+ - camertron@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - Gemfile
63
+ - History.txt
64
+ - README.md
65
+ - Rakefile
66
+ - lib/tmx-parser.rb
67
+ - lib/tmx-parser/document.rb
68
+ - lib/tmx-parser/elements.rb
69
+ - lib/tmx-parser/listener.rb
70
+ - lib/tmx-parser/sax_document.rb
71
+ - lib/tmx-parser/tag_names.rb
72
+ - lib/tmx-parser/version.rb
73
+ - spec/spec_helper.rb
74
+ - spec/tmx-parser_spec.rb
75
+ - tmx-parser.gemspec
76
+ homepage: http://github.com/camertron
77
+ licenses: []
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.4.6
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: Parser for the Translation Memory eXchange (.tmx) file format.
99
+ test_files: []
100
+ has_rdoc: true