ruby_docx 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/.gitignore +19 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +29 -0
  5. data/Rakefile +1 -0
  6. data/lib/ruby_docx.rb +24 -0
  7. data/lib/ruby_docx/convertors/elements/html/base.rb +44 -0
  8. data/lib/ruby_docx/convertors/elements/html/br.rb +6 -0
  9. data/lib/ruby_docx/convertors/elements/html/header.rb +15 -0
  10. data/lib/ruby_docx/convertors/elements/html/hyperlink.rb +6 -0
  11. data/lib/ruby_docx/convertors/elements/html/paragraph.rb +15 -0
  12. data/lib/ruby_docx/convertors/elements/html/span.rb +11 -0
  13. data/lib/ruby_docx/convertors/elements/html/table.rb +19 -0
  14. data/lib/ruby_docx/convertors/elements/html/td.rb +27 -0
  15. data/lib/ruby_docx/convertors/elements/html/th.rb +3 -0
  16. data/lib/ruby_docx/convertors/elements/html/tr.rb +10 -0
  17. data/lib/ruby_docx/convertors/html.rb +52 -0
  18. data/lib/ruby_docx/elements/block.rb +72 -0
  19. data/lib/ruby_docx/elements/br.rb +3 -0
  20. data/lib/ruby_docx/elements/document.rb +60 -0
  21. data/lib/ruby_docx/elements/hyperlink.rb +9 -0
  22. data/lib/ruby_docx/elements/inextensible_block.rb +24 -0
  23. data/lib/ruby_docx/elements/paragraph.rb +59 -0
  24. data/lib/ruby_docx/elements/row.rb +13 -0
  25. data/lib/ruby_docx/elements/table.rb +33 -0
  26. data/lib/ruby_docx/elements/table_column.rb +9 -0
  27. data/lib/ruby_docx/elements/table_row.rb +3 -0
  28. data/lib/ruby_docx/styles/default.css +11 -0
  29. data/lib/ruby_docx/template.docx +0 -0
  30. data/lib/ruby_docx/templates/br.xml +1 -0
  31. data/lib/ruby_docx/templates/document.xml +2 -0
  32. data/lib/ruby_docx/templates/hyperlink.xml +1 -0
  33. data/lib/ruby_docx/templates/paragraph.xml +1 -0
  34. data/lib/ruby_docx/templates/row.xml +1 -0
  35. data/lib/ruby_docx/templates/table.xml +1 -0
  36. data/lib/ruby_docx/templates/table_column.xml +1 -0
  37. data/lib/ruby_docx/templates/table_row.xml +1 -0
  38. data/lib/ruby_docx/version.rb +3 -0
  39. data/ruby_docx.gemspec +22 -0
  40. metadata +132 -0
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.sublime-project
19
+ *.sublime-workspace
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ruby_docx.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 HoJSim
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # RubyDocx
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'ruby_docx'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install ruby_docx
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/ruby_docx.rb ADDED
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ require "nokogiri"
3
+ require "css_parser"
4
+ require "zip/zip"
5
+ require "ruby_docx/version"
6
+
7
+ module RubyDocx
8
+ class InvalidOperation < StandardError; end
9
+
10
+ require 'ruby_docx/elements/document'
11
+ require 'ruby_docx/elements/inextensible_block'
12
+ require 'ruby_docx/elements/block'
13
+ require 'ruby_docx/elements/paragraph'
14
+ require 'ruby_docx/elements/row'
15
+ require 'ruby_docx/elements/br'
16
+ require 'ruby_docx/elements/table'
17
+ require 'ruby_docx/elements/table_row'
18
+ require 'ruby_docx/elements/table_column'
19
+ require 'ruby_docx/elements/hyperlink'
20
+
21
+ module Convertor
22
+ require 'ruby_docx/convertors/html'
23
+ end
24
+ end
@@ -0,0 +1,44 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Base
3
+ attr_reader :tag, :css
4
+ def initialize(tag, css)
5
+ @tag = tag
6
+ @css = css
7
+ end
8
+
9
+ def build
10
+ node = convert
11
+ node.add_styles(styles) if styles.present?
12
+ node
13
+ end
14
+
15
+ def convert
16
+ RubyDocx::InextensibleBlock.new
17
+ end
18
+
19
+ def styles
20
+ @styles = {}
21
+ eval_styles.reverse.each do |row|
22
+ prop, val = row.split(':', 2).map(&:strip)
23
+ unless @styles.has_key? prop
24
+ @styles[prop] = val.sub /;$/, ''
25
+ end
26
+ end
27
+ @styles
28
+ end
29
+
30
+ protected
31
+ def eval_styles
32
+ styles = css[tag.name]
33
+ tag.attributes.each do |_, attr|
34
+ if attr.name == 'class'
35
+ attr.value.split(' ').map(&:strip).each do |tag_class|
36
+ styles += css[".#{tag_class}"]
37
+ end
38
+ elsif attr.name == 'id'
39
+ styles += css["##{attr.value}"]
40
+ end
41
+ end
42
+ styles.uniq.map { |row| row.split(';').map(&:strip) }.flatten
43
+ end
44
+ end
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Br < RubyDocx::Convertor::Html::Base
3
+ def convert
4
+ RubyDocx::Br.new
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ class RubyDocx::Convertor::Html::Header < RubyDocx::Convertor::Html::Base
2
+ def convert
3
+ default_styles = {
4
+ 'font-weight' => 'bold',
5
+ 'font-size' => (20 - tag.name.gsub(/\D/, '').to_i)
6
+ }
7
+ node = RubyDocx::Paragraph.new(nil, default_styles)
8
+ tag.children.each do |child|
9
+ if child.is_a?(Nokogiri::XML::Text) && child.content.present?
10
+ node.append(RubyDocx::Row.new(child.content, default_styles))
11
+ end
12
+ end
13
+ node
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Hyperlink < RubyDocx::Convertor::Html::Base
3
+ def convert
4
+ RubyDocx::Hyperlink.new(tag['href'])
5
+ end
6
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Paragraph < RubyDocx::Convertor::Html::Base
3
+ def convert
4
+ node = RubyDocx::Paragraph.new
5
+ tag.children.each do |child|
6
+ child_node = if child.is_a?(Nokogiri::XML::Text)
7
+ RubyDocx::Row.new(child.content) if child.content.present?
8
+ else
9
+ RubyDocx::Convertor::Html.create_node(child, css)
10
+ end
11
+ node.append(child_node) if child_node
12
+ end
13
+ node
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Span < RubyDocx::Convertor::Html::Base
3
+ def convert
4
+ RubyDocx::Row.new(
5
+ tag.children.select{|child| child.is_a? Nokogiri::XML::Text }.map(&:content).join(' '),
6
+ {
7
+ 'white-space' => 'pre'
8
+ }
9
+ )
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Table < RubyDocx::Convertor::Html::Base
3
+ def convert
4
+ node = RubyDocx::Table.new
5
+ tag.children.each do |child|
6
+ rows = if %w[thead tbody tfoot].include? child.name
7
+ child.children
8
+ elsif !child.is_a?(Nokogiri::XML::Text)
9
+ [child]
10
+ else
11
+ []
12
+ end
13
+ rows.each do |row|
14
+ node.append RubyDocx::Convertor::Html.create_node(row, css)
15
+ end
16
+ end
17
+ node
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Td < RubyDocx::Convertor::Html::Base
3
+ def convert
4
+ node = RubyDocx::Paragraph.new
5
+ tag.children.each do |child|
6
+ child_node = if child.is_a?(Nokogiri::XML::Text)
7
+ RubyDocx::Row.new(child.content) if child.content.present?
8
+ else
9
+ RubyDocx::Convertor::Html.create_node(child, css)
10
+ end
11
+ node.append(child_node) if child_node
12
+ end
13
+ RubyDocx::TableColumn.new(nil, [], [node])
14
+ end
15
+
16
+ protected
17
+ def apply_style(properties_node, key, style)
18
+ super
19
+ case key
20
+ when 'vertical-align'
21
+ property_node = Nokogiri::XML::Node.new 'vAlign', node.document
22
+ property_node['w:val'] = style
23
+ properties_node.add_child property_node
24
+ end
25
+ properties_node
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Th < RubyDocx::Convertor::Html::Td
3
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Convertor::Html::Tr < RubyDocx::Convertor::Html::Base
3
+ def convert
4
+ node = RubyDocx::TableRow.new
5
+ tag.children.each do |child|
6
+ node.append(RubyDocx::Convertor::Html.create_node(child, css)) unless child.is_a?(Nokogiri::XML::Text)
7
+ end
8
+ node
9
+ end
10
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+ module RubyDocx::Convertor::Html
3
+ require_relative 'elements/html/base'
4
+ require_relative 'elements/html/paragraph'
5
+ require_relative 'elements/html/header'
6
+ require_relative 'elements/html/br'
7
+ require_relative 'elements/html/span'
8
+ require_relative 'elements/html/table'
9
+ require_relative 'elements/html/tr'
10
+ require_relative 'elements/html/td'
11
+ require_relative 'elements/html/th'
12
+ require_relative 'elements/html/hyperlink'
13
+
14
+ ROUTES = {
15
+ default: 'Paragraph',
16
+ h1: 'Header',
17
+ h2: 'Header',
18
+ h3: 'Header',
19
+ h4: 'Header',
20
+ h5: 'Header',
21
+ h6: 'Header',
22
+ a: 'Hyperlink'
23
+ }
24
+
25
+ def self.convert(template, css_path = nil)
26
+ css = self.load_styles(css_path)
27
+ doc = RubyDocx::Document.new
28
+ body = Nokogiri::HTML(template).xpath('//body').first
29
+ body.children.each { |child| doc.append self.create_node(child, css) }
30
+ doc
31
+ end
32
+
33
+ protected
34
+ def self.create_node(tag, css)
35
+ tag_name = tag.name.capitalize
36
+ unless RubyDocx::Convertor::Html.const_defined? tag_name
37
+ tag_name = ROUTES[tag.name.to_sym] || ROUTES[:default]
38
+ end
39
+ RubyDocx::Convertor::Html.const_get(tag_name).new(tag, css).build
40
+ end
41
+
42
+ ##
43
+ # returns CssParser
44
+ def self.load_styles(css_path = nil)
45
+ default_css_path = File.expand_path("../../styles/default.css", __FILE__)
46
+ css = CssParser::Parser.new
47
+ css_block = File.read( default_css_path )
48
+ css_block += File.read( css_path ) if css_path
49
+ css.add_block!(css_block)
50
+ css
51
+ end
52
+ end
@@ -0,0 +1,72 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Block < RubyDocx::InextensibleBlock
3
+ attr_accessor :content, :children, :styles
4
+
5
+ def initialize(content = nil, styles = {}, children = [])
6
+ @content = content
7
+ @children = children
8
+ @styles = styles
9
+
10
+ @template = 'block.xml'
11
+ end
12
+
13
+ def append(block)
14
+ @children << block
15
+ end
16
+
17
+ def prepend(block)
18
+ @children.unshift block
19
+ end
20
+
21
+ def build
22
+ node = super
23
+ apply_styles(node)
24
+ @children.each { |child| node.add_child child.build }
25
+ node
26
+ end
27
+
28
+ protected
29
+ def apply_styles(node)
30
+ if styles.present?
31
+ properties_node = get_properties_node(node)
32
+ styles.each do |key, style|
33
+ apply_style(properties_node, key, style)
34
+ end
35
+ end
36
+ node
37
+ end
38
+
39
+ def apply_style(properties_node, key, style)
40
+ case key
41
+ when 'text-align'
42
+ property_node = Nokogiri::XML::Node.new 'jc', properties_node.document
43
+ property_node['w:val'] = style
44
+ properties_node.add_child property_node
45
+ when 'font-weight'
46
+ if style == 'bold' || (style =~ /^\d+$/ && style.to_i > 500 )
47
+ properties_node.add_child Nokogiri::XML::Node.new 'b', properties_node.document
48
+ end
49
+ when 'font-size'
50
+ property_node = Nokogiri::XML::Node.new 'sz', properties_node.document
51
+ property_node['w:val'] = style.to_i * 2
52
+ properties_node.add_child property_node
53
+
54
+ property_node = Nokogiri::XML::Node.new 'szCs', properties_node.document
55
+ property_node['w:val'] = style.to_i * 2
56
+ properties_node.add_child property_node
57
+ end
58
+ properties_node
59
+ end
60
+
61
+ def get_properties_node(node)
62
+ properties_node_name = "#{node.name}Pr"
63
+ properties_node = node.children.find { |child| child.name == properties_node_name }
64
+ return properties_node if properties_node
65
+ properties_node = Nokogiri::XML::Node.new properties_node_name, node.document
66
+ if node.children.empty?
67
+ node.add_child(properties_node)
68
+ else
69
+ node.children.first.add_previous_sibling(properties_node)
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Br < RubyDocx::InextensibleBlock
3
+ end
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Document
3
+ TEMPLATE = 'document.xml'
4
+
5
+ attr_accessor :children
6
+
7
+ def initialize(children = [])
8
+ @children = children
9
+ end
10
+
11
+ def append(block)
12
+ @children << block
13
+ end
14
+
15
+ def prepend(block)
16
+ @children.unshift block
17
+ end
18
+
19
+ def build
20
+ doc = Nokogiri::XML(File.read( File.expand_path("../../templates/#{TEMPLATE}", __FILE__) ))
21
+ body = doc.at '/w:document/w:body'
22
+ @children.each { |child| body.add_child child.build }
23
+ doc
24
+ end
25
+
26
+ def render
27
+ build.to_s
28
+ end
29
+
30
+ def file
31
+ file = Tempfile.new('order_preview')
32
+ write_file(file)
33
+ end
34
+
35
+ def save(path)
36
+ file = File.open(path, 'w')
37
+ write_file(file).close
38
+ end
39
+
40
+ protected
41
+ def write_file(file)
42
+ zf = Zip::ZipFile.new File.expand_path("../../template.docx", __FILE__)
43
+ buffer = Zip::ZipOutputStream.write_buffer do |out|
44
+ zf.entries.each do |e|
45
+ if e.ftype == :directory
46
+ out.put_next_entry(e.name)
47
+ else
48
+ out.put_next_entry(e.name)
49
+ if e.name == "word/document.xml"
50
+ out.write render
51
+ else
52
+ out.write e.get_input_stream.read
53
+ end
54
+ end
55
+ end
56
+ end
57
+ file.write(buffer.string)
58
+ file
59
+ end
60
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Hyperlink < RubyDocx::Block
3
+ protected
4
+ def build_node
5
+ node = super
6
+ node.at('/hyperlink/r/t').content = content
7
+ node
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::InextensibleBlock
3
+ attr_accessor :document, :styles
4
+ def build
5
+ build_node
6
+ end
7
+
8
+ def add_styles(adding_styles)
9
+ self.styles = ( styles.present? ? styles : {} ).merge(adding_styles)
10
+ end
11
+
12
+ def self.create(*args)
13
+ new(*args).build
14
+ end
15
+
16
+ protected
17
+ def template
18
+ "#{self.class.to_s.split('::').last.underscore}.xml"
19
+ end
20
+
21
+ def build_node
22
+ Nokogiri::XML(File.read( File.expand_path("../../templates/#{template}", __FILE__) )).children.last
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Paragraph < RubyDocx::Block
3
+ def build
4
+ # doc = RubyDocx::Convertor::Html.convert(nil); puts doc.render
5
+ # doc = RubyDocx::Convertor::Html.convert(nil); doc.save('/Users/Homer/Temp/creating.docx')
6
+ set = []
7
+ node = build_node
8
+ apply_styles node
9
+ set << node
10
+ @children.each do |child|
11
+ if child.is_a?(self.class)
12
+ child_set = child.build
13
+ unless child_set.all? { |cnode| cnode.name == 'p' && cnode.children.empty? }
14
+ child_set.each { |item| set << item }
15
+ end
16
+ elsif child.is_a?(RubyDocx::Table)
17
+ set << child.build
18
+ elsif (child.is_a?(RubyDocx::Row) || child.is_a?(RubyDocx::Br) || child.is_a?(RubyDocx::Hyperlink)) && set.size > 1
19
+ RubyDocx::Paragraph.new(nil, styles, [child]).build.each { |item| set << item }
20
+ else
21
+ node.add_child child.build
22
+ end
23
+ end
24
+ delete_empty_nodes set
25
+ node_set = Nokogiri::XML::NodeSet.new( document || Nokogiri::XML::Document.new )
26
+ set.each { |item| node_set << item }
27
+ node_set
28
+ end
29
+
30
+ protected
31
+ ##
32
+ # removes empty node (<p/>) and convert <p><r><cr/></r></p> to <p><r/></p> that excess break lines are exluded
33
+ def delete_empty_nodes(set)
34
+ set.reject! { |node| node.name == 'p' && node.children.empty? }
35
+ set.select do |node|
36
+ node.name == 'p' &&
37
+ node.children.size == 1 &&
38
+ node.children.first.name == 'r' &&
39
+ node.children.first.children.size == 1 &&
40
+ node.children.first.children.first.name == 'cr'
41
+ end.each do |node|
42
+ node.children.first.children.remove
43
+ end
44
+ end
45
+
46
+ def build_node
47
+ node = super
48
+ if content
49
+ rows = content.split("\n")
50
+ rows.each_with_index do |row, row_number|
51
+ node.add_child RubyDocx::Row.create(row)
52
+ if row_number != rows.size - 1
53
+ node.add_child RubyDocx::Br.create
54
+ end
55
+ end
56
+ end
57
+ node
58
+ end
59
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Row < RubyDocx::Block
3
+ protected
4
+ def build_node
5
+ node = super
6
+ t_node = node.at('/r/t')
7
+ t_node.content = content
8
+ if styles['white-space'] == 'pre'
9
+ t_node['xml:space'] = 'preserve'
10
+ end
11
+ node
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::Table < RubyDocx::Block
3
+ protected
4
+ def apply_style(properties_node, key, style)
5
+ super
6
+ case key
7
+ when 'width'
8
+ if style =~ /^(\d+)%$/
9
+ property_node = Nokogiri::XML::Node.new 'tblW', properties_node.document
10
+ property_node['w:w'] = $1.to_i * 50 # 1% == 50 pct
11
+ property_node['w:type'] = 'pct'
12
+ properties_node.add_child property_node
13
+ end
14
+ when 'border'
15
+ border_size = style.split(' ').map(&:strip).find { |prop| prop =~ /^\d+(px)%/ }.to_i * 4
16
+ border_style = 'single'
17
+ border_color = 'auto'
18
+ if border_size
19
+ property_node = Nokogiri::XML::Node.new 'tblBorders', properties_node.document
20
+ %w[top left bottom right insideH insideV].each do |border|
21
+ border_node = Nokogiri::XML::Node.new border, properties_node.document
22
+ border_node['w:val'] = border_style
23
+ border_node['w:sz'] = border_size
24
+ border_node['w:color'] = border_color
25
+ border_node['w:space'] = 0
26
+ property_node.add_child border_node
27
+ end
28
+ properties_node.add_child property_node
29
+ end
30
+ end
31
+ properties_node
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::TableColumn < RubyDocx::Block
3
+ protected
4
+ def build_node
5
+ node = super
6
+ node.add_child RubyDocx::Paragraph.new(content, styles).build if content
7
+ node
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ class RubyDocx::TableRow < RubyDocx::Block
3
+ end
@@ -0,0 +1,11 @@
1
+ table {
2
+ width: 100%;
3
+ border: 1px solid #000000;
4
+ }
5
+ th {
6
+ text-align: center;
7
+ border: 1px solid #000000;
8
+ }
9
+ td {
10
+ border: 1px solid #000000;
11
+ }
Binary file
@@ -0,0 +1 @@
1
+ <r><cr/></r>
@@ -0,0 +1,2 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mo="http://schemas.microsoft.com/office/mac/office/2008/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14"><w:body/></w:document>
@@ -0,0 +1 @@
1
+ <hyperlink><r><t/></r></hyperlink>
@@ -0,0 +1 @@
1
+ <p/>
@@ -0,0 +1 @@
1
+ <r><t/></r>
@@ -0,0 +1 @@
1
+ <tbl/>
@@ -0,0 +1 @@
1
+ <tc/>
@@ -0,0 +1 @@
1
+ <tr/>
@@ -0,0 +1,3 @@
1
+ module RubyDocx
2
+ VERSION = "0.0.4"
3
+ end
data/ruby_docx.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ruby_docx/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "ruby_docx"
8
+ gem.version = RubyDocx::VERSION
9
+ gem.authors = ["Dmitriy Mokrushin"]
10
+ gem.email = ["dimokr@ya.ru"]
11
+ gem.description = %q{Simple html to docx convertor}
12
+ gem.summary = %q{Simple html to docx convertor}
13
+ gem.homepage = "https://github.com/HoJSim/ruby_docx"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ gem.add_dependency 'nokogiri', '>= 1.5.5'
20
+ gem.add_dependency 'css_parser'
21
+ gem.add_dependency 'rubyzip'
22
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_docx
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.4
6
+ platform: ruby
7
+ authors:
8
+ - Dmitriy Mokrushin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ version_requirements: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.5.5
22
+ requirement: !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ! '>='
26
+ - !ruby/object:Gem::Version
27
+ version: 1.5.5
28
+ type: :runtime
29
+ prerelease: false
30
+ - !ruby/object:Gem::Dependency
31
+ name: css_parser
32
+ version_requirements: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirement: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ - !ruby/object:Gem::Dependency
47
+ name: rubyzip
48
+ version_requirements: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ requirement: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ type: :runtime
61
+ prerelease: false
62
+ description: Simple html to docx convertor
63
+ email:
64
+ - dimokr@ya.ru
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - .gitignore
70
+ - Gemfile
71
+ - LICENSE.txt
72
+ - README.md
73
+ - Rakefile
74
+ - lib/ruby_docx.rb
75
+ - lib/ruby_docx/convertors/elements/html/base.rb
76
+ - lib/ruby_docx/convertors/elements/html/br.rb
77
+ - lib/ruby_docx/convertors/elements/html/header.rb
78
+ - lib/ruby_docx/convertors/elements/html/hyperlink.rb
79
+ - lib/ruby_docx/convertors/elements/html/paragraph.rb
80
+ - lib/ruby_docx/convertors/elements/html/span.rb
81
+ - lib/ruby_docx/convertors/elements/html/table.rb
82
+ - lib/ruby_docx/convertors/elements/html/td.rb
83
+ - lib/ruby_docx/convertors/elements/html/th.rb
84
+ - lib/ruby_docx/convertors/elements/html/tr.rb
85
+ - lib/ruby_docx/convertors/html.rb
86
+ - lib/ruby_docx/elements/block.rb
87
+ - lib/ruby_docx/elements/br.rb
88
+ - lib/ruby_docx/elements/document.rb
89
+ - lib/ruby_docx/elements/hyperlink.rb
90
+ - lib/ruby_docx/elements/inextensible_block.rb
91
+ - lib/ruby_docx/elements/paragraph.rb
92
+ - lib/ruby_docx/elements/row.rb
93
+ - lib/ruby_docx/elements/table.rb
94
+ - lib/ruby_docx/elements/table_column.rb
95
+ - lib/ruby_docx/elements/table_row.rb
96
+ - lib/ruby_docx/styles/default.css
97
+ - lib/ruby_docx/template.docx
98
+ - lib/ruby_docx/templates/br.xml
99
+ - lib/ruby_docx/templates/document.xml
100
+ - lib/ruby_docx/templates/hyperlink.xml
101
+ - lib/ruby_docx/templates/paragraph.xml
102
+ - lib/ruby_docx/templates/row.xml
103
+ - lib/ruby_docx/templates/table.xml
104
+ - lib/ruby_docx/templates/table_column.xml
105
+ - lib/ruby_docx/templates/table_row.xml
106
+ - lib/ruby_docx/version.rb
107
+ - ruby_docx.gemspec
108
+ homepage: https://github.com/HoJSim/ruby_docx
109
+ licenses: []
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 1.8.25
129
+ signing_key:
130
+ specification_version: 3
131
+ summary: Simple html to docx convertor
132
+ test_files: []