rodf 0.1 → 0.1.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/CHANGELOG CHANGED
@@ -1,2 +1,3 @@
1
- v0.1. First version with very basic support for spreadsheet generation
1
+ v0.1.1. Basic spreadsheet styling support
2
+ v0.1. First version with very basic support for spreadsheet generation
2
3
 
data/Manifest CHANGED
@@ -1,6 +1,7 @@
1
1
  lib/odf/row.rb
2
2
  lib/odf/spreadsheet.rb
3
3
  lib/odf/cell.rb
4
+ lib/odf/column.rb
4
5
  lib/odf/table.rb
5
6
  lib/odf/property.rb
6
7
  lib/odf/style.rb
@@ -1,20 +1,18 @@
1
1
  = rODF
2
2
 
3
- This is (soon to be) a RubyGem for writing to ODF output. It currently supports
4
- creating spreadsheets.
3
+ This is a library for writing to ODF output with Ruby. It currently only
4
+ supports creating spreadsheets (ODS). Text documents (ODT) and slide shows (ODP)
5
+ may be added some time in the future.
5
6
 
6
7
  This is NOT an ODF reading library.
7
8
 
8
- == Installation
9
+ === Installation
9
10
 
10
- At some moment you'll be able to
11
+ You should be able to install the latest stable version by saying something like
11
12
 
12
13
  sudo gem install rodf
13
14
 
14
- But for the time being, try going to the project's GitHub page and downloading
15
- the source: http://github.com/thiagoarrais/rodf/tree
16
-
17
- == How do I use it?
15
+ === How do I use it?
18
16
 
19
17
  rODF works pretty much like Builder, but with ODF-aware constructs. Try this:
20
18
 
data/Rakefile CHANGED
@@ -14,8 +14,9 @@ Echoe.new('rodf') do |gem|
14
14
  gem.runtime_dependencies = [
15
15
  ["builder", ">= 2.1.2"],
16
16
  ["rubyzip", ">= 0.9.1"],
17
- ["activesupport", ">= 2.0.0"]]
17
+ ["activesupport", "= 2.1.2"]]
18
18
  gem.development_dependencies = [
19
+ ["rspec", ">= 1.1.11"],
19
20
  ["rspec_hpricot_matchers" , ">= 1.0"],
20
21
  ["echoe" , ">= 3.0.2"]]
21
22
  end
@@ -25,18 +25,13 @@ module ODF
25
25
  opts = args.last.instance_of?(Hash) ? args.last : {}
26
26
 
27
27
  @type = opts[:type] || :string
28
- @formula = opts[:formula]
29
- @style = opts[:style]
30
28
  @value = value.to_s.strip unless value.instance_of? Hash
29
+
30
+ @elem_attrs = make_element_attributes(@type, @value, opts)
31
31
  end
32
32
 
33
33
  def xml
34
- elem_attrs = {'office:value-type' => @type}
35
- elem_attrs['office:value'] = @value unless contains_string?
36
- elem_attrs['table:formula'] = @formula unless @formula.nil?
37
- elem_attrs['table:style-name'] = @style unless @style.nil?
38
-
39
- Builder::XmlMarkup.new.tag! 'table:table-cell', elem_attrs do |xml|
34
+ Builder::XmlMarkup.new.tag! 'table:table-cell', @elem_attrs do |xml|
40
35
  xml.text(:p, @value) if contains_string?
41
36
  end
42
37
  end
@@ -44,6 +39,16 @@ module ODF
44
39
  def contains_string?
45
40
  :string == @type && !@value.nil? && !@value.empty?
46
41
  end
42
+
43
+ def make_element_attributes(type, value, opts)
44
+ attrs = {'office:value-type' => type}
45
+ attrs['office:value'] = value unless contains_string?
46
+ attrs['table:formula'] = opts[:formula] unless opts[:formula].nil?
47
+ attrs['table:style-name'] = opts[:style] unless opts[:style].nil?
48
+ attrs['table:number-matrix-columns-spanned'] =
49
+ attrs['table:number-matrix-rows-spanned'] = 1 if opts[:matrix_formula]
50
+ attrs
51
+ end
47
52
  end
48
53
  end
49
54
 
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2008 Thiago Arrais
2
+ #
3
+ # This file is part of rODF.
4
+ #
5
+ # rODF is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as
7
+ # published by the Free Software Foundation, either version 3 of
8
+ # the License, or (at your option) any later version.
9
+
10
+ # rODF 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 Lesser General Public License for more details.
14
+
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with rODF. If not, see <http://www.gnu.org/licenses/>.
17
+
18
+ require 'rubygems'
19
+ require 'builder'
20
+
21
+ module ODF
22
+ class Column
23
+ def initialize(opts={})
24
+ @elem_attrs = {}
25
+ @elem_attrs['table:style-name'] = opts[:style] unless opts[:style].nil?
26
+ end
27
+
28
+ def xml
29
+ Builder::XmlMarkup.new.tag! 'table:table-column', @elem_attrs
30
+ end
31
+ end
32
+ end
33
+
@@ -16,6 +16,8 @@
16
16
  # along with rODF. If not, see <http://www.gnu.org/licenses/>.
17
17
 
18
18
  require 'rubygems'
19
+ gem 'activesupport', '2.1.2'
20
+
19
21
  require 'active_support/core_ext/string'
20
22
 
21
23
  module ODF
@@ -21,7 +21,8 @@ require 'builder'
21
21
  module ODF
22
22
  class Property
23
23
  PROPERTY_NAMES = {:cell => 'style:table-cell-properties',
24
- :text => 'style:text-properties'}
24
+ :text => 'style:text-properties',
25
+ :column => 'style:table-column-properties'}
25
26
 
26
27
  def initialize(type, specs={})
27
28
  @name = PROPERTY_NAMES[type]
@@ -29,9 +30,9 @@ module ODF
29
30
  end
30
31
 
31
32
  def xml
32
- specs = {}
33
- @specs.each do |k, v|
34
- specs['fo:' + k] = v
33
+ specs = @specs.inject({}) do |acc, kv|
34
+ prefix = 'column-width' == kv.first ? 'style' : 'fo'
35
+ acc.merge prefix + ':' + kv.first => kv.last
35
36
  end
36
37
  Builder::XmlMarkup.new.tag! @name, specs
37
38
  end
@@ -11,13 +11,12 @@
11
11
  <style:table-cell-properties style:rotation-align="none"/>
12
12
  <style:text-properties style:font-name="Arial1" style:font-name-complex="Arial1"/>
13
13
  </style:style>
14
- <number:number-style style:name="number-currency-positive" style:volatile="true">
14
+ <number:number-style style:name="currency-grouped">
15
15
  <number:number number:decimal-places="2" number:min-integer-digits="1" number:grouping="true" />
16
16
  </number:number-style>
17
- <number:number-style style:name="number-currency">
18
- <number:text>-</number:text>
19
- <number:number number:decimal-places="2" number:min-integer-digits="1" number:grouping="true" />
20
- <style:map style:condition="value()&gt;=0" style:apply-style-name="number-currency-positive" />
21
- </number:number-style>
17
+ <number:number-style style:name="integer-grouped">
18
+ <number:number number:decimal-places="0" number:min-integer-digits="1" number:grouping="true" />
19
+ </number:number-style>
22
20
  </office:styles>
23
- </office:document-styles>
21
+ </office:document-styles>
22
+
@@ -25,20 +25,29 @@ module ODF
25
25
  class Style < Container
26
26
  contains :properties
27
27
 
28
- FAMILIES = {:cell => 'table-cell'}
28
+ FAMILIES = {:cell => 'table-cell', :column => 'table-column'}
29
29
 
30
30
  def initialize(name='', opts={})
31
31
  @name = name
32
- @family = FAMILIES[opts[:family]]
32
+ @elem_attrs = make_element_attributes(@name, opts)
33
33
  end
34
34
 
35
35
  def xml
36
- Builder::XmlMarkup.new.style:style, 'style:name' => @name,
37
- 'style:family' => @family do
38
- |xml|
36
+ Builder::XmlMarkup.new.style:style, @elem_attrs do |xml|
39
37
  xml << properties_xml
40
38
  end
41
39
  end
40
+
41
+ def make_element_attributes(name, opts)
42
+ attrs = {'style:name' => name, 'style:family' => FAMILIES[opts[:family]]}
43
+ attrs['style:data-style-name'] = opts[:data_style] unless opts[:data_style].nil?
44
+ attrs['style:parent-style-name'] = opts[:parent].to_s unless opts[:parent].nil?
45
+ attrs
46
+ end
47
+
48
+ def to_s
49
+ @name
50
+ end
42
51
  end
43
52
  end
44
53
 
@@ -18,12 +18,13 @@
18
18
  require 'rubygems'
19
19
  require 'builder'
20
20
 
21
+ require 'odf/column'
21
22
  require 'odf/container'
22
23
  require 'odf/row'
23
24
 
24
25
  module ODF
25
26
  class Table < Container
26
- contains :rows
27
+ contains :rows, :columns
27
28
 
28
29
  def initialize(title)
29
30
  @title = title
@@ -37,6 +38,7 @@ module ODF
37
38
 
38
39
  def xml
39
40
  Builder::XmlMarkup.new.table:table, 'table:name' => @title do |xml|
41
+ xml << columns_xml
40
42
  xml << rows_xml
41
43
  end
42
44
  end
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{rodf}
5
- s.version = "0.1"
5
+ s.version = "0.1.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Thiago Arrais"]
9
- s.date = %q{2008-11-22}
9
+ s.date = %q{2008-12-02}
10
10
  s.description = %q{ODF generation library for Ruby}
11
11
  s.email = %q{thiago.arrais@gmail.com}
12
- s.extra_rdoc_files = ["lib/odf/row.rb", "lib/odf/spreadsheet.rb", "lib/odf/cell.rb", "lib/odf/table.rb", "lib/odf/property.rb", "lib/odf/style.rb", "lib/odf/skeleton/manifest.xml", "lib/odf/skeleton/styles.xml", "lib/odf/container.rb", "CHANGELOG", "README.rdoc", "LICENSE.LGPL"]
13
- s.files = ["lib/odf/row.rb", "lib/odf/spreadsheet.rb", "lib/odf/cell.rb", "lib/odf/table.rb", "lib/odf/property.rb", "lib/odf/style.rb", "lib/odf/skeleton/manifest.xml", "lib/odf/skeleton/styles.xml", "lib/odf/container.rb", "CHANGELOG", "README.rdoc", "Rakefile", "LICENSE.LGPL", "spec/cell_spec.rb", "spec/spreadsheet_spec.rb", "spec/spec_helper.rb", "spec/row_spec.rb", "spec/table_spec.rb", "spec/style_spec.rb", "spec/property_spec.rb", "Manifest", "rodf.gemspec"]
12
+ s.extra_rdoc_files = ["lib/odf/row.rb", "lib/odf/spreadsheet.rb", "lib/odf/cell.rb", "lib/odf/column.rb", "lib/odf/table.rb", "lib/odf/property.rb", "lib/odf/style.rb", "lib/odf/skeleton/manifest.xml", "lib/odf/skeleton/styles.xml", "lib/odf/container.rb", "CHANGELOG", "README.rdoc", "LICENSE.LGPL"]
13
+ s.files = ["lib/odf/row.rb", "lib/odf/spreadsheet.rb", "lib/odf/cell.rb", "lib/odf/column.rb", "lib/odf/table.rb", "lib/odf/property.rb", "lib/odf/style.rb", "lib/odf/skeleton/manifest.xml", "lib/odf/skeleton/styles.xml", "lib/odf/container.rb", "CHANGELOG", "README.rdoc", "Rakefile", "LICENSE.LGPL", "spec/cell_spec.rb", "spec/spreadsheet_spec.rb", "spec/spec_helper.rb", "spec/row_spec.rb", "spec/table_spec.rb", "spec/style_spec.rb", "spec/property_spec.rb", "Manifest", "rodf.gemspec"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{http://github.com/thiagoarrais/rodf/tree}
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Rodf", "--main", "README.rdoc"]
@@ -26,20 +26,23 @@ Gem::Specification.new do |s|
26
26
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
27
27
  s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
28
28
  s.add_runtime_dependency(%q<rubyzip>, [">= 0.9.1"])
29
- s.add_runtime_dependency(%q<activesupport>, [">= 2.0.0"])
29
+ s.add_runtime_dependency(%q<activesupport>, ["= 2.1.2"])
30
+ s.add_development_dependency(%q<rspec>, [">= 1.1.11"])
30
31
  s.add_development_dependency(%q<rspec_hpricot_matchers>, [">= 1.0"])
31
32
  s.add_development_dependency(%q<echoe>, [">= 3.0.2"])
32
33
  else
33
34
  s.add_dependency(%q<builder>, [">= 2.1.2"])
34
35
  s.add_dependency(%q<rubyzip>, [">= 0.9.1"])
35
- s.add_dependency(%q<activesupport>, [">= 2.0.0"])
36
+ s.add_dependency(%q<activesupport>, ["= 2.1.2"])
37
+ s.add_dependency(%q<rspec>, [">= 1.1.11"])
36
38
  s.add_dependency(%q<rspec_hpricot_matchers>, [">= 1.0"])
37
39
  s.add_dependency(%q<echoe>, [">= 3.0.2"])
38
40
  end
39
41
  else
40
42
  s.add_dependency(%q<builder>, [">= 2.1.2"])
41
43
  s.add_dependency(%q<rubyzip>, [">= 0.9.1"])
42
- s.add_dependency(%q<activesupport>, [">= 2.0.0"])
44
+ s.add_dependency(%q<activesupport>, ["= 2.1.2"])
45
+ s.add_dependency(%q<rspec>, [">= 1.1.11"])
43
46
  s.add_dependency(%q<rspec_hpricot_matchers>, [">= 1.0"])
44
47
  s.add_dependency(%q<echoe>, [">= 3.0.2"])
45
48
  end
@@ -59,6 +59,24 @@ describe ODF::Cell do
59
59
  elem['table:formula'].should == 'oooc:=SUM([.A1:.A4])'
60
60
  end
61
61
 
62
+ it "should accept matrix formulas" do
63
+ output = ODF::Cell.new(:type => :float, :matrix_formula => true,
64
+ :formula => "oooc:=SUM([.A1:.A4])").xml
65
+
66
+ elem = Hpricot(output).at('table:table-cell')
67
+ elem['table:number-matrix-columns-spanned'].should == '1'
68
+ elem['table:number-matrix-rows-spanned'].should == '1'
69
+ end
70
+
71
+ it "should not make a matrix formula when asked not too" do
72
+ output = ODF::Cell.new(:type => :float, :matrix_formula => false,
73
+ :formula => "oooc:=SUM([.A1:.A4])").xml
74
+
75
+ elem = Hpricot(output).at('table:table-cell')
76
+ elem['table:number-matrix-columns-spanned'].should be_nil
77
+ elem['table:number-matrix-rows-spanned'].should be_nil
78
+ end
79
+
62
80
  it "should not have an empty paragraph" do
63
81
  [ODF::Cell.new, ODF::Cell.new(''), ODF::Cell.new(' ')].each do |cell|
64
82
  cell.xml.should_not have_tag('text:p')
@@ -26,5 +26,14 @@ describe ODF::Property do
26
26
  elem['fo:color'].should == '#4c4c4c'
27
27
  elem['fo:font-weight'].should == 'bold'
28
28
  end
29
+
30
+ it "should prefix column-width property with style namespace" do
31
+ property = ODF::Property.new :column, 'column-width' => '2cm'
32
+
33
+ property.xml.should have_tag('//style:table-column-properties')
34
+
35
+ elem = Hpricot(property.xml).at('//style:table-column-properties')
36
+ elem['style:column-width'].should == '2cm'
37
+ end
29
38
  end
30
39
 
@@ -40,5 +40,38 @@ describe ODF::Style do
40
40
  text_elem = Hpricot(output).at('style:text-properties')
41
41
  text_elem['fo:color'].should == '#4c4c4c'
42
42
  end
43
+
44
+ it "should allow data styles" do
45
+ xml = ODF::Style.create 'my-style', :family => :cell,
46
+ :data_style => 'currency-grouped'
47
+
48
+ style = Hpricot(xml).at('//style:style')
49
+ style['style:data-style-name'].should == 'currency-grouped'
50
+ end
51
+
52
+ it "should allow parent styles" do
53
+ xml = ODF::Style.create 'child-style', :family => :cell,
54
+ :parent => 'cell-default'
55
+
56
+ style = Hpricot(xml).at('//style:style')
57
+ style['style:parent-style-name'].should == 'cell-default'
58
+
59
+ cell_style = ODF::Style.new('cell-default', :family => :cell)
60
+ xml = ODF::Style.create 'child-style', :family => :cell,
61
+ :parent => cell_style
62
+
63
+ style = Hpricot(xml).at('//style:style')
64
+ style['style:parent-style-name'].should == 'cell-default'
65
+ end
66
+
67
+ it "should be able to describe column styles" do
68
+ xml = ODF::Style.create 'column-style', :family => :column do |style|
69
+ style.property :column, 'column-width' => '2cm'
70
+ end
71
+
72
+ Hpricot(xml).at('//style:style')['style:family'].should == 'table-column'
73
+ xml.should have_tag('//style:style/*', :count => 1)
74
+ xml.should have_tag('//style:table-column-properties')
75
+ end
43
76
  end
44
77
 
@@ -45,4 +45,14 @@ describe ODF::Table do
45
45
  output.should have_tag('text:p')
46
46
  Hpricot(output).at('text:p').innerHTML.should == '2'
47
47
  end
48
+
49
+ it "should allow column style specifications" do
50
+ xml = ODF::Table.create('Styles columns table') do |t|
51
+ t.column :style => 'wide'
52
+ end
53
+
54
+ xml.should have_tag('table:table-column')
55
+ column = Hpricot(xml).at('table:table-column')
56
+ column['table:style-name'].should == 'wide'
57
+ end
48
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rodf
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.1"
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thiago Arrais
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-22 00:00:00 -03:00
12
+ date: 2008-12-02 00:00:00 -03:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -36,11 +36,21 @@ dependencies:
36
36
  name: activesupport
37
37
  type: :runtime
38
38
  version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.1.2
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: rspec
47
+ type: :development
48
+ version_requirement:
39
49
  version_requirements: !ruby/object:Gem::Requirement
40
50
  requirements:
41
51
  - - ">="
42
52
  - !ruby/object:Gem::Version
43
- version: 2.0.0
53
+ version: 1.1.11
44
54
  version:
45
55
  - !ruby/object:Gem::Dependency
46
56
  name: rspec_hpricot_matchers
@@ -72,6 +82,7 @@ extra_rdoc_files:
72
82
  - lib/odf/row.rb
73
83
  - lib/odf/spreadsheet.rb
74
84
  - lib/odf/cell.rb
85
+ - lib/odf/column.rb
75
86
  - lib/odf/table.rb
76
87
  - lib/odf/property.rb
77
88
  - lib/odf/style.rb
@@ -85,6 +96,7 @@ files:
85
96
  - lib/odf/row.rb
86
97
  - lib/odf/spreadsheet.rb
87
98
  - lib/odf/cell.rb
99
+ - lib/odf/column.rb
88
100
  - lib/odf/table.rb
89
101
  - lib/odf/property.rb
90
102
  - lib/odf/style.rb