openxml-package 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/openxml/builder/element.rb +43 -0
- data/lib/openxml/builder/namespace.rb +13 -0
- data/lib/openxml/builder.rb +57 -10
- data/lib/openxml/part.rb +3 -5
- data/lib/openxml-package/version.rb +1 -1
- data/test/part_test.rb +71 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d6a0da91c83a3de0209c39c9d29016da44e3ffc
|
4
|
+
data.tar.gz: 08f26c9b65ec985d6b784341cd288b15f58cea8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da26c7fc3fa5e983c0a6f78ebb5149e3ca562991ba182e44d516a226451ac95522ee41a09ca8c4c1ccc6c328eac29d595c14bc06055d6fb3bb5030c6fcbe1032
|
7
|
+
data.tar.gz: 6965c0f5343a7328c78a7a6fba636dad620f9ed316e223e82a2ef6d153f79dcae22f63cd23b7c5d30ff2ba962981d32bd149a35c1532b97f896533d5843574d5
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module OpenXml
|
2
|
+
class Builder
|
3
|
+
class Element < SimpleDelegator
|
4
|
+
attr_reader :namespace
|
5
|
+
attr_accessor :parent
|
6
|
+
|
7
|
+
def initialize(*args)
|
8
|
+
super Ox::Element.new(*args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def []=(attribute, value)
|
12
|
+
namespace_def = attribute.downcase.to_s.match /^xmlns(?:\:(?<prefix>.*))?$/
|
13
|
+
add_namespace(namespace_def[:prefix], value.to_s) if namespace_def
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def namespace=(ns)
|
18
|
+
@namespace = ns
|
19
|
+
tag = name.match(/^(?:\w*?\:)?(?<tag>\w*)$/i)[:tag]
|
20
|
+
self.value = "#{namespace.prefix}:#{tag}" if namespace.is_a? OpenXml::Builder::Namespace
|
21
|
+
self.value = "#{namespace}:#{tag}" if namespace.is_a? String
|
22
|
+
end
|
23
|
+
|
24
|
+
def namespaces
|
25
|
+
@namespaces ||= []
|
26
|
+
end
|
27
|
+
alias :namespace_definitions :namespaces
|
28
|
+
|
29
|
+
def ancestors
|
30
|
+
parents = [self]
|
31
|
+
parents << parent.ancestors unless parent.nil? || !parent.respond_to?(:ancestors)
|
32
|
+
parents.flatten
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def add_namespace(prefix, uri)
|
38
|
+
namespaces << OpenXml::Builder::Namespace.new(prefix, uri)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/openxml/builder.rb
CHANGED
@@ -4,41 +4,88 @@
|
|
4
4
|
#
|
5
5
|
# This class mimics the XML Builder DSL.
|
6
6
|
require "ox"
|
7
|
+
require "openxml/builder/element"
|
8
|
+
require "openxml/builder/namespace"
|
7
9
|
|
8
10
|
module OpenXml
|
9
11
|
class Builder
|
12
|
+
attr_reader :parent
|
10
13
|
|
11
|
-
def initialize
|
12
|
-
@
|
13
|
-
|
14
|
+
def initialize(options={})
|
15
|
+
@options = {
|
16
|
+
with_xml: true,
|
17
|
+
encoding: "utf-8"
|
18
|
+
}.merge(options)
|
19
|
+
@options[:with_xml] = !!@options[:with_xml] || @options[:standalone] == :yes
|
20
|
+
|
21
|
+
@document = Ox::Document.new({version: "1.0"}.merge(@options))
|
22
|
+
@parent = @document
|
14
23
|
yield self if block_given?
|
15
24
|
end
|
16
25
|
|
17
26
|
def to_s
|
18
|
-
Ox.dump @document
|
27
|
+
Ox.dump @document, @options
|
19
28
|
end
|
20
29
|
alias :to_xml :to_s
|
21
30
|
|
31
|
+
# Adapted from Nokogiri's builder.rb
|
32
|
+
def [](ns)
|
33
|
+
if @parent != @document
|
34
|
+
@ns = @parent.namespace_definitions.find { |x| x.prefix == ns.to_s }
|
35
|
+
end
|
36
|
+
return self if @ns
|
37
|
+
|
38
|
+
@parent.ancestors.each do |a|
|
39
|
+
next if a == @document
|
40
|
+
@ns = a.namespace_definitions.find { |x| x.prefix == ns.to_s }
|
41
|
+
return self if @ns
|
42
|
+
end
|
43
|
+
|
44
|
+
@ns = { :pending => ns.to_s }
|
45
|
+
return self
|
46
|
+
end
|
47
|
+
|
22
48
|
def method_missing(tag_name, *args)
|
23
|
-
new_element =
|
24
|
-
|
49
|
+
new_element = OpenXml::Builder::Element.new(tag_name)
|
50
|
+
new_element.parent = @parent
|
51
|
+
attributes = extract_options!(args)
|
25
52
|
attributes.each do |key, value|
|
26
53
|
new_element[key] = value
|
27
54
|
end
|
28
55
|
|
56
|
+
# Adapted from Nokogiri's builder.rb
|
57
|
+
if @ns.is_a? OpenXml::Builder::Namespace
|
58
|
+
new_element.namespace = @ns
|
59
|
+
elsif @ns.is_a? Hash
|
60
|
+
new_element.namespace = new_element.namespace_definitions.find { |x| x.prefix == @ns[:pending] }
|
61
|
+
raise ArgumentError, "Namespace #{@ns[:pending]} has not been defined" if new_element.namespace.nil?
|
62
|
+
end
|
63
|
+
|
64
|
+
@ns = nil
|
65
|
+
|
29
66
|
if block_given?
|
30
67
|
begin
|
31
|
-
was_current = @
|
32
|
-
@
|
68
|
+
was_current = @parent
|
69
|
+
@parent = new_element
|
33
70
|
yield self
|
34
71
|
ensure
|
35
|
-
@
|
72
|
+
@parent = was_current
|
36
73
|
end
|
37
74
|
elsif value = args.first
|
38
75
|
new_element << value.to_s
|
39
76
|
end
|
40
77
|
|
41
|
-
@
|
78
|
+
@parent << new_element.__getobj__
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def extract_options!(args)
|
84
|
+
if args.last.is_a?(Hash) && args.last.instance_of?(Hash)
|
85
|
+
args.pop
|
86
|
+
else
|
87
|
+
{}
|
88
|
+
end
|
42
89
|
end
|
43
90
|
|
44
91
|
end
|
data/lib/openxml/part.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
|
-
require "nokogiri"
|
2
1
|
require "openxml/builder"
|
3
2
|
|
4
3
|
module OpenXml
|
5
4
|
class Part
|
6
|
-
include ::Nokogiri
|
7
5
|
|
8
|
-
def build_xml
|
9
|
-
OpenXml::Builder.new { |xml| yield xml }.to_xml
|
6
|
+
def build_xml(options={})
|
7
|
+
OpenXml::Builder.new(options) { |xml| yield xml }.to_xml
|
10
8
|
end
|
11
9
|
|
12
10
|
def build_standalone_xml(&block)
|
13
|
-
|
11
|
+
build_xml({ standalone: :yes }, &block)
|
14
12
|
end
|
15
13
|
|
16
14
|
def read
|
data/test/part_test.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "fileutils"
|
3
|
+
require "set"
|
4
|
+
|
5
|
+
class OpenXmlPartTest < ActiveSupport::TestCase
|
6
|
+
attr_reader :part, :builder
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
context "Building" do
|
11
|
+
setup do
|
12
|
+
@part = OpenXml::Part.new
|
13
|
+
end
|
14
|
+
|
15
|
+
context "Given simple xml for one part" do
|
16
|
+
setup do
|
17
|
+
@builder = @part.build_xml do |xml|
|
18
|
+
xml.document do |xml|
|
19
|
+
2.times { xml.child({ attribute: "value", other_attr: "other value" }) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
should "build the expected xml" do
|
25
|
+
assert_equal basic_xml, builder.to_s
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "Given namespaced xml for one part" do
|
30
|
+
setup do
|
31
|
+
@builder = @part.build_xml do |xml|
|
32
|
+
xml.document({ "xmlns:ns" => "some:namespace:uri" }) do
|
33
|
+
2.times { xml["ns"].child({ attribute: "value", other_attr: "other value" }) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
should "build the expected xml" do
|
39
|
+
assert_equal namespaced_xml, builder.to_s
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
|
50
|
+
def basic_xml
|
51
|
+
<<-STR
|
52
|
+
<?xml version="1.0" encoding="utf-8"?>
|
53
|
+
<document>
|
54
|
+
<child attribute="value" other_attr="other value"/>
|
55
|
+
<child attribute="value" other_attr="other value"/>
|
56
|
+
</document>
|
57
|
+
STR
|
58
|
+
end
|
59
|
+
|
60
|
+
def namespaced_xml
|
61
|
+
<<-STR
|
62
|
+
<?xml version="1.0" encoding="utf-8"?>
|
63
|
+
<document xmlns:ns="some:namespace:uri">
|
64
|
+
<ns:child attribute="value" other_attr="other value"/>
|
65
|
+
<ns:child attribute="value" other_attr="other value"/>
|
66
|
+
</document>
|
67
|
+
STR
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openxml-package
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bob Lail
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -213,6 +213,8 @@ files:
|
|
213
213
|
- lib/openxml-package.rb
|
214
214
|
- lib/openxml-package/version.rb
|
215
215
|
- lib/openxml/builder.rb
|
216
|
+
- lib/openxml/builder/element.rb
|
217
|
+
- lib/openxml/builder/namespace.rb
|
216
218
|
- lib/openxml/content_types_presets.rb
|
217
219
|
- lib/openxml/errors.rb
|
218
220
|
- lib/openxml/package.rb
|
@@ -226,6 +228,7 @@ files:
|
|
226
228
|
- openxml-package.gemspec
|
227
229
|
- test/content_types_test.rb
|
228
230
|
- test/package_test.rb
|
231
|
+
- test/part_test.rb
|
229
232
|
- test/support/sample.docx
|
230
233
|
- test/test_helper.rb
|
231
234
|
homepage: https://github.com/openxml/openxml-package
|
@@ -255,5 +258,6 @@ summary: A Ruby implementation of OpenXmlPackage
|
|
255
258
|
test_files:
|
256
259
|
- test/content_types_test.rb
|
257
260
|
- test/package_test.rb
|
261
|
+
- test/part_test.rb
|
258
262
|
- test/support/sample.docx
|
259
263
|
- test/test_helper.rb
|