paper_docx_templater 0.1.1

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.
Files changed (40) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +7 -0
  3. data/LICENSE.txt +176 -0
  4. data/README.rdoc +40 -0
  5. data/Rakefile +16 -0
  6. data/docx_templater.gemspec +42 -0
  7. data/lib/VERSION +1 -0
  8. data/lib/docx_templater/docx_creator.rb +72 -0
  9. data/lib/docx_templater/image.rb +16 -0
  10. data/lib/docx_templater/template_processor.rb +230 -0
  11. data/lib/docx_templater.rb +18 -0
  12. data/script/ci.sh +48 -0
  13. data/spec/example_input/2.docx +0 -0
  14. data/spec/example_input/3.docx +0 -0
  15. data/spec/example_input/9/[Content_Types].xml +2 -0
  16. data/spec/example_input/9/docProps/app.xml +2 -0
  17. data/spec/example_input/9/docProps/core.xml +2 -0
  18. data/spec/example_input/9/word/_rels/document.xml.rels +2 -0
  19. data/spec/example_input/9/word/document.xml +2 -0
  20. data/spec/example_input/9/word/endnotes.xml +2 -0
  21. data/spec/example_input/9/word/fontTable.xml +2 -0
  22. data/spec/example_input/9/word/footnotes.xml +2 -0
  23. data/spec/example_input/9/word/media/image1.jpeg +0 -0
  24. data/spec/example_input/9/word/media/image2.jpeg +0 -0
  25. data/spec/example_input/9/word/media/image3.jpeg +0 -0
  26. data/spec/example_input/9/word/settings.xml +2 -0
  27. data/spec/example_input/9/word/styles.xml +2 -0
  28. data/spec/example_input/9/word/theme/theme1.xml +2 -0
  29. data/spec/example_input/9/word/webSettings.xml +2 -0
  30. data/spec/example_input/ExampleTemplate.docx +0 -0
  31. data/spec/example_input/tmp/IntegrationTestOutput.docx +0 -0
  32. data/spec/example_input/word/document.xml +1122 -0
  33. data/spec/example_input/~$3.docx +0 -0
  34. data/spec/example_input/~$/351/253/230/350/200/203/346/250/241/346/213/237/345/215/267.doc +0 -0
  35. data/spec/example_input//351/253/230/350/200/203/346/250/241/346/213/237/345/215/267.doc +0 -0
  36. data/spec/integration_spec.rb +49 -0
  37. data/spec/spec.opts +1 -0
  38. data/spec/spec_helper.rb +12 -0
  39. data/spec/template_processor_spec.rb +269 -0
  40. metadata +177 -0
Binary file
@@ -0,0 +1,49 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
3
+ require 'template_processor_spec'
4
+
5
+ describe "integration test", :integration => true do
6
+ let(:data) { DocxTemplater::TestData::DATA }
7
+ let(:base_path) { SPEC_BASE_PATH.join("example_input") }
8
+ let(:input_file) { "#{base_path}/3.docx" }
9
+ #let(:input_file) { "#{base_path}/ExampleTemplate.docx" }
10
+ let(:output_dir) { "#{base_path}/tmp" }
11
+ let(:output_file) { "#{output_dir}/IntegrationTestOutput.docx" }
12
+ before do
13
+ FileUtils.rm_rf(output_dir) if File.exists?(output_dir)
14
+ Dir.mkdir(output_dir)
15
+ end
16
+
17
+ context "should process in incoming docx" do
18
+ it "generates a valid zip file (.docx)" do
19
+
20
+ cached_images = {
21
+ :image0 => DocxTemplater::Image.new('test1.jpeg', Base64.encode64(File.open('/Users/sam/Pictures/test1.png'){|f| f.read})),
22
+ #:image1 => DocxTemplater::Image.new('test2.jpeg', Base64.encode64(File.open('/Users/sam/Pictures/test2.png'){|f| f.read})),
23
+ :image2 => DocxTemplater::Image.new('test3.jpeg', Base64.encode64(File.open('/Users/sam/Pictures/test3.png'){|f| f.read}))
24
+ #:image3 => DocxTemplater::Image.new('test4.jpeg', Base64.encode64(File.open('/Users/sam/Pictures/test4.png'){|f| f.read}))
25
+ }
26
+ DocxTemplater::DocxCreator.new(input_file, data, cached_images).generate_docx_file(output_file)
27
+
28
+ archive = ZipRuby::Archive.open(output_file)
29
+ archive.close
30
+
31
+ puts "\n************************************"
32
+ puts " >>> Only will work on mac <<<"
33
+ puts "NOW attempting to open created file in Word."
34
+ cmd = "open #{output_file}"
35
+ puts " will run '#{cmd}'"
36
+ puts "************************************"
37
+
38
+ system cmd
39
+ end
40
+
41
+ #it "generates a file with the same contents as the input docx" do
42
+ #input_entries = ZipRuby::Archive.open(input_file) { |z| z.map(&:name) }
43
+ #DocxTemplater::DocxCreator.new(input_file, data).generate_docx_file(output_file)
44
+ #output_entries = ZipRuby::Archive.open(output_file) { |z| z.map(&:name) }
45
+
46
+ #input_entries.should == output_entries
47
+ #end
48
+ end
49
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,12 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'rubygems'
3
+ require 'bundler'
4
+ Bundler.setup
5
+
6
+ require 'rspec'
7
+ require 'nokogiri'
8
+ require 'fileutils'
9
+
10
+ require 'docx_templater'
11
+
12
+ SPEC_BASE_PATH = Pathname.new(File.expand_path(File.dirname(__FILE__)))
@@ -0,0 +1,269 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ module DocxTemplater
5
+ module TestData
6
+ DATA = {
7
+ :subject => '高考模拟卷一',
8
+ #:teacher => '土豪金',
9
+ :teacher => '土豪金高端大气上档次哈哈',
10
+ :questions => [
11
+ {
12
+ :title => '一、选择题(本题包括21小题,每小题给出的四个选项中,有的只有一个选项正确,有的有多个选项正确,全部选对的得6分,选对但不全的得3分,有选错的得0分)',
13
+ :items => [
14
+ {
15
+ :content => '1. 人在恐惧、紧张时,在内脏神经的支配下,肾上腺髓质释放的肾上腺素增多,该激素可用于心脏,使心率加快。下列叙述错误的是${image2}( )',
16
+ :choice => [
17
+ ' A.该肾上腺素作用的靶器官包括心脏',
18
+ ' B.该实例包含神经调节和体液调节',
19
+ ' C.该肾上腺素通过神经纤维运输到心脏',
20
+ ' D.该实例中反射弧是实现神经调节的结构基础'
21
+ ]
22
+ },
23
+ {
24
+ :content => '2. 番茄幼苗在缺镁的培养液中培养一段时间后,与对照组相比,其叶片光合作用强度下降,原因是( )',
25
+ :choice => [
26
+ ' A.光反应强度升高,暗反应强度降低',
27
+ ' B.光反应强度降低,暗反应强度降低',
28
+ ' C.反应强度不变,暗反应强度降低',
29
+ ' D.反应强度降低,暗反应强度不变'
30
+ ]
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ :title => '二、问答题',
36
+ :items => [
37
+ {
38
+ :content => '1. 图中左边有一对平行金属板,两板相距为d,电压为V;两板之间有匀强磁场,磁感应强度大小为B0,方向平行于板面并垂直于纸面朝里。图中右边有一边长为a的正三角形区域EFG(EF边与金属板垂直),在此区域内及其边界上也有匀强磁场,磁感应强度大小为B,方向垂直于纸面朝里。假设一系列电荷量为q的正离子沿平行于金属板面,垂直于磁场的方向射入金属板之间,沿同一方向射出金属板之间的区域,并经EF边中点H射入磁场区域。不计重力\n
39
+ (1)已知这些离子中的离子${image0}甲到达磁场边界EG后,从边界EF穿出磁场,求离子甲的质量。\n
40
+ (2)已知这些离子中的离子乙从EG边上的I点(图中未画出)穿出磁场,且GI长为 ,求离 子乙的质量。\n
41
+ (3)若这些离子中的最轻离子的质量等于离子甲质量的一半,而离子乙的质量是最大的,问磁场边界上什么区域内可能有离子到达。
42
+ '
43
+ },{
44
+ :content => '2.【生物——选修1:生物技术实践】(8分) 为了探究6―BA和IAA对某些菊花品种茎尖外植物再生丛芽的影响,某研究小组在MS培养基中加入6―BA和IAA,配制成四种培养基(见下表),灭菌后分别接种数量相同、生长状态一致、消毒后地的尖外植体,在适宜条件下培养一段时间后,统计再生丛芽外植体的比率(m),以及再生丛芽外植体上的丛芽平均数(n),结果如下表。\n
45
+ (2)在该实验中,自变量是 ,因变量是 ,自变量的取值范围是 。\n
46
+ (3)从实验结果可知,诱导从芽总数量少的培养基是 号培养基。\n
47
+ (4)为了诱导该菊花试管菌生根,培养基中一般不加入 。(填“6―BA”或“IAA”)。'
48
+ }
49
+ ]
50
+ }
51
+ ]
52
+ }
53
+ #DATA = {
54
+ #:teacher => "Priya Vora",
55
+ #:building => "Building #14",
56
+ #:classroom => :'Rm 202',
57
+ #:district => "Washington County Public Schools",
58
+ #:senority => 12.25,
59
+ #:roster => [
60
+ #{:name => 'Sally', :age => 12, :attendence => '100%'},
61
+ #{:name => :Xiao, :age => 10, :attendence => '94%'},
62
+ #{:name => 'Bryan', :age => 13, :attendence => '100%'},
63
+ #{:name => 'Larry', :age => 11, :attendence => '90%'},
64
+ #{:name => 'Kumar', :age => 12, :attendence => '76%'},
65
+ #{:name => 'Amber', :age => 11, :attendence => '100%'},
66
+ #{:name => 'Isaiah', :age => 12, :attendence => '89%'},
67
+ #{:name => 'Omar', :age => 12, :attendence => '99%'},
68
+ #{:name => 'Xi', :age => 11, :attendence => '20%'},
69
+ #{:name => 'Noushin', :age => 12, :attendence => '100%'}
70
+ #],
71
+ #:event_reports => [
72
+ #{:name => 'Science Museum Field Trip', :notes => 'PTA sponsored event. Spoke to Astronaut with HAM radio.'},
73
+ #{:name => 'Wilderness Center Retreat', :notes => '2 days hiking for charity:water fundraiser, $10,200 raised.'}
74
+ #],
75
+ #:created_at => "11-12-03 02:01"
76
+ #}
77
+ end
78
+ end
79
+
80
+ #describe DocxTemplater::TemplateProcessor do
81
+ #let(:data) { Marshal.load(Marshal.dump(DocxTemplater::TestData::DATA)) } # deep copy
82
+ #let(:base_path) { SPEC_BASE_PATH.join("example_input") }
83
+ #let(:xml) { File.read("#{base_path}/word/document.xml") }
84
+ #let(:parser) { DocxTemplater::TemplateProcessor.new(data) }
85
+
86
+ #context "valid xml" do
87
+ #it "should render and still be valid XML" do
88
+ #Nokogiri::XML.parse(xml).should be_xml
89
+ #out = parser.render(xml)
90
+ #Nokogiri::XML.parse(out).should be_xml
91
+ #end
92
+
93
+ #it "should accept non-ascii characters" do
94
+ #data[:teacher] = "老师"
95
+ #out = parser.render(xml)
96
+ #out.index("老师").should >= 0
97
+ #Nokogiri::XML.parse(out).should be_xml
98
+ #end
99
+
100
+ #it "should escape as necessary invalid xml characters, if told to" do
101
+ #data[:building] = "23rd & A #1 floor"
102
+ #data[:classroom] = "--> 201 <!--"
103
+ #data[:roster][0][:name] = "<#Ai & Bo>"
104
+ #out = parser.render(xml)
105
+
106
+ #Nokogiri::XML.parse(out).should be_xml
107
+ #out.index("23rd &amp; A #1 floor").should >= 0
108
+ #out.index("--&gt; 201 &lt;!--").should >= 0
109
+ #out.index("&lt;#Ai &amp; Bo&gt;").should >= 0
110
+ #end
111
+
112
+ #context "not escape xml" do
113
+ #let(:parser) { DocxTemplater::TemplateProcessor.new(data, false) }
114
+ #it "does not escape the xml attributes" do
115
+ #data[:building] = "23rd <p>&amp;</p> #1 floor"
116
+ #out = parser.render(xml)
117
+ #Nokogiri::XML.parse(out).should be_xml
118
+ #out.index("23rd <p>&amp;</p> #1 floor").should >= 0
119
+ #end
120
+ #end
121
+ #end
122
+
123
+ #context "unmatched begin and end row templates" do
124
+ #it "should not raise" do
125
+ #xml = <<EOF
126
+ #<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
127
+ #<w:body>
128
+ #<w:tbl>
129
+ #<w:tr><w:tc>
130
+ #<w:p>
131
+ #<w:r><w:t>#BEGIN_ROW:#{:roster.to_s.upcase}#</w:t></w:r>
132
+ #</w:p>
133
+ #</w:tc></w:tr>
134
+ #<w:tr><w:tc>
135
+ #<w:p>
136
+ #<w:r><w:t>#END_ROW:#{:roster.to_s.upcase}#</w:t></w:r>
137
+ #</w:p>
138
+ #</w:tc></w:tr>
139
+ #<w:tr><w:tc>
140
+ #<w:p>
141
+ #<w:r><w:t>#BEGIN_ROW:#{:event_reports.to_s.upcase}#</w:t></w:r>
142
+ #</w:p>
143
+ #</w:tc></w:tr>
144
+ #<w:tr><w:tc>
145
+ #<w:p>
146
+ #<w:r><w:t>#END_ROW:#{:event_reports.to_s.upcase}#</w:t></w:r>
147
+ #</w:p>
148
+ #</w:tc></w:tr>
149
+ #</w:tbl>
150
+ #</w:body>
151
+ #</xml>
152
+ #EOF
153
+ #expect { parser.render(xml) }.to_not raise_error
154
+ #end
155
+
156
+ #it "should raise an exception" do
157
+ #xml = <<EOF
158
+ #<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
159
+ #<w:body>
160
+ #<w:tbl>
161
+ #<w:tr><w:tc>
162
+ #<w:p>
163
+ #<w:r><w:t>#BEGIN_ROW:#{:roster.to_s.upcase}#</w:t></w:r>
164
+ #</w:p>
165
+ #</w:tc></w:tr>
166
+ #<w:tr><w:tc>
167
+ #<w:p>
168
+ #<w:r><w:t>#END_ROW:#{:roster.to_s.upcase}#</w:t></w:r>
169
+ #</w:p>
170
+ #</w:tc></w:tr>
171
+ #<w:tr><w:tc>
172
+ #<w:p>
173
+ #<w:r><w:t>#BEGIN_ROW:#{:event_reports.to_s.upcase}#</w:t></w:r>
174
+ #</w:p>
175
+ #</w:tc></w:tr>
176
+ #</w:tbl>
177
+ #</w:body>
178
+ #</xml>
179
+ #EOF
180
+ #expect { parser.render(xml) }.to raise_error(/#END_ROW:EVENT_REPORTS# nil: true/)
181
+ #end
182
+ #end
183
+
184
+ #it "should enter no text for a nil value" do
185
+ #xml = <<EOF
186
+ #<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
187
+ #<w:body>
188
+ #<w:p>Before.$KEY$After</w:p>
189
+ #</w:body>
190
+ #</xml>
191
+ #EOF
192
+ #actual = DocxTemplater::TemplateProcessor.new(:key => nil).render(xml)
193
+ #expected_xml = <<EOF
194
+ #<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
195
+ #<w:body>
196
+ #<w:p>Before.After</w:p>
197
+ #</w:body>
198
+ #</xml>
199
+ #EOF
200
+ #actual.should == expected_xml
201
+ #end
202
+
203
+ #it "should replace all simple keys with values" do
204
+ #non_array_keys = data.reject { |k, v| v.class == Array }
205
+ #non_array_keys.keys.each do |key|
206
+ #xml.index("$#{key.to_s.upcase}$").should >= 0
207
+ #xml.index(data[key].to_s).should be_nil
208
+ #end
209
+ #out = parser.render(xml)
210
+
211
+ #non_array_keys.each do |key|
212
+ #out.index("$#{key}$").should be_nil
213
+ #out.index(data[key].to_s).should >= 0
214
+ #end
215
+ #end
216
+
217
+ #it "should replace all array keys with values" do
218
+ #xml.index("#BEGIN_ROW:").should >= 0
219
+ #xml.index("#END_ROW:").should >= 0
220
+ #xml.index("$EACH:").should >= 0
221
+
222
+ #out = parser.render(xml)
223
+
224
+ #out.index("#BEGIN_ROW:").should be_nil
225
+ #out.index("#END_ROW:").should be_nil
226
+ #out.index("$EACH:").should be_nil
227
+
228
+ #[:roster, :event_reports].each do |key|
229
+ #data[key].each do |row|
230
+ #row.values.map(&:to_s).each do |row_value|
231
+ #out.index(row_value).should >= 0
232
+ #end
233
+ #end
234
+ #end
235
+ #end
236
+
237
+ #it "shold render students names in the same order as the data" do
238
+ #out = parser.render(xml)
239
+ #out.index('Sally').should >= 0
240
+ #out.index('Kumar').should >= 0
241
+ #out.index('Kumar').should > out.index('Sally')
242
+ #end
243
+
244
+ #it "shold render event reports names in the same order as the data" do
245
+ #out = parser.render(xml)
246
+ #out.index('Science Museum Field Trip').should >= 0
247
+ #out.index('Wilderness Center Retreat').should >= 0
248
+ #out.index('Wilderness Center Retreat').should > out.index('Science Museum Field Trip')
249
+ #end
250
+
251
+ #it "should render 2-line event reports in same order as docx" do
252
+ #event_reports_starting_at = xml.index("#BEGIN_ROW:EVENT_REPORTS#")
253
+ #event_reports_starting_at.should >= 0
254
+ #xml.index("$EACH:NAME$", event_reports_starting_at).should > event_reports_starting_at
255
+ #xml.index("$EACH:NOTES$", event_reports_starting_at).should > event_reports_starting_at
256
+ #xml.index("$EACH:NOTES$", event_reports_starting_at).should > xml.index("$EACH:NAME$", event_reports_starting_at)
257
+
258
+ #out = parser.render(xml)
259
+ #out.index('PTA sponsored event. Spoke to Astronaut with HAM radio.').should > out.index('Science Museum Field Trip')
260
+ #end
261
+
262
+ #it "should render sums of input data" do
263
+ #xml.index("#SUM").should >= 0
264
+ #out = parser.render(xml)
265
+ #out.index("#SUM").should be_nil
266
+ #out.index("#{data[:roster].count} Students").should >= 0
267
+ #out.index("#{data[:event_reports].count} Events").should >= 0
268
+ #end
269
+ #end
metadata ADDED
@@ -0,0 +1,177 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: paper_docx_templater
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tim Lang
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: zipruby-compat
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 0.3.7
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.3.7
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.7.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 2.7.0
78
+ description: A Ruby library to template Microsoft Word .docx files.
79
+ email: langyong135@gmail.com
80
+ executables: []
81
+ extensions: []
82
+ extra_rdoc_files:
83
+ - README.rdoc
84
+ files:
85
+ - lib/docx_templater/docx_creator.rb
86
+ - lib/docx_templater/image.rb
87
+ - lib/docx_templater/template_processor.rb
88
+ - lib/docx_templater.rb
89
+ - lib/VERSION
90
+ - script/ci.sh
91
+ - spec/example_input/2.docx
92
+ - spec/example_input/3.docx
93
+ - spec/example_input/9/[Content_Types].xml
94
+ - spec/example_input/9/docProps/app.xml
95
+ - spec/example_input/9/docProps/core.xml
96
+ - spec/example_input/9/word/_rels/document.xml.rels
97
+ - spec/example_input/9/word/document.xml
98
+ - spec/example_input/9/word/endnotes.xml
99
+ - spec/example_input/9/word/fontTable.xml
100
+ - spec/example_input/9/word/footnotes.xml
101
+ - spec/example_input/9/word/media/image1.jpeg
102
+ - spec/example_input/9/word/media/image2.jpeg
103
+ - spec/example_input/9/word/media/image3.jpeg
104
+ - spec/example_input/9/word/settings.xml
105
+ - spec/example_input/9/word/styles.xml
106
+ - spec/example_input/9/word/theme/theme1.xml
107
+ - spec/example_input/9/word/webSettings.xml
108
+ - spec/example_input/ExampleTemplate.docx
109
+ - spec/example_input/tmp/IntegrationTestOutput.docx
110
+ - spec/example_input/word/document.xml
111
+ - spec/example_input/~$3.docx
112
+ - spec/example_input/~$高考模拟卷.doc
113
+ - spec/example_input/高考模拟卷.doc
114
+ - spec/integration_spec.rb
115
+ - spec/spec.opts
116
+ - spec/spec_helper.rb
117
+ - spec/template_processor_spec.rb
118
+ - docx_templater.gemspec
119
+ - LICENSE.txt
120
+ - Rakefile
121
+ - README.rdoc
122
+ - .gitignore
123
+ - Gemfile
124
+ homepage: https://github.com/TimLang/ruby-docx-templater
125
+ licenses: []
126
+ post_install_message:
127
+ rdoc_options:
128
+ - --charset=UTF-8
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ none: false
133
+ requirements:
134
+ - - ! '>='
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 1.8.25
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: Generates new Word .docx files based on a template file.
149
+ test_files:
150
+ - spec/example_input/2.docx
151
+ - spec/example_input/3.docx
152
+ - spec/example_input/9/[Content_Types].xml
153
+ - spec/example_input/9/docProps/app.xml
154
+ - spec/example_input/9/docProps/core.xml
155
+ - spec/example_input/9/word/_rels/document.xml.rels
156
+ - spec/example_input/9/word/document.xml
157
+ - spec/example_input/9/word/endnotes.xml
158
+ - spec/example_input/9/word/fontTable.xml
159
+ - spec/example_input/9/word/footnotes.xml
160
+ - spec/example_input/9/word/media/image1.jpeg
161
+ - spec/example_input/9/word/media/image2.jpeg
162
+ - spec/example_input/9/word/media/image3.jpeg
163
+ - spec/example_input/9/word/settings.xml
164
+ - spec/example_input/9/word/styles.xml
165
+ - spec/example_input/9/word/theme/theme1.xml
166
+ - spec/example_input/9/word/webSettings.xml
167
+ - spec/example_input/ExampleTemplate.docx
168
+ - spec/example_input/tmp/IntegrationTestOutput.docx
169
+ - spec/example_input/word/document.xml
170
+ - spec/example_input/~$3.docx
171
+ - spec/example_input/~$高考模拟卷.doc
172
+ - spec/example_input/高考模拟卷.doc
173
+ - spec/integration_spec.rb
174
+ - spec/spec.opts
175
+ - spec/spec_helper.rb
176
+ - spec/template_processor_spec.rb
177
+ has_rdoc: