odf-report 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Mzc3ZTFmODBhMzEzZjQ1MzdmMjIyMDE3OTBlMmZjMTE0MTYxODI3MA==
5
+ data.tar.gz: !binary |-
6
+ ZDY1OGI3MTRhY2Q1OTI1YjdkYzgyYjhiYjIwMDZhMjA0NzhmZjc0ZQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZGEzNjBjYzhhZWMzMGFmNTIyYjdiYTdlNTFlMjA1ZDQyNWMwMWNiODQ3YTg1
10
+ YTk0OGJhZDYzZTA5NGUxZDFjMmIzMGM1NzVlNDgzZDRhNjVkMGFjNTJiN2Fj
11
+ MmI4ZTkwN2M3YzZhYjkzMTA2NmVlNzVkOWQyYjA1OWRjZTNmYzk=
12
+ data.tar.gz: !binary |-
13
+ N2Q1Yzk4NGZiMmY3OTg0OWE2NWYyMWYzOTUyYjVlNDI3YWUxYzRiZDZmYjJh
14
+ MTBlMGUzYzQwZDhiZTBhOGE1ZTAxN2VjMjljZWE2MWFjZTUwM2E4ODhiZmZl
15
+ ZTljNWU3Mzc0YTkwZjk0OWQ1YWEwNDUzOWFlNGM4MmUxNmYyOTQ=
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  pkg
2
+ pckg
2
3
  doc
3
4
  *.gem
4
- test/result/*.odt
5
+ test/result
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in odf-report.gemspec
4
+ gemspec
@@ -2,19 +2,6 @@ h1. ODF-REPORT
2
2
 
3
3
  Gem for generating .odt files by making strings, images, tables and sections replacements in a previously created .odt file.
4
4
 
5
-
6
- h2. NEW!
7
-
8
- <pre>
9
- ODF-REPORT have been internally refactored. It now uses Nokogiri for parsing the documents, instead of Regex.
10
-
11
- This provides for a much greater flexibility. As a result, it was possible to implement nested sections and tables.
12
-
13
- Now sections can be nested inside sections, with fields, tables and others sections
14
-
15
- And now, tables can also be nested inside tables.
16
- </pre>
17
-
18
5
  h2. INSTALL
19
6
 
20
7
  (sudo) gem install odf-report
@@ -109,7 +96,7 @@ end
109
96
 
110
97
  h3. Sections
111
98
 
112
- Sometimes, you have to repeat a whole chunk of a document, in a structure a lot more complex than a table. Now you can make a Section in your template and use it in this situations. Creating a Session in OpenOffice is as easy as select menu *Insert* and then *Section...*, and then choose a name for it.
99
+ Sometimes, you have to repeat a whole chunk of a document, in a structure a lot more complex than a table. Now you can make a Section in your template and use it in this situations. Creating a Section in OpenOffice is as easy as select menu *Insert* and then *Section...*, and then choose a name for it.
113
100
 
114
101
  *Section* 's are lot like Tables, in the sense that you can pass a collection and have that section repeated for each member of the collection. *But*, Sections can have anything inside it, even Tables *and nested Sections*, as long as you pass the appropriate data structure.
115
102
 
@@ -176,6 +163,7 @@ def print
176
163
 
177
164
  @ticket = Ticket.find(params[:id])
178
165
 
166
+ # For Rails 3 or latest replace #{RAILS_ROOT} to #{Rails.root}
179
167
  report = ODFReport::Report.new("#{RAILS_ROOT}/app/reports/ticket.odt") do |r|
180
168
 
181
169
  r.add_field(:id, @ticket.id.to_s)
@@ -236,4 +224,4 @@ h3. THE FUTURE
236
224
 
237
225
  Well, this is my first attempt. This gem was extracted from an actual project we developed internally, to fulfill our specific needs.
238
226
 
239
- That said, I would really appreciate any input you can come up with. Critics, suggestions, bug reports are welcome and will be thoroughly examined.
227
+ That said, I would really appreciate any input you can come up with. Critics, suggestions, bug reports are welcome and will be thoroughly examined.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -1,10 +1,13 @@
1
1
  require 'rubygems'
2
- require 'zip/zipfilesystem'
2
+ require 'zip'
3
3
  require 'fileutils'
4
4
  require 'nokogiri'
5
5
 
6
+ require File.expand_path('../odf-report/parser/default', __FILE__)
7
+
6
8
  require File.expand_path('../odf-report/images', __FILE__)
7
9
  require File.expand_path('../odf-report/field', __FILE__)
10
+ require File.expand_path('../odf-report/text', __FILE__)
8
11
  require File.expand_path('../odf-report/file', __FILE__)
9
12
  require File.expand_path('../odf-report/fields', __FILE__)
10
13
  require File.expand_path('../odf-report/nested', __FILE__)
@@ -1,82 +1,47 @@
1
1
  module ODFReport
2
-
3
2
  class File
4
3
 
5
- attr_accessor :tmp_dir, :path
4
+ attr_accessor :data, :output_stream
6
5
 
7
6
  def initialize(template)
8
-
9
7
  raise "Template [#{template}] not found." unless ::File.exists? template
10
-
11
8
  @template = template
12
- @tmp_dir = ::File.join(Dir.tmpdir, random_filename(:prefix=>'odt_'))
13
- Dir.mkdir(@tmp_dir) unless ::File.exists? @tmp_dir
14
9
  end
15
10
 
16
- def create(dest)
17
- if dest
18
- FileUtils.cp(@template, dest)
19
- @path = dest
20
- else
21
- FileUtils.cp(@template, @tmp_dir)
22
- @path = "#{@tmp_dir}/#{::File.basename(@template)}"
11
+ def update_content
12
+ @buffer = Zip::OutputStream.write_buffer do |out|
13
+ @output_stream = out
14
+ yield self
23
15
  end
24
16
  end
25
17
 
26
- def update(*content_files, &block)
18
+ def update_files(*content_files, &block)
27
19
 
28
- content_files.each do |content_file|
20
+ Zip::File.open(@template) do |file|
29
21
 
30
- update_content_file(content_file) do |txt|
22
+ file.each do |entry|
31
23
 
32
- yield txt
33
-
34
- end
35
-
36
- end
37
-
38
- end
24
+ unless entry.directory?
39
25
 
40
- private
26
+ data = entry.get_input_stream.read
41
27
 
42
- def update_content_file(content_file, &block)
28
+ if content_files.include?(entry.name)
29
+ yield data
30
+ end
43
31
 
44
- Zip::ZipFile.open(@path) do |z|
32
+ @output_stream.put_next_entry(entry.name)
33
+ @output_stream.write data
34
+ end
45
35
 
46
- cont = "#{@tmp_dir}/#{content_file}"
47
-
48
- z.extract(content_file, cont)
49
-
50
- txt = ''
51
-
52
- ::File.open(cont, "r") do |f|
53
- txt = f.read
54
- end
55
-
56
- yield(txt)
57
-
58
- ::File.open(cont, "w") do |f|
59
- f.write(txt)
60
36
  end
61
37
 
62
- z.replace(content_file, cont)
63
38
  end
64
39
 
65
40
  end
66
41
 
67
- def random_filename(opts={})
68
- opts = {:chars => ('0'..'9').to_a + ('A'..'F').to_a + ('a'..'f').to_a,
69
- :length => 24, :prefix => '', :suffix => '',
70
- :verify => true, :attempts => 10}.merge(opts)
71
- opts[:attempts].times do
72
- filename = ''
73
- opts[:length].times { filename << opts[:chars][rand(opts[:chars].size)] }
74
- filename = opts[:prefix] + filename + opts[:suffix]
75
- return filename unless opts[:verify] && ::File.exists?(filename)
76
- end
77
- nil
42
+ def data
43
+ @buffer.string
78
44
  end
79
45
 
80
46
  end
81
-
82
- end
47
+ end
@@ -19,18 +19,25 @@ module ODFReport
19
19
 
20
20
  return if @images.empty?
21
21
 
22
- FileUtils.mkdir(::File.join(file.tmp_dir, IMAGE_DIR_NAME))
23
-
24
22
  @image_names_replacements.each_pair do |path, template_image|
25
23
 
26
- file.update(template_image) do |content|
27
- content.replace ::File.read(path)
28
- end
24
+ file.output_stream.put_next_entry(template_image)
25
+ file.output_stream.write ::File.read(path)
29
26
 
30
27
  end
31
28
 
32
29
  end # replace_images
33
30
 
31
+ # newer versions of LibreOffice can't open files with duplicates image names
32
+ def avoid_duplicate_image_names(content)
33
+
34
+ nodes = content.xpath("//draw:frame[@draw:name]")
35
+
36
+ nodes.each_with_index do |node, i|
37
+ node.attribute('name').value = "pic_#{i}"
38
+ end
39
+
40
+ end
34
41
 
35
42
  end
36
43
 
@@ -0,0 +1,90 @@
1
+ module ODFReport
2
+
3
+ module Parser
4
+
5
+
6
+ # Default HTML parser
7
+ #
8
+ # sample HTML
9
+ #
10
+ # <p> first paragraph </p>
11
+ # <p> second <strong>paragraph</strong> </p>
12
+ # <blockquote>
13
+ # <p> first <em>quote paragraph</em> </p>
14
+ # <p> first quote paragraph </p>
15
+ # <p> first quote paragraph </p>
16
+ # </blockquote>
17
+ # <p> third <strong>paragraph</strong> </p>
18
+ #
19
+ # <p style="margin: 100px"> fourth <em>paragraph</em> </p>
20
+ # <p style="margin: 120px"> fifth paragraph </p>
21
+ # <p> sixth <strong>paragraph</strong> </p>
22
+ #
23
+
24
+ class Default
25
+
26
+ attr_accessor :paragraphs
27
+
28
+ def initialize(text, template_node)
29
+ @text = text
30
+ @paragraphs = []
31
+ @template_node = template_node
32
+
33
+ parse
34
+ end
35
+
36
+ def parse
37
+ xml = @template_node.parse(@text)
38
+
39
+ xml.css("p", "h1", "h2").each do |p|
40
+
41
+ style = check_style(p)
42
+ text = parse_formatting(p.inner_html)
43
+
44
+ add_paragraph(text, style)
45
+ end
46
+ end
47
+
48
+ def add_paragraph(text, style)
49
+
50
+ node = @template_node.dup
51
+
52
+ node['text:style-name'] = style if style
53
+ node.children = text
54
+
55
+ @paragraphs << node
56
+ end
57
+
58
+ private
59
+
60
+ def parse_formatting(text)
61
+ text.strip!
62
+ text.gsub!(/<strong>(.+?)<\/strong>/) { "<text:span text:style-name=\"bold\">#{$1}<\/text:span>" }
63
+ text.gsub!(/<em>(.+?)<\/em>/) { "<text:span text:style-name=\"italic\">#{$1}<\/text:span>" }
64
+ text.gsub!(/<u>(.+?)<\/u>/) { "<text:span text:style-name=\"underline\">#{$1}<\/text:span>" }
65
+ text.gsub!("\n", "")
66
+ text
67
+ end
68
+
69
+ def check_style(node)
70
+ style = nil
71
+
72
+ if node.name =~ /h\d/i
73
+ style = "title"
74
+
75
+ elsif node.parent && node.parent.name == "blockquote"
76
+ style = "quote"
77
+
78
+ elsif node['style'] =~ /margin/
79
+ style = "quote"
80
+
81
+ end
82
+
83
+ style
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+
90
+ end
@@ -3,12 +3,13 @@ module ODFReport
3
3
  class Report
4
4
  include Fields, Images
5
5
 
6
- attr_accessor :fields, :tables, :images, :sections, :file
6
+ attr_accessor :fields, :tables, :images, :sections, :file, :texts
7
7
 
8
8
  def initialize(template_name, &block)
9
9
 
10
10
  @file = ODFReport::File.new(template_name)
11
11
 
12
+ @texts = []
12
13
  @fields = []
13
14
  @tables = []
14
15
  @images = {}
@@ -23,7 +24,12 @@ class Report
23
24
  opts = {:name => field_tag, :value => value}
24
25
  field = Field.new(opts, &block)
25
26
  @fields << field
27
+ end
26
28
 
29
+ def add_text(field_tag, value='', &block)
30
+ opts = {:name => field_tag, :value => value}
31
+ text = Text.new(opts)
32
+ @texts << text
27
33
  end
28
34
 
29
35
  def add_table(table_name, collection, opts={}, &block)
@@ -48,25 +54,34 @@ class Report
48
54
 
49
55
  def generate(dest = nil)
50
56
 
51
- @file.create(dest)
57
+ @file.update_content do |file|
58
+
59
+ file.update_files('content.xml', 'styles.xml') do |txt|
52
60
 
53
- @file.update('content.xml', 'styles.xml') do |txt|
61
+ parse_document(txt) do |doc|
54
62
 
55
- parse_document(txt) do |doc|
63
+ replace_texts!(doc)
64
+ replace_fields!(doc)
56
65
 
57
- replace_fields!(doc)
58
- replace_sections!(doc)
59
- replace_tables!(doc)
66
+ replace_sections!(doc)
67
+ replace_tables!(doc)
60
68
 
61
- find_image_name_matches(doc)
69
+ find_image_name_matches(doc)
70
+ avoid_duplicate_image_names(doc)
71
+
72
+ end
62
73
 
63
74
  end
64
75
 
65
- end
76
+ replace_images(file)
66
77
 
67
- replace_images(@file)
78
+ end
68
79
 
69
- @file.path
80
+ if dest
81
+ ::File.open(dest, "w") {|f| f.write(@file.data) }
82
+ else
83
+ @file.data
84
+ end
70
85
 
71
86
  end
72
87
 
@@ -75,13 +90,19 @@ private
75
90
  def parse_document(txt)
76
91
  doc = Nokogiri::XML(txt)
77
92
  yield doc
78
- txt.replace(doc.to_s)
93
+ txt.replace(doc.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML))
79
94
  end
80
95
 
81
96
  def replace_fields!(content)
82
97
  field_replace!(content)
83
98
  end
84
99
 
100
+ def replace_texts!(content)
101
+ @texts.each do |text|
102
+ text.replace!(content)
103
+ end
104
+ end
105
+
85
106
  def replace_tables!(content)
86
107
  @tables.each do |table|
87
108
  table.replace!(content)
@@ -12,6 +12,7 @@ module ODFReport
12
12
  @parent = opts[:parent]
13
13
 
14
14
  @fields = []
15
+ @texts = []
15
16
 
16
17
  @tables = []
17
18
  @sections = []
@@ -24,6 +25,13 @@ module ODFReport
24
25
 
25
26
  end
26
27
 
28
+ def add_text(name, data_field=nil, &block)
29
+ opts = {:name => name, :data_field => data_field}
30
+ field = Text.new(opts, &block)
31
+ @texts << field
32
+
33
+ end
34
+
27
35
  def add_table(table_name, collection_field, opts={}, &block)
28
36
  opts.merge!(:name => table_name, :collection_field => collection_field, :parent => self)
29
37
  tab = Table.new(opts)
@@ -55,7 +63,9 @@ module ODFReport
55
63
  @collection.each do |data_item|
56
64
  new_section = template.dup
57
65
 
58
- replace_fields!(new_section, data_item)
66
+ @texts.each do |t|
67
+ t.replace!(new_section, data_item)
68
+ end
59
69
 
60
70
  @tables.each do |t|
61
71
  t.replace!(new_section, data_item)
@@ -65,6 +75,8 @@ module ODFReport
65
75
  s.replace!(new_section, data_item)
66
76
  end
67
77
 
78
+ replace_fields!(new_section, data_item)
79
+
68
80
  section.before(new_section)
69
81
 
70
82
  end
@@ -85,4 +97,6 @@ module ODFReport
85
97
 
86
98
  end
87
99
 
88
- end
100
+ end
101
+
102
+
@@ -51,6 +51,8 @@ class Table
51
51
 
52
52
  @template_rows = table.xpath("table:table-row")
53
53
 
54
+ @header = table.xpath("table:table-header-rows").empty? ? @header : false
55
+
54
56
  @collection.each do |data_item|
55
57
 
56
58
  new_node = get_next_row
@@ -0,0 +1,43 @@
1
+ module ODFReport
2
+
3
+ class Text < Field
4
+
5
+ attr_accessor :parser
6
+
7
+ def replace!(doc, data_item = nil)
8
+
9
+ return unless node = find_text_node(doc)
10
+
11
+ text_value = get_value(data_item)
12
+
13
+ @parser = Parser::Default.new(text_value, node)
14
+
15
+ @parser.paragraphs.each do |p|
16
+ node.before(p)
17
+ end
18
+
19
+ node.remove
20
+
21
+ end
22
+
23
+ private
24
+
25
+ def find_text_node(doc)
26
+ texts = doc.xpath(".//text:p[text()='#{to_placeholder}']")
27
+ if texts.empty?
28
+ texts = doc.xpath(".//text:p/text:span[text()='#{to_placeholder}']")
29
+ if texts.empty?
30
+ texts = nil
31
+ else
32
+ texts = texts.first.parent
33
+ end
34
+ else
35
+ texts = texts.first
36
+ end
37
+
38
+ texts
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -1,3 +1,3 @@
1
1
  module ODFReport
2
- VERSION = "0.4.4"
3
- end
2
+ VERSION = "0.5.0"
3
+ end
@@ -10,16 +10,19 @@ Gem::Specification.new do |s|
10
10
  s.description = %q{Generates ODF files, given a template (.odt) and data, replacing tags}
11
11
  s.email = %q{sandrods@gmail.com}
12
12
  s.has_rdoc = false
13
- s.homepage = %q{https://github.com/sandrods/odf-report}
13
+ s.homepage = %q{http://sandrods.github.com/odf-report/}
14
14
  s.rubygems_version = %q{1.3.7}
15
15
  s.summary = %q{Generates ODF files, given a template (.odt) and data, replacing tags}
16
16
 
17
- s.files = `git ls-files`.split("\n")
18
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.files = `git ls-files -z`.split("\x0")
18
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_runtime_dependency('rubyzip', "~> 0.9.4")
23
- s.add_runtime_dependency('nokogiri', "~> 1.5.0")
22
+ s.add_development_dependency "bundler", "~> 1.6"
23
+ s.add_development_dependency "rake"
24
+
25
+ s.add_runtime_dependency('rubyzip', "~> 1.1.0")
26
+ s.add_runtime_dependency('nokogiri', ">= 1.5.0")
24
27
 
25
28
  end
@@ -0,0 +1,37 @@
1
+ # coding: UTF-8
2
+ require '../lib/odf-report'
3
+ require 'ostruct'
4
+ require 'faker'
5
+
6
+ html = <<-HTML
7
+ <p>Uniquely promote installed base total linkage via emerging deliverables com [EVENTO_TEXTO_CARTA], unleash cross-media collaboration <strong>[FUNCAO]</strong> [EVENTO_NOME].</p>
8
+
9
+ <p>Progressively fashion diverse portals nº <strong>[NUMERO_SECAO]</strong> do local <strong>[NOME_LOCAL]</strong>, situado na <strong>[ENDERECO_LOCAL]</strong> methodologies </p>
10
+
11
+ <p>Assertively orchestrate market positioning bandwidth rather than fully researched total linkage. Interactively architect granular e-markets via clicks-and-mortar ROI. Uniquely aggregate compelling.</p>
12
+
13
+ <p>Compellingly facilitate functionalized interfaces before wireless models. Compellingly morph parallel systems whereas combinado com o artigo 63, § 2º da Lei nº 9.504/97, abaixo mencionados:</p>
14
+
15
+ <p style="margin-left:1.76cm;"><em>Art. 120 - § 1º Compellingly envisioneer high standards in niches without best-of-breed leadership. Phosfluorescently unleash go forward methodologies after bricks-and-clicks niches. Authoritatively. </em></p>
16
+
17
+ <p style="margin-left:1.76cm;"><em>Art. 63 - [...] § 2º Enthusiastically parallel task user friendly functionalities whereas exceptional leadership. </em></p>
18
+
19
+ <p>Credibly enable multifunctional strategic theme areas and premium communities.</p>
20
+
21
+ HTML
22
+
23
+
24
+ report = ODFReport::Report.new("./templates/test_fields_inside_text.odt") do |r|
25
+
26
+ r.add_text(:body, html)
27
+
28
+ r.add_field('EVENTO_TEXTO_CARTA', Faker::Lorem.sentence)
29
+ r.add_field('FUNCAO', Faker::Lorem.word)
30
+ r.add_field('EVENTO_NOME', Faker::Company.name)
31
+
32
+ r.add_field('NUMERO_SECAO', Faker::Number.number(3))
33
+ r.add_field('NOME_LOCAL', Faker::Company.name)
34
+ r.add_field('ENDERECO_LOCAL', Faker::Address.street_address)
35
+ end
36
+
37
+ report.generate("./result/test_fields_inside_text.odt")
@@ -16,7 +16,7 @@ items << Item.new("ALIAS", '302', %w(sidney sloane jack michael marshal
16
16
  items << Item.new("GREY'S ANATOMY", '220', %w(meredith christina izzie alex george))
17
17
  items << Item.new("BREAKING BAD", '556', %w(pollos gus mike heisenberg))
18
18
 
19
- report = ODFReport::Report.new("test_nested_tables.odt") do |r|
19
+ report = ODFReport::Report.new("./templates/test_nested_tables.odt") do |r|
20
20
 
21
21
  r.add_field("TAG_01", Time.now)
22
22
  r.add_field("TAG_02", "TAG-2 -> New tag")
@@ -36,4 +36,4 @@ report = ODFReport::Report.new("test_nested_tables.odt") do |r|
36
36
 
37
37
  end
38
38
 
39
- report.generate("./result/test_nested_tables.odt")
39
+ report.generate("./result/test_nested_tables.odt")
@@ -16,7 +16,7 @@ items << Item.new("ALIAS", '302', %w(sidney sloane jack michael marshal
16
16
  items << Item.new("GREY'S ANATOMY", '220', %w(meredith christina izzie alex george))
17
17
  items << Item.new("BREAKING BAD", '556', %w(pollos gus mike heisenberg))
18
18
 
19
- report = ODFReport::Report.new("test_sections.odt") do |r|
19
+ report = ODFReport::Report.new("./templates/test_sections.odt") do |r|
20
20
 
21
21
  r.add_field("TAG_01", Time.now)
22
22
  r.add_field("TAG_02", "TAG-2 -> New tag")
@@ -36,4 +36,4 @@ report = ODFReport::Report.new("test_sections.odt") do |r|
36
36
 
37
37
  end
38
38
 
39
- report.generate("./result/test_sections.odt")
39
+ report.generate("./result/test_sections.odt")
@@ -27,7 +27,7 @@ items << Item.new("ALIAS", '302', %w(sidney sloane jack michael marshal
27
27
  items << Item.new("GREY'S ANATOMY", '220', %w(meredith christina izzie alex george), subs2)
28
28
  items << Item.new("BREAKING BAD", '556', %w(pollos gus mike heisenberg))
29
29
 
30
- report = ODFReport::Report.new("test_sub_sections.odt") do |r|
30
+ report = ODFReport::Report.new("./templates/test_sub_sections.odt") do |r|
31
31
 
32
32
  r.add_field("TAG_01", Time.now)
33
33
  r.add_field("TAG_02", "TAG-2 -> New tag")
@@ -54,4 +54,4 @@ report = ODFReport::Report.new("test_sub_sections.odt") do |r|
54
54
 
55
55
  end
56
56
 
57
- report.generate("./result/test_sub_sections.odt")
57
+ report.generate("./result/test_sub_sections.odt")
@@ -0,0 +1,39 @@
1
+ require '../lib/odf-report'
2
+ require 'ostruct'
3
+ require 'faker'
4
+
5
+ class Item
6
+ attr_accessor :name, :mail
7
+ def initialize(_name, _mail)
8
+ @name=_name
9
+ @mail=_mail
10
+ end
11
+ end
12
+
13
+ items = []
14
+ 50.times do
15
+
16
+ items << Item.new(Faker::Name.name, Faker::Internet.email)
17
+
18
+ end
19
+
20
+ report = ODFReport::Report.new("./templates/test_table_headers.odt") do |r|
21
+
22
+ r.add_table("TABLE_01", items, :header => true) do |s|
23
+ s.add_column(:name)
24
+ s.add_column(:mail)
25
+ end
26
+
27
+ r.add_table("TABLE_02", items, :header => true) do |s|
28
+ s.add_column(:name)
29
+ s.add_column(:mail)
30
+ end
31
+
32
+ r.add_table("TABLE_03", items) do |s|
33
+ s.add_column(:name)
34
+ s.add_column(:mail)
35
+ end
36
+
37
+ end
38
+
39
+ report.generate("./result/test_table_headers.odt")
@@ -15,7 +15,7 @@ col2 << OpenStruct.new({:name=>"luiz garcia", 'idx'=>"88", :address=>"address
15
15
 
16
16
  col3, col4, col5 = [], [], []
17
17
 
18
- report = ODFReport::Report.new("test_tables.odt") do |r|
18
+ report = ODFReport::Report.new("./templates/test_tables.odt") do |r|
19
19
 
20
20
  r.add_field("HEADER_FIELD", "This field was in the HEADER")
21
21
 
@@ -59,4 +59,4 @@ report = ODFReport::Report.new("test_tables.odt") do |r|
59
59
 
60
60
  end
61
61
 
62
- report.generate("./result/test_tables.odt")
62
+ report.generate("./result/test_tables.odt")
@@ -0,0 +1,48 @@
1
+ require '../lib/odf-report'
2
+ require 'ostruct'
3
+ require 'faker'
4
+
5
+ class Item
6
+ attr_accessor :name, :text
7
+ def initialize(_name, _text)
8
+ @name=_name
9
+ @text=_text
10
+ end
11
+ end
12
+
13
+ items = []
14
+ 4.times do
15
+
16
+ text = <<-HTML
17
+ <p>#{Faker::Lorem.sentence} <em>#{Faker::Lorem.sentence}</em> #{Faker::Lorem.sentence}</p>
18
+ <p>#{Faker::Lorem.sentence} <strong>#{Faker::Lorem.paragraph}</strong> #{Faker::Lorem.paragraph}</p>
19
+ <p>#{Faker::Lorem.paragraph}</p>
20
+ <blockquote>
21
+ <p>#{Faker::Lorem.paragraph(10)}</p>
22
+ <p>#{Faker::Lorem.paragraph}</p>
23
+ </blockquote>
24
+ <p style="margin: 150px">#{Faker::Lorem.paragraph(15)}</p>
25
+ <p>#{Faker::Lorem.paragraph}</p>
26
+ HTML
27
+
28
+ items << Item.new(Faker::Name.name, text)
29
+
30
+ end
31
+
32
+ item = items.pop
33
+
34
+ report = ODFReport::Report.new("./templates/test_text.odt") do |r|
35
+
36
+ r.add_field("TAG_01", Faker::Company.name)
37
+ r.add_field("TAG_02", Faker::Company.catch_phrase)
38
+
39
+ r.add_text(:main_text, item.text)
40
+
41
+ r.add_section("SECTION_01", items) do |s|
42
+ s.add_field(:name)
43
+ s.add_text(:text)
44
+ end
45
+
46
+ end
47
+
48
+ report.generate("./result/test_text.odt")
metadata CHANGED
@@ -1,38 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: odf-report
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
5
- prerelease:
4
+ version: 0.5.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Sandro Duarte
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2011-12-29 00:00:00.000000000Z
11
+ date: 2014-07-24 00:00:00.000000000 Z
13
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
14
41
  - !ruby/object:Gem::Dependency
15
42
  name: rubyzip
16
- requirement: &2153481300 !ruby/object:Gem::Requirement
17
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
18
44
  requirements:
19
45
  - - ~>
20
46
  - !ruby/object:Gem::Version
21
- version: 0.9.4
47
+ version: 1.1.0
22
48
  type: :runtime
23
49
  prerelease: false
24
- version_requirements: *2153481300
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.0
25
55
  - !ruby/object:Gem::Dependency
26
56
  name: nokogiri
27
- requirement: &2153480700 !ruby/object:Gem::Requirement
28
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
29
58
  requirements:
30
- - - ~>
59
+ - - ! '>='
31
60
  - !ruby/object:Gem::Version
32
61
  version: 1.5.0
33
62
  type: :runtime
34
63
  prerelease: false
35
- version_requirements: *2153480700
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.5.0
36
69
  description: Generates ODF files, given a template (.odt) and data, replacing tags
37
70
  email: sandrods@gmail.com
38
71
  executables: []
@@ -40,62 +73,78 @@ extensions: []
40
73
  extra_rdoc_files: []
41
74
  files:
42
75
  - .gitignore
76
+ - Gemfile
43
77
  - MIT-LICENSE
44
78
  - Manifest
45
79
  - README.textile
80
+ - Rakefile
46
81
  - lib/odf-report.rb
47
82
  - lib/odf-report/field.rb
48
83
  - lib/odf-report/fields.rb
49
84
  - lib/odf-report/file.rb
50
85
  - lib/odf-report/images.rb
51
86
  - lib/odf-report/nested.rb
87
+ - lib/odf-report/parser/default.rb
52
88
  - lib/odf-report/report.rb
53
89
  - lib/odf-report/section.rb
54
90
  - lib/odf-report/table.rb
91
+ - lib/odf-report/text.rb
55
92
  - lib/odf-report/version.rb
56
93
  - odf-report.gemspec
57
94
  - test/piriapolis.jpg
58
95
  - test/rails.png
59
- - test/test_nested_tables.odt
96
+ - test/templates/test_fields_inside_text.odt
97
+ - test/templates/test_nested_tables.odt
98
+ - test/templates/test_sections.odt
99
+ - test/templates/test_sub_sections.odt
100
+ - test/templates/test_table_headers.odt
101
+ - test/templates/test_tables.odt
102
+ - test/templates/test_text.odt
103
+ - test/test_fields_inside_text.rb
60
104
  - test/test_nested_tables.rb
61
- - test/test_sections.odt
62
105
  - test/test_sections.rb
63
- - test/test_sub_sections.odt
64
106
  - test/test_sub_sections.rb
65
- - test/test_tables.odt
107
+ - test/test_table_headers.rb
66
108
  - test/test_tables.rb
67
- homepage: https://github.com/sandrods/odf-report
109
+ - test/test_text.rb
110
+ homepage: http://sandrods.github.com/odf-report/
68
111
  licenses: []
112
+ metadata: {}
69
113
  post_install_message:
70
114
  rdoc_options: []
71
115
  require_paths:
72
116
  - lib
73
117
  required_ruby_version: !ruby/object:Gem::Requirement
74
- none: false
75
118
  requirements:
76
119
  - - ! '>='
77
120
  - !ruby/object:Gem::Version
78
121
  version: '0'
79
122
  required_rubygems_version: !ruby/object:Gem::Requirement
80
- none: false
81
123
  requirements:
82
124
  - - ! '>='
83
125
  - !ruby/object:Gem::Version
84
126
  version: '0'
85
127
  requirements: []
86
128
  rubyforge_project:
87
- rubygems_version: 1.8.10
129
+ rubygems_version: 2.2.2
88
130
  signing_key:
89
- specification_version: 3
131
+ specification_version: 4
90
132
  summary: Generates ODF files, given a template (.odt) and data, replacing tags
91
133
  test_files:
92
134
  - test/piriapolis.jpg
93
135
  - test/rails.png
94
- - test/test_nested_tables.odt
136
+ - test/templates/test_fields_inside_text.odt
137
+ - test/templates/test_nested_tables.odt
138
+ - test/templates/test_sections.odt
139
+ - test/templates/test_sub_sections.odt
140
+ - test/templates/test_table_headers.odt
141
+ - test/templates/test_tables.odt
142
+ - test/templates/test_text.odt
143
+ - test/test_fields_inside_text.rb
95
144
  - test/test_nested_tables.rb
96
- - test/test_sections.odt
97
145
  - test/test_sections.rb
98
- - test/test_sub_sections.odt
99
146
  - test/test_sub_sections.rb
100
- - test/test_tables.odt
147
+ - test/test_table_headers.rb
101
148
  - test/test_tables.rb
149
+ - test/test_text.rb
150
+ has_rdoc: false