write_xlsx 0.62.0 → 0.64.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.
- data/README.rdoc +14 -1
- data/examples/chart_data_tools.rb +215 -0
- data/examples/chart_pie.rb +36 -5
- data/examples/sparklines2.rb +1 -1
- data/examples/tab_colors.rb +3 -3
- data/lib/write_xlsx/chart.rb +559 -516
- data/lib/write_xlsx/chart/area.rb +4 -1
- data/lib/write_xlsx/chart/axis.rb +132 -0
- data/lib/write_xlsx/chart/bar.rb +17 -9
- data/lib/write_xlsx/chart/column.rb +9 -1
- data/lib/write_xlsx/chart/line.rb +24 -0
- data/lib/write_xlsx/chart/radar.rb +2 -2
- data/lib/write_xlsx/chart/scatter.rb +19 -0
- data/lib/write_xlsx/chart/stock.rb +10 -3
- data/lib/write_xlsx/drawing.rb +43 -44
- data/lib/write_xlsx/package/vml.rb +21 -14
- data/lib/write_xlsx/shape.rb +173 -22
- data/lib/write_xlsx/sparkline.rb +524 -0
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +183 -115
- data/lib/write_xlsx/worksheet.rb +821 -1073
- data/lib/write_xlsx/worksheet/cell_data.rb +132 -0
- data/lib/write_xlsx/worksheet/print_style.rb +51 -0
- data/test/chart/test_add_series.rb +31 -6
- data/test/chart/test_write_d_lbls.rb +18 -18
- data/test/chart/test_write_number_format.rb +20 -24
- data/test/drawing/test_drawing_shape_01.rb +1 -1
- data/test/drawing/test_drawing_shape_02.rb +2 -2
- data/test/drawing/test_drawing_shape_03.rb +5 -5
- data/test/drawing/test_drawing_shape_04.rb +3 -3
- data/test/drawing/test_drawing_shape_05.rb +4 -4
- data/test/drawing/test_drawing_shape_07.rb +2 -2
- data/test/perl_output/chart_data_tools.xlsx +0 -0
- data/test/perl_output/chart_pie.xlsx +0 -0
- data/test/regression/disabled_test_vml04.rb +2 -2
- data/test/regression/test_chart_drop_lines01.rb +46 -0
- data/test/regression/test_chart_drop_lines02.rb +51 -0
- data/test/regression/test_chart_drop_lines03.rb +46 -0
- data/test/regression/test_chart_drop_lines04.rb +64 -0
- data/test/regression/test_chart_errorbars01.rb +47 -0
- data/test/regression/test_chart_errorbars02.rb +57 -0
- data/test/regression/test_chart_errorbars03.rb +53 -0
- data/test/regression/test_chart_errorbars04.rb +48 -0
- data/test/regression/test_chart_errorbars05.rb +47 -0
- data/test/regression/test_chart_errorbars06.rb +47 -0
- data/test/regression/test_chart_errorbars07.rb +66 -0
- data/test/regression/test_chart_font02.rb +1 -1
- data/test/regression/test_chart_font06.rb +1 -1
- data/test/regression/test_chart_gridlines04.rb +2 -1
- data/test/regression/test_chart_gridlines08.rb +2 -1
- data/test/regression/test_chart_points01.rb +37 -0
- data/test/regression/test_chart_points02.rb +40 -0
- data/test/regression/test_chart_points03.rb +42 -0
- data/test/regression/test_chart_points04.rb +52 -0
- data/test/regression/test_chart_points05.rb +49 -0
- data/test/regression/test_chart_points06.rb +49 -0
- data/test/regression/test_chartsheet05.rb +1 -1
- data/test/regression/test_chartsheet06.rb +1 -1
- data/test/regression/test_comment01.rb +1 -1
- data/test/regression/test_comment02.rb +1 -1
- data/test/regression/test_comment03.rb +1 -1
- data/test/regression/test_comment04.rb +2 -2
- data/test/regression/test_comment06.rb +1 -1
- data/test/regression/test_comment07.rb +1 -1
- data/test/regression/test_comment08.rb +1 -1
- data/test/regression/test_comment09.rb +1 -1
- data/test/regression/test_comment10.rb +1 -1
- data/test/regression/test_default_row04.rb +1 -1
- data/test/regression/test_escapes02.rb +1 -1
- data/test/regression/test_hyperlink15.rb +2 -2
- data/test/regression/test_shape_connect01.rb +6 -6
- data/test/regression/test_shape_connect02.rb +6 -6
- data/test/regression/test_shape_connect03.rb +11 -11
- data/test/regression/test_shape_connect04.rb +10 -10
- data/test/regression/test_shape_scale01.rb +2 -2
- data/test/regression/test_shape_stencil01.rb +3 -3
- data/test/regression/test_tab_color01.rb +1 -1
- data/test/regression/test_table04.rb +1 -1
- data/test/regression/test_table05.rb +1 -1
- data/test/regression/test_table06.rb +1 -1
- data/test/regression/test_vml01.rb +1 -1
- data/test/regression/test_vml02.rb +1 -1
- data/test/regression/test_vml03.rb +2 -2
- data/test/regression/xlsx_files/chart_drop_lines01.xlsx +0 -0
- data/test/regression/xlsx_files/chart_drop_lines02.xlsx +0 -0
- data/test/regression/xlsx_files/chart_drop_lines03.xlsx +0 -0
- data/test/regression/xlsx_files/chart_drop_lines04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars01.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars02.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars03.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars06.xlsx +0 -0
- data/test/regression/xlsx_files/chart_errorbars07.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points01.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points02.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points03.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_points06.xlsx +0 -0
- data/test/regression/xlsx_files/chart_stock02.xlsx +0 -0
- data/test/test_example_match.rb +278 -57
- data/test/worksheet/test_convert_date_time_02.rb +427 -433
- data/test/worksheet/test_convert_date_time_03.rb +1 -1
- data/test/worksheet/test_write_sheet_pr.rb +2 -2
- data/test/worksheet/test_write_sheet_view1.rb +2 -2
- metadata +80 -10
|
@@ -28,7 +28,7 @@ def initialize(subtype)
|
|
|
28
28
|
|
|
29
29
|
# Override and reset the default axis values.
|
|
30
30
|
if @subtype == 'percent_stacked'
|
|
31
|
-
@y_axis[:
|
|
31
|
+
@y_axis.defaults[:num_format] = '0%'
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
set_y_axis
|
|
@@ -60,6 +60,9 @@ def write_area_chart(params)
|
|
|
60
60
|
# Write the series elements.
|
|
61
61
|
series.each {|s| write_series(s)}
|
|
62
62
|
|
|
63
|
+
# Write the c:dropLines element.
|
|
64
|
+
write_drop_lines
|
|
65
|
+
|
|
63
66
|
# Write the c:marker element.
|
|
64
67
|
write_marker_value
|
|
65
68
|
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
require 'write_xlsx/package/xml_writer_simple'
|
|
3
|
+
require 'write_xlsx/utility'
|
|
4
|
+
|
|
5
|
+
module Writexlsx
|
|
6
|
+
class Chart
|
|
7
|
+
class Axis
|
|
8
|
+
include Writexlsx::Utility
|
|
9
|
+
|
|
10
|
+
attr_accessor :defaults, :name, :formula, :data_id, :reverse
|
|
11
|
+
attr_accessor :min, :max
|
|
12
|
+
attr_accessor :minor_unit, :major_unit, :minor_unit_type, :major_unit_type
|
|
13
|
+
attr_accessor :log_base, :crossing, :position, :label_position, :visible
|
|
14
|
+
attr_accessor :num_format, :num_format_linked, :num_font, :name_font
|
|
15
|
+
attr_accessor :major_gridlines, :minor_gridlines, :major_tick_mark
|
|
16
|
+
|
|
17
|
+
#
|
|
18
|
+
# Convert user defined axis values into axis instance.
|
|
19
|
+
#
|
|
20
|
+
def merge_with_hash(chart, params) # :nodoc:
|
|
21
|
+
@chart = chart
|
|
22
|
+
args = (defaults || {}).merge(params)
|
|
23
|
+
|
|
24
|
+
@name, @formula = @chart.process_names(args[:name], args[:name_formula])
|
|
25
|
+
@data_id = @chart.get_data_id(@formula, args[:data])
|
|
26
|
+
@reverse = args[:reverse]
|
|
27
|
+
@min = args[:min]
|
|
28
|
+
@max = args[:max]
|
|
29
|
+
@minor_unit = args[:minor_unit]
|
|
30
|
+
@major_unit = args[:major_unit]
|
|
31
|
+
@minor_unit_type = args[:minor_unit_type]
|
|
32
|
+
@major_unit_type = args[:major_unit_type]
|
|
33
|
+
@log_base = args[:log_base]
|
|
34
|
+
@crossing = args[:crossing]
|
|
35
|
+
@label_position = args[:label_position]
|
|
36
|
+
@num_format = args[:num_format]
|
|
37
|
+
@num_format_linked = args[:num_format_linked]
|
|
38
|
+
@visible = args[:visible] || 1
|
|
39
|
+
|
|
40
|
+
# Map major/minor_gridlines properties.
|
|
41
|
+
[:major_gridlines, :minor_gridlines].each do |lines|
|
|
42
|
+
if args[lines] && ptrue?(args[lines][:visible])
|
|
43
|
+
instance_variable_set("@#{lines}", gridline_properties(args[lines]))
|
|
44
|
+
else
|
|
45
|
+
instance_variable_set("@#{lines}", nil)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
@major_tick_mark = args[:major_tick_mark]
|
|
49
|
+
|
|
50
|
+
# Only use the first letter of bottom, top, left or right.
|
|
51
|
+
@position = args[:position]
|
|
52
|
+
@position = @position.downcase[0, 1] if @position
|
|
53
|
+
|
|
54
|
+
# Set the font properties if present.
|
|
55
|
+
@num_font = @chart.convert_font_args(args[:num_font])
|
|
56
|
+
@name_font = @chart.convert_font_args(args[:name_font])
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
#
|
|
60
|
+
# Write the <c:numberFormat> element. Note: It is assumed that if a user
|
|
61
|
+
# defined number format is supplied (i.e., non-default) then the sourceLinked
|
|
62
|
+
# attribute is 0. The user can override this if required.
|
|
63
|
+
#
|
|
64
|
+
|
|
65
|
+
def write_number_format(writer) # :nodoc:
|
|
66
|
+
source_linked = 1
|
|
67
|
+
|
|
68
|
+
# Check if a user defined number format has been set.
|
|
69
|
+
if @defaults && @num_format != @defaults[:num_format]
|
|
70
|
+
source_linked = 0
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# User override of sourceLinked.
|
|
74
|
+
if ptrue?(@num_format_linked)
|
|
75
|
+
source_linked = 1
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
attributes = [
|
|
79
|
+
'formatCode', @num_format,
|
|
80
|
+
'sourceLinked', source_linked
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
writer.empty_tag('c:numFmt', attributes)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
#
|
|
87
|
+
# Write the <c:numFmt> element. Special case handler for category axes which
|
|
88
|
+
# don't always have a number format.
|
|
89
|
+
#
|
|
90
|
+
def write_cat_number_format(writer, cat_has_num_fmt)
|
|
91
|
+
source_linked = 1
|
|
92
|
+
default_format = true
|
|
93
|
+
|
|
94
|
+
# Check if a user defined number format has been set.
|
|
95
|
+
if @defaults && @num_format != @defaults[:num_format]
|
|
96
|
+
source_linked = 0
|
|
97
|
+
default_format = false
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# User override of linkedSource.
|
|
101
|
+
if @num_format_linked
|
|
102
|
+
source_linked = 1
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Skip if cat doesn't have a num format (unless it is non-default).
|
|
106
|
+
if !cat_has_num_fmt && default_format
|
|
107
|
+
return ''
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
attributes = [
|
|
111
|
+
'formatCode', @num_format,
|
|
112
|
+
'sourceLinked', source_linked,
|
|
113
|
+
]
|
|
114
|
+
|
|
115
|
+
writer.empty_tag('c:numFmt', attributes)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
#
|
|
119
|
+
# Convert user defined gridline properties to the structure required internally.
|
|
120
|
+
#
|
|
121
|
+
def gridline_properties(args)
|
|
122
|
+
# Set the visible property for the gridline.
|
|
123
|
+
gridline = { :_visible => args[:visible] }
|
|
124
|
+
|
|
125
|
+
# Set the line properties for the gridline.
|
|
126
|
+
gridline[:_line] = @chart.line_properties(args[:line])
|
|
127
|
+
|
|
128
|
+
gridline
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
data/lib/write_xlsx/chart/bar.rb
CHANGED
|
@@ -29,19 +29,19 @@ def initialize(subtype)
|
|
|
29
29
|
@show_crosses = false
|
|
30
30
|
|
|
31
31
|
# Override and reset the default axis values.
|
|
32
|
-
if @x_axis
|
|
33
|
-
@x_axis[:
|
|
32
|
+
if @x_axis.defaults
|
|
33
|
+
@x_axis.defaults[:major_gridlines] = { :visible => 1 }
|
|
34
34
|
else
|
|
35
|
-
@x_axis
|
|
35
|
+
@x_axis.defaults = { :major_gridlines => { :visible => 1 } }
|
|
36
36
|
end
|
|
37
|
-
if @y_axis
|
|
38
|
-
@y_axis[:
|
|
37
|
+
if @y_axis.defaults
|
|
38
|
+
@y_axis.defaults[:major_gridlines] = { :visible => 0 }
|
|
39
39
|
else
|
|
40
|
-
@y_axis
|
|
40
|
+
@y_axis.defaults = { :major_gridlines => { :visible => 0 } }
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
if @subtype == 'percent_stacked'
|
|
44
|
-
@x_axis[:
|
|
44
|
+
@x_axis.defaults[:num_format] = '0%'
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
set_x_axis
|
|
@@ -55,8 +55,8 @@ def write_chart_type(params)
|
|
|
55
55
|
if params[:primary_axes] != 0
|
|
56
56
|
# Reverse X and Y axes for Bar charts.
|
|
57
57
|
@y_axis, @x_axis = @x_axis, @y_axis
|
|
58
|
-
if @y2_axis
|
|
59
|
-
@y2_axis
|
|
58
|
+
if @y2_axis.position == 'r'
|
|
59
|
+
@y2_axis.position = 't'
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
62
|
|
|
@@ -74,6 +74,14 @@ def write_bar_dir
|
|
|
74
74
|
|
|
75
75
|
@writer.empty_tag('c:barDir', attributes)
|
|
76
76
|
end
|
|
77
|
+
|
|
78
|
+
#
|
|
79
|
+
# Write the <c:errDir> element. Overridden from Chart class since it is not
|
|
80
|
+
# used in Bar charts.
|
|
81
|
+
#
|
|
82
|
+
def write_err_dir(direction)
|
|
83
|
+
# do nothing
|
|
84
|
+
end
|
|
77
85
|
end
|
|
78
86
|
end
|
|
79
87
|
end
|
|
@@ -35,7 +35,7 @@ def initialize(subtype)
|
|
|
35
35
|
|
|
36
36
|
# Override and reset the default axis values.
|
|
37
37
|
if @subtype == 'percent_stacked'
|
|
38
|
-
@y_axis[:
|
|
38
|
+
@y_axis.defaults[:num_format] = '0%'
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
set_y_axis
|
|
@@ -59,6 +59,14 @@ def write_bar_dir
|
|
|
59
59
|
|
|
60
60
|
@writer.empty_tag('c:barDir', attributes)
|
|
61
61
|
end
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Write the <c:errDir> element. Overridden from Chart class since it is not
|
|
65
|
+
# used in Bar charts.
|
|
66
|
+
#
|
|
67
|
+
def write_err_dir(direction)
|
|
68
|
+
# do nothing
|
|
69
|
+
end
|
|
62
70
|
end
|
|
63
71
|
end
|
|
64
72
|
end
|
|
@@ -45,6 +45,15 @@ def write_line_chart(params)
|
|
|
45
45
|
# Write the series elements.
|
|
46
46
|
series.each {|s| write_series(s)}
|
|
47
47
|
|
|
48
|
+
# Write the c:dropLines element.
|
|
49
|
+
write_drop_lines
|
|
50
|
+
|
|
51
|
+
# Write the c:hiLowLines element.
|
|
52
|
+
write_hi_low_lines
|
|
53
|
+
|
|
54
|
+
# Write the c:upDownBars element.
|
|
55
|
+
write_up_down_bars
|
|
56
|
+
|
|
48
57
|
# Write the c:marker element.
|
|
49
58
|
write_marker_value
|
|
50
59
|
|
|
@@ -52,6 +61,21 @@ def write_line_chart(params)
|
|
|
52
61
|
write_axis_ids(params)
|
|
53
62
|
end
|
|
54
63
|
end
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# Write an individual <c:dPt> element. Override the parent method to add
|
|
67
|
+
# markers.
|
|
68
|
+
#
|
|
69
|
+
def write_d_pt_point(index, point)
|
|
70
|
+
@writer.tag_elements('c:dPt') do
|
|
71
|
+
# Write the c:idx element.
|
|
72
|
+
write_idx(index)
|
|
73
|
+
@writer.tag_elements('c:marker') do
|
|
74
|
+
# Write the c:spPr element.
|
|
75
|
+
write_sp_pr(point)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
55
79
|
end
|
|
56
80
|
end
|
|
57
81
|
end
|
|
@@ -36,11 +36,11 @@ def initialize(subtype)
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
# Override and reset the default axis values.
|
|
39
|
-
@x_axis[:
|
|
39
|
+
@x_axis.defaults[:major_gridlines] = { :visible => 1 }
|
|
40
40
|
set_x_axis
|
|
41
41
|
|
|
42
42
|
# Hardcode major_tick_mark for now untill there is an accessor.
|
|
43
|
-
@y_axis
|
|
43
|
+
@y_axis.major_tick_mark = 'cross'
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
#
|
|
@@ -110,10 +110,14 @@ def write_ser(series)
|
|
|
110
110
|
write_sp_pr(series)
|
|
111
111
|
# Write the c:marker element.
|
|
112
112
|
write_marker(series[:_marker])
|
|
113
|
+
# Write the c:dPt element.
|
|
114
|
+
write_d_pt(series[:_points])
|
|
113
115
|
# Write the c:dLbls element.
|
|
114
116
|
write_d_lbls(series[:_labels])
|
|
115
117
|
# Write the c:trendline element.
|
|
116
118
|
write_trendline(series[:_trendline])
|
|
119
|
+
# Write the c:errBars element.
|
|
120
|
+
write_error_bars(series[:_error_bars])
|
|
117
121
|
# Write the c:xVal element.
|
|
118
122
|
write_x_val(series)
|
|
119
123
|
# Write the c:yVal element.
|
|
@@ -266,6 +270,21 @@ def modify_series_formatting
|
|
|
266
270
|
end
|
|
267
271
|
end
|
|
268
272
|
end
|
|
273
|
+
|
|
274
|
+
#
|
|
275
|
+
# Write an individual <c:dPt> element. Override the parent method to add
|
|
276
|
+
# markers.
|
|
277
|
+
#
|
|
278
|
+
def write_d_pt_point(index, point)
|
|
279
|
+
@writer.tag_elements('c:dPt') do
|
|
280
|
+
# Write the c:idx element.
|
|
281
|
+
write_idx(index)
|
|
282
|
+
@writer.tag_elements('c:marker') do
|
|
283
|
+
# Write the c:spPr element.
|
|
284
|
+
write_sp_pr(point)
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
end
|
|
269
288
|
end
|
|
270
289
|
end
|
|
271
290
|
end
|
|
@@ -27,10 +27,11 @@ class Stock < self
|
|
|
27
27
|
def initialize(subtype)
|
|
28
28
|
super(subtype)
|
|
29
29
|
@show_crosses = false
|
|
30
|
+
@hi_low_lines = {}
|
|
30
31
|
|
|
31
32
|
# Override and reset the default axis values.
|
|
32
|
-
@x_axis[:
|
|
33
|
-
@x2_axis[:
|
|
33
|
+
@x_axis.defaults[:num_format] = 'dd/mm/yyyy'
|
|
34
|
+
@x2_axis.defaults[:num_format] = 'dd/mm/yyyy'
|
|
34
35
|
set_x_axis
|
|
35
36
|
set_x2_axis
|
|
36
37
|
end
|
|
@@ -62,8 +63,14 @@ def write_stock_chart(params)
|
|
|
62
63
|
# Write the series elements.
|
|
63
64
|
series.each {|s| write_series(s)}
|
|
64
65
|
|
|
66
|
+
# Write the c:dtopLines element.
|
|
67
|
+
write_drop_lines
|
|
68
|
+
|
|
65
69
|
# Write the c:hiLowLines element.
|
|
66
|
-
write_hi_low_lines if params[:primary_axes]
|
|
70
|
+
write_hi_low_lines if ptrue?(params[:primary_axes])
|
|
71
|
+
|
|
72
|
+
# Write the c:upDownBars element.
|
|
73
|
+
write_up_down_bars
|
|
67
74
|
|
|
68
75
|
# Write the c:marker element.
|
|
69
76
|
write_marker_value
|
data/lib/write_xlsx/drawing.rb
CHANGED
|
@@ -89,7 +89,7 @@ def write_two_cell_anchor(*args)
|
|
|
89
89
|
attributes << :editAs << 'oneCell' if type == 2
|
|
90
90
|
|
|
91
91
|
# Add attribute for shapes.
|
|
92
|
-
attributes << :editAs << shape
|
|
92
|
+
attributes << :editAs << shape.edit_as if shape && !shape.edit_as.nil?
|
|
93
93
|
|
|
94
94
|
@writer.tag_elements('xdr:twoCellAnchor', attributes) do
|
|
95
95
|
# Write the xdr:from element.
|
|
@@ -400,7 +400,7 @@ def write_client_data
|
|
|
400
400
|
# Write the <xdr:sp> element.
|
|
401
401
|
#
|
|
402
402
|
def write_sp(index, col_absolute, row_absolute, width, height, shape)
|
|
403
|
-
if shape
|
|
403
|
+
if shape.connect != 0
|
|
404
404
|
attributes = [:macro, '']
|
|
405
405
|
@writer.tag_elements('xdr:cxnSp', attributes) do
|
|
406
406
|
|
|
@@ -422,7 +422,7 @@ def write_sp(index, col_absolute, row_absolute, width, height, shape)
|
|
|
422
422
|
write_xdr_sp_pr(index, col_absolute, row_absolute, width, height, shape)
|
|
423
423
|
|
|
424
424
|
# Write the xdr:txBody element.
|
|
425
|
-
if shape
|
|
425
|
+
if shape.text != 0
|
|
426
426
|
write_txBody(col_absolute, row_absolute, width, height, shape)
|
|
427
427
|
end
|
|
428
428
|
end
|
|
@@ -435,21 +435,21 @@ def write_sp(index, col_absolute, row_absolute, width, height, shape)
|
|
|
435
435
|
def write_nv_cxn_sp_pr(index, shape)
|
|
436
436
|
@writer.tag_elements('xdr:nvCxnSpPr') do
|
|
437
437
|
|
|
438
|
-
shape
|
|
439
|
-
write_c_nv_pr(shape
|
|
438
|
+
shape.name = [shape.type, index].join(' ') unless shape.name
|
|
439
|
+
write_c_nv_pr(shape.id, shape.name)
|
|
440
440
|
|
|
441
441
|
@writer.tag_elements('xdr:cNvCxnSpPr') do
|
|
442
442
|
|
|
443
443
|
attributes = [:noChangeShapeType, '1']
|
|
444
444
|
@writer.empty_tag('a:cxnSpLocks', attributes)
|
|
445
445
|
|
|
446
|
-
if shape
|
|
447
|
-
attributes = ['id', shape
|
|
446
|
+
if shape.start
|
|
447
|
+
attributes = ['id', shape.start, 'idx', shape.start_index]
|
|
448
448
|
@writer.empty_tag('a:stCxn', attributes)
|
|
449
449
|
end
|
|
450
450
|
|
|
451
|
-
if shape
|
|
452
|
-
attributes = ['id', shape
|
|
451
|
+
if shape.end
|
|
452
|
+
attributes = ['id', shape.end, 'idx', shape.end_index]
|
|
453
453
|
@writer.empty_tag('a:endCxn', attributes)
|
|
454
454
|
end
|
|
455
455
|
end
|
|
@@ -461,14 +461,13 @@ def write_nv_cxn_sp_pr(index, shape)
|
|
|
461
461
|
#
|
|
462
462
|
def write_nv_sp_pr(index, shape)
|
|
463
463
|
attributes = []
|
|
464
|
+
attributes << 'txBox' << 1 if shape.tx_box
|
|
464
465
|
|
|
465
466
|
@writer.tag_elements('xdr:nvSpPr') do
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
attributes = ['txBox', 1] if shape[:tx_box] != 0
|
|
467
|
+
write_c_nv_pr(shape.id, "#{shape.type} #{index}")
|
|
468
|
+
|
|
469
469
|
@writer.tag_elements('xdr:cNvSpPr', attributes) do
|
|
470
|
-
|
|
471
|
-
@writer.empty_tag('a:spLocks', attributes)
|
|
470
|
+
@writer.empty_tag('a:spLocks', [:noChangeArrowheads, '1'])
|
|
472
471
|
end
|
|
473
472
|
end
|
|
474
473
|
end
|
|
@@ -485,7 +484,7 @@ def write_pic(index, col_absolute, row_absolute, width, height, description)
|
|
|
485
484
|
|
|
486
485
|
# Pictures are rectangle shapes by default.
|
|
487
486
|
shape = Shape.new
|
|
488
|
-
shape
|
|
487
|
+
shape.type = 'rect'
|
|
489
488
|
|
|
490
489
|
# Write the xdr:spPr element.
|
|
491
490
|
write_sp_pr(col_absolute, row_absolute, width, height, shape)
|
|
@@ -596,9 +595,9 @@ def write_xdr_sp_pr(index, col_absolute, row_absolute, width, height, shape)
|
|
|
596
595
|
# Write the a:prstGeom element.
|
|
597
596
|
write_a_prst_geom(shape)
|
|
598
597
|
|
|
599
|
-
if shape
|
|
598
|
+
if shape.fill.to_s.bytesize > 1
|
|
600
599
|
# Write the a:solidFill element.
|
|
601
|
-
write_a_solid_fill(shape
|
|
600
|
+
write_a_solid_fill(shape.fill)
|
|
602
601
|
else
|
|
603
602
|
@writer.empty_tag('a:noFill')
|
|
604
603
|
end
|
|
@@ -611,15 +610,15 @@ def write_xdr_sp_pr(index, col_absolute, row_absolute, width, height, shape)
|
|
|
611
610
|
#
|
|
612
611
|
# Write the <a:xfrm> element.
|
|
613
612
|
#
|
|
614
|
-
def write_a_xfrm(col_absolute, row_absolute, width, height, shape =
|
|
613
|
+
def write_a_xfrm(col_absolute, row_absolute, width, height, shape = nil)
|
|
615
614
|
attributes = []
|
|
616
615
|
|
|
617
|
-
rotation = shape
|
|
616
|
+
rotation = shape ? shape.rotation : 0
|
|
618
617
|
rotation *= 60000
|
|
619
618
|
|
|
620
619
|
attributes << 'rot' << rotation if rotation != 0
|
|
621
|
-
attributes << 'flipH' << 1 if ptrue?(shape
|
|
622
|
-
attributes << 'flipV' << 1 if ptrue?(shape
|
|
620
|
+
attributes << 'flipH' << 1 if shape && ptrue?(shape.flip_h)
|
|
621
|
+
attributes << 'flipV' << 1 if shape && ptrue?(shape.flip_v)
|
|
623
622
|
|
|
624
623
|
@writer.tag_elements('a:xfrm', attributes) do
|
|
625
624
|
# Write the a:off element.
|
|
@@ -659,7 +658,7 @@ def write_a_ext(cx, cy)
|
|
|
659
658
|
#
|
|
660
659
|
def write_a_prst_geom(shape = {})
|
|
661
660
|
attributes = []
|
|
662
|
-
attributes << 'prst' << shape
|
|
661
|
+
attributes << 'prst' << shape.type if shape.type
|
|
663
662
|
|
|
664
663
|
@writer.tag_elements('a:prstGeom', attributes) do
|
|
665
664
|
# Write the a:avLst element.
|
|
@@ -671,11 +670,11 @@ def write_a_prst_geom(shape = {})
|
|
|
671
670
|
# Write the <a:avLst> element.
|
|
672
671
|
#
|
|
673
672
|
def write_a_av_lst(shape = {})
|
|
674
|
-
if shape
|
|
675
|
-
adjustments = shape
|
|
676
|
-
elsif shape
|
|
677
|
-
adjustments = [shape
|
|
678
|
-
elsif !shape
|
|
673
|
+
if shape.adjustments.respond_to?(:empty?)
|
|
674
|
+
adjustments = shape.adjustments
|
|
675
|
+
elsif shape.adjustments.respond_to?(:coerce)
|
|
676
|
+
adjustments = [shape.adjustments]
|
|
677
|
+
elsif !shape.adjustments
|
|
679
678
|
adjustments = []
|
|
680
679
|
end
|
|
681
680
|
|
|
@@ -685,7 +684,7 @@ def write_a_av_lst(shape = {})
|
|
|
685
684
|
adjustments.each do |adj|
|
|
686
685
|
i += 1
|
|
687
686
|
# Only connectors have multiple adjustments.
|
|
688
|
-
suffix = shape
|
|
687
|
+
suffix = shape.connect != 0 ? i : ''
|
|
689
688
|
|
|
690
689
|
# Scale Adjustments: 100,000 = 100%.
|
|
691
690
|
adj_int = (adj * 1000).to_i
|
|
@@ -714,10 +713,10 @@ def write_a_solid_fill(rgb = '000000')
|
|
|
714
713
|
# Write the <a:ln> elements.
|
|
715
714
|
#
|
|
716
715
|
def write_a_ln(shape = {})
|
|
717
|
-
weight = shape
|
|
716
|
+
weight = shape.line_weight || 0
|
|
718
717
|
attributes = ['w', weight * 9525]
|
|
719
718
|
@writer.tag_elements('a:ln', attributes) do
|
|
720
|
-
line = shape
|
|
719
|
+
line = shape.line || 0
|
|
721
720
|
if line.to_s.bytesize > 1
|
|
722
721
|
# Write the a:solidFill element.
|
|
723
722
|
write_a_solid_fill(line)
|
|
@@ -725,12 +724,12 @@ def write_a_ln(shape = {})
|
|
|
725
724
|
@writer.empty_tag('a:noFill')
|
|
726
725
|
end
|
|
727
726
|
|
|
728
|
-
if shape
|
|
729
|
-
attributes = ['val', shape
|
|
727
|
+
if shape.line_type != ''
|
|
728
|
+
attributes = ['val', shape.line_type]
|
|
730
729
|
@writer.empty_tag('a:prstDash', attributes)
|
|
731
730
|
end
|
|
732
731
|
|
|
733
|
-
if shape
|
|
732
|
+
if shape.connect != 0
|
|
734
733
|
@writer.empty_tag('a:round')
|
|
735
734
|
else
|
|
736
735
|
attributes = ['lim', 800000]
|
|
@@ -753,7 +752,7 @@ def write_txBody(col_absolute, row_absolute, width, height, shape)
|
|
|
753
752
|
:tIns, "22860",
|
|
754
753
|
:rIns, "27432",
|
|
755
754
|
:bIns, "22860",
|
|
756
|
-
:anchor, shape
|
|
755
|
+
:anchor, shape.valign,
|
|
757
756
|
:upright, "1"
|
|
758
757
|
]
|
|
759
758
|
@writer.tag_elements('xdr:txBody') do
|
|
@@ -761,23 +760,23 @@ def write_txBody(col_absolute, row_absolute, width, height, shape)
|
|
|
761
760
|
@writer.empty_tag('a:lstStyle')
|
|
762
761
|
|
|
763
762
|
@writer.tag_elements('a:p') do
|
|
764
|
-
rotation = shape
|
|
763
|
+
rotation = shape.format[:rotation] || 0
|
|
765
764
|
rotation *= 60000
|
|
766
765
|
|
|
767
|
-
attributes = [:algn, shape
|
|
766
|
+
attributes = [:algn, shape.align, :rtl, rotation]
|
|
768
767
|
@writer.tag_elements('a:pPr', attributes) do
|
|
769
768
|
attributes = [:sz, "1000"]
|
|
770
769
|
@writer.empty_tag('a:defRPr', attributes)
|
|
771
770
|
end
|
|
772
771
|
|
|
773
772
|
@writer.tag_elements('a:r') do
|
|
774
|
-
size = shape
|
|
773
|
+
size = shape.format[:size] || 8
|
|
775
774
|
size *= 100
|
|
776
775
|
|
|
777
|
-
bold = shape
|
|
778
|
-
italic = shape
|
|
779
|
-
underline = ptrue?(shape
|
|
780
|
-
strike = ptrue?(shape
|
|
776
|
+
bold = shape.format[:bold] || 0
|
|
777
|
+
italic = shape.format[:italic] || 0
|
|
778
|
+
underline = ptrue?(shape.format[:underline]) ? 'sng' : 'none'
|
|
779
|
+
strike = ptrue?(shape.format[:font_strikeout]) ? 'Strike' : 'noStrike'
|
|
781
780
|
|
|
782
781
|
attributes = [
|
|
783
782
|
:lang, "en-US",
|
|
@@ -789,7 +788,7 @@ def write_txBody(col_absolute, row_absolute, width, height, shape)
|
|
|
789
788
|
:baseline, 0
|
|
790
789
|
]
|
|
791
790
|
@writer.tag_elements('a:rPr', attributes) do
|
|
792
|
-
color = shape
|
|
791
|
+
color = shape.format[:color]
|
|
793
792
|
if color
|
|
794
793
|
color = shape.get_palette_color(color)
|
|
795
794
|
color = color.sub(/^FF/, '') # Remove leading FF from rgb for shape color.
|
|
@@ -799,13 +798,13 @@ def write_txBody(col_absolute, row_absolute, width, height, shape)
|
|
|
799
798
|
|
|
800
799
|
write_a_solid_fill(color)
|
|
801
800
|
|
|
802
|
-
font = shape
|
|
801
|
+
font = shape.format[:font] || 'Calibri'
|
|
803
802
|
attributes = [:typeface, font]
|
|
804
803
|
@writer.empty_tag('a:latin', attributes)
|
|
805
804
|
@writer.empty_tag('a:cs', attributes)
|
|
806
805
|
end
|
|
807
806
|
@writer.tag_elements('a:t') do
|
|
808
|
-
@writer.characters(shape
|
|
807
|
+
@writer.characters(shape.text)
|
|
809
808
|
end
|
|
810
809
|
end
|
|
811
810
|
end
|