goldendocx 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +8 -2
- data/Gemfile.lock +3 -1
- data/README.md +10 -2
- data/Rakefile +14 -3
- data/demo/templates/generate_codes.rb +10 -0
- data/demo/templates/xml_to_class.rb +91 -0
- data/demo/texts/append_plain_text.rb +1 -1
- data/demo/texts/append_styled_text.rb +1 -2
- data/demo/texts/create_text.rb +14 -0
- data/lib/extensions/active_support_extensions.rb +16 -0
- data/lib/extensions/nokogiri_extensions.rb +41 -0
- data/lib/extensions/ox_extensions.rb +35 -0
- data/lib/extensions/xml_serialize_extensions.rb +45 -0
- data/lib/goldendocx/components/properties/font_property.rb +19 -0
- data/lib/goldendocx/components/properties/language_property.rb +18 -0
- data/lib/goldendocx/components/properties/run_property.rb +2 -0
- data/lib/goldendocx/content_types/default.rb +2 -6
- data/lib/goldendocx/content_types/override.rb +2 -6
- data/lib/goldendocx/document.rb +9 -28
- data/lib/goldendocx/documents/body.rb +20 -11
- data/lib/goldendocx/documents/document.rb +2 -4
- data/lib/goldendocx/documents/latent_styles.rb +12 -0
- data/lib/goldendocx/documents/properties/default_style_property.rb +17 -0
- data/lib/goldendocx/documents/properties/page_margin_property.rb +37 -0
- data/lib/goldendocx/documents/properties/page_size_property.rb +17 -0
- data/lib/goldendocx/documents/properties/paragraph_default_style_property.rb +16 -0
- data/lib/goldendocx/documents/properties/run_default_style_property.rb +22 -0
- data/lib/goldendocx/documents/properties/section_property.rb +17 -0
- data/lib/goldendocx/documents/properties/style_name_property.rb +16 -0
- data/lib/goldendocx/documents/properties.rb +12 -0
- data/lib/goldendocx/documents/settings.rb +23 -0
- data/lib/goldendocx/documents/style.rb +10 -10
- data/lib/goldendocx/documents/styles.rb +9 -33
- data/lib/goldendocx/docx.rb +55 -12
- data/lib/goldendocx/element.rb +33 -140
- data/lib/goldendocx/has_associations.rb +52 -0
- data/lib/goldendocx/has_attributes.rb +67 -0
- data/lib/goldendocx/has_children.rb +116 -0
- data/lib/goldendocx/{documents → models}/relationship.rb +1 -1
- data/lib/goldendocx/{documents → models}/relationships.rb +4 -12
- data/lib/goldendocx/models.rb +10 -0
- data/lib/goldendocx/parts/app.rb +46 -0
- data/lib/goldendocx/parts/content_types.rb +16 -30
- data/lib/goldendocx/parts/core.rb +46 -0
- data/lib/goldendocx/parts/documents.rb +26 -13
- data/lib/goldendocx/parts/properties/created_at_property.rb +17 -0
- data/lib/goldendocx/parts/properties/creator_property.rb +16 -0
- data/lib/goldendocx/parts/properties/revision_property.rb +16 -0
- data/lib/goldendocx/parts/properties/updated_at_property.rb +17 -0
- data/lib/goldendocx/parts/properties/updater_property.rb +16 -0
- data/lib/goldendocx/parts/properties.rb +12 -0
- data/lib/goldendocx/tables/row.rb +1 -1
- data/lib/goldendocx/version.rb +1 -1
- data/lib/goldendocx/xml_serializers/nokogiri.rb +30 -22
- data/lib/goldendocx/xml_serializers/ox.rb +10 -20
- data/lib/goldendocx.rb +14 -2
- metadata +51 -7
- data/lib/goldendocx/documents/element.rb +0 -23
- data/lib/goldendocx/documents/unparsed_style.rb +0 -17
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module HasAttributes
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
class_attribute :attributes, instance_accessor: false, default: {}
|
9
|
+
|
10
|
+
def unparsed_attributes
|
11
|
+
@unparsed_attributes ||= {}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class_methods do
|
16
|
+
# alias_name: nil
|
17
|
+
# readonly: false
|
18
|
+
# default: nil
|
19
|
+
# namespace: nil
|
20
|
+
# setter: nil
|
21
|
+
def attribute(name, **options)
|
22
|
+
named = name.to_s
|
23
|
+
attributes[named] = {
|
24
|
+
alias_name: options[:alias_name],
|
25
|
+
default: options[:default],
|
26
|
+
namespace: options[:namespace],
|
27
|
+
method: options[:method]
|
28
|
+
}.compact
|
29
|
+
|
30
|
+
readonly = options[:readonly] || false
|
31
|
+
if readonly
|
32
|
+
attr_reader named
|
33
|
+
elsif options[:method]
|
34
|
+
attr_writer named
|
35
|
+
else
|
36
|
+
attr_accessor named
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def attributes
|
42
|
+
self.class.attributes.each_with_object({}) do |(name, options), result|
|
43
|
+
value = public_send(options[:method] || name) || options[:default]
|
44
|
+
next if value.nil?
|
45
|
+
|
46
|
+
key = [options[:namespace], options[:alias_name] || name].compact.join(':')
|
47
|
+
result[key] = value
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def read_attributes(node)
|
52
|
+
node_attributes = node.attributes_hash
|
53
|
+
|
54
|
+
attributes = self.class.attributes.each_with_object({}) do |(name, options), result|
|
55
|
+
attribute_tag = [options[:namespace], (options[:alias_name] || name)].compact.join(':')
|
56
|
+
result[name] = node_attributes.delete(attribute_tag)
|
57
|
+
end
|
58
|
+
assign_attributes(**attributes)
|
59
|
+
|
60
|
+
unparsed_attributes.update(node_attributes)
|
61
|
+
end
|
62
|
+
|
63
|
+
def assign_attributes(**attributes)
|
64
|
+
attributes.each { |key, value| send("#{key}=", value) if respond_to?("#{key}=") }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'goldendocx/has_attributes'
|
4
|
+
|
5
|
+
module Goldendocx
|
6
|
+
module HasChildren
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
class_attribute :children, instance_accessor: false, default: {}
|
11
|
+
|
12
|
+
def unparsed_children
|
13
|
+
@unparsed_children ||= []
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
def embeds_one(name, class_name:, auto_build: false)
|
19
|
+
warning_naming_suggestion(__method__, name, name.to_s.singularize)
|
20
|
+
|
21
|
+
options = { class_name: class_name, multiple: false, auto_build: auto_build }
|
22
|
+
self.children = children.merge(name => options)
|
23
|
+
|
24
|
+
create_children_getter(name)
|
25
|
+
create_children_setter(name)
|
26
|
+
create_children_builder(name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def embeds_many(name, class_name:, uniqueness: false)
|
30
|
+
warning_naming_suggestion(__method__, name, name.to_s.pluralize)
|
31
|
+
|
32
|
+
options = { class_name: class_name, multiple: true, uniqueness: uniqueness }
|
33
|
+
self.children = children.merge(name => options)
|
34
|
+
|
35
|
+
create_children_getter(name)
|
36
|
+
create_children_setter(name)
|
37
|
+
create_children_builder(name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def default_value(name)
|
41
|
+
options = children[name]
|
42
|
+
return [] if options[:multiple]
|
43
|
+
|
44
|
+
options[:class_name].constantize.new if options[:auto_build]
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def create_children_getter(name)
|
50
|
+
define_method name do
|
51
|
+
return instance_variable_get("@#{name}") if instance_variable_defined?("@#{name}")
|
52
|
+
|
53
|
+
instance_variable_set("@#{name}", self.class.default_value(name))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_children_setter(name)
|
58
|
+
define_method("#{name}=") { |value| instance_variable_set("@#{name}", value) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_children_appender(name)
|
62
|
+
options = children[name]
|
63
|
+
|
64
|
+
define_method "append_#{name.to_s.singularize}" do |child|
|
65
|
+
return instance_variable_set("@#{name}", child) unless options[:multiple]
|
66
|
+
|
67
|
+
children = send(name)
|
68
|
+
children << child unless options[:uniqueness] && children.any?(child)
|
69
|
+
child
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_children_builder(name)
|
74
|
+
options = children[name]
|
75
|
+
create_children_appender(name)
|
76
|
+
|
77
|
+
define_method "build_#{name.to_s.singularize}" do |**attributes|
|
78
|
+
child = options[:class_name].constantize.new
|
79
|
+
attributes.each { |key, value| child.send("#{key}=", value) if child.respond_to?("#{key}=") }
|
80
|
+
send("append_#{name.to_s.singularize}", child)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# :nocov:
|
85
|
+
def warning_naming_suggestion(method, name, suggestion_name)
|
86
|
+
return if suggestion_name == name.to_s
|
87
|
+
|
88
|
+
location = caller.find { |c| c.include?('goldendocx/') && !c.include?('goldendocx/element.rb') }
|
89
|
+
warn "warning: [#{method}] `#{name}` better be `#{suggestion_name}` at #{location}"
|
90
|
+
end
|
91
|
+
# :nocov:
|
92
|
+
end
|
93
|
+
|
94
|
+
def children
|
95
|
+
self.class.children.keys.flat_map { |name| send(name) }.compact
|
96
|
+
end
|
97
|
+
|
98
|
+
def read_children(xml_node)
|
99
|
+
xml_node.children.each do |child_node|
|
100
|
+
read_child(child_node)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def read_child(child_node)
|
105
|
+
name, options = self.class.children.find do |_, opts|
|
106
|
+
opts[:class_name].constantize.adapt?(child_node)
|
107
|
+
end
|
108
|
+
if name.present?
|
109
|
+
child = options[:class_name].constantize.read_from(child_node)
|
110
|
+
send("append_#{name.to_s.singularize}", child)
|
111
|
+
else
|
112
|
+
unparsed_children << child_node
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -1,31 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Goldendocx
|
4
|
-
module
|
4
|
+
module Models
|
5
5
|
class Relationships
|
6
6
|
include Goldendocx::Document
|
7
7
|
|
8
|
-
XML_PATH = 'word/_rels/document.xml.rels'
|
9
8
|
NAMESPACE = 'http://schemas.openxmlformats.org/package/2006/relationships'
|
10
9
|
|
11
10
|
tag :Relationships
|
12
11
|
attribute :xmlns, default: NAMESPACE, readonly: true
|
13
12
|
|
14
|
-
embeds_many :relationships, class_name: 'Goldendocx::
|
13
|
+
embeds_many :relationships, class_name: 'Goldendocx::Models::Relationship'
|
15
14
|
|
16
15
|
def size
|
17
16
|
relationships.size
|
18
17
|
end
|
19
18
|
|
20
|
-
def
|
21
|
-
|
22
|
-
Goldendocx.xml_serializer.parse(docx_file.read(XML_PATH), paths).map do |node|
|
23
|
-
build_relationship(id: node[:Id], type: node[:Type], target: node[:Target])
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def write_to(zos)
|
28
|
-
zos.put_next_entry XML_PATH
|
19
|
+
def write_to(zos, xml_path)
|
20
|
+
zos.put_next_entry xml_path
|
29
21
|
zos.write to_document_xml
|
30
22
|
end
|
31
23
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Parts
|
5
|
+
class App
|
6
|
+
include Goldendocx::Document
|
7
|
+
|
8
|
+
TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties'
|
9
|
+
XML_PATH = 'docProps/app.xml'
|
10
|
+
NAMESPACE = 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'
|
11
|
+
CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.extended-properties+xml'
|
12
|
+
|
13
|
+
tag :Properties
|
14
|
+
attribute :xmlns, default: NAMESPACE, readonly: true
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def read_from(app_document)
|
18
|
+
new_instance = new
|
19
|
+
|
20
|
+
app_document.children.map do |node|
|
21
|
+
new_instance.properties[node.name.to_sym] = node.text
|
22
|
+
end
|
23
|
+
|
24
|
+
new_instance
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def write_to(zos)
|
29
|
+
zos.put_next_entry XML_PATH
|
30
|
+
zos.write to_document_xml
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_document_xml
|
34
|
+
super do |xml|
|
35
|
+
properties.each do |name, value|
|
36
|
+
xml << Goldendocx.xml_serializer.build_element(name).tap { |app| app << value }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def properties
|
42
|
+
@properties ||= { Application: "Goldendocx_#{Goldendocx::VERSION}" }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -11,52 +11,38 @@ module Goldendocx
|
|
11
11
|
XML_PATH = '[Content_Types].xml'
|
12
12
|
NAMESPACE = 'http://schemas.openxmlformats.org/package/2006/content-types'
|
13
13
|
|
14
|
-
|
14
|
+
REQUIRED_DEFAULTS = {
|
15
|
+
rels: 'application/vnd.openxmlformats-package.relationships+xml',
|
16
|
+
xml: 'application/xml'
|
17
|
+
}.with_indifferent_access.freeze
|
15
18
|
|
16
19
|
tag :Types
|
17
20
|
attribute :xmlns, default: NAMESPACE, readonly: true
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
content_types = Goldendocx::Parts::ContentTypes.new
|
22
|
-
content_types.read_defaults(docx_file)
|
23
|
-
content_types.read_overrides(docx_file)
|
24
|
-
content_types
|
25
|
-
end
|
26
|
-
end
|
22
|
+
embeds_many :defaults, class_name: 'Goldendocx::ContentTypes::Default', uniqueness: true
|
23
|
+
embeds_many :overrides, class_name: 'Goldendocx::ContentTypes::Override', uniqueness: true
|
27
24
|
|
28
25
|
def initialize
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
def read_defaults(docx_file)
|
34
|
-
@defaults = Goldendocx.xml_serializer.parse(docx_file.read(XML_PATH), %w[Types Default]).map do |node|
|
35
|
-
Goldendocx::ContentTypes::Default.new(node[:Extension], node[:ContentType])
|
26
|
+
REQUIRED_DEFAULTS.map do |extension, content_type|
|
27
|
+
build_defaults(extension: extension, content_type: content_type)
|
36
28
|
end
|
37
29
|
end
|
38
30
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
end
|
31
|
+
def write_to(zos)
|
32
|
+
zos.put_next_entry XML_PATH
|
33
|
+
zos.write to_document_xml
|
43
34
|
end
|
44
35
|
|
45
36
|
def add_default(extension, content_type)
|
46
|
-
|
47
|
-
|
37
|
+
return if defaults.any? { |default| extension == default.extension && content_type == default.content_type }
|
38
|
+
|
39
|
+
build_defaults(extension: extension, content_type: content_type)
|
48
40
|
end
|
49
41
|
|
50
42
|
def add_override(part_name, content_type)
|
51
|
-
|
52
|
-
overrides << new_override if overrides.none?(new_override)
|
53
|
-
end
|
43
|
+
return if overrides.any? { |override| part_name == override.part_name && content_type == override.content_type }
|
54
44
|
|
55
|
-
|
56
|
-
super do |xml|
|
57
|
-
defaults.each { |default| xml << default }
|
58
|
-
overrides.each { |override| xml << override }
|
59
|
-
end
|
45
|
+
build_override(part_name: part_name, content_type: content_type)
|
60
46
|
end
|
61
47
|
end
|
62
48
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Parts
|
5
|
+
class Core
|
6
|
+
include Goldendocx::Document
|
7
|
+
|
8
|
+
TYPE = 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties'
|
9
|
+
XML_PATH = 'docProps/core.xml'
|
10
|
+
NAMESPACE = 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'
|
11
|
+
CONTENT_TYPE = 'application/vnd.openxmlformats-package.core-properties+xml'
|
12
|
+
|
13
|
+
concern_namespaces :cp, :dc, :dcterms, :dcmitype, :xsi
|
14
|
+
|
15
|
+
namespace :cp
|
16
|
+
tag :coreProperties
|
17
|
+
|
18
|
+
embeds_one :creator, class_name: 'Goldendocx::Parts::Properties::CreatorProperty'
|
19
|
+
embeds_one :created_at, class_name: 'Goldendocx::Parts::Properties::CreatedAtProperty'
|
20
|
+
embeds_one :revision, class_name: 'Goldendocx::Parts::Properties::RevisionProperty'
|
21
|
+
embeds_one :updater, class_name: 'Goldendocx::Parts::Properties::UpdaterProperty'
|
22
|
+
embeds_one :updated_at, class_name: 'Goldendocx::Parts::Properties::UpdatedAtProperty'
|
23
|
+
|
24
|
+
class << self
|
25
|
+
def read_from(xml_node)
|
26
|
+
core = super(xml_node)
|
27
|
+
revision = (core.revision || core.build_revision)
|
28
|
+
revision.value = revision.value.to_i + 1
|
29
|
+
core.build_updater(name: "Goldendocx_#{Goldendocx::VERSION}")
|
30
|
+
core.build_updated_at(timestamp: Time.now)
|
31
|
+
core
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
build_creator(name: "Goldendocx_#{Goldendocx::VERSION}")
|
37
|
+
build_created_at(timestamp: Time.now)
|
38
|
+
end
|
39
|
+
|
40
|
+
def write_to(zos)
|
41
|
+
zos.put_next_entry XML_PATH
|
42
|
+
zos.write to_document_xml
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -4,37 +4,50 @@
|
|
4
4
|
module Goldendocx
|
5
5
|
module Parts
|
6
6
|
class Documents
|
7
|
+
include Goldendocx::HasAssociations
|
8
|
+
|
7
9
|
XML_PATH = 'word/'
|
10
|
+
RELATIONSHIPS_XML_PATH = 'word/_rels/document.xml.rels'
|
8
11
|
|
9
12
|
attr_reader :document, # document.xml
|
10
|
-
:styles, # styles.xml
|
11
|
-
:relationships, # _rels/document.xml.rels
|
12
13
|
:charts, # charts/
|
13
14
|
:medias # New Medias to media/
|
14
15
|
|
15
16
|
attr_accessor :media_amount # Entries amount in directory media/ for generating relationship id
|
16
17
|
|
18
|
+
relationships_at RELATIONSHIPS_XML_PATH
|
19
|
+
associate :styles, class_name: 'Goldendocx::Documents::Styles'
|
20
|
+
associate :settings, class_name: 'Goldendocx::Documents::Settings'
|
21
|
+
associate :document, class_name: 'Goldendocx::Documents::Document', isolate: true
|
22
|
+
|
17
23
|
class << self
|
18
24
|
def read_from(docx_file)
|
19
25
|
parts = Goldendocx::Parts::Documents.new
|
20
|
-
parts.
|
21
|
-
parts.
|
22
|
-
parts.relationships.read_from(docx_file)
|
26
|
+
parts.read_relationships(docx_file)
|
27
|
+
parts.read_associations(docx_file)
|
23
28
|
parts.media_amount = docx_file.entries.count { |entry| entry.name.start_with?('word/media/') }
|
24
29
|
parts
|
25
30
|
end
|
26
31
|
end
|
27
32
|
|
28
33
|
def initialize
|
29
|
-
|
30
|
-
|
31
|
-
|
34
|
+
associations.each do |association, options|
|
35
|
+
association_class = options[:class_name].constantize
|
36
|
+
instance_variable_set("@#{association}", association_class.new)
|
37
|
+
add_relationship association_class::TYPE, association_class::XML_PATH.gsub(XML_PATH, '') unless options[:isolate]
|
38
|
+
end
|
39
|
+
|
32
40
|
@medias = []
|
41
|
+
@media_amount = 0
|
33
42
|
end
|
34
43
|
|
35
44
|
def write_stream(zos)
|
36
|
-
|
37
|
-
|
45
|
+
write_relationships(zos)
|
46
|
+
|
47
|
+
associations.each_key do |association|
|
48
|
+
send(association).write_to(zos)
|
49
|
+
end
|
50
|
+
|
38
51
|
document.write_to(zos)
|
39
52
|
medias.each { |media| media.write_to(zos) }
|
40
53
|
document.body.charts.each { |chart| chart.write_to(zos) }
|
@@ -60,14 +73,14 @@ module Goldendocx
|
|
60
73
|
|
61
74
|
def create_image(image_data, options = {})
|
62
75
|
image_media = add_image_media(image_data, options)
|
63
|
-
relationship_id =
|
76
|
+
relationship_id = add_relationship(image_media.type, image_media.target)
|
64
77
|
|
65
78
|
document.body.create_image(relationship_id, options)
|
66
79
|
end
|
67
80
|
|
68
81
|
def create_embed_image(image_data, options = {})
|
69
82
|
image_media = add_image_media(image_data, options)
|
70
|
-
relationship_id =
|
83
|
+
relationship_id = add_relationship(image_media.type, image_media.target)
|
71
84
|
|
72
85
|
document.body.create_embed_image(relationship_id, options)
|
73
86
|
end
|
@@ -87,7 +100,7 @@ module Goldendocx
|
|
87
100
|
|
88
101
|
chart_id = document.body.charts.size + 1
|
89
102
|
|
90
|
-
relationship_id =
|
103
|
+
relationship_id = add_relationship(
|
91
104
|
Goldendocx::Charts::RELATIONSHIP_TYPE,
|
92
105
|
format(Goldendocx::Charts::RELATIONSHIP_NAME_PATTERN, id: chart_id)
|
93
106
|
)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Parts
|
5
|
+
module Properties
|
6
|
+
class CreatedAtProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :dcterms
|
10
|
+
tag :created
|
11
|
+
|
12
|
+
attribute :type, namespace: :xsi, default: 'dcterms:W3CDTF'
|
13
|
+
embeds_one :timestamp, class_name: 'Time'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Parts
|
5
|
+
module Properties
|
6
|
+
class RevisionProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :cp
|
10
|
+
tag :revision
|
11
|
+
|
12
|
+
embeds_one :value, class_name: 'Integer'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Parts
|
5
|
+
module Properties
|
6
|
+
class UpdatedAtProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :dcterms
|
10
|
+
tag :modified
|
11
|
+
|
12
|
+
attribute :type, namespace: :xsi, default: 'dcterms:W3CDTF'
|
13
|
+
embeds_one :timestamp, class_name: 'Time'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Parts
|
5
|
+
module Properties
|
6
|
+
class UpdaterProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :cp
|
10
|
+
tag :lastModifiedBy
|
11
|
+
|
12
|
+
embeds_one :name, class_name: 'String'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -18,7 +18,7 @@ module Goldendocx
|
|
18
18
|
def add_cell(data)
|
19
19
|
cell = case data
|
20
20
|
when Goldendocx::Tables::Cell then data
|
21
|
-
when Hash then Goldendocx::Tables::Cell.new(data)
|
21
|
+
when Hash then Goldendocx::Tables::Cell.new(**data)
|
22
22
|
else Goldendocx::Tables::Cell.new(content: data.to_s)
|
23
23
|
end
|
24
24
|
cells << cell
|
data/lib/goldendocx/version.rb
CHANGED