openxml-docx 0.11.0.rc → 0.11.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/ci.yml +21 -0
- data/Gemfile.lock +38 -40
- data/examples/numbering +125 -0
- data/lib/openxml/docx/elements/abstract_numbering.rb +34 -0
- data/lib/openxml/docx/elements/level.rb +53 -0
- data/lib/openxml/docx/elements/level_override.rb +27 -0
- data/lib/openxml/docx/elements/numbering.rb +29 -0
- data/lib/openxml/docx/package.rb +7 -2
- data/lib/openxml/docx/parts/numbering.rb +42 -0
- data/lib/openxml/docx/properties/abstract_number_id.rb +10 -0
- data/lib/openxml/docx/properties/legal_numbering.rb +10 -0
- data/lib/openxml/docx/properties/level_alignment.rb +14 -0
- data/lib/openxml/docx/properties/level_restart.rb +10 -0
- data/lib/openxml/docx/properties/level_text.rb +14 -0
- data/lib/openxml/docx/properties/multi_level_type.rb +14 -0
- data/lib/openxml/docx/properties/number_format.rb +46 -0
- data/lib/openxml/docx/properties/start.rb +10 -0
- data/lib/openxml/docx/properties/start_override.rb +10 -0
- data/lib/openxml/docx/properties/suffix.rb +13 -0
- data/lib/openxml/docx/properties/tab.rb +1 -1
- data/lib/openxml/docx/version.rb +1 -1
- data/lib/openxml/docx.rb +2 -0
- data/lib/openxml/vml/elements/group.rb +1 -1
- data/lib/openxml/vml/elements/rectangle.rb +1 -1
- data/lib/openxml/vml/elements/rounded_rectangle.rb +1 -1
- data/openxml-docx.gemspec +2 -6
- metadata +28 -19
- data/.travis.yml +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: aef7247561ac85ebf59ce97f8a4c3de2b74e03d29881cb00257d44462adb395e
|
4
|
+
data.tar.gz: 71d28458c33a4f75f61231e235d9cc956c8b6f70e1cd7473ca7b3ea1bbfeb1b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ceb9ea15cc3af14d25fbfd44aed3146701f8914f7b17ccb82303b32dbba2837d02de3e14326533ba0b92183c365e35b767ef7a681efd3de234f1f24aa721f540
|
7
|
+
data.tar.gz: d2458309c0b8f36154ab0e8a6992d90b58a5d8bd66438db45081a8f385337808fa0de0e8c5adfe98254127d6fe4685b066cb056835ea9ebed81500df5b384d72
|
@@ -0,0 +1,21 @@
|
|
1
|
+
name: Tests
|
2
|
+
on: [push]
|
3
|
+
|
4
|
+
jobs:
|
5
|
+
ruby:
|
6
|
+
name: Ruby Tests
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
strategy:
|
9
|
+
matrix:
|
10
|
+
ruby-version: [ "2.6", "2.7" ]
|
11
|
+
|
12
|
+
steps:
|
13
|
+
- name: Checkout
|
14
|
+
uses: actions/checkout@v2
|
15
|
+
- name: Setup Ruby
|
16
|
+
uses: ruby/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
bundler-cache: true
|
19
|
+
ruby-version: ${{ matrix.ruby-version }}
|
20
|
+
- name: Run Tests
|
21
|
+
run: bundle exec rake spec
|
data/Gemfile.lock
CHANGED
@@ -1,58 +1,56 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
openxml-docx (0.11.
|
4
|
+
openxml-docx (0.11.3)
|
5
5
|
nokogiri
|
6
6
|
openxml-drawingml
|
7
7
|
openxml-package (>= 0.2.2)
|
8
|
-
ox (~> 2.
|
8
|
+
ox (~> 2.9)
|
9
9
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
coderay (1.1.
|
13
|
+
coderay (1.1.2)
|
14
14
|
diff-lcs (1.3)
|
15
|
-
docile (1.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
openxml-drawingml (0.
|
15
|
+
docile (1.3.2)
|
16
|
+
method_source (1.0.0)
|
17
|
+
mini_portile2 (2.6.1)
|
18
|
+
nokogiri (1.12.5)
|
19
|
+
mini_portile2 (~> 2.6.1)
|
20
|
+
racc (~> 1.4)
|
21
|
+
openxml-drawingml (0.2.0)
|
22
22
|
nokogiri
|
23
|
-
openxml-package (~> 0.2
|
24
|
-
openxml-package (0.
|
23
|
+
openxml-package (~> 0.3.2)
|
24
|
+
openxml-package (0.3.4)
|
25
25
|
nokogiri
|
26
26
|
ox
|
27
|
-
rubyzip
|
28
|
-
ox (2.
|
29
|
-
pry (0.
|
30
|
-
coderay (~> 1.1
|
31
|
-
method_source (~> 0
|
32
|
-
|
33
|
-
rake (
|
34
|
-
rr (1.2.
|
35
|
-
rspec (3.
|
36
|
-
rspec-core (~> 3.
|
37
|
-
rspec-expectations (~> 3.
|
38
|
-
rspec-mocks (~> 3.
|
39
|
-
rspec-core (3.
|
40
|
-
rspec-support (~> 3.
|
41
|
-
rspec-expectations (3.
|
27
|
+
rubyzip
|
28
|
+
ox (2.14.5)
|
29
|
+
pry (0.13.1)
|
30
|
+
coderay (~> 1.1)
|
31
|
+
method_source (~> 1.0)
|
32
|
+
racc (1.6.0)
|
33
|
+
rake (13.0.1)
|
34
|
+
rr (1.2.1)
|
35
|
+
rspec (3.9.0)
|
36
|
+
rspec-core (~> 3.9.0)
|
37
|
+
rspec-expectations (~> 3.9.0)
|
38
|
+
rspec-mocks (~> 3.9.0)
|
39
|
+
rspec-core (3.9.2)
|
40
|
+
rspec-support (~> 3.9.3)
|
41
|
+
rspec-expectations (3.9.2)
|
42
42
|
diff-lcs (>= 1.2.0, < 2.0)
|
43
|
-
rspec-support (~> 3.
|
44
|
-
rspec-mocks (3.
|
43
|
+
rspec-support (~> 3.9.0)
|
44
|
+
rspec-mocks (3.9.1)
|
45
45
|
diff-lcs (>= 1.2.0, < 2.0)
|
46
|
-
rspec-support (~> 3.
|
47
|
-
rspec-support (3.
|
48
|
-
rubyzip (
|
49
|
-
simplecov (0.
|
50
|
-
docile (~> 1.1
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
slop (3.6.0)
|
55
|
-
timecop (0.8.1)
|
46
|
+
rspec-support (~> 3.9.0)
|
47
|
+
rspec-support (3.9.3)
|
48
|
+
rubyzip (2.3.2)
|
49
|
+
simplecov (0.18.5)
|
50
|
+
docile (~> 1.1)
|
51
|
+
simplecov-html (~> 0.11)
|
52
|
+
simplecov-html (0.12.2)
|
53
|
+
timecop (0.9.1)
|
56
54
|
|
57
55
|
PLATFORMS
|
58
56
|
ruby
|
@@ -67,4 +65,4 @@ DEPENDENCIES
|
|
67
65
|
timecop
|
68
66
|
|
69
67
|
BUNDLED WITH
|
70
|
-
1.
|
68
|
+
2.1.4
|
data/examples/numbering
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# This example shows how to use the "numbering" system to describe how a list
|
4
|
+
# should be numbered within a document.
|
5
|
+
|
6
|
+
# require "rails" # workaround: openxml-package uses `extract_options!`
|
7
|
+
$:.push Dir.pwd + "/lib"
|
8
|
+
require "openxml/docx"
|
9
|
+
|
10
|
+
package = OpenXml::Docx::Package.new
|
11
|
+
|
12
|
+
include OpenXml::Docx::Elements
|
13
|
+
|
14
|
+
# Each list item is a paragraph. A helper function to create paragraphs in the
|
15
|
+
# final document:
|
16
|
+
def create_paragraph(content)
|
17
|
+
text = Text.new(content)
|
18
|
+
run = Run.new
|
19
|
+
run << text
|
20
|
+
paragraph = Paragraph.new
|
21
|
+
paragraph << run
|
22
|
+
paragraph
|
23
|
+
end
|
24
|
+
|
25
|
+
# First up, create a style for the list paragraph
|
26
|
+
list_style = OpenXml::Docx::Style.new :paragraph
|
27
|
+
list_style.id = 'ListParagraph'
|
28
|
+
list_style.style_name = 'List Paragraph'
|
29
|
+
list_style.paragraph.indentation.left = 720
|
30
|
+
list_style.paragraph.contextual_spacing = true
|
31
|
+
|
32
|
+
package.styles << list_style
|
33
|
+
|
34
|
+
# Each list needs a numbering within the numbering part of the document.
|
35
|
+
|
36
|
+
# Create an abstract numbering that describes a bulleted list:
|
37
|
+
abstract_numbering = AbstractNumbering.new(0)
|
38
|
+
|
39
|
+
# Each numbering can have multiple levels. Define the first level as a bulleted list:
|
40
|
+
level_0 = Level.new
|
41
|
+
level_0.level = 0
|
42
|
+
level_0.start = 1
|
43
|
+
level_0.number_format = :bullet
|
44
|
+
# This is the default bullet Word uses
|
45
|
+
level_0.level_text = "\u00B7".encode("UTF-8")
|
46
|
+
level_0.alignment = :left
|
47
|
+
level_0.character_style.font.ascii = "Symbol"
|
48
|
+
level_0.character_style.font.high_ansi = "Symbol"
|
49
|
+
level_0.character_style.font.hint = :default
|
50
|
+
level_0.paragraph_style.indentation.left = 720
|
51
|
+
level_0.paragraph_style.indentation.hanging = 360
|
52
|
+
abstract_numbering << level_0
|
53
|
+
|
54
|
+
package.numbering << abstract_numbering
|
55
|
+
|
56
|
+
package.document << create_paragraph("Example of adding a list to a document")
|
57
|
+
|
58
|
+
list_item = create_paragraph("First list item")
|
59
|
+
list_item.paragraph_style = 'ListParagraph'
|
60
|
+
# Say that this list item belongs to our first abstract numbering:
|
61
|
+
list_item.numbering.level = 0
|
62
|
+
list_item.numbering.id = 1
|
63
|
+
# This ID is NOT the numbering ID we created above. Instead, it is a concrete
|
64
|
+
# numbering that defines an instance of a list in the document. To link it to
|
65
|
+
# our existing abstract numbering, we need to create a concrete numbering
|
66
|
+
# instance:
|
67
|
+
|
68
|
+
numbering = Numbering.new(1)
|
69
|
+
# Setting the abstract numbering ID here links it to a given abstract numbering
|
70
|
+
numbering.abstract_numbering_id = 0
|
71
|
+
|
72
|
+
# And add this number to the numbering
|
73
|
+
package.numbering << numbering
|
74
|
+
|
75
|
+
# All that allows us to finally add the item to the document.
|
76
|
+
|
77
|
+
package.document << list_item
|
78
|
+
|
79
|
+
list_item = create_paragraph("Second list item")
|
80
|
+
list_item.paragraph_style = 'ListParagraph'
|
81
|
+
|
82
|
+
# The second list item is simpler: we can reuse the numbering we used above.
|
83
|
+
list_item.numbering.level = 0
|
84
|
+
list_item.numbering.id = 1
|
85
|
+
|
86
|
+
package.document << list_item
|
87
|
+
|
88
|
+
package.document << create_paragraph("Outline Example")
|
89
|
+
|
90
|
+
# Lists with numbers are a bit more complicated. The following creates an
|
91
|
+
# "outline" list:
|
92
|
+
|
93
|
+
abstract_numbering = AbstractNumbering.new(1)
|
94
|
+
|
95
|
+
[:upperRoman, :upperLetter, :decimal, :lowerLetter, :lowerRoman, :decimal, :lowerLetter].each.with_index do |number_format, index|
|
96
|
+
level = Level.new
|
97
|
+
level.level = index
|
98
|
+
level.start = 1
|
99
|
+
level.number_format = number_format
|
100
|
+
# Level text replacement tokens are always 1-based, while the levels
|
101
|
+
# themselves are 0-based
|
102
|
+
level.level_text = index < 4 ? "%#{index+1}." : "(%#{index+1})"
|
103
|
+
level.alignment = :left
|
104
|
+
level.paragraph_style.indentation.left = (360 * (index+1))
|
105
|
+
level.paragraph_style.indentation.hanging = 360
|
106
|
+
abstract_numbering << level
|
107
|
+
end
|
108
|
+
|
109
|
+
package.numbering << abstract_numbering
|
110
|
+
|
111
|
+
numbering = Numbering.new(2)
|
112
|
+
numbering.abstract_numbering_id = 1
|
113
|
+
|
114
|
+
package.numbering << numbering
|
115
|
+
|
116
|
+
(0..6).each do |level|
|
117
|
+
list_item = create_paragraph("Level #{level+1}")
|
118
|
+
list_item.paragraph_style = 'ListParagraph'
|
119
|
+
list_item.numbering.level = level
|
120
|
+
list_item.numbering.id = 2
|
121
|
+
package.document << list_item
|
122
|
+
end
|
123
|
+
|
124
|
+
filename = "numbering_example.docx"
|
125
|
+
package.save File.expand_path("#{filename}")
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module OpenXml
|
2
|
+
module Docx
|
3
|
+
module Elements
|
4
|
+
class AbstractNumbering < OpenXml::Docx::Element
|
5
|
+
include HasChildren, HasProperties
|
6
|
+
tag :abstractNum
|
7
|
+
|
8
|
+
def initialize(id)
|
9
|
+
super()
|
10
|
+
self.id = id
|
11
|
+
end
|
12
|
+
# TODO: child levels is limited to a max of 9
|
13
|
+
|
14
|
+
with_namespace :w do
|
15
|
+
attribute :id, expects: :integer, displays_as: :abstractNumId#, required: true
|
16
|
+
end
|
17
|
+
|
18
|
+
# value_property :nsid - this is a UI property and likely not worth implementing
|
19
|
+
value_property :multi_level_type
|
20
|
+
# value_property :tmpl - this is a UI property and likely not worth implementing
|
21
|
+
# value_property :name
|
22
|
+
# value_property :style_link
|
23
|
+
# value_property :num_style_link
|
24
|
+
|
25
|
+
def property_xml(xml)
|
26
|
+
props = properties.keys.map(&method(:send)).compact
|
27
|
+
return if props.none?(&:render?)
|
28
|
+
|
29
|
+
props.each { |prop| prop.to_xml(xml) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module OpenXml
|
2
|
+
module Docx
|
3
|
+
module Elements
|
4
|
+
class Level < OpenXml::Docx::Element
|
5
|
+
include HasChildren, HasProperties
|
6
|
+
tag :lvl
|
7
|
+
|
8
|
+
with_namespace :w do
|
9
|
+
attribute :level, expects: :integer, displays_as: :ilvl # required
|
10
|
+
# tplc is an entirely opaque "Word template code" and is
|
11
|
+
# "application-specific" according to the spec
|
12
|
+
attribute :template_code, expects: :long_hex_number, displays_as: :tplc
|
13
|
+
attribute :tentative, expects: :boolean
|
14
|
+
end
|
15
|
+
|
16
|
+
value_property :start
|
17
|
+
value_property :number_format
|
18
|
+
value_property :level_restart
|
19
|
+
value_property :associated_paragraph_style, as: :paragraph_style
|
20
|
+
value_property :legal_numbering
|
21
|
+
value_property :suffix
|
22
|
+
value_property :level_text
|
23
|
+
# TODO: Add pic_bullet support (this refers to an element that isn't
|
24
|
+
# implemented in the Numbering part)
|
25
|
+
# value_property :lvl_pic_bullet_id
|
26
|
+
value_property :alignment, as: :level_alignment
|
27
|
+
|
28
|
+
def paragraph_style
|
29
|
+
@paragraph_style ||= Paragraph.new
|
30
|
+
end
|
31
|
+
|
32
|
+
def character_style
|
33
|
+
@character_style ||= Run.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def property_xml(xml)
|
37
|
+
props = properties.keys.map(&method(:send)).compact
|
38
|
+
return if props.none?(&:render?)
|
39
|
+
|
40
|
+
props.each { |prop| prop.to_xml(xml) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_xml(xml)
|
44
|
+
xml["w"].public_send(tag, xml_attributes) {
|
45
|
+
property_xml(xml)
|
46
|
+
@paragraph_style.property_xml(xml) unless @paragraph_style.nil?
|
47
|
+
@character_style.property_xml(xml) unless @character_style.nil?
|
48
|
+
}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module OpenXml
|
2
|
+
module Docx
|
3
|
+
module Elements
|
4
|
+
class LevelOverride < OpenXml::Docx::Element
|
5
|
+
include HasChildren, HasProperties
|
6
|
+
tag :lvlOverride
|
7
|
+
|
8
|
+
with_namespace :w do
|
9
|
+
attribute :level, expects: :integer, displays_as: :ilvl # required
|
10
|
+
end
|
11
|
+
|
12
|
+
value_property :start_override
|
13
|
+
|
14
|
+
def override
|
15
|
+
@override ||= Level.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_xml(xml)
|
19
|
+
xml["w"].public_send(tag, xml_attributes) {
|
20
|
+
start_override.to_xml(xml)
|
21
|
+
@override.to_xml(xml) unless @override.nil?
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module OpenXml
|
2
|
+
module Docx
|
3
|
+
module Elements
|
4
|
+
class Numbering < OpenXml::Docx::Element
|
5
|
+
include HasChildren, HasProperties
|
6
|
+
tag :num
|
7
|
+
|
8
|
+
def initialize(id)
|
9
|
+
super()
|
10
|
+
self.id = id
|
11
|
+
end
|
12
|
+
# TODO: child lvlOverride is limited to 9
|
13
|
+
|
14
|
+
with_namespace :w do
|
15
|
+
attribute :id, expects: :integer, displays_as: :numId#, required: true
|
16
|
+
end
|
17
|
+
|
18
|
+
value_property :abstract_numbering_id
|
19
|
+
|
20
|
+
def property_xml(xml)
|
21
|
+
props = properties.keys.map(&method(:send)).compact
|
22
|
+
return if props.none?(&:render?)
|
23
|
+
|
24
|
+
props.each { |prop| prop.to_xml(xml) }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/openxml/docx/package.rb
CHANGED
@@ -10,6 +10,7 @@ module OpenXml
|
|
10
10
|
:footers,
|
11
11
|
:styles,
|
12
12
|
:fonts,
|
13
|
+
:numbering,
|
13
14
|
:image_names
|
14
15
|
|
15
16
|
content_types do
|
@@ -23,6 +24,7 @@ module OpenXml
|
|
23
24
|
override "/word/styles.xml", TYPE_STYLES
|
24
25
|
override "/word/settings.xml", TYPE_SETTINGS
|
25
26
|
override "/word/fontTable.xml", TYPE_FONT_TABLE
|
27
|
+
override "/word/numbering.xml", TYPE_NUMBERING
|
26
28
|
end
|
27
29
|
|
28
30
|
def initialize
|
@@ -32,6 +34,7 @@ module OpenXml
|
|
32
34
|
@settings = OpenXml::Docx::Parts::Settings.new
|
33
35
|
@styles = OpenXml::Docx::Parts::Styles.new
|
34
36
|
@fonts = OpenXml::Docx::Parts::Fonts.new
|
37
|
+
@numbering = OpenXml::Docx::Parts::Numbering.new
|
35
38
|
@document = OpenXml::Docx::Parts::Document.new
|
36
39
|
@headers = []
|
37
40
|
@footers = []
|
@@ -40,6 +43,7 @@ module OpenXml
|
|
40
43
|
document.relationships.add_relationship REL_STYLES, "styles.xml"
|
41
44
|
document.relationships.add_relationship REL_SETTINGS, "settings.xml"
|
42
45
|
document.relationships.add_relationship REL_FONT_TABLE, "fontTable.xml"
|
46
|
+
document.relationships.add_relationship REL_NUMBERING, "numbering.xml"
|
43
47
|
|
44
48
|
add_part "word/_rels/document.xml.rels", document.relationships
|
45
49
|
add_part "word/_rels/fontTable.xml.rels", fonts.relationships
|
@@ -47,6 +51,7 @@ module OpenXml
|
|
47
51
|
add_part "word/settings.xml", settings
|
48
52
|
add_part "word/styles.xml", styles
|
49
53
|
add_part "word/fontTable.xml", fonts
|
54
|
+
add_part "word/numbering.xml", numbering
|
50
55
|
end
|
51
56
|
|
52
57
|
def embed_truetype_font(path: nil, name: nil)
|
@@ -97,7 +102,7 @@ module OpenXml
|
|
97
102
|
def add_header(header)
|
98
103
|
headers << header
|
99
104
|
header_name = "header#{headers.count}.xml"
|
100
|
-
|
105
|
+
content_types.add_override "/word/#{header_name}", TYPE_HEADER
|
101
106
|
add_part "word/#{header_name}", header
|
102
107
|
add_part "word/_rels/#{header_name}.rels", header.relationships
|
103
108
|
relationship = document.relationships.add_relationship REL_HEADER, header_name
|
@@ -107,7 +112,7 @@ module OpenXml
|
|
107
112
|
def add_footer(footer)
|
108
113
|
footers << footer
|
109
114
|
footer_name = "footer#{footers.count}.xml"
|
110
|
-
|
115
|
+
content_types.add_override "/word/#{footer_name}", TYPE_FOOTER
|
111
116
|
add_part "word/#{footer_name}", footer
|
112
117
|
add_part "word/_rels/#{footer_name}.rels", footer.relationships
|
113
118
|
relationship = document.relationships.add_relationship REL_FOOTER, footer_name
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module OpenXml
|
2
|
+
module Docx
|
3
|
+
module Parts
|
4
|
+
class Numbering < OpenXml::Part
|
5
|
+
include RootNamespaces
|
6
|
+
|
7
|
+
attr_reader :abstractNumbers, :numbers
|
8
|
+
|
9
|
+
use_namespaces :w
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@abstractNumbers = []
|
13
|
+
@numbers = []
|
14
|
+
@relationships = OpenXml::Parts::Rels.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def <<(child)
|
18
|
+
if child.is_a?(OpenXml::Docx::Elements::AbstractNumbering)
|
19
|
+
abstractNumbers << child
|
20
|
+
elsif child.is_a?(OpenXml::Docx::Elements::Numbering)
|
21
|
+
numbers << child
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def count
|
26
|
+
abstractNums.count
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_xml
|
30
|
+
build_standalone_xml do |xml|
|
31
|
+
xml.numbering(root_namespaces) {
|
32
|
+
xml.parent.namespace = :w
|
33
|
+
abstractNumbers.each { |num| num.to_xml(xml) }
|
34
|
+
numbers.each { |number| number.to_xml(xml) }
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module OpenXml
|
2
|
+
module Docx
|
3
|
+
module Properties
|
4
|
+
class LevelAlignment < ValueProperty
|
5
|
+
tag :lvlJc
|
6
|
+
|
7
|
+
def ok_values
|
8
|
+
%i(both center distribute end highKashida lowKashida mediumKashida numTab start thaiDistribute left right)
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module OpenXml
|
2
|
+
module Docx
|
3
|
+
module Properties
|
4
|
+
class NumberFormat < ValueProperty
|
5
|
+
tag :numFmt
|
6
|
+
|
7
|
+
# TODO: Also allow "format" when "custom" is the number format
|
8
|
+
|
9
|
+
def ok_values
|
10
|
+
%i(decimal upperRoman lowerRoman upperLetter lowerLetter ordinal
|
11
|
+
cardinalText ordinalText hex chicago ideographDigital japaneseCounting
|
12
|
+
aiueo iroha decimalFullWidth decimalHalfWidth japaneseLegal
|
13
|
+
japaneseDigitalTenThousand decimalEnclosedCircle decimalFullWidth2
|
14
|
+
aiueoFullWidth irohaFullWidth decimalZero bullet ganada chosung
|
15
|
+
decimalEnclosedFullstop
|
16
|
+
decimalEnclosedParen
|
17
|
+
decimalEnclosedCircleChinese
|
18
|
+
ideographEnclosedCircle
|
19
|
+
ideographTraditional
|
20
|
+
ideographZodiac
|
21
|
+
ideographZodiacTraditional
|
22
|
+
taiwaneseCounting
|
23
|
+
ideographLegalTraditional
|
24
|
+
taiwaneseCountingThousand
|
25
|
+
taiwaneseDigital
|
26
|
+
chineseCounting
|
27
|
+
chineseLegalSimplified
|
28
|
+
chineseCountingThousand
|
29
|
+
koreanDigital
|
30
|
+
koreanCounting
|
31
|
+
koreanLegal
|
32
|
+
koreanDigital2
|
33
|
+
vietnameseCounting
|
34
|
+
russianLower russianUpper
|
35
|
+
none numberInDash
|
36
|
+
hebrew1 hebrew2
|
37
|
+
arabicAlpha arabicAbjad
|
38
|
+
hindiVowels hindiConsonants hindiNumbers hindiCounting
|
39
|
+
thaiLetters thaiNumbers thaiCounting
|
40
|
+
bahtText
|
41
|
+
dollarText custom)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -4,7 +4,7 @@ module OpenXml
|
|
4
4
|
class Tab < BaseProperty
|
5
5
|
attr_reader :position, :type, :leader
|
6
6
|
|
7
|
-
VALID_TYPES = %i(bar center clear decimal end num start)
|
7
|
+
VALID_TYPES = %i(bar center clear decimal end num start left right)
|
8
8
|
VALID_LEADERS = [nil, :dot, :heavy, :hyphen, :middleDot, :none, :underscore]
|
9
9
|
|
10
10
|
def initialize(position, type, leader=nil)
|
data/lib/openxml/docx/version.rb
CHANGED
data/lib/openxml/docx.rb
CHANGED
@@ -7,6 +7,7 @@ module OpenXml
|
|
7
7
|
REL_FOOTER = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer".freeze
|
8
8
|
REL_FONT_TABLE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable".freeze
|
9
9
|
REL_FONT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/font".freeze
|
10
|
+
REL_NUMBERING = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering".freeze
|
10
11
|
REL_IMAGE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image".freeze
|
11
12
|
|
12
13
|
TYPE_STYLES = "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml".freeze
|
@@ -14,6 +15,7 @@ module OpenXml
|
|
14
15
|
TYPE_HEADER = "application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml".freeze
|
15
16
|
TYPE_FOOTER = "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml".freeze
|
16
17
|
TYPE_FONT_TABLE = "application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml".freeze
|
18
|
+
TYPE_NUMBERING = "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml".freeze
|
17
19
|
TYPE_XML = "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml".freeze
|
18
20
|
TYPE_OBSCURED_FONT = "application/vnd.openxmlformats-officedocument.obfuscatedFont".freeze
|
19
21
|
TYPE_IMAGE = {
|
@@ -61,7 +61,7 @@ module OpenXml
|
|
61
61
|
|
62
62
|
def valid_diagram_layout(value)
|
63
63
|
message = "Invalid diagram layout. Must be a single digit between 0 and 3 inclusive"
|
64
|
-
raise ArgumentError, message unless (value.is_a?(
|
64
|
+
raise ArgumentError, message unless (value.is_a?(Integer) && (0..3).include?(value)) || value =~ /^[0-3]$/
|
65
65
|
end
|
66
66
|
|
67
67
|
end
|
@@ -76,7 +76,7 @@ module OpenXml
|
|
76
76
|
|
77
77
|
def valid_diagram_layout(value)
|
78
78
|
message = "Invalid diagram layout. Must be a single digit between 0 and 3 inclusive"
|
79
|
-
raise ArgumentError, message unless (value.is_a?(
|
79
|
+
raise ArgumentError, message unless (value.is_a?(Integer) && (0..3).include?(value)) || value =~ /^[0-3]$/
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
@@ -82,7 +82,7 @@ module OpenXml
|
|
82
82
|
|
83
83
|
def valid_diagram_layout(value)
|
84
84
|
message = "Invalid diagram layout. Must be a single digit between 0 and 3 inclusive"
|
85
|
-
raise ArgumentError, message unless (value.is_a?(
|
85
|
+
raise ArgumentError, message unless (value.is_a?(Integer) && (0..3).include?(value)) || value =~ /^[0-3]$/
|
86
86
|
end
|
87
87
|
|
88
88
|
end
|
data/openxml-docx.gemspec
CHANGED
@@ -19,16 +19,12 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.required_ruby_version = "
|
22
|
+
spec.required_ruby_version = ">= 2.0"
|
23
23
|
|
24
24
|
spec.add_dependency "nokogiri"
|
25
25
|
spec.add_dependency "openxml-package", ">= 0.2.2"
|
26
26
|
spec.add_dependency "openxml-drawingml"
|
27
|
-
|
28
|
-
# Ox 2.4.10 changed how special characters are encoded,
|
29
|
-
# but a few of openxml-docx's tests rely on the previous
|
30
|
-
# behavior. Remove this line after refactoring those tests.
|
31
|
-
spec.add_dependency "ox", "~> 2.4.3", "< 2.4.10"
|
27
|
+
spec.add_dependency "ox", "~> 2.9"
|
32
28
|
|
33
29
|
spec.add_development_dependency "pry"
|
34
30
|
spec.add_development_dependency "rspec"
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openxml-docx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gene Doyel
|
8
8
|
- Bob Lail
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-10-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -59,20 +59,14 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 2.
|
63
|
-
- - "<"
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: 2.4.10
|
62
|
+
version: '2.9'
|
66
63
|
type: :runtime
|
67
64
|
prerelease: false
|
68
65
|
version_requirements: !ruby/object:Gem::Requirement
|
69
66
|
requirements:
|
70
67
|
- - "~>"
|
71
68
|
- !ruby/object:Gem::Version
|
72
|
-
version: 2.
|
73
|
-
- - "<"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 2.4.10
|
69
|
+
version: '2.9'
|
76
70
|
- !ruby/object:Gem::Dependency
|
77
71
|
name: pry
|
78
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -165,8 +159,8 @@ executables: []
|
|
165
159
|
extensions: []
|
166
160
|
extra_rdoc_files: []
|
167
161
|
files:
|
162
|
+
- ".github/workflows/ci.yml"
|
168
163
|
- ".gitignore"
|
169
|
-
- ".travis.yml"
|
170
164
|
- Gemfile
|
171
165
|
- Gemfile.lock
|
172
166
|
- LICENSE.txt
|
@@ -178,6 +172,7 @@ files:
|
|
178
172
|
- examples/booklet-printing
|
179
173
|
- examples/drawing-ml
|
180
174
|
- examples/image-embedding
|
175
|
+
- examples/numbering
|
181
176
|
- examples/ochanomizu.jpg
|
182
177
|
- examples/table
|
183
178
|
- lib/openxml-docx.rb
|
@@ -185,6 +180,7 @@ files:
|
|
185
180
|
- lib/openxml/docx/element.rb
|
186
181
|
- lib/openxml/docx/elements.rb
|
187
182
|
- lib/openxml/docx/elements/absolute_position_tab.rb
|
183
|
+
- lib/openxml/docx/elements/abstract_numbering.rb
|
188
184
|
- lib/openxml/docx/elements/background.rb
|
189
185
|
- lib/openxml/docx/elements/bidi_embed.rb
|
190
186
|
- lib/openxml/docx/elements/bidi_override.rb
|
@@ -217,6 +213,8 @@ files:
|
|
217
213
|
- lib/openxml/docx/elements/grid_column.rb
|
218
214
|
- lib/openxml/docx/elements/group_shape.rb
|
219
215
|
- lib/openxml/docx/elements/last_rendered_page_break.rb
|
216
|
+
- lib/openxml/docx/elements/level.rb
|
217
|
+
- lib/openxml/docx/elements/level_override.rb
|
220
218
|
- lib/openxml/docx/elements/long_day.rb
|
221
219
|
- lib/openxml/docx/elements/long_month.rb
|
222
220
|
- lib/openxml/docx/elements/long_year.rb
|
@@ -224,6 +222,7 @@ files:
|
|
224
222
|
- lib/openxml/docx/elements/markup_compatibility_choice.rb
|
225
223
|
- lib/openxml/docx/elements/markup_compatibility_fallback.rb
|
226
224
|
- lib/openxml/docx/elements/nonbreaking_hyphen.rb
|
225
|
+
- lib/openxml/docx/elements/numbering.rb
|
227
226
|
- lib/openxml/docx/elements/optional_hyphen.rb
|
228
227
|
- lib/openxml/docx/elements/page_number.rb
|
229
228
|
- lib/openxml/docx/elements/paper_source.rb
|
@@ -277,9 +276,11 @@ files:
|
|
277
276
|
- lib/openxml/docx/parts/fonts.rb
|
278
277
|
- lib/openxml/docx/parts/footer.rb
|
279
278
|
- lib/openxml/docx/parts/header.rb
|
279
|
+
- lib/openxml/docx/parts/numbering.rb
|
280
280
|
- lib/openxml/docx/parts/settings.rb
|
281
281
|
- lib/openxml/docx/parts/styles.rb
|
282
282
|
- lib/openxml/docx/properties.rb
|
283
|
+
- lib/openxml/docx/properties/abstract_number_id.rb
|
283
284
|
- lib/openxml/docx/properties/alignment.rb
|
284
285
|
- lib/openxml/docx/properties/auto_adjust_right_indent.rb
|
285
286
|
- lib/openxml/docx/properties/auto_space_de.rb
|
@@ -342,14 +343,20 @@ files:
|
|
342
343
|
- lib/openxml/docx/properties/language.rb
|
343
344
|
- lib/openxml/docx/properties/latent_styles.rb
|
344
345
|
- lib/openxml/docx/properties/latent_styles_exception.rb
|
346
|
+
- lib/openxml/docx/properties/legal_numbering.rb
|
347
|
+
- lib/openxml/docx/properties/level_alignment.rb
|
348
|
+
- lib/openxml/docx/properties/level_restart.rb
|
349
|
+
- lib/openxml/docx/properties/level_text.rb
|
345
350
|
- lib/openxml/docx/properties/line_numbering.rb
|
346
351
|
- lib/openxml/docx/properties/linked_style.rb
|
347
352
|
- lib/openxml/docx/properties/manual_width.rb
|
348
353
|
- lib/openxml/docx/properties/math.rb
|
349
354
|
- lib/openxml/docx/properties/mirror_indent.rb
|
355
|
+
- lib/openxml/docx/properties/multi_level_type.rb
|
350
356
|
- lib/openxml/docx/properties/next_style.rb
|
351
357
|
- lib/openxml/docx/properties/no_proof.rb
|
352
358
|
- lib/openxml/docx/properties/no_wrap.rb
|
359
|
+
- lib/openxml/docx/properties/number_format.rb
|
353
360
|
- lib/openxml/docx/properties/numbering.rb
|
354
361
|
- lib/openxml/docx/properties/on_off_property.rb
|
355
362
|
- lib/openxml/docx/properties/outline.rb
|
@@ -386,6 +393,8 @@ files:
|
|
386
393
|
- lib/openxml/docx/properties/snap_to_grid.rb
|
387
394
|
- lib/openxml/docx/properties/spacing.rb
|
388
395
|
- lib/openxml/docx/properties/spec_vanish.rb
|
396
|
+
- lib/openxml/docx/properties/start.rb
|
397
|
+
- lib/openxml/docx/properties/start_override.rb
|
389
398
|
- lib/openxml/docx/properties/strikethrough.rb
|
390
399
|
- lib/openxml/docx/properties/string_property.rb
|
391
400
|
- lib/openxml/docx/properties/style.rb
|
@@ -393,6 +402,7 @@ files:
|
|
393
402
|
- lib/openxml/docx/properties/style_auto_redefinition.rb
|
394
403
|
- lib/openxml/docx/properties/style_lock.rb
|
395
404
|
- lib/openxml/docx/properties/style_name.rb
|
405
|
+
- lib/openxml/docx/properties/suffix.rb
|
396
406
|
- lib/openxml/docx/properties/supress_auto_hyphens.rb
|
397
407
|
- lib/openxml/docx/properties/supress_line_numbers.rb
|
398
408
|
- lib/openxml/docx/properties/supress_overlap.rb
|
@@ -452,24 +462,23 @@ homepage: https://github.com/openxml/openxml-docx
|
|
452
462
|
licenses:
|
453
463
|
- MIT
|
454
464
|
metadata: {}
|
455
|
-
post_install_message:
|
465
|
+
post_install_message:
|
456
466
|
rdoc_options: []
|
457
467
|
require_paths:
|
458
468
|
- lib
|
459
469
|
required_ruby_version: !ruby/object:Gem::Requirement
|
460
470
|
requirements:
|
461
|
-
- - "
|
471
|
+
- - ">="
|
462
472
|
- !ruby/object:Gem::Version
|
463
473
|
version: '2.0'
|
464
474
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
465
475
|
requirements:
|
466
|
-
- - "
|
476
|
+
- - ">="
|
467
477
|
- !ruby/object:Gem::Version
|
468
|
-
version:
|
478
|
+
version: '0'
|
469
479
|
requirements: []
|
470
|
-
|
471
|
-
|
472
|
-
signing_key:
|
480
|
+
rubygems_version: 3.1.6
|
481
|
+
signing_key:
|
473
482
|
specification_version: 4
|
474
483
|
summary: Implements the Office Open XML spec for creating WordprocessingML documents
|
475
484
|
test_files: []
|