caracal 1.0.13 → 1.1.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 +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +2 -2
- data/lib/caracal/document.rb +1 -1
- data/lib/caracal/renderers/core_renderer.rb +1 -1
- data/lib/caracal/renderers/document_renderer.rb +102 -102
- data/lib/caracal/renderers/fonts_renderer.rb +2 -2
- data/lib/caracal/renderers/footer_renderer.rb +15 -15
- data/lib/caracal/renderers/numbering_renderer.rb +16 -16
- data/lib/caracal/renderers/settings_renderer.rb +5 -5
- data/lib/caracal/renderers/styles_renderer.rb +56 -56
- data/lib/caracal/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 718806bf68883db5fcc8368a9494bb3235d6b39f
|
4
|
+
data.tar.gz: 617abc80e867466e960ca952c4b12a799741470a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a3f5d8804e51338f20f7167c1c14cc01bd9ed57a7d3765df79d29053fb796a2e7b76ed0896a35e90118cb1d22df59db97ac6299a2e7d042f3d1b1a6231d61b4
|
7
|
+
data.tar.gz: a3b4ceeb74433b5a34248a3208f6d5a8d803c0d7dd4eda033068b66708e22cf01e9d1839754e89b243edd28032eebff70c4b49f1e43e3e203759f0b8202d4203
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
#### v1.1.0
|
2
|
+
|
3
|
+
* Enhancements
|
4
|
+
* Corrected how renderers output namespaced nodes to ensure jruby compliance. (HUGE thank you to @henrychung for researching and implementing this).
|
5
|
+
|
6
|
+
|
7
|
+
#### v1.0.13
|
8
|
+
|
9
|
+
* Bug Fixes
|
10
|
+
* Corrected bug where lists were no longer multi-line. (@jdugan h/t @StochasticSpring).
|
11
|
+
|
12
|
+
|
1
13
|
#### v1.0.12
|
2
14
|
|
3
15
|
* Bug Fixes
|
data/README.md
CHANGED
@@ -263,8 +263,8 @@ dimensions and the orientation explicitly.
|
|
263
263
|
|
264
264
|
```ruby
|
265
265
|
docx.page_size do
|
266
|
-
width
|
267
|
-
height
|
266
|
+
width 15840 # sets the page width. units in twips.
|
267
|
+
height 12240 # sets the page height. units in twips.
|
268
268
|
orientation :landscape # sets the printer orientation. accepts :portrait and :landscape.
|
269
269
|
end
|
270
270
|
```
|
data/lib/caracal/document.rb
CHANGED
@@ -17,9 +17,9 @@ module Caracal
|
|
17
17
|
#
|
18
18
|
def to_xml
|
19
19
|
builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
|
20
|
-
xml
|
21
|
-
xml
|
22
|
-
xml
|
20
|
+
xml['w'].document root_options do
|
21
|
+
xml['w'].background({ 'w:color' => 'FFFFFF' })
|
22
|
+
xml['w'].body do
|
23
23
|
|
24
24
|
#============= CONTENTS ===================================
|
25
25
|
|
@@ -30,14 +30,14 @@ module Caracal
|
|
30
30
|
|
31
31
|
#============= PAGE SETTINGS ==============================
|
32
32
|
|
33
|
-
xml
|
33
|
+
xml['w'].sectPr do
|
34
34
|
if document.page_number_show
|
35
35
|
if rel = document.find_relationship('footer1.xml')
|
36
|
-
xml
|
36
|
+
xml['w'].footerReference({ 'r:id' => rel.formatted_id, 'w:type' => 'default' })
|
37
37
|
end
|
38
38
|
end
|
39
|
-
xml
|
40
|
-
xml
|
39
|
+
xml['w'].pgSz page_size_options
|
40
|
+
xml['w'].pgMar page_margin_options
|
41
41
|
end
|
42
42
|
|
43
43
|
end
|
@@ -73,22 +73,22 @@ module Caracal
|
|
73
73
|
if paragraph_level && attrs.empty?
|
74
74
|
# skip
|
75
75
|
else
|
76
|
-
xml
|
76
|
+
xml['w'].rPr do
|
77
77
|
unless attrs.empty?
|
78
|
-
xml
|
79
|
-
xml
|
80
|
-
xml
|
81
|
-
xml
|
82
|
-
xml
|
83
|
-
xml
|
84
|
-
xml
|
85
|
-
xml
|
78
|
+
xml['w'].rStyle( { 'w:val' => attrs[:style] }) unless attrs[:style].nil?
|
79
|
+
xml['w'].color( { 'w:val' => attrs[:color] }) unless attrs[:color].nil?
|
80
|
+
xml['w'].sz( { 'w:val' => attrs[:size] }) unless attrs[:size].nil?
|
81
|
+
xml['w'].b( { 'w:val' => (attrs[:bold] ? '1' : '0') }) unless attrs[:bold].nil?
|
82
|
+
xml['w'].i( { 'w:val' => (attrs[:italic] ? '1' : '0') }) unless attrs[:italic].nil?
|
83
|
+
xml['w'].u( { 'w:val' => (attrs[:underline] ? 'single' : 'none') }) unless attrs[:underline].nil?
|
84
|
+
xml['w'].shd( { 'w:fill' => attrs[:bgcolor], 'w:val' => 'clear' }) unless attrs[:bgcolor].nil?
|
85
|
+
xml['w'].vertAlign( { 'w:val' => attrs[:vertical_align] }) unless attrs[:vertical_align].nil?
|
86
86
|
unless attrs[:font].nil?
|
87
87
|
f = attrs[:font]
|
88
|
-
xml
|
88
|
+
xml['w'].rFonts( { 'w:ascii' => f, 'w:hAnsi' => f, 'w:eastAsia' => f, 'w:cs' => f })
|
89
89
|
end
|
90
90
|
end
|
91
|
-
xml
|
91
|
+
xml['w'].rtl({ 'w:val' => '0' })
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
@@ -140,39 +140,39 @@ module Caracal
|
|
140
140
|
rel_id = rel.relationship_id
|
141
141
|
rel_name = rel.formatted_target
|
142
142
|
|
143
|
-
xml
|
144
|
-
xml
|
145
|
-
xml
|
146
|
-
xml
|
147
|
-
xml
|
148
|
-
xml
|
143
|
+
xml['w'].p paragraph_options do
|
144
|
+
xml['w'].pPr do
|
145
|
+
xml['w'].spacing({ 'w:lineRule' => 'auto', 'w:line' => ds.style_line })
|
146
|
+
xml['w'].contextualSpacing({ 'w:val' => '0' })
|
147
|
+
xml['w'].jc({ 'w:val' => model.image_align.to_s })
|
148
|
+
xml['w'].rPr
|
149
149
|
end
|
150
|
-
xml
|
151
|
-
xml
|
152
|
-
xml
|
153
|
-
xml
|
154
|
-
xml
|
155
|
-
xml
|
156
|
-
xml
|
157
|
-
xml
|
158
|
-
xml
|
159
|
-
xml
|
160
|
-
xml
|
161
|
-
xml
|
150
|
+
xml['w'].r run_options do
|
151
|
+
xml['w'].drawing do
|
152
|
+
xml['wp'].inline({ distR: model.formatted_right, distT: model.formatted_top, distB: model.formatted_bottom, distL: model.formatted_left }) do
|
153
|
+
xml['wp'].extent({ cx: model.formatted_width, cy: model.formatted_height })
|
154
|
+
xml['wp'].effectExtent({ t: 0, b: 0, r: 0, l: 0 })
|
155
|
+
xml['wp'].docPr({ id: rel_id, name: rel_name })
|
156
|
+
xml['a'].graphic do
|
157
|
+
xml['a'].graphicData({ uri: 'http://schemas.openxmlformats.org/drawingml/2006/picture' }) do
|
158
|
+
xml['pic'].pic do
|
159
|
+
xml['pic'].nvPicPr do
|
160
|
+
xml['pic'].cNvPr({ id: rel_id, name: rel_name })
|
161
|
+
xml['pic'].cNvPicPr
|
162
162
|
end
|
163
|
-
xml
|
164
|
-
xml
|
165
|
-
xml
|
166
|
-
xml
|
167
|
-
xml
|
163
|
+
xml['pic'].blipFill do
|
164
|
+
xml['a'].blip({ 'r:embed' => rel.formatted_id })
|
165
|
+
xml['a'].srcRect
|
166
|
+
xml['a'].stretch do
|
167
|
+
xml['a'].fillRect
|
168
168
|
end
|
169
169
|
end
|
170
|
-
xml
|
171
|
-
xml
|
172
|
-
xml
|
170
|
+
xml['pic'].spPr do
|
171
|
+
xml['a'].xfrm do
|
172
|
+
xml['a'].ext({ cx: model.formatted_width, cy: model.formatted_height })
|
173
173
|
end
|
174
|
-
xml
|
175
|
-
xml
|
174
|
+
xml['a'].prstGeom({ prst: 'rect' })
|
175
|
+
xml['a'].ln
|
176
176
|
end
|
177
177
|
end
|
178
178
|
end
|
@@ -180,27 +180,27 @@ module Caracal
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
end
|
183
|
-
xml
|
184
|
-
xml
|
185
|
-
xml
|
183
|
+
xml['w'].r run_options do
|
184
|
+
xml['w'].rPr do
|
185
|
+
xml['w'].rtl({ 'w:val' => '0' })
|
186
186
|
end
|
187
187
|
end
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
191
191
|
def render_linebreak(xml, model)
|
192
|
-
xml
|
193
|
-
xml
|
192
|
+
xml['w'].r do
|
193
|
+
xml['w'].br
|
194
194
|
end
|
195
195
|
end
|
196
196
|
|
197
197
|
def render_link(xml, model)
|
198
198
|
rel = document.relationship({ target: model.link_href, type: :link })
|
199
199
|
|
200
|
-
xml
|
201
|
-
xml
|
200
|
+
xml['w'].hyperlink({ 'r:id' => rel.formatted_id }) do
|
201
|
+
xml['w'].r run_options do
|
202
202
|
render_run_attributes(xml, model, false)
|
203
|
-
xml
|
203
|
+
xml['w'].t({ 'xml:space' => 'preserve' }, model.link_content)
|
204
204
|
end
|
205
205
|
end
|
206
206
|
end
|
@@ -220,16 +220,16 @@ module Caracal
|
|
220
220
|
ls = document.find_list_style(model.list_item_type, model.list_item_level)
|
221
221
|
hanging = ls.style_left.to_i - ls.style_indent.to_i - 1
|
222
222
|
|
223
|
-
xml
|
224
|
-
xml
|
225
|
-
xml
|
226
|
-
xml
|
227
|
-
xml
|
223
|
+
xml['w'].p paragraph_options do
|
224
|
+
xml['w'].pPr do
|
225
|
+
xml['w'].numPr do
|
226
|
+
xml['w'].ilvl({ 'w:val' => model.list_item_level })
|
227
|
+
xml['w'].numId({ 'w:val' => list_num })
|
228
228
|
end
|
229
|
-
xml
|
230
|
-
xml
|
231
|
-
xml
|
232
|
-
xml
|
229
|
+
xml['w'].ind({ 'w:left' => ls.style_left, 'w:hanging' => hanging })
|
230
|
+
xml['w'].contextualSpacing({ 'w:val' => '1' })
|
231
|
+
xml['w'].rPr do
|
232
|
+
xml['w'].u({ 'w:val' => 'none' })
|
233
233
|
end
|
234
234
|
end
|
235
235
|
model.runs.each do |run|
|
@@ -241,14 +241,14 @@ module Caracal
|
|
241
241
|
|
242
242
|
def render_pagebreak(xml, model)
|
243
243
|
if model.page_break_wrap
|
244
|
-
xml
|
245
|
-
xml
|
246
|
-
xml
|
244
|
+
xml['w'].p paragraph_options do
|
245
|
+
xml['w'].r run_options do
|
246
|
+
xml['w'].br({ 'w:type' => 'page' })
|
247
247
|
end
|
248
248
|
end
|
249
249
|
else
|
250
|
-
xml
|
251
|
-
xml
|
250
|
+
xml['w'].r run_options do
|
251
|
+
xml['w'].br({ 'w:type' => 'page' })
|
252
252
|
end
|
253
253
|
end
|
254
254
|
end
|
@@ -256,11 +256,11 @@ module Caracal
|
|
256
256
|
def render_paragraph(xml, model)
|
257
257
|
run_props = [:color, :size, :bold, :italic, :underline].map { |m| model.send("paragraph_#{ m }") }.compact
|
258
258
|
|
259
|
-
xml
|
260
|
-
xml
|
261
|
-
xml
|
262
|
-
xml
|
263
|
-
xml
|
259
|
+
xml['w'].p paragraph_options do
|
260
|
+
xml['w'].pPr do
|
261
|
+
xml['w'].pStyle({ 'w:val' => model.paragraph_style }) unless model.paragraph_style.nil?
|
262
|
+
xml['w'].contextualSpacing({ 'w:val' => '0' })
|
263
|
+
xml['w'].jc({ 'w:val' => model.paragraph_align }) unless model.paragraph_align.nil?
|
264
264
|
render_run_attributes(xml, model, true)
|
265
265
|
end
|
266
266
|
model.runs.each do |run|
|
@@ -273,19 +273,19 @@ module Caracal
|
|
273
273
|
def render_rule(xml, model)
|
274
274
|
options = { 'w:color' => model.rule_color, 'w:sz' => model.rule_size, 'w:val' => model.rule_line, 'w:space' => model.rule_spacing }
|
275
275
|
|
276
|
-
xml
|
277
|
-
xml
|
278
|
-
xml
|
279
|
-
xml
|
276
|
+
xml['w'].p paragraph_options do
|
277
|
+
xml['w'].pPr do
|
278
|
+
xml['w'].pBdr do
|
279
|
+
xml['w'].top options
|
280
280
|
end
|
281
281
|
end
|
282
282
|
end
|
283
283
|
end
|
284
284
|
|
285
285
|
def render_text(xml, model)
|
286
|
-
xml
|
286
|
+
xml['w'].r run_options do
|
287
287
|
render_run_attributes(xml, model, false)
|
288
|
-
xml
|
288
|
+
xml['w'].t({ 'xml:space' => 'preserve' }, model.text_content)
|
289
289
|
end
|
290
290
|
end
|
291
291
|
|
@@ -294,15 +294,15 @@ module Caracal
|
|
294
294
|
model.send("table_border_#{ m }_size") > 0
|
295
295
|
end
|
296
296
|
|
297
|
-
xml
|
298
|
-
xml
|
299
|
-
xml
|
300
|
-
xml
|
301
|
-
xml
|
302
|
-
xml
|
303
|
-
xml
|
297
|
+
xml['w'].tbl do
|
298
|
+
xml['w'].tblPr do
|
299
|
+
xml['w'].tblStyle({ 'w:val' => 'DefaultTable' })
|
300
|
+
xml['w'].bidiVisual({ 'w:val' => '0' })
|
301
|
+
xml['w'].tblW({ 'w:w' => model.table_width.to_f, 'w:type' => 'dxa' })
|
302
|
+
xml['w'].tblInd({ 'w:w' => '0.0', 'w:type' => 'dxa' })
|
303
|
+
xml['w'].jc({ 'w:val' => model.table_align })
|
304
304
|
unless borders.empty?
|
305
|
-
xml
|
305
|
+
xml['w'].tblBorders do
|
306
306
|
borders.each do |m|
|
307
307
|
options = {
|
308
308
|
'w:color' => model.send("table_border_#{ m }_color"),
|
@@ -310,35 +310,35 @@ module Caracal
|
|
310
310
|
'w:sz' => model.send("table_border_#{ m }_size"),
|
311
311
|
'w:space' => model.send("table_border_#{ m }_spacing")
|
312
312
|
}
|
313
|
-
xml.
|
313
|
+
xml['w'].method_missing "#{ Caracal::Core::Models::BorderModel.formatted_type(m) }", options
|
314
314
|
end
|
315
315
|
end
|
316
316
|
end
|
317
|
-
xml
|
318
|
-
xml
|
317
|
+
xml['w'].tblLayout({ 'w:type' => 'fixed' })
|
318
|
+
xml['w'].tblLook({ 'w:val' => '0600' })
|
319
319
|
end
|
320
|
-
xml
|
320
|
+
xml['w'].tblGrid do
|
321
321
|
model.rows.first.each do |tc|
|
322
|
-
xml
|
322
|
+
xml['w'].gridCol({ 'w:w' => tc.cell_width })
|
323
323
|
end
|
324
|
-
xml
|
325
|
-
xml
|
324
|
+
xml['w'].tblGridChange({ 'w:id' => '0' }) do
|
325
|
+
xml['w'].tblGrid do
|
326
326
|
model.rows.first.each do |tc|
|
327
|
-
xml
|
327
|
+
xml['w'].gridCol({ 'w:w' => tc.cell_width })
|
328
328
|
end
|
329
329
|
end
|
330
330
|
end
|
331
331
|
end
|
332
332
|
model.rows.each do |row|
|
333
|
-
xml
|
333
|
+
xml['w'].tr do
|
334
334
|
row.each do |tc|
|
335
|
-
xml
|
336
|
-
xml.
|
337
|
-
xml
|
338
|
-
xml
|
339
|
-
xml
|
335
|
+
xml['w'].tc do
|
336
|
+
xml['w'].tcPr do
|
337
|
+
xml['w'].shd({ 'w:fill' => tc.cell_background })
|
338
|
+
xml['w'].vAlign({ 'w:val' => tc.cell_vertical_align })
|
339
|
+
xml['w'].tcMar do
|
340
340
|
%w(top left bottom right).each do |d|
|
341
|
-
xml.
|
341
|
+
xml['w'].method_missing "#{ d }", { 'w:w' => tc.send("cell_margin_#{ d }").to_f, 'w:type' => 'dxa' }
|
342
342
|
end
|
343
343
|
end
|
344
344
|
end
|
@@ -16,9 +16,9 @@ module Caracal
|
|
16
16
|
#
|
17
17
|
def to_xml
|
18
18
|
builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
|
19
|
-
xml
|
19
|
+
xml['w'].fonts root_options do
|
20
20
|
document.fonts.each do |font|
|
21
|
-
xml
|
21
|
+
xml['w'].font({ 'w:name' => font.font_name })
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -16,30 +16,30 @@ module Caracal
|
|
16
16
|
#
|
17
17
|
def to_xml
|
18
18
|
builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
|
19
|
-
xml
|
20
|
-
xml
|
21
|
-
xml
|
22
|
-
xml
|
23
|
-
xml
|
19
|
+
xml['w'].ftr root_options do
|
20
|
+
xml['w'].p paragraph_options do
|
21
|
+
xml['w'].pPr do
|
22
|
+
xml['w'].contextualSpacing({ 'w:val' => '0' })
|
23
|
+
xml['w'].jc({ 'w:val' => "#{ document.page_number_align }" })
|
24
24
|
end
|
25
25
|
unless document.page_number_label.nil?
|
26
|
-
xml
|
27
|
-
xml
|
28
|
-
xml
|
26
|
+
xml['w'].r run_options do
|
27
|
+
xml['w'].rPr do
|
28
|
+
xml['w'].rStyle({ 'w:val' => 'PageNumber' })
|
29
29
|
end
|
30
|
-
xml
|
30
|
+
xml['w'].t({ 'xml:space' => 'preserve' }) do
|
31
31
|
xml.text "#{ document.page_number_label } "
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
|
-
xml
|
36
|
-
xml
|
37
|
-
xml
|
35
|
+
xml['w'].fldSimple({ 'w:dirty' => '0', 'w:instr' => 'PAGE', 'w:fldLock' => '0' }) do
|
36
|
+
xml['w'].r run_options do
|
37
|
+
xml['w'].rPr
|
38
38
|
end
|
39
39
|
end
|
40
|
-
xml
|
41
|
-
xml
|
42
|
-
xml
|
40
|
+
xml['w'].r run_options do
|
41
|
+
xml['w'].rPr do
|
42
|
+
xml['w'].rtl({ 'w:val' => '0' })
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -18,25 +18,25 @@ module Caracal
|
|
18
18
|
#
|
19
19
|
def to_xml
|
20
20
|
builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
|
21
|
-
xml
|
22
|
-
|
21
|
+
xml['w'].numbering root_options do
|
22
|
+
|
23
23
|
# add abstract definitions
|
24
24
|
document.toplevel_lists.each_with_index do |model, i|
|
25
|
-
xml
|
26
|
-
xml
|
25
|
+
xml['w'].abstractNum({ 'w:abstractNumId' => i + 1 }) do
|
26
|
+
xml['w'].multiLevelType({ 'w:val' => 'hybridMultilevel' })
|
27
27
|
model.level_map.each do |(level, type)|
|
28
28
|
if s = document.find_list_style(type, level)
|
29
|
-
xml
|
30
|
-
xml
|
31
|
-
xml
|
32
|
-
xml
|
33
|
-
xml
|
34
|
-
xml
|
35
|
-
xml
|
36
|
-
xml
|
29
|
+
xml['w'].lvl({ 'w:ilvl' => s.style_level }) do
|
30
|
+
xml['w'].start({ 'w:val' => s.style_start })
|
31
|
+
xml['w'].numFmt({ 'w:val' => s.style_format })
|
32
|
+
xml['w'].lvlRestart({ 'w:val' => s.style_restart })
|
33
|
+
xml['w'].lvlText({ 'w:val' => s.style_value })
|
34
|
+
xml['w'].lvlJc({ 'w:val' => s.style_align })
|
35
|
+
xml['w'].pPr do
|
36
|
+
xml['w'].ind({ 'w:left' => s.style_left, 'w:firstLine' => s.style_indent })
|
37
37
|
end
|
38
|
-
xml
|
39
|
-
xml
|
38
|
+
xml['w'].rPr do
|
39
|
+
xml['w'].u({ 'w:val' => 'none' })
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -46,8 +46,8 @@ module Caracal
|
|
46
46
|
|
47
47
|
# bind individual tables to abstract definitions
|
48
48
|
document.toplevel_lists.each_with_index do |model, i|
|
49
|
-
xml
|
50
|
-
xml
|
49
|
+
xml['w'].num({ 'w:numId' => i + 1 }) do
|
50
|
+
xml['w'].abstractNumId({ 'w:val' => i + 1 })
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -16,11 +16,11 @@ module Caracal
|
|
16
16
|
#
|
17
17
|
def to_xml
|
18
18
|
builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
|
19
|
-
xml
|
20
|
-
xml
|
21
|
-
xml
|
22
|
-
xml
|
23
|
-
xml
|
19
|
+
xml['w'].settings root_options do
|
20
|
+
xml['w'].displayBackgroundShape({ 'w:val' => '1' })
|
21
|
+
xml['w'].defaultTabStop({ 'w:val' => '720' })
|
22
|
+
xml['w'].compat do
|
23
|
+
xml['w'].compatSetting({ 'w:val' => '14', 'w:name' => 'compatibilityMode', 'w:uri' => 'http://schemas.microsoft.com/office/word' })
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -17,46 +17,46 @@ module Caracal
|
|
17
17
|
#
|
18
18
|
def to_xml
|
19
19
|
builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
|
20
|
-
xml
|
20
|
+
xml['w'].styles root_options do
|
21
21
|
|
22
22
|
#============ DEFAULT STYLES ================================
|
23
23
|
|
24
24
|
unless s = document.default_style
|
25
25
|
raise Caracal::Errors::NoDefaultStyleError 'Document must declare a default paragraph style.'
|
26
26
|
end
|
27
|
-
xml
|
28
|
-
xml
|
29
|
-
xml
|
30
|
-
xml
|
31
|
-
xml
|
32
|
-
xml
|
33
|
-
xml
|
34
|
-
xml
|
35
|
-
xml
|
36
|
-
xml
|
37
|
-
xml
|
38
|
-
xml
|
39
|
-
xml
|
27
|
+
xml['w'].docDefaults do
|
28
|
+
xml['w'].rPrDefault do
|
29
|
+
xml['w'].rPr do
|
30
|
+
xml['w'].rFonts font_options(s)
|
31
|
+
xml['w'].b({ 'w:val' => (s.style_bold ? '1' : '0') })
|
32
|
+
xml['w'].i({ 'w:val' => (s.style_italic ? '1' : '0') })
|
33
|
+
xml['w'].caps({ 'w:val' => (s.style_caps ? '1' : '0') })
|
34
|
+
xml['w'].smallCaps({ 'w:val' => '0' })
|
35
|
+
xml['w'].strike({ 'w:val' => '0' })
|
36
|
+
xml['w'].color({ 'w:val' => s.style_color })
|
37
|
+
xml['w'].sz({ 'w:val' => s.style_size })
|
38
|
+
xml['w'].u({ 'w:val' => (s.style_underline ? 'single' : 'none') })
|
39
|
+
xml['w'].vertAlign({ 'w:val' => 'baseline' })
|
40
40
|
end
|
41
41
|
end
|
42
|
-
xml
|
43
|
-
xml
|
44
|
-
xml
|
45
|
-
xml
|
46
|
-
xml
|
47
|
-
xml
|
48
|
-
xml
|
49
|
-
xml
|
42
|
+
xml['w'].pPrDefault do
|
43
|
+
xml['w'].pPr do
|
44
|
+
xml['w'].keepNext({ 'w:val' => '0' })
|
45
|
+
xml['w'].keepLines({ 'w:val' => '0' })
|
46
|
+
xml['w'].widowControl({ 'w:val' => '1' })
|
47
|
+
xml['w'].spacing(spacing_options(s, true))
|
48
|
+
xml['w'].ind(indentation_options(s, true))
|
49
|
+
xml['w'].jc({ 'w:val' => s.style_align.to_s })
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
53
|
-
xml
|
54
|
-
xml
|
53
|
+
xml['w'].style({ 'w:styleId' => s.style_id, 'w:type' => 'paragraph', 'w:default' => '1' }) do
|
54
|
+
xml['w'].name({ 'w:val' => s.style_name })
|
55
55
|
end
|
56
|
-
xml
|
57
|
-
xml
|
58
|
-
xml
|
59
|
-
xml
|
56
|
+
xml['w'].style({ 'w:styleId' => 'TableNormal', 'w:type' => 'table', 'w:default' => '1' }) do
|
57
|
+
xml['w'].name({ 'w:val' => 'Table Normal'})
|
58
|
+
xml['w'].pPr do
|
59
|
+
xml['w'].spacing({ 'w:lineRule' => 'auto', 'w:line' => (s.style_size * 20 * 1.15), 'w:before' => '0', 'w:after' => '0' })
|
60
60
|
end
|
61
61
|
end
|
62
62
|
default_id = s.style_id
|
@@ -65,47 +65,47 @@ module Caracal
|
|
65
65
|
#============ PARAGRAPH STYLES ================================
|
66
66
|
|
67
67
|
document.styles.reject { |s| s.style_id == default_id }.each do |s|
|
68
|
-
xml
|
69
|
-
xml
|
70
|
-
xml
|
71
|
-
xml
|
72
|
-
xml
|
73
|
-
xml
|
74
|
-
xml
|
75
|
-
xml
|
76
|
-
xml
|
77
|
-
xml
|
78
|
-
xml
|
79
|
-
xml
|
68
|
+
xml['w'].style({ 'w:styleId' => s.style_id, 'w:type' => 'paragraph' }) do
|
69
|
+
xml['w'].name({ 'w:val' => s.style_name })
|
70
|
+
xml['w'].basedOn({ 'w:val' => s.style_base })
|
71
|
+
xml['w'].next({ 'w:val' => s.style_next })
|
72
|
+
xml['w'].pPr do
|
73
|
+
xml['w'].keepNext({ 'w:val' => '0' })
|
74
|
+
xml['w'].keepLines({ 'w:val' => '0' })
|
75
|
+
xml['w'].widowControl({ 'w:val' => '1' })
|
76
|
+
xml['w'].spacing(spacing_options(s)) unless spacing_options(s).nil?
|
77
|
+
xml['w'].contextualSpacing({ 'w:val' => '1' })
|
78
|
+
xml['w'].jc({ 'w:val' => s.style_align.to_s }) unless s.style_align.nil?
|
79
|
+
xml['w'].ind(indentation_options(s)) unless indentation_options(s).nil?
|
80
80
|
end
|
81
|
-
xml
|
82
|
-
xml
|
83
|
-
xml
|
84
|
-
xml
|
85
|
-
xml
|
86
|
-
xml
|
87
|
-
xml
|
88
|
-
xml
|
81
|
+
xml['w'].rPr do
|
82
|
+
xml['w'].rFonts(font_options(s)) unless s.style_font.nil?
|
83
|
+
xml['w'].b({ 'w:val' => (s.style_bold ? '1' : '0') } ) unless s.style_bold.nil?
|
84
|
+
xml['w'].i({ 'w:val' => (s.style_italic ? '1' : '0') }) unless s.style_italic.nil?
|
85
|
+
xml['w'].caps({ 'w:val' => (s.style_caps ? '1' : '0') }) unless s.style_caps.nil?
|
86
|
+
xml['w'].color({ 'w:val' => s.style_color }) unless s.style_color.nil?
|
87
|
+
xml['w'].sz({ 'w:val' => s.style_size }) unless s.style_size.nil?
|
88
|
+
xml['w'].u({ 'w:val' => (s.style_underline ? 'single' : 'none') }) unless s.style_underline.nil?
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
93
|
#============ TABLE STYLES ================================
|
94
94
|
|
95
|
-
xml
|
96
|
-
xml
|
97
|
-
xml
|
98
|
-
xml
|
99
|
-
xml
|
95
|
+
xml['w'].style({ 'w:styleId' => 'DefaultTable', 'w:type' => 'table' }) do
|
96
|
+
xml['w'].basedOn({ 'w:val' => 'TableNormal' })
|
97
|
+
xml['w'].tblPr do
|
98
|
+
xml['w'].tblStyleRowBandSize({ 'w:val' => '1' })
|
99
|
+
xml['w'].tblStyleColBandSize({ 'w:val' => '1' })
|
100
100
|
end
|
101
101
|
%w(band1Horz band1Vert band2Horz band2Vert).each do |type|
|
102
|
-
xml
|
102
|
+
xml['w'].tblStylePr({ 'w:type' => type })
|
103
103
|
end
|
104
104
|
%w(firstCol firstRow lastCol lastRow).each do |type|
|
105
|
-
xml
|
105
|
+
xml['w'].tblStylePr({ 'w:type' => type })
|
106
106
|
end
|
107
107
|
%w(neCell nwCell seCell swCell).each do |type|
|
108
|
-
xml
|
108
|
+
xml['w'].tblStylePr({ 'w:type' => type })
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
data/lib/caracal/version.rb
CHANGED