paper_docx_templater 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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: