keeguon-spreadsheet 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +619 -0
- data/Manifest.txt +85 -0
- data/bin/xlsopcodes +18 -0
- data/lib/parseexcel.rb +27 -0
- data/lib/parseexcel/parseexcel.rb +75 -0
- data/lib/parseexcel/parser.rb +11 -0
- data/lib/spreadsheet.rb +80 -0
- data/lib/spreadsheet/column.rb +71 -0
- data/lib/spreadsheet/compatibility.rb +23 -0
- data/lib/spreadsheet/datatypes.rb +161 -0
- data/lib/spreadsheet/encodings.rb +57 -0
- data/lib/spreadsheet/excel.rb +88 -0
- data/lib/spreadsheet/excel/error.rb +26 -0
- data/lib/spreadsheet/excel/internals.rb +458 -0
- data/lib/spreadsheet/excel/internals/biff5.rb +17 -0
- data/lib/spreadsheet/excel/internals/biff8.rb +19 -0
- data/lib/spreadsheet/excel/offset.rb +41 -0
- data/lib/spreadsheet/excel/password_hash.rb +24 -0
- data/lib/spreadsheet/excel/reader.rb +1302 -0
- data/lib/spreadsheet/excel/reader/biff5.rb +42 -0
- data/lib/spreadsheet/excel/reader/biff8.rb +231 -0
- data/lib/spreadsheet/excel/rgb.rb +122 -0
- data/lib/spreadsheet/excel/row.rb +98 -0
- data/lib/spreadsheet/excel/sst_entry.rb +46 -0
- data/lib/spreadsheet/excel/workbook.rb +80 -0
- data/lib/spreadsheet/excel/worksheet.rb +115 -0
- data/lib/spreadsheet/excel/writer.rb +1 -0
- data/lib/spreadsheet/excel/writer/biff8.rb +75 -0
- data/lib/spreadsheet/excel/writer/format.rb +264 -0
- data/lib/spreadsheet/excel/writer/n_worksheet.rb +888 -0
- data/lib/spreadsheet/excel/writer/workbook.rb +735 -0
- data/lib/spreadsheet/excel/writer/worksheet.rb +940 -0
- data/lib/spreadsheet/font.rb +115 -0
- data/lib/spreadsheet/format.rb +209 -0
- data/lib/spreadsheet/formula.rb +9 -0
- data/lib/spreadsheet/helpers.rb +11 -0
- data/lib/spreadsheet/link.rb +43 -0
- data/lib/spreadsheet/note.rb +23 -0
- data/lib/spreadsheet/noteObject.rb +17 -0
- data/lib/spreadsheet/row.rb +151 -0
- data/lib/spreadsheet/workbook.rb +143 -0
- data/lib/spreadsheet/worksheet.rb +326 -0
- data/lib/spreadsheet/writer.rb +30 -0
- data/test/data/test_adding_data_to_existing_file.xls +0 -0
- data/test/data/test_borders.xls +0 -0
- data/test/data/test_changes.xls +0 -0
- data/test/data/test_comment.xls +0 -0
- data/test/data/test_copy.xls +0 -0
- data/test/data/test_datetime.xls +0 -0
- data/test/data/test_empty.xls +0 -0
- data/test/data/test_formula.xls +0 -0
- data/test/data/test_long_sst_record.xls +0 -0
- data/test/data/test_margin.xls +0 -0
- data/test/data/test_merged_and_protected.xls +0 -0
- data/test/data/test_merged_cells.xls +0 -0
- data/test/data/test_missing_row.xls +0 -0
- data/test/data/test_pagesetup.xls +0 -0
- data/test/data/test_version_excel5.xls +0 -0
- data/test/data/test_version_excel95.xls +0 -0
- data/test/data/test_version_excel97.xls +0 -0
- data/test/data/test_version_excel97_2010.xls +0 -0
- data/test/data/test_worksheet_visibility.xls +0 -0
- data/test/excel/reader.rb +30 -0
- data/test/excel/row.rb +40 -0
- data/test/excel/writer/workbook.rb +95 -0
- data/test/excel/writer/worksheet.rb +81 -0
- data/test/font.rb +163 -0
- data/test/format.rb +95 -0
- data/test/integration.rb +1390 -0
- data/test/row.rb +33 -0
- data/test/suite.rb +18 -0
- data/test/workbook.rb +55 -0
- data/test/workbook_protection.rb +19 -0
- data/test/worksheet.rb +112 -0
- metadata +148 -0
data/Manifest.txt
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
.gitignore
|
2
|
+
.travis.yml
|
3
|
+
GUIDE.md
|
4
|
+
Gemfile
|
5
|
+
Gemfile.lock
|
6
|
+
History.md
|
7
|
+
LICENSE.txt
|
8
|
+
Manifest.txt
|
9
|
+
README.md
|
10
|
+
Rakefile
|
11
|
+
bin/xlsopcodes
|
12
|
+
doc/Excel97-2007BinaryFileFormatSpecification.pdf
|
13
|
+
doc/excelfileformat.pdf
|
14
|
+
lib/parseexcel.rb
|
15
|
+
lib/parseexcel/parseexcel.rb
|
16
|
+
lib/parseexcel/parser.rb
|
17
|
+
lib/spreadsheet.rb
|
18
|
+
lib/spreadsheet/column.rb
|
19
|
+
lib/spreadsheet/compatibility.rb
|
20
|
+
lib/spreadsheet/datatypes.rb
|
21
|
+
lib/spreadsheet/encodings.rb
|
22
|
+
lib/spreadsheet/excel.rb
|
23
|
+
lib/spreadsheet/excel/error.rb
|
24
|
+
lib/spreadsheet/excel/internals.rb
|
25
|
+
lib/spreadsheet/excel/internals/biff5.rb
|
26
|
+
lib/spreadsheet/excel/internals/biff8.rb
|
27
|
+
lib/spreadsheet/excel/offset.rb
|
28
|
+
lib/spreadsheet/excel/password_hash.rb
|
29
|
+
lib/spreadsheet/excel/reader.rb
|
30
|
+
lib/spreadsheet/excel/reader/biff5.rb
|
31
|
+
lib/spreadsheet/excel/reader/biff8.rb
|
32
|
+
lib/spreadsheet/excel/rgb.rb
|
33
|
+
lib/spreadsheet/excel/row.rb
|
34
|
+
lib/spreadsheet/excel/sst_entry.rb
|
35
|
+
lib/spreadsheet/excel/workbook.rb
|
36
|
+
lib/spreadsheet/excel/worksheet.rb
|
37
|
+
lib/spreadsheet/excel/writer.rb
|
38
|
+
lib/spreadsheet/excel/writer/biff8.rb
|
39
|
+
lib/spreadsheet/excel/writer/format.rb
|
40
|
+
lib/spreadsheet/excel/writer/n_worksheet.rb
|
41
|
+
lib/spreadsheet/excel/writer/workbook.rb
|
42
|
+
lib/spreadsheet/excel/writer/worksheet.rb
|
43
|
+
lib/spreadsheet/font.rb
|
44
|
+
lib/spreadsheet/format.rb
|
45
|
+
lib/spreadsheet/formula.rb
|
46
|
+
lib/spreadsheet/helpers.rb
|
47
|
+
lib/spreadsheet/link.rb
|
48
|
+
lib/spreadsheet/note.rb
|
49
|
+
lib/spreadsheet/noteObject.rb
|
50
|
+
lib/spreadsheet/row.rb
|
51
|
+
lib/spreadsheet/workbook.rb
|
52
|
+
lib/spreadsheet/worksheet.rb
|
53
|
+
lib/spreadsheet/writer.rb
|
54
|
+
spreadsheet.gemspec
|
55
|
+
test/data/test_adding_data_to_existing_file.xls
|
56
|
+
test/data/test_borders.xls
|
57
|
+
test/data/test_changes.xls
|
58
|
+
test/data/test_comment.xls
|
59
|
+
test/data/test_copy.xls
|
60
|
+
test/data/test_datetime.xls
|
61
|
+
test/data/test_empty.xls
|
62
|
+
test/data/test_formula.xls
|
63
|
+
test/data/test_long_sst_record.xls
|
64
|
+
test/data/test_margin.xls
|
65
|
+
test/data/test_merged_and_protected.xls
|
66
|
+
test/data/test_merged_cells.xls
|
67
|
+
test/data/test_missing_row.xls
|
68
|
+
test/data/test_pagesetup.xls
|
69
|
+
test/data/test_version_excel5.xls
|
70
|
+
test/data/test_version_excel95.xls
|
71
|
+
test/data/test_version_excel97.xls
|
72
|
+
test/data/test_version_excel97_2010.xls
|
73
|
+
test/data/test_worksheet_visibility.xls
|
74
|
+
test/excel/reader.rb
|
75
|
+
test/excel/row.rb
|
76
|
+
test/excel/writer/workbook.rb
|
77
|
+
test/excel/writer/worksheet.rb
|
78
|
+
test/font.rb
|
79
|
+
test/format.rb
|
80
|
+
test/integration.rb
|
81
|
+
test/row.rb
|
82
|
+
test/suite.rb
|
83
|
+
test/workbook.rb
|
84
|
+
test/workbook_protection.rb
|
85
|
+
test/worksheet.rb
|
data/bin/xlsopcodes
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'spreadsheet'
|
4
|
+
|
5
|
+
source, target = ARGV
|
6
|
+
|
7
|
+
if source.nil?
|
8
|
+
puts "Usage: #{$0} <source> [<target>]"
|
9
|
+
exit -1
|
10
|
+
end
|
11
|
+
|
12
|
+
target = target ? File.open(target, 'w') : STDOUT
|
13
|
+
|
14
|
+
reader = Spreadsheet::Excel::Reader.new :print_opcodes => target
|
15
|
+
reader.setup File.open(source)
|
16
|
+
|
17
|
+
while tuple = reader.get_next_chunk
|
18
|
+
end
|
data/lib/parseexcel.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
### Spreadsheet - A Library for reading and writing Spreadsheet Documents.
|
2
|
+
#
|
3
|
+
# Copyright (C) 2008 Hannes Wyss
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
# Contact Information:
|
19
|
+
#
|
20
|
+
# E-Mail: hannes.wyss@gmail.com
|
21
|
+
# P-Mail: ywesee GmbH
|
22
|
+
# Hannes Wyss
|
23
|
+
# Winterthurerstrasse 52
|
24
|
+
# 8006 Zürich
|
25
|
+
### Switzerland
|
26
|
+
|
27
|
+
require 'parseexcel/parseexcel'
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spreadsheet'
|
2
|
+
|
3
|
+
warn <<-EOS
|
4
|
+
[DEPRECATED] By requiring 'parseexcel', 'parseexcel/parseexcel' and/or
|
5
|
+
'parseexcel/parser' you are loading a Compatibility layer which
|
6
|
+
provides a drop-in replacement for the ParseExcel library. This
|
7
|
+
code makes the reading of Spreadsheet documents less efficient and
|
8
|
+
will be removed in Spreadsheet version 1.0.0
|
9
|
+
EOS
|
10
|
+
|
11
|
+
module Spreadsheet
|
12
|
+
##
|
13
|
+
# The ParseExcel module is provided as a drop-in replacement for the
|
14
|
+
# ParseExcel library. This code is deprecated and will be removed in
|
15
|
+
# Spreadsheet version 1.0.0
|
16
|
+
module ParseExcel
|
17
|
+
def ParseExcel.parse path
|
18
|
+
Spreadsheet.open path
|
19
|
+
end
|
20
|
+
class Worksheet
|
21
|
+
class Cell
|
22
|
+
attr_accessor :value, :kind, :numeric, :code, :book,
|
23
|
+
:format, :rich, :encoding, :annotation
|
24
|
+
def initialize value, format, row, idx
|
25
|
+
@format = format
|
26
|
+
@idx = idx
|
27
|
+
@row = row
|
28
|
+
@value = value
|
29
|
+
@encoding = Spreadsheet.client_encoding
|
30
|
+
end
|
31
|
+
def date
|
32
|
+
@row.date @idx
|
33
|
+
end
|
34
|
+
def datetime
|
35
|
+
@row.datetime @idx
|
36
|
+
end
|
37
|
+
def to_i
|
38
|
+
@value.to_i
|
39
|
+
end
|
40
|
+
def to_f
|
41
|
+
@value.to_f
|
42
|
+
end
|
43
|
+
def to_s(target_encoding=nil)
|
44
|
+
if(target_encoding)
|
45
|
+
begin
|
46
|
+
Iconv.new(target_encoding, @encoding).iconv(@value)
|
47
|
+
rescue
|
48
|
+
Iconv.new(target_encoding, 'ascii').iconv(@value.to_s)
|
49
|
+
end
|
50
|
+
else
|
51
|
+
@value.to_s
|
52
|
+
end
|
53
|
+
end
|
54
|
+
def type
|
55
|
+
if @format && (@format.date? || @format.time?)
|
56
|
+
:date
|
57
|
+
elsif @value.is_a?(Numeric)
|
58
|
+
:numeric
|
59
|
+
else
|
60
|
+
:text
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
module Excel
|
67
|
+
class Reader # :nodoc: all
|
68
|
+
def set_cell worksheet, row, column, xf, value=nil
|
69
|
+
cells = @current_row_block[row] ||= Row.new(nil, row)
|
70
|
+
cells.formats[column] = xf = @workbook.format(xf)
|
71
|
+
cells[column] = ParseExcel::Worksheet::Cell.new(value, xf, cells, column)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/spreadsheet.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
### Spreadsheet - A Library for reading and writing Spreadsheet Documents.
|
2
|
+
#
|
3
|
+
# Copyright (C) 2008-2010 ywesee GmbH
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
# Contact Information:
|
19
|
+
#
|
20
|
+
# E-Mail: mhatakeyama@ywesee.com, zdavatz@ywesee.com
|
21
|
+
# P-Mail: ywesee GmbH
|
22
|
+
# Zeno R.R. Davatz
|
23
|
+
# Winterthurerstrasse 52
|
24
|
+
# 8006 Zürich
|
25
|
+
### Switzerland
|
26
|
+
|
27
|
+
require 'spreadsheet/excel/workbook'
|
28
|
+
require 'spreadsheet/excel/reader'
|
29
|
+
require 'spreadsheet/excel/rgb'
|
30
|
+
|
31
|
+
# = Synopsis
|
32
|
+
# The Spreadsheet Library is designed to read and write Spreadsheet Documents.
|
33
|
+
# As of version 0.6.0, only Microsoft Excel compatible spreadsheets are
|
34
|
+
# supported.
|
35
|
+
#
|
36
|
+
# == Example
|
37
|
+
# require 'spreadsheet'
|
38
|
+
#
|
39
|
+
# book = Spreadsheet.open '/path/to/an/excel-file.xls'
|
40
|
+
# sheet = book.worksheet 0
|
41
|
+
# sheet.each do |row| puts row[0] end
|
42
|
+
module Spreadsheet
|
43
|
+
|
44
|
+
##
|
45
|
+
# The version of Spreadsheet you are using.
|
46
|
+
VERSION = '0.9.4'
|
47
|
+
|
48
|
+
##
|
49
|
+
# Default client Encoding. Change this value if your application uses a
|
50
|
+
# different Encoding:
|
51
|
+
# Spreadsheet.client_encoding = 'ISO-LATIN-1//TRANSLIT//IGNORE'
|
52
|
+
@client_encoding = 'UTF-8'
|
53
|
+
|
54
|
+
class << self
|
55
|
+
|
56
|
+
attr_accessor :client_encoding
|
57
|
+
|
58
|
+
##
|
59
|
+
# Parses a Spreadsheet Document and returns a Workbook object. At present,
|
60
|
+
# only Excel-Documents can be read.
|
61
|
+
def open io_or_path, mode="rb+"
|
62
|
+
if io_or_path.respond_to? :seek
|
63
|
+
Excel::Workbook.open(io_or_path)
|
64
|
+
elsif block_given?
|
65
|
+
File.open(io_or_path, mode) do |fh|
|
66
|
+
yield open(fh)
|
67
|
+
end
|
68
|
+
else
|
69
|
+
open File.open(io_or_path, mode)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
##
|
74
|
+
# Returns a Writer object for the specified path. At present, only the
|
75
|
+
# Excel-Writer is available.
|
76
|
+
def writer io_or_path, type=Excel
|
77
|
+
Excel::Writer::Workbook.new io_or_path
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spreadsheet/datatypes'
|
2
|
+
|
3
|
+
module Spreadsheet
|
4
|
+
##
|
5
|
+
# The Column class. Encapsulates column-formatting and width, and provides a
|
6
|
+
# means to iterate over all cells in a column.
|
7
|
+
#
|
8
|
+
# Useful Attributes:
|
9
|
+
# #width:: The width in characters (in respect to the '0' character
|
10
|
+
# of the Worksheet's default Font). Float values are
|
11
|
+
# permitted, for Excel the available Precision is at 1/256
|
12
|
+
# characters.
|
13
|
+
# #default_format:: The default Format for cells in this column (applied if
|
14
|
+
# there is no explicit Cell Format and no default Row format
|
15
|
+
# for the Cell).
|
16
|
+
# #hidden:: The Column is hidden.
|
17
|
+
# #collapsed:: The Column is collapsed.
|
18
|
+
# #outline_level:: Outline level of the column.
|
19
|
+
class Column
|
20
|
+
class << self
|
21
|
+
def updater *keys
|
22
|
+
keys.each do |key|
|
23
|
+
unless instance_methods.include? "unupdated_#{key}="
|
24
|
+
alias_method :"unupdated_#{key}=", :"#{key}="
|
25
|
+
define_method "#{key}=" do |value|
|
26
|
+
send "unupdated_#{key}=", value
|
27
|
+
@worksheet.column_updated @idx, self if @worksheet
|
28
|
+
value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
include Datatypes
|
35
|
+
include Enumerable
|
36
|
+
attr_accessor :width, :worksheet
|
37
|
+
attr_reader :default_format, :idx
|
38
|
+
boolean :hidden, :collapsed
|
39
|
+
enum :outline_level, 0, Integer
|
40
|
+
updater :collapsed, :hidden, :outline_level, :width
|
41
|
+
def initialize idx, format, opts={}
|
42
|
+
@worksheet = nil
|
43
|
+
@idx = idx
|
44
|
+
opts[:width] ||= 10
|
45
|
+
opts.each do |key, value|
|
46
|
+
self.send "#{key}=", value
|
47
|
+
end
|
48
|
+
self.default_format = format
|
49
|
+
end
|
50
|
+
##
|
51
|
+
# Set the default Format for Cells in this Column.
|
52
|
+
def default_format= format
|
53
|
+
@worksheet.add_format format if @worksheet
|
54
|
+
@default_format = format
|
55
|
+
@worksheet.column_updated @idx, self if @worksheet
|
56
|
+
format
|
57
|
+
end
|
58
|
+
##
|
59
|
+
# Iterate over all cells in this column.
|
60
|
+
def each
|
61
|
+
@worksheet.each do |row|
|
62
|
+
yield row[idx]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
def == other # :nodoc:
|
66
|
+
other.is_a?(Column) && default_format == other.default_format \
|
67
|
+
&& width == other.width && hidden == other.hidden \
|
68
|
+
&& collapsed == other.collapsed && outline_level == other.outline_level
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Spreadsheet
|
2
|
+
module Compatibility
|
3
|
+
##
|
4
|
+
# One of the most incisive changes in terms of meta-programming in Ruby 1.9
|
5
|
+
# is the switch from representing instance-variable names as Strings to
|
6
|
+
# presenting them as Symbols. ivar_name provides compatibility.
|
7
|
+
if RUBY_VERSION >= '1.9'
|
8
|
+
def ivar_name symbol
|
9
|
+
:"@#{symbol}"
|
10
|
+
end
|
11
|
+
def method_name symbol
|
12
|
+
symbol.to_sym
|
13
|
+
end
|
14
|
+
else
|
15
|
+
def ivar_name symbol
|
16
|
+
"@#{symbol}"
|
17
|
+
end
|
18
|
+
def method_name symbol
|
19
|
+
symbol.to_s
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'spreadsheet/compatibility'
|
2
|
+
|
3
|
+
module Spreadsheet
|
4
|
+
##
|
5
|
+
# This module defines convenience-methods for the definition of Spreadsheet
|
6
|
+
# attributes (boolean, colors and enumerations)
|
7
|
+
module Datatypes
|
8
|
+
include Compatibility
|
9
|
+
def Datatypes.append_features mod
|
10
|
+
super
|
11
|
+
mod.module_eval do
|
12
|
+
class << self
|
13
|
+
##
|
14
|
+
# Valid colors for color attributes.
|
15
|
+
COLORS = [ :builtin_black, :builtin_white, :builtin_red, :builtin_green,
|
16
|
+
:builtin_blue, :builtin_yellow, :builtin_magenta, :builtin_cyan,
|
17
|
+
:text, :border, :pattern_bg, :dialog_bg, :chart_text, :chart_bg,
|
18
|
+
:chart_border, :tooltip_bg, :tooltip_text, :aqua,
|
19
|
+
:black, :blue, :cyan, :brown, :fuchsia, :gray, :grey, :green,
|
20
|
+
:lime, :magenta, :navy, :orange, :purple, :red, :silver, :white,
|
21
|
+
:yellow,
|
22
|
+
:xls_color_0,
|
23
|
+
:xls_color_1,
|
24
|
+
:xls_color_2,
|
25
|
+
:xls_color_3,
|
26
|
+
:xls_color_4,
|
27
|
+
:xls_color_5,
|
28
|
+
:xls_color_6,
|
29
|
+
:xls_color_7,
|
30
|
+
:xls_color_8,
|
31
|
+
:xls_color_9,
|
32
|
+
:xls_color_10,
|
33
|
+
:xls_color_11,
|
34
|
+
:xls_color_12,
|
35
|
+
:xls_color_13,
|
36
|
+
:xls_color_14,
|
37
|
+
:xls_color_15,
|
38
|
+
:xls_color_16,
|
39
|
+
:xls_color_17,
|
40
|
+
:xls_color_18,
|
41
|
+
:xls_color_19,
|
42
|
+
:xls_color_20,
|
43
|
+
:xls_color_21,
|
44
|
+
:xls_color_22,
|
45
|
+
:xls_color_23,
|
46
|
+
:xls_color_24,
|
47
|
+
:xls_color_25,
|
48
|
+
:xls_color_26,
|
49
|
+
:xls_color_27,
|
50
|
+
:xls_color_28,
|
51
|
+
:xls_color_29,
|
52
|
+
:xls_color_30,
|
53
|
+
:xls_color_31,
|
54
|
+
:xls_color_32,
|
55
|
+
:xls_color_33,
|
56
|
+
:xls_color_34,
|
57
|
+
:xls_color_35,
|
58
|
+
:xls_color_36,
|
59
|
+
:xls_color_37,
|
60
|
+
:xls_color_38,
|
61
|
+
:xls_color_39,
|
62
|
+
:xls_color_40,
|
63
|
+
:xls_color_41,
|
64
|
+
:xls_color_42,
|
65
|
+
:xls_color_43,
|
66
|
+
:xls_color_44,
|
67
|
+
:xls_color_45,
|
68
|
+
:xls_color_46,
|
69
|
+
:xls_color_47,
|
70
|
+
:xls_color_48,
|
71
|
+
:xls_color_49,
|
72
|
+
:xls_color_50,
|
73
|
+
:xls_color_51,
|
74
|
+
:xls_color_52,
|
75
|
+
:xls_color_53,
|
76
|
+
:xls_color_54,
|
77
|
+
:xls_color_55 ]
|
78
|
+
##
|
79
|
+
# Define instance methods to read and write boolean attributes.
|
80
|
+
def boolean *args
|
81
|
+
args.each do |key|
|
82
|
+
define_method key do
|
83
|
+
name = ivar_name key
|
84
|
+
!!(instance_variable_get(name) if instance_variables.include?(name))
|
85
|
+
end
|
86
|
+
define_method "#{key}?" do
|
87
|
+
send key
|
88
|
+
end
|
89
|
+
define_method "#{key}=" do |arg|
|
90
|
+
arg = false if arg == 0
|
91
|
+
instance_variable_set(ivar_name(key), !!arg)
|
92
|
+
end
|
93
|
+
define_method "#{key}!" do
|
94
|
+
send "#{key}=", true
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
##
|
99
|
+
# Define instance methods to read and write color attributes.
|
100
|
+
# For valid colors see COLORS
|
101
|
+
def colors *args
|
102
|
+
args.each do |key|
|
103
|
+
attr_reader key
|
104
|
+
define_method "#{key}=" do |name|
|
105
|
+
name = name.to_s.downcase.to_sym
|
106
|
+
if COLORS.include?(name)
|
107
|
+
instance_variable_set ivar_name(key), name
|
108
|
+
else
|
109
|
+
raise ArgumentError, "unknown color '#{name}'"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
##
|
115
|
+
# Define instance methods to read and write enumeration attributes.
|
116
|
+
# * The first argument designates the attribute name.
|
117
|
+
# * The second argument designates the default value.
|
118
|
+
# * All subsequent attributes are possible values.
|
119
|
+
# * If the last attribute is a Hash, each value in the Hash designates
|
120
|
+
# aliases for the corresponding key.
|
121
|
+
def enum key, *values
|
122
|
+
aliases = {}
|
123
|
+
if values.last.is_a? Hash
|
124
|
+
values.pop.each do |value, synonyms|
|
125
|
+
if synonyms.is_a? Array
|
126
|
+
synonyms.each do |synonym| aliases.store synonym, value end
|
127
|
+
else
|
128
|
+
aliases.store synonyms, value
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
values.each do |value|
|
133
|
+
aliases.store value, value
|
134
|
+
end
|
135
|
+
define_method key do
|
136
|
+
name = ivar_name key
|
137
|
+
value = instance_variable_get(name) if instance_variables.include? name
|
138
|
+
value || values.first
|
139
|
+
end
|
140
|
+
define_method "#{key}=" do |arg|
|
141
|
+
if arg
|
142
|
+
arg = aliases.fetch arg do
|
143
|
+
aliases.fetch arg.to_s.downcase.gsub(/[ \-]/, '_').to_sym, arg
|
144
|
+
end
|
145
|
+
if values.any? do |val| val === arg end
|
146
|
+
instance_variable_set(ivar_name(key), arg)
|
147
|
+
else
|
148
|
+
valid = values.collect do |val| val.inspect end.join ', '
|
149
|
+
raise ArgumentError,
|
150
|
+
"Invalid value '#{arg.inspect}' for #{key}. Valid values are: #{valid}"
|
151
|
+
end
|
152
|
+
else
|
153
|
+
instance_variable_set ivar_name(key), values.first
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|