osheet 0.10.0 → 1.0.0.rc.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.
- data/Gemfile +0 -1
- data/Gemfile.lock +9 -6
- data/Rakefile +35 -19
- data/bench/bench_runner.rb +91 -0
- data/bench/profiler_runner.rb +1 -0
- data/examples/basic.rb +1 -1
- data/examples/basic.xls +2 -1
- data/examples/basic_with_templates.rb +2 -2
- data/examples/basic_with_templates.xls +3 -3
- data/examples/formats.rb +2 -2
- data/examples/formats.xls +46 -46
- data/examples/formula.rb +2 -2
- data/examples/styles.rb +2 -2
- data/examples/styles.xls +5 -5
- data/examples/trivial.rb +2 -2
- data/lib/osheet/cell.rb +48 -46
- data/lib/osheet/column.rb +23 -29
- data/lib/osheet/format.rb +3 -3
- data/lib/osheet/meta_element.rb +2 -1
- data/lib/osheet/mixin.rb +21 -9
- data/lib/osheet/partial.rb +5 -9
- data/lib/osheet/row.rb +28 -32
- data/lib/osheet/style.rb +11 -25
- data/lib/osheet/styled_element.rb +9 -1
- data/lib/osheet/template.rb +3 -8
- data/lib/osheet/version.rb +1 -1
- data/lib/osheet/workbook.rb +135 -43
- data/lib/osheet/workbook_api.rb +208 -0
- data/lib/osheet/workbook_element.rb +225 -8
- data/lib/osheet/worksheet.rb +22 -28
- data/lib/osheet/xmlss_writer/style_cache.rb +64 -0
- data/lib/osheet/xmlss_writer/style_settings.rb +148 -0
- data/lib/osheet/xmlss_writer.rb +143 -1
- data/lib/osheet.rb +3 -29
- data/osheet.gemspec +4 -1
- data/test/cell_test.rb +33 -98
- data/test/column_test.rb +20 -88
- data/test/{mixins.rb → fixtures/mixins.rb} +6 -4
- data/test/fixtures/test_writer.rb +68 -0
- data/test/format_test.rb +2 -2
- data/test/helper.rb +34 -68
- data/test/mixin_test.rb +37 -43
- data/test/partial_test.rb +3 -26
- data/test/row_test.rb +32 -85
- data/test/style_test.rb +9 -26
- data/test/template_test.rb +5 -6
- data/test/workbook_element_test.rb +231 -0
- data/test/workbook_test.rb +225 -116
- data/test/worksheet_test.rb +51 -98
- data/test/xmlss_writer/api_test.rb +139 -0
- data/test/xmlss_writer/style_cache_test.rb +65 -0
- data/test/xmlss_writer/style_settings_test.rb +263 -0
- data/test/xmlss_writer/styles_test.rb +121 -153
- data/test/xmlss_writer_test.rb +91 -0
- metadata +75 -50
- data/lib/osheet/associations.rb +0 -58
- data/lib/osheet/instance.rb +0 -30
- data/lib/osheet/markup_element.rb +0 -22
- data/lib/osheet/partial_set.rb +0 -57
- data/lib/osheet/railtie.rb +0 -9
- data/lib/osheet/style_set.rb +0 -39
- data/lib/osheet/template_set.rb +0 -51
- data/lib/osheet/view_handler/rails.rb +0 -44
- data/lib/osheet/view_handler/tilt.rb +0 -42
- data/lib/osheet/view_handler.rb +0 -2
- data/lib/osheet/worksheet_element.rb +0 -17
- data/lib/osheet/xmlss_writer/base.rb +0 -49
- data/lib/osheet/xmlss_writer/elements.rb +0 -56
- data/lib/osheet/xmlss_writer/styles.rb +0 -216
- data/test/osheet_test.rb +0 -13
- data/test/partial_set_test.rb +0 -64
- data/test/style_set_test.rb +0 -47
- data/test/template_set_test.rb +0 -74
- data/test/xmlss_writer/base_test.rb +0 -103
- data/test/xmlss_writer/elements_test.rb +0 -172
data/lib/osheet/cell.rb
CHANGED
@@ -1,62 +1,64 @@
|
|
1
1
|
require 'date'
|
2
|
+
|
2
3
|
require 'osheet/format'
|
4
|
+
require 'osheet/meta_element'
|
5
|
+
require 'osheet/styled_element'
|
3
6
|
|
4
7
|
module Osheet
|
5
8
|
class Cell
|
6
|
-
|
7
|
-
include
|
8
|
-
include WorksheetElement
|
9
|
+
|
10
|
+
include MetaElement
|
9
11
|
include StyledElement
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
12
|
+
|
13
|
+
def initialize(data_value=nil)
|
14
|
+
@data = cast_data_value(data_value)
|
15
|
+
@format = Format.new(:general)
|
16
|
+
@rowspan = 1
|
17
|
+
@colspan = 1
|
18
|
+
@index = nil
|
19
|
+
@href = nil
|
20
|
+
@formula = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
def data(value=nil)
|
24
|
+
value.nil? ? @data : @data = cast_data_value(value)
|
25
|
+
end
|
26
|
+
|
27
|
+
def format(value=nil, opts={})
|
28
|
+
value.nil? ? @format : @format = Format.new(value, opts)
|
29
|
+
end
|
30
|
+
|
31
|
+
def rowspan(value=nil)
|
32
|
+
value.nil? ? @rowspan : @rowspan = value
|
26
33
|
end
|
27
34
|
|
28
|
-
def
|
29
|
-
|
30
|
-
|
35
|
+
def colspan(value=nil)
|
36
|
+
value.nil? ? @colspan : @colspan = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def index(value=nil)
|
40
|
+
value.nil? ? @index : @index = value
|
41
|
+
end
|
42
|
+
|
43
|
+
def href(value=nil)
|
44
|
+
value.nil? ? @href : @href = value
|
45
|
+
end
|
46
|
+
|
47
|
+
def formula(value=nil)
|
48
|
+
value.nil? ? @formula : @formula = value
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def cast_data_value(value)
|
54
|
+
case value
|
55
|
+
when ::String, ::Numeric, ::Date, ::Time, ::DateTime, ::NilClass
|
31
56
|
value
|
32
57
|
when ::Symbol
|
33
58
|
value.to_s
|
34
59
|
else
|
35
60
|
value.inspect.to_s
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def format(type, opts={})
|
40
|
-
set_ivar(:format, Format.new(type, opts))
|
41
|
-
end
|
42
|
-
|
43
|
-
def rowspan(value); set_ivar(:rowspan, value); end
|
44
|
-
def colspan(value); set_ivar(:colspan, value); end
|
45
|
-
def href(value); set_ivar(:href, value); end
|
46
|
-
def index(value); set_ivar(:index, value); end
|
47
|
-
def formula(value); set_ivar(:formula, value); end
|
48
|
-
|
49
|
-
def attributes
|
50
|
-
{
|
51
|
-
:style_class => get_ivar(:style_class),
|
52
|
-
:data => get_ivar(:data),
|
53
|
-
:format => get_ivar(:format),
|
54
|
-
:colspan => get_ivar(:colspan),
|
55
|
-
:rowspan => get_ivar(:rowspan),
|
56
|
-
:href => get_ivar(:href),
|
57
|
-
:index => get_ivar(:index),
|
58
|
-
:formula => get_ivar(:formula)
|
59
|
-
}
|
61
|
+
end
|
60
62
|
end
|
61
63
|
|
62
64
|
end
|
data/lib/osheet/column.rb
CHANGED
@@ -1,40 +1,34 @@
|
|
1
|
+
require 'osheet/meta_element'
|
2
|
+
require 'osheet/styled_element'
|
3
|
+
|
1
4
|
module Osheet
|
2
5
|
class Column
|
3
|
-
|
4
|
-
include WorkbookElement
|
5
|
-
include WorksheetElement
|
6
|
-
include StyledElement
|
6
|
+
|
7
7
|
include MetaElement
|
8
|
-
include
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
set_binding_ivars(block.binding)
|
18
|
-
instance_exec(*args, &block)
|
19
|
-
end
|
8
|
+
include StyledElement
|
9
|
+
|
10
|
+
attr_reader :format
|
11
|
+
|
12
|
+
def initialize(width=nil)
|
13
|
+
@width = width
|
14
|
+
@autofit = false
|
15
|
+
@hidden = false
|
16
|
+
@format = Format.new(:general)
|
20
17
|
end
|
21
18
|
|
22
19
|
def width(value=nil)
|
23
|
-
|
20
|
+
value.nil? ? @width : @width = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def autofit(value=nil)
|
24
|
+
value.nil? ? @autofit : @autofit = !!value
|
24
25
|
end
|
25
|
-
def autofit
|
26
|
-
|
27
|
-
def hidden(value)
|
28
|
-
|
29
|
-
|
30
|
-
def attributes
|
31
|
-
{
|
32
|
-
:style_class => get_ivar(:style_class),
|
33
|
-
:width => get_ivar(:width),
|
34
|
-
:autofit => get_ivar(:autofit),
|
35
|
-
:hidden => get_ivar(:hidden)
|
36
|
-
}
|
26
|
+
def autofit?; @autofit; end
|
27
|
+
|
28
|
+
def hidden(value=nil)
|
29
|
+
value.nil? ? @hidden : @hidden = !!value
|
37
30
|
end
|
31
|
+
def hidden?; @hidden; end
|
38
32
|
|
39
33
|
end
|
40
34
|
end
|
data/lib/osheet/format.rb
CHANGED
@@ -13,17 +13,17 @@ require 'osheet/format/custom'
|
|
13
13
|
module Osheet::Format
|
14
14
|
|
15
15
|
VALUES = [
|
16
|
-
:general
|
16
|
+
:general, :number, :currency, :accounting,
|
17
17
|
:datetime, :percentage, :fraction, :scientific,
|
18
18
|
:text, :special, :custom
|
19
19
|
]
|
20
20
|
|
21
21
|
class << self
|
22
|
-
def new(type,
|
22
|
+
def new(type, *args)
|
23
23
|
unless VALUES.include?(type)
|
24
24
|
raise ArgumentError, "'#{type.inspect}' is not a valid format type"
|
25
25
|
end
|
26
|
-
self.const_get(type.to_s.capitalize).new(
|
26
|
+
self.const_get(type.to_s.capitalize).new(*args)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
data/lib/osheet/meta_element.rb
CHANGED
data/lib/osheet/mixin.rb
CHANGED
@@ -1,36 +1,48 @@
|
|
1
|
-
require 'osheet/style'
|
2
|
-
require 'osheet/template'
|
3
|
-
|
4
1
|
module Osheet::Mixin
|
5
2
|
|
6
3
|
def self.included(receiver)
|
7
4
|
receiver.send(:extend, ClassMethods)
|
8
5
|
end
|
9
6
|
|
7
|
+
class Args
|
8
|
+
|
9
|
+
attr_reader :args, :build
|
10
|
+
|
11
|
+
def initialize(*args, &build)
|
12
|
+
@args = args
|
13
|
+
@build = build || Proc.new {}
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
10
18
|
module ClassMethods
|
11
|
-
|
19
|
+
|
20
|
+
def style(*selectors, &build)
|
12
21
|
instance_variable_set("@s",
|
13
|
-
(instance_variable_get("@s") || []) <<
|
22
|
+
(instance_variable_get("@s") || []) << Args.new(*selectors, &build)
|
14
23
|
)
|
15
24
|
end
|
25
|
+
|
16
26
|
def styles
|
17
27
|
instance_variable_get("@s") || []
|
18
28
|
end
|
19
29
|
|
20
|
-
def template(element, name, &
|
30
|
+
def template(element, name, &build)
|
21
31
|
instance_variable_set("@t",
|
22
|
-
(instance_variable_get("@t") || []) <<
|
32
|
+
(instance_variable_get("@t") || []) << Args.new(element, name, &build)
|
23
33
|
)
|
24
34
|
end
|
35
|
+
|
25
36
|
def templates
|
26
37
|
instance_variable_get("@t") || []
|
27
38
|
end
|
28
39
|
|
29
|
-
def partial(name, &
|
40
|
+
def partial(name, &build)
|
30
41
|
instance_variable_set("@p",
|
31
|
-
(instance_variable_get("@p") || []) <<
|
42
|
+
(instance_variable_get("@p") || []) << Args.new(name, &build)
|
32
43
|
)
|
33
44
|
end
|
45
|
+
|
34
46
|
def partials
|
35
47
|
instance_variable_get("@p") || []
|
36
48
|
end
|
data/lib/osheet/partial.rb
CHANGED
@@ -2,23 +2,19 @@ module Osheet
|
|
2
2
|
class Partial < ::Proc
|
3
3
|
|
4
4
|
# this class is essentially a way to define a named definition
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
|
9
|
-
include Instance
|
5
|
+
# block with arguments. If the partial is added to an element,
|
6
|
+
# any markup in it's definition block is applied to the element.
|
7
|
+
# ie. the definition block will be instance_eval'd on workbook.
|
10
8
|
|
11
9
|
def initialize(name)
|
12
10
|
unless name.kind_of?(::String) || name.kind_of?(::Symbol)
|
13
11
|
raise ArgumentError, "please use a string or symbol for the partial name."
|
14
12
|
end
|
15
13
|
|
16
|
-
|
14
|
+
@name = name.to_s
|
17
15
|
super()
|
18
16
|
end
|
19
17
|
|
20
|
-
def name; get_ivar(:name); end
|
21
|
-
def name=(v); set_ivar(:name, v); end
|
22
|
-
|
23
18
|
end
|
24
19
|
end
|
20
|
+
|
data/lib/osheet/row.rb
CHANGED
@@ -1,44 +1,40 @@
|
|
1
|
+
require 'osheet/meta_element'
|
2
|
+
require 'osheet/styled_element'
|
3
|
+
|
1
4
|
require 'osheet/cell'
|
2
5
|
|
3
6
|
module Osheet
|
4
7
|
class Row
|
5
|
-
|
6
|
-
include Associations
|
7
|
-
include WorkbookElement
|
8
|
-
include WorksheetElement
|
9
|
-
include StyledElement
|
8
|
+
|
10
9
|
include MetaElement
|
11
|
-
include
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def initialize(
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
if block_given?
|
22
|
-
set_binding_ivars(block.binding)
|
23
|
-
instance_exec(*args, &block)
|
24
|
-
end
|
10
|
+
include StyledElement
|
11
|
+
|
12
|
+
attr_reader :cells, :format
|
13
|
+
|
14
|
+
def initialize(height=nil)
|
15
|
+
@height = height
|
16
|
+
@autofit = false
|
17
|
+
@hidden = false
|
18
|
+
@cells = []
|
19
|
+
@format = Format.new(:general)
|
25
20
|
end
|
26
21
|
|
27
22
|
def height(value=nil)
|
28
|
-
|
23
|
+
value.nil? ? @height : @height = value
|
29
24
|
end
|
30
|
-
|
31
|
-
def autofit
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
25
|
+
|
26
|
+
def autofit(value=nil)
|
27
|
+
value.nil? ? @autofit : @autofit = !!value
|
28
|
+
end
|
29
|
+
def autofit?; @autofit; end
|
30
|
+
|
31
|
+
def hidden(value=nil)
|
32
|
+
value.nil? ? @hidden : @hidden = !!value
|
33
|
+
end
|
34
|
+
def hidden?; @hidden; end
|
35
|
+
|
36
|
+
def cell(cell_obj)
|
37
|
+
@cells << cell_obj
|
42
38
|
end
|
43
39
|
|
44
40
|
end
|
data/lib/osheet/style.rb
CHANGED
@@ -2,45 +2,31 @@ module Osheet
|
|
2
2
|
class Style
|
3
3
|
|
4
4
|
# this class is essentially a set of collectors for style settings
|
5
|
-
#
|
6
|
-
#
|
7
|
-
|
8
|
-
include Instance
|
5
|
+
# each setting collects any arguments passed to it and
|
6
|
+
# it is up to the writer to determine how to use the settings
|
9
7
|
|
10
8
|
BORDER_POSITIONS = [:top, :right, :bottom, :left]
|
11
9
|
BORDERS = BORDER_POSITIONS.collect{|p| "border_#{p}".to_sym}
|
12
10
|
SETTINGS = [:align, :font, :bg] + BORDERS
|
13
11
|
|
14
|
-
|
15
|
-
set_ivar(:selectors, verify(selectors))
|
16
|
-
SETTINGS.each {|setting| set_ivar(setting, [])}
|
17
|
-
if block_given?
|
18
|
-
set_binding_ivars(block.binding)
|
19
|
-
instance_eval(&block)
|
20
|
-
end
|
21
|
-
end
|
12
|
+
attr_reader :selectors, :build
|
22
13
|
|
23
|
-
def selectors
|
24
|
-
|
14
|
+
def initialize(*selectors, &build)
|
15
|
+
@selectors = verify(selectors)
|
16
|
+
@build = build || Proc.new {}
|
17
|
+
SETTINGS.each { |s| instance_variable_set("@#{s}", []) }
|
25
18
|
end
|
26
19
|
|
27
20
|
SETTINGS.each do |setting|
|
28
21
|
define_method(setting) do |*args|
|
29
|
-
|
22
|
+
instance_variable_get("@#{setting}").tap do |value|
|
23
|
+
instance_variable_set("@#{setting}", value + args) if !args.empty?
|
24
|
+
end
|
30
25
|
end
|
31
26
|
end
|
32
27
|
|
33
28
|
def border(*args)
|
34
|
-
BORDERS.each
|
35
|
-
send(border, *args)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def attributes
|
40
|
-
SETTINGS.inject({}) do |attrs, s|
|
41
|
-
attrs[s] = get_ivar(s)
|
42
|
-
attrs
|
43
|
-
end
|
29
|
+
BORDERS.each { |border| send(border, *args) }
|
44
30
|
end
|
45
31
|
|
46
32
|
def match?(style_class)
|
@@ -1,5 +1,13 @@
|
|
1
|
+
module Osheet; end
|
1
2
|
module Osheet::StyledElement
|
2
|
-
|
3
|
+
|
4
|
+
def style_class(value=nil)
|
5
|
+
if value.nil?
|
6
|
+
instance_variable_get("@style_class")
|
7
|
+
else
|
8
|
+
instance_variable_set("@style_class", verify_style_class(value))
|
9
|
+
end
|
10
|
+
end
|
3
11
|
|
4
12
|
private
|
5
13
|
|
data/lib/osheet/template.rb
CHANGED
@@ -4,10 +4,8 @@ module Osheet
|
|
4
4
|
class Template < Partial
|
5
5
|
|
6
6
|
# this class is a partial that is associated with an osheet element
|
7
|
-
#
|
8
|
-
#
|
9
|
-
|
10
|
-
include Instance
|
7
|
+
# if an element is initialized from a template, the template
|
8
|
+
# block will be instance_eval'd for the element being initialized
|
11
9
|
|
12
10
|
ELEMENTS = ['worksheet', 'column', 'row', 'cell']
|
13
11
|
|
@@ -16,12 +14,9 @@ module Osheet
|
|
16
14
|
raise ArgumentError, "you can only define a template for #{ELEMENTS.join(', ')} elements."
|
17
15
|
end
|
18
16
|
|
19
|
-
|
17
|
+
@element = element.to_s
|
20
18
|
super(name)
|
21
19
|
end
|
22
20
|
|
23
|
-
def element; get_ivar(:element); end
|
24
|
-
def element=(v); set_ivar(:element, v); end
|
25
|
-
|
26
21
|
end
|
27
22
|
end
|
data/lib/osheet/version.rb
CHANGED
data/lib/osheet/workbook.rb
CHANGED
@@ -1,65 +1,157 @@
|
|
1
|
-
require 'osheet/
|
2
|
-
require 'osheet/
|
3
|
-
require 'osheet/
|
4
|
-
require 'osheet/
|
5
|
-
require 'osheet/template_set'
|
6
|
-
require 'osheet/partial_set'
|
7
|
-
require 'osheet/worksheet'
|
8
|
-
require 'osheet/xmlss_writer'
|
1
|
+
require 'osheet/partial'
|
2
|
+
require 'osheet/template'
|
3
|
+
require 'osheet/workbook_element'
|
4
|
+
require 'osheet/workbook_api'
|
9
5
|
|
10
6
|
module Osheet
|
7
|
+
|
8
|
+
|
11
9
|
class Workbook
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
10
|
+
|
11
|
+
# This 'Workbook' class is really just a scope for workbook builds to run
|
12
|
+
# in. All actually workbook metadata is behavior is handled by the
|
13
|
+
# 'WorkbookElement' class
|
14
|
+
|
15
|
+
class ElementStack < ::Array; end
|
16
|
+
|
17
|
+
include WorkbookApi
|
18
|
+
|
19
|
+
def initialize(writer=nil, data={}, &build)
|
20
|
+
# apply :data options to workbook scope
|
21
|
+
data ||= {}
|
22
|
+
if (data.keys.map(&:to_s) & self.public_methods.map(&:to_s)).size > 0
|
23
|
+
raise ArgumentError, "data conflicts with workbook public methods."
|
26
24
|
end
|
27
|
-
|
25
|
+
metaclass = class << self; self; end
|
26
|
+
data.each {|key, value| metaclass.class_eval { define_method(key){value} }}
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
# setup the writer, element stack, and workbook_element
|
29
|
+
writer.bind(self) if writer
|
30
|
+
set_ivar(:writer, writer)
|
31
|
+
set_ivar(:element_stack, Workbook::ElementStack.new)
|
32
|
+
set_ivar(:workbook_element, WorkbookElement.new)
|
33
|
+
|
34
|
+
# push the workbook element onto the element stack
|
35
|
+
element_stack.push(workbook)
|
32
36
|
|
33
|
-
|
34
|
-
|
35
|
-
get_ivar(:styles)
|
37
|
+
# run any instance workbook build given
|
38
|
+
instance_eval(&build) if build
|
36
39
|
end
|
37
|
-
|
38
|
-
def
|
39
|
-
get_ivar(:
|
40
|
+
|
41
|
+
def writer
|
42
|
+
get_ivar(:writer)
|
40
43
|
end
|
41
|
-
|
42
|
-
def
|
43
|
-
get_ivar(:
|
44
|
+
|
45
|
+
def element_stack
|
46
|
+
get_ivar(:element_stack)
|
44
47
|
end
|
45
48
|
|
46
|
-
def
|
47
|
-
|
49
|
+
def workbook_element
|
50
|
+
get_ivar(:workbook_element)
|
48
51
|
end
|
52
|
+
alias_method :workbook, :workbook_element
|
49
53
|
|
54
|
+
# use a mixin to define its markup handlers (templates, partials, and styles)
|
55
|
+
# in your workbook scope
|
56
|
+
# all blocks in mixins will be instance eval'd in the workbook scope
|
57
|
+
# and should be written as such
|
50
58
|
def use(mixin)
|
51
|
-
|
52
|
-
|
53
|
-
|
59
|
+
# templates and partials are just blocks themselves so they just need to
|
60
|
+
# be added to the workbook element
|
61
|
+
# they will be instance eval'd when they get used
|
62
|
+
(mixin.templates || []).each { |mt| template(*mt.args, &mt.build) }
|
63
|
+
(mixin.partials || []).each { |mp| partial(*mp.args, &mp.build) }
|
64
|
+
|
65
|
+
# styles not only need to be added to the workbook element, but
|
66
|
+
# any build passed to the style needs to be instance eval'd
|
67
|
+
(mixin.styles || []).each do |ms|
|
68
|
+
StyleBuild.new(self, *ms.args, &ms.build).add do |build|
|
69
|
+
instance_eval(&build)
|
70
|
+
end
|
71
|
+
end
|
54
72
|
end
|
55
73
|
|
56
|
-
|
57
|
-
|
74
|
+
# add partials to dynamically add markup to your workbook
|
75
|
+
# note: you can also define element templates to add element specific
|
76
|
+
# markup to your workbook
|
77
|
+
def add(partial_name, *args)
|
78
|
+
workbook.partials.get(partial_name).tap do |p|
|
79
|
+
instance_exec(*args, &p) if p
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# overriding to make less noisy
|
84
|
+
def to_str(*args)
|
85
|
+
"#<Osheet::Workbook:#{self.object_id} @title=#{workbook.title.inspect}, " +
|
86
|
+
"worksheet_count=#{workbook.worksheets.size.inspect}, " +
|
87
|
+
"style_count=#{workbook.styles.size.inspect}>"
|
58
88
|
end
|
89
|
+
alias_method :inspect, :to_str
|
59
90
|
|
60
|
-
|
91
|
+
# writers are responsible for defining what each of these methods do
|
92
|
+
# and what they return
|
93
|
+
[:to_s, :to_data, :to_file].each do |meth|
|
61
94
|
define_method(meth) {|*args| writer.send(meth, *args) }
|
62
95
|
end
|
63
96
|
|
97
|
+
private
|
98
|
+
|
99
|
+
OSHEET_IVAR_NS = "_osheet_"
|
100
|
+
|
101
|
+
def get_ivar(name)
|
102
|
+
instance_variable_get(ivar_name(name))
|
103
|
+
end
|
104
|
+
|
105
|
+
def set_ivar(name, value)
|
106
|
+
instance_variable_set(ivar_name(name), value)
|
107
|
+
end
|
108
|
+
|
109
|
+
def push_ivar(name, value)
|
110
|
+
get_ivar(name) << value
|
111
|
+
end
|
112
|
+
|
113
|
+
def ivar_name(name)
|
114
|
+
"@#{OSHEET_IVAR_NS}#{name}"
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
class Workbook::ElementStack
|
122
|
+
|
123
|
+
# this class is just a wrapper to Array. I want to treat this as a
|
124
|
+
# stack of objects for the workbook DSL to reference. I need to push
|
125
|
+
# an object onto the stack, reference it using the 'current' method,
|
126
|
+
# and pop it off the stack when I'm done.
|
127
|
+
|
128
|
+
def initialize
|
129
|
+
super
|
130
|
+
end
|
131
|
+
|
132
|
+
def push(*args)
|
133
|
+
super
|
134
|
+
end
|
135
|
+
|
136
|
+
def pop(*args)
|
137
|
+
super
|
138
|
+
end
|
139
|
+
|
140
|
+
def current
|
141
|
+
self.last
|
142
|
+
end
|
143
|
+
|
144
|
+
def size(*args)
|
145
|
+
super
|
146
|
+
end
|
147
|
+
|
148
|
+
def using(obj, &block)
|
149
|
+
push(obj)
|
150
|
+
block.call if !block.nil?
|
151
|
+
pop
|
152
|
+
end
|
153
|
+
|
64
154
|
end
|
155
|
+
|
156
|
+
|
65
157
|
end
|