goldendocx 0.2.2 → 0.3.0

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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +8 -2
  5. data/Gemfile.lock +3 -1
  6. data/README.md +10 -2
  7. data/Rakefile +14 -3
  8. data/demo/tables/create_embed_image_table.rb +3 -3
  9. data/demo/templates/generate_codes.rb +10 -0
  10. data/demo/templates/xml_to_class.rb +97 -0
  11. data/demo/texts/append_plain_text.rb +1 -1
  12. data/demo/texts/append_styled_text.rb +1 -2
  13. data/demo/texts/create_text.rb +14 -0
  14. data/lib/extensions/active_support_extensions.rb +16 -0
  15. data/lib/extensions/nokogiri_extensions.rb +41 -0
  16. data/lib/extensions/ox_extensions.rb +35 -0
  17. data/lib/extensions/xml_serialize_extensions.rb +45 -0
  18. data/lib/goldendocx/charts/properties.rb +1 -1
  19. data/lib/goldendocx/charts/series.rb +2 -2
  20. data/lib/goldendocx/charts.rb +1 -1
  21. data/lib/goldendocx/components/bar_chart.rb +2 -2
  22. data/lib/goldendocx/components/chart.rb +6 -6
  23. data/lib/goldendocx/components/column_chart.rb +2 -2
  24. data/lib/goldendocx/components/doughnut_chart.rb +2 -2
  25. data/lib/goldendocx/components/line_chart.rb +2 -2
  26. data/lib/goldendocx/components/properties/font_property.rb +19 -0
  27. data/lib/goldendocx/components/properties/language_property.rb +18 -0
  28. data/lib/goldendocx/components/properties/run_property.rb +2 -0
  29. data/lib/goldendocx/components/properties.rb +1 -1
  30. data/lib/goldendocx/components/table.rb +2 -2
  31. data/lib/goldendocx/components.rb +1 -1
  32. data/lib/goldendocx/content_types/default.rb +2 -6
  33. data/lib/goldendocx/content_types/override.rb +2 -6
  34. data/lib/goldendocx/document.rb +9 -28
  35. data/lib/goldendocx/documents/body.rb +23 -14
  36. data/lib/goldendocx/documents/document.rb +2 -4
  37. data/lib/goldendocx/documents/latent_styles.rb +12 -0
  38. data/lib/goldendocx/documents/properties/default_style_property.rb +17 -0
  39. data/lib/goldendocx/documents/properties/page_margin_property.rb +37 -0
  40. data/lib/goldendocx/documents/properties/page_size_property.rb +17 -0
  41. data/lib/goldendocx/documents/properties/paragraph_default_style_property.rb +16 -0
  42. data/lib/goldendocx/documents/properties/run_default_style_property.rb +22 -0
  43. data/lib/goldendocx/documents/properties/section_property.rb +17 -0
  44. data/lib/goldendocx/documents/properties/style_name_property.rb +16 -0
  45. data/lib/goldendocx/documents/properties.rb +12 -0
  46. data/lib/goldendocx/documents/settings.rb +23 -0
  47. data/lib/goldendocx/documents/style.rb +10 -10
  48. data/lib/goldendocx/documents/styles.rb +9 -33
  49. data/lib/goldendocx/documents.rb +1 -1
  50. data/lib/goldendocx/docx.rb +55 -12
  51. data/lib/goldendocx/element.rb +33 -140
  52. data/lib/goldendocx/has_associations.rb +54 -0
  53. data/lib/goldendocx/has_attributes.rb +67 -0
  54. data/lib/goldendocx/has_children.rb +116 -0
  55. data/lib/goldendocx/images/picture.rb +1 -1
  56. data/lib/goldendocx/images/properties.rb +1 -1
  57. data/lib/goldendocx/images.rb +1 -1
  58. data/lib/goldendocx/{documents → models}/relationship.rb +1 -1
  59. data/lib/goldendocx/models/relationships.rb +31 -0
  60. data/lib/goldendocx/models.rb +10 -0
  61. data/lib/goldendocx/parts/app.rb +46 -0
  62. data/lib/goldendocx/parts/content_types.rb +16 -30
  63. data/lib/goldendocx/parts/core.rb +46 -0
  64. data/lib/goldendocx/parts/documents.rb +27 -14
  65. data/lib/goldendocx/parts/media.rb +1 -1
  66. data/lib/goldendocx/parts/properties/created_at_property.rb +17 -0
  67. data/lib/goldendocx/parts/properties/creator_property.rb +16 -0
  68. data/lib/goldendocx/parts/properties/revision_property.rb +16 -0
  69. data/lib/goldendocx/parts/properties/updated_at_property.rb +17 -0
  70. data/lib/goldendocx/parts/properties/updater_property.rb +16 -0
  71. data/lib/goldendocx/parts/properties.rb +12 -0
  72. data/lib/goldendocx/parts.rb +1 -1
  73. data/lib/goldendocx/tables/header_cell.rb +1 -1
  74. data/lib/goldendocx/tables/properties.rb +1 -1
  75. data/lib/goldendocx/tables/row.rb +1 -1
  76. data/lib/goldendocx/tables.rb +1 -1
  77. data/lib/goldendocx/version.rb +1 -1
  78. data/lib/goldendocx/xml_serializers/nokogiri.rb +32 -24
  79. data/lib/goldendocx/xml_serializers/ox.rb +15 -25
  80. data/lib/goldendocx.rb +14 -2
  81. metadata +54 -9
  82. data/lib/goldendocx/documents/element.rb +0 -23
  83. data/lib/goldendocx/documents/relationships.rb +0 -39
  84. data/lib/goldendocx/documents/unparsed_style.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1603ab8a5538d27e48b351b381f8859c92fb9e42169df8cbcc6104545803c2b
4
- data.tar.gz: 9bc30497d4a1f96da15f8190d9edb42857f2ec6876550ebb47415f3ed5e67caa
3
+ metadata.gz: dc5f8d130528f4e1f5e5738146ab61e9cc771968d549ec251d1996aa7704c1e8
4
+ data.tar.gz: 37981979a35e94d81c5515783f28752ebcf0425a635d2d610afdab1b05b4c897
5
5
  SHA512:
6
- metadata.gz: b826c86f0013b2af7af58b047cdb5340cc912913ca78b0198ab9b506a8614a173b2d1a53f42d928da6f277f21a6312895175687a49e79e2cf63658acace1ef4a
7
- data.tar.gz: cb4198c911418e3579df98019d87709a009aed9bd595b2889602e595a32d53b2a333561cd8d43dde67f40a55b1ebd6552e0921a184308417f4ce8270a215cd0f
6
+ metadata.gz: a1e8b756aa8960aa6796a23539498bb9632c68cc8f2c7e18bd02cc5546926afc61347302e8251eeb5e676075dfc97f2bc7c5126d626aec7b6b7f48400aa7f4b1
7
+ data.tar.gz: 7e4b16e552fbac46c52880c39267472d07481a5a895a9e98d892b508d51a040de7e0bd32bac05ad26c29cb722cd7829df0321b02f47ad14c53e977a758802bac
data/.rubocop.yml CHANGED
@@ -4,7 +4,7 @@ require:
4
4
 
5
5
  AllCops:
6
6
  NewCops: enable
7
- TargetRubyVersion: 2.7
7
+ TargetRubyVersion: 3.2
8
8
  SuggestExtensions: false
9
9
 
10
10
  Metrics/AbcSize:
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.2.0
data/CHANGELOG.md CHANGED
@@ -30,7 +30,7 @@ Mostly refactoring
30
30
  - Introduce `ActiveSupport` to make coding easier
31
31
  - Clean irrelevant demos
32
32
 
33
- ## [0.2.2] - 2023-03-31(WIP)
33
+ ## [0.2.2] - 2023-03-31
34
34
 
35
35
  ### Features
36
36
 
@@ -40,4 +40,10 @@ Mostly refactoring
40
40
  ### Fixes
41
41
 
42
42
  - Fix create charts issues
43
- - Fix Nokogiri XML serializer compatible issues
43
+ - Fix Nokogiri XML serializer compatible issues
44
+
45
+ ## [0.2.3] - 2023-04-07
46
+
47
+ ### Features
48
+
49
+ - Support create new MS Word docx file without template
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- goldendocx (0.2.2)
4
+ goldendocx (0.3.0)
5
5
  activesupport (~> 7.0)
6
6
  nokogiri (~> 1.14)
7
7
  ox (~> 2.14)
@@ -78,6 +78,7 @@ GEM
78
78
  simplecov-html (0.12.3)
79
79
  simplecov-lcov (0.8.0)
80
80
  simplecov_json_formatter (0.1.4)
81
+ timecop (0.9.6)
81
82
  tzinfo (2.0.6)
82
83
  concurrent-ruby (~> 1.0)
83
84
  unicode-display_width (2.2.0)
@@ -96,6 +97,7 @@ DEPENDENCIES
96
97
  rubocop-rspec (~> 2.19)
97
98
  simplecov (~> 0.22.0)
98
99
  simplecov-lcov (~> 0.8.0)
100
+ timecop (~> 0.9.6)
99
101
 
100
102
  BUNDLED WITH
101
103
  2.3.23
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # The Ruby API for Microsoft Word
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/goldendocx.svg)](https://badge.fury.io/rb/goldendocx)
4
+ [![Coverage Status](https://coveralls.io/repos/github/SheldonLeo/goldendocx/badge.svg)](https://coveralls.io/github/SheldonLeo/goldendocx)
5
+
3
6
  Ruby APIs for manipulating Microsoft Word based upon OOXML standards.
4
7
 
5
8
  ## Installation
@@ -23,6 +26,7 @@ If bundler is not being used to manage dependencies, install the gem by executin
23
26
  Support both `ox` and `nokogiri` as XML serializer, and `ox` as default.
24
27
 
25
28
  You can customize with configuration
29
+
26
30
  ```ruby
27
31
  Goldendocx.configure do |config|
28
32
  config.xml_serializer = :nokogiri
@@ -30,9 +34,13 @@ end
30
34
  ```
31
35
 
32
36
  ### Compose MS Word
33
- - Read MS Word file and write to another path
37
+
38
+ - Create new MS Word file or read exists file and write to another path
34
39
  ```ruby
40
+ docx = Goldendocx::Docx.new
35
41
  docx = Goldendocx::Docx.new(docx_file_path)
42
+ docx.read_from(docx_file_path)
43
+
36
44
  docx.write_to(new_file_path)
37
45
  ```
38
46
  - Create texts to MS Word
@@ -71,6 +79,6 @@ end
71
79
  values = [13, 12, 9, 9, 8, 7, 7, 6, 5, 3]
72
80
  chart.add_series('地域分布详情数据', categories, values)
73
81
  ```
74
-
82
+
75
83
  More demos view at [Demos](demo/)
76
84
 
data/Rakefile CHANGED
@@ -4,7 +4,18 @@ require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
  require 'rubocop/rake_task'
6
6
 
7
- RSpec::Core::RakeTask.new(:spec)
8
- RuboCop::RakeTask.new
7
+ RSpec::Core::RakeTask.new(:ox_compatible_spec) do |task|
8
+ ENV['XML_SERIALIZER'] = 'ox'
9
+ task.failure_message = 'Failed with ox xml serializer compatible'
10
+ end
9
11
 
10
- task default: %i[rubocop spec]
12
+ RSpec::Core::RakeTask.new(:nokogiri_compatible_spec) do |task|
13
+ ENV['XML_SERIALIZER'] = 'nokogiri'
14
+ task.failure_message = 'Failed with nokogiri xml serializer compatible'
15
+ end
16
+
17
+ RuboCop::RakeTask.new(:rubocop) do |task|
18
+ task.options = ['-P']
19
+ end
20
+
21
+ task default: %i[rubocop ox_compatible_spec nokogiri_compatible_spec]
@@ -27,9 +27,9 @@ image_base64 = File.read("#{Dir.pwd}/demo/templates/image_base64")
27
27
  image = docx.create_embed_image(image_base64, width: 720000, height: 720000, align: :left)
28
28
 
29
29
  rows = [
30
- [Goldendocx::Tables::ImageCell.new(image: image, content: '选项A'), 3, '¥3.00', '¥9.00'],
31
- [Goldendocx::Tables::ImageCell.new(image: image, content: '选项B'), 4, '¥6.50', '¥18.00'],
32
- [Goldendocx::Tables::ImageCell.new(image: image, content: '选项C'), 10, '¥6.00', '¥60.00']
30
+ [Goldendocx::Tables::ImageCell.new(image:, content: '选项A'), 3, '¥3.00', '¥9.00'],
31
+ [Goldendocx::Tables::ImageCell.new(image:, content: '选项B'), 4, '¥6.50', '¥18.00'],
32
+ [Goldendocx::Tables::ImageCell.new(image:, content: '选项C'), 10, '¥6.00', '¥60.00']
33
33
  ]
34
34
  rows.each do |r|
35
35
  row = table.add_row(r)
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ox'
4
+ require_relative 'xml_to_class'
5
+
6
+ xml_fragment = File.read("#{Dir.pwd}/demo/templates/styles/reportTitle")
7
+ root_class = XmlToClass.new.parse(Ox.parse(xml_fragment))
8
+
9
+ root_class.write_rb('goldendocx/styles')
10
+ root_class.write_spec('goldendocx/styles')
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Metrics/AbcSize
4
+ # rubocop:disable Metrics/MethodLength
5
+ # rubocop:disable Metrics/CyclomaticComplexity
6
+ require 'ox'
7
+ require 'fileutils'
8
+ require 'active_support/core_ext/string/inflections'
9
+
10
+ class XmlToClass
11
+ def parse(node)
12
+ @node = node
13
+ @namespace, @tag = parse_tag(@node.name)
14
+ @class_name = "#{@tag}Property".classify
15
+ parse_attributes
16
+ parse_children
17
+ self
18
+ end
19
+
20
+ def write_rb(dir)
21
+ dir_to_write = "#{Dir.pwd}/lib/#{dir}"
22
+ FileUtils.mkdir_p(dir_to_write)
23
+
24
+ File.open("#{dir_to_write}/#{@tag}.rb", 'w') do |f|
25
+ f.puts '# frozen_string_literal: true'
26
+ f.puts ''
27
+ f.puts "class Goldendocx::#{@class_name}"
28
+ f.puts ' include Goldendocx::Element'
29
+ f.puts ''
30
+ f.puts " namespace :#{@namespace}" if @namespace
31
+ f.puts " tag :#{@tag}"
32
+ f.puts ''
33
+ @attributes.each do |name, opt|
34
+ options = opt.map { |k, v| "#{k}: :#{v}" }.join(',')
35
+ f.puts " attribute :#{name.underscore}, #{options}"
36
+ end
37
+ f.puts ''
38
+ @children.group_by(&:to_s).each do |name, values|
39
+ method = values.size > 1 ? :embeds_many : :embeds_one
40
+ _, class_name = parse_tag(name)
41
+ f.puts " #{method} :#{class_name.underscore}, class_name: 'Goldendocx::#{class_name.classify}Property'"
42
+ end
43
+ f.puts 'end'
44
+ end
45
+
46
+ @subclasses.each { |c| c.write_rb("#{dir}/#{@tag}") }
47
+ end
48
+
49
+ def write_spec(dir)
50
+ dir_to_write = "#{Dir.pwd}/spec/#{dir}"
51
+ FileUtils.mkdir_p(dir_to_write)
52
+
53
+ File.open("#{dir_to_write}/#{@tag}_spec.rb", 'w') do |f|
54
+ f.puts '# frozen_string_literal: true'
55
+ f.puts ''
56
+ f.puts "describe Goldendocx::#{@class_name} do"
57
+ f.puts ' let(:property) { described_class.new }'
58
+ f.puts ''
59
+ f.puts " specify 'builds default #{@tag} property xml' do "
60
+ f.puts " expect(property.to_xml).to eq('<#{@namespace}:#{@tag}/>')"
61
+ f.puts ' end'
62
+ f.puts ''
63
+ f.puts " specify 'builds customized #{@tag} property xml' do"
64
+ f.puts ' property.attribute = :value '
65
+ f.puts " expect(property.to_xml).to eq('<#{@namespace}:#{@tag}/>') "
66
+ f.puts ' end '
67
+ f.puts 'end'
68
+ end
69
+
70
+ @subclasses.each { |c| c.write_spec("#{dir}/#{@tag}") }
71
+ end
72
+
73
+ def parse_tag(string)
74
+ string = string.to_s
75
+ string.include?(':') ? string.split(':') : [nil, string]
76
+ end
77
+
78
+ def parse_attributes
79
+ @attributes ||= {}
80
+ @node.attributes.each_key do |name|
81
+ ns, tg = parse_tag(name)
82
+ @attributes[tg] = { alias_name: tg, namespace: ns }.compact
83
+ end
84
+ end
85
+
86
+ def parse_children
87
+ @children = []
88
+ @subclasses = []
89
+ @node.nodes.each do |node|
90
+ @children << node.name.to_s
91
+ @subclasses << XmlToClass.new.parse(node)
92
+ end
93
+ end
94
+ end
95
+ # rubocop:enable Metrics/AbcSize
96
+ # rubocop:enable Metrics/MethodLength
97
+ # rubocop:enable Metrics/CyclomaticComplexity
@@ -3,7 +3,7 @@
3
3
  $LOAD_PATH.push "#{Dir.pwd}/lib"
4
4
  require 'goldendocx'
5
5
 
6
- docx = Goldendocx::Docx.new("#{Dir.pwd}/demo/templates/blankDocument.docx")
6
+ docx = Goldendocx::Docx.new.read_from("#{Dir.pwd}/demo/templates/blankDocument.docx")
7
7
 
8
8
  docx.create_text('Hello World!')
9
9
 
@@ -2,8 +2,7 @@
2
2
 
3
3
  $LOAD_PATH.push "#{Dir.pwd}/lib"
4
4
  require 'goldendocx'
5
-
6
- docx = Goldendocx::Docx.new("#{Dir.pwd}/demo/templates/blankDocument.docx")
5
+ docx = Goldendocx::Docx.new.read_from("#{Dir.pwd}/demo/templates/blankDocument.docx")
7
6
 
8
7
  # Register styles because default document without any style
9
8
  docx.add_style(File.read("#{Dir.pwd}/demo/templates/styles/reportTitle"))
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.push "#{Dir.pwd}/lib"
4
+ require 'goldendocx'
5
+
6
+ docx = Goldendocx::Docx.new
7
+
8
+ docx.create_text('Hello World!')
9
+ docx.create_text('Hello World!', align: :center, color: 'FF8533', bold: true)
10
+
11
+ filename = 'plainTextDocument.docx'
12
+ system "rm -f ~/Desktop/#{filename}" # -f so that we don't have an error if the file doesn't exist
13
+ docx.write_to File.expand_path("~/Desktop/#{filename}")
14
+ exec "open ~/Desktop/#{filename}"
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/concern'
4
+ require 'active_support/core_ext/array/access'
5
+ require 'active_support/core_ext/class/attribute'
6
+ require 'active_support/core_ext/class/subclasses'
7
+ require 'active_support/core_ext/hash/indifferent_access'
8
+ require 'active_support/core_ext/string/inflections'
9
+ require 'active_support/core_ext/string/conversions'
10
+
11
+ ActiveSupport::Inflector.inflections do |inflect|
12
+ inflect.uncountable 'extents', 'image_data', 'data', 'defaults', 'latentStyles'
13
+ inflect.irregular 'axis', 'axes'
14
+
15
+ inflect.uncountable 'values' # TODO: Find better names
16
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+
5
+ # FIXME: Temporarily here to provider syntactic sugar
6
+ module Nokogiri
7
+ module XML
8
+ class Document
9
+ def tag_name
10
+ root.tag_name
11
+ end
12
+ end
13
+
14
+ class Node
15
+ def <<(node_or_tags)
16
+ # FIXME: Add this line to transform element implicitly
17
+ node_or_tags = node_or_tags.public_send(:to_element, parent: self) if node_or_tags.respond_to?(:to_element)
18
+
19
+ add_child(node_or_tags)
20
+ self
21
+ end
22
+
23
+ def adapt?(klass)
24
+ adaptable_classes = [String, Integer, Time]
25
+ is_a?(Nokogiri::XML::Text) && adaptable_classes.include?(klass)
26
+ end
27
+
28
+ def tag_name
29
+ [namespace&.prefix, name].compact.join(':')
30
+ end
31
+
32
+ def unparsed_children
33
+ @unparsed_children ||= children.dup
34
+ end
35
+
36
+ def attributes_hash
37
+ attribute_nodes.reject { |node| node.tag_name == 'mc:Ignorable' }.to_h { |node| [node.tag_name, node.value] }
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ox'
4
+
5
+ module Ox
6
+ class Document
7
+ def root
8
+ children.first
9
+ end
10
+ end
11
+
12
+ class Element
13
+ def <<(node)
14
+ # FIXME: Add this line to transform element implicitly
15
+ node = node.public_send(:to_element) if node.respond_to?(:to_element)
16
+
17
+ raise 'argument to << must be a String or Ox::Node.' unless node.is_a?(String) || node.is_a?(Node)
18
+
19
+ @nodes = [] if !instance_variable_defined?(:@nodes) || @nodes.nil?
20
+ @nodes << node
21
+ self
22
+ end
23
+
24
+ alias children nodes
25
+ alias tag_name name
26
+
27
+ def unparsed_children
28
+ @unparsed_children ||= children.dup
29
+ end
30
+
31
+ def attributes_hash
32
+ attributes.with_indifferent_access.reject { |k, _| k.to_s.start_with?('xmlns') || k.to_s == 'mc:Ignorable' }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ class String
4
+ class << self
5
+ def adapt?(xml_node)
6
+ xml_node.is_a?(String) || xml_node.adapt?(String)
7
+ end
8
+
9
+ def read_from(xml_node)
10
+ xml_node.to_s
11
+ end
12
+ end
13
+ end
14
+
15
+ class Time
16
+ class << self
17
+ def adapt?(xml_node)
18
+ xml_node.is_a?(String) || xml_node.adapt?(Time)
19
+ end
20
+
21
+ def read_from(xml_node)
22
+ xml_node.to_s.to_time
23
+ end
24
+ end
25
+
26
+ def to_element(**_context)
27
+ strftime('%Y-%m-%dT%H:%M:%SZ')
28
+ end
29
+ end
30
+
31
+ class Integer
32
+ class << self
33
+ def adapt?(xml_node)
34
+ xml_node.is_a?(String) || xml_node.adapt?(Integer)
35
+ end
36
+
37
+ def read_from(xml_node)
38
+ xml_node.to_s.to_i
39
+ end
40
+ end
41
+
42
+ def to_element(**_context)
43
+ to_s
44
+ end
45
+ end
@@ -7,6 +7,6 @@ module Goldendocx
7
7
  end
8
8
  end
9
9
 
10
- Dir.glob(File.join(File.dirname(__FILE__), 'properties', '*.rb').to_s).sort.each do |file|
10
+ Dir.glob(File.join(File.dirname(__FILE__), 'properties', '*.rb').to_s).each do |file|
11
11
  require file
12
12
  end
@@ -27,7 +27,7 @@ module Goldendocx
27
27
  def categories=(categories)
28
28
  category_axis.values.build_count(count: categories.size)
29
29
  categories.each_with_index do |cat, index|
30
- point = category_axis.values.build_point(index: index)
30
+ point = category_axis.values.build_point(index:)
31
31
  point.build_value(value: cat)
32
32
  end
33
33
  end
@@ -35,7 +35,7 @@ module Goldendocx
35
35
  def values=(values)
36
36
  value_axis.values.build_count(count: values.size)
37
37
  values.each_with_index do |val, index|
38
- point = value_axis.values.build_point(index: index)
38
+ point = value_axis.values.build_point(index:)
39
39
  point.build_value(value: val)
40
40
  end
41
41
  end
@@ -21,6 +21,6 @@ end
21
21
 
22
22
  require 'goldendocx/charts/properties'
23
23
 
24
- Dir.glob(File.join(File.dirname(__FILE__), 'charts', '*.rb').to_s).sort.each do |file|
24
+ Dir.glob(File.join(File.dirname(__FILE__), 'charts', '*.rb').to_s).each do |file|
25
25
  require file
26
26
  end
@@ -3,8 +3,8 @@
3
3
  module Goldendocx
4
4
  module Components
5
5
  class BarChart < Chart
6
- def initialize(chart_id, relationship_id, **attributes)
7
- super(chart_id, relationship_id, **attributes)
6
+ def initialize(chart_id, relationship_id, attributes = {})
7
+ super(chart_id, relationship_id, attributes)
8
8
 
9
9
  build_chart.plot_area.build_bar_chart
10
10
  end
@@ -18,21 +18,21 @@ module Goldendocx
18
18
  attr_accessor :name
19
19
  attr_reader :id, :series
20
20
 
21
- def initialize(chart_id, relationship_id, **attributes)
21
+ def initialize(chart_id, relationship_id, attributes = {})
22
22
  @id = chart_id
23
23
  @series = []
24
24
 
25
25
  @paragraph = Goldendocx::Components::Paragraph.new
26
26
  inline_drawing = @paragraph.build_run.build_drawing.build_inline
27
- inline_drawing.build_non_visual_property(relationship_id: relationship_id)
27
+ inline_drawing.build_non_visual_property(relationship_id:)
28
28
  inline_drawing.build_extents(width: attributes[:width], height: attributes[:height])
29
- inline_drawing.build_graphic.build_data.build_chart(relationship_id: relationship_id)
29
+ inline_drawing.build_graphic.build_data.build_chart(relationship_id:)
30
30
  end
31
31
 
32
32
  def add_series(name, categories, values)
33
33
  ser_id = series.size + 1
34
- the_chart.build_series(categories: categories, values: values, id: ser_id, name: name)
35
- ser = Goldendocx::Charts::Series.new(categories: categories, values: values, id: ser_id, name: name)
34
+ the_chart.build_series(categories:, values:, id: ser_id, name:)
35
+ ser = Goldendocx::Charts::Series.new(categories:, values:, id: ser_id, name:)
36
36
  series << ser
37
37
  ser
38
38
  end
@@ -46,7 +46,7 @@ module Goldendocx
46
46
  end
47
47
 
48
48
  def write_to(zos)
49
- entry_name = format(Goldendocx::Charts::RELATIONSHIP_NAME_PATTERN, id: id)
49
+ entry_name = format(Goldendocx::Charts::RELATIONSHIP_NAME_PATTERN, id:)
50
50
  zos.put_next_entry "word/#{entry_name}"
51
51
  zos.write to_document_xml
52
52
  end
@@ -3,8 +3,8 @@
3
3
  module Goldendocx
4
4
  module Components
5
5
  class ColumnChart < Chart
6
- def initialize(chart_id, relationship_id, **attributes)
7
- super(chart_id, relationship_id, **attributes)
6
+ def initialize(chart_id, relationship_id, attributes = {})
7
+ super(chart_id, relationship_id, attributes)
8
8
 
9
9
  build_chart.plot_area.build_column_chart
10
10
  end
@@ -3,8 +3,8 @@
3
3
  module Goldendocx
4
4
  module Components
5
5
  class DoughnutChart < Chart
6
- def initialize(chart_id, relationship_id, **attributes)
7
- super(chart_id, relationship_id, **attributes)
6
+ def initialize(chart_id, relationship_id, attributes = {})
7
+ super(chart_id, relationship_id, attributes)
8
8
 
9
9
  build_chart.plot_area.build_doughnut_chart
10
10
  end
@@ -3,8 +3,8 @@
3
3
  module Goldendocx
4
4
  module Components
5
5
  class LineChart < Chart
6
- def initialize(chart_id, relationship_id, **attributes)
7
- super(chart_id, relationship_id, **attributes)
6
+ def initialize(chart_id, relationship_id, attributes = {})
7
+ super(chart_id, relationship_id, attributes)
8
8
 
9
9
  build_chart.plot_area.build_line_chart
10
10
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Goldendocx
4
+ module Components
5
+ module Properties
6
+ class FontProperty
7
+ include Goldendocx::Element
8
+
9
+ namespace :w
10
+ tag :rFonts
11
+
12
+ attribute :ascii, namespace: :w, default: 'Times New Roman'
13
+ attribute :east_asia, alias_name: :eastAsia, namespace: :w, default: '宋体'
14
+ attribute :high_ansi, alias_name: :hAnsi, namespace: :w, default: 'Times New Roman'
15
+ attribute :complex, alias_name: :cs, namespace: :w, default: 'Times New Roman'
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Goldendocx
4
+ module Components
5
+ module Properties
6
+ class LanguageProperty
7
+ include Goldendocx::Element
8
+
9
+ namespace :w
10
+ tag :lang
11
+
12
+ attribute :complex, alias_name: :bidi, namespace: :w, default: 'ar-SA'
13
+ attribute :east_asia, alias_name: :eastAsia, namespace: :w, default: 'zh-CN'
14
+ attribute :latin, alias_name: :val, namespace: :w, default: 'en-US'
15
+ end
16
+ end
17
+ end
18
+ end
@@ -11,6 +11,8 @@ module Goldendocx
11
11
 
12
12
  embeds_one :color, class_name: 'Goldendocx::Components::Properties::ColorProperty', auto_build: false
13
13
  embeds_one :bold, class_name: 'Goldendocx::Components::Properties::BoldProperty', auto_build: false
14
+ embeds_one :language, class_name: 'Goldendocx::Components::Properties::LanguageProperty', auto_build: false
15
+ embeds_one :font, class_name: 'Goldendocx::Components::Properties::FontProperty', auto_build: false
14
16
  end
15
17
  end
16
18
  end
@@ -7,6 +7,6 @@ module Goldendocx
7
7
  end
8
8
  end
9
9
 
10
- Dir.glob(File.join(File.dirname(__FILE__), 'properties', '*.rb').to_s).sort.each do |file|
10
+ Dir.glob(File.join(File.dirname(__FILE__), 'properties', '*.rb').to_s).each do |file|
11
11
  require file
12
12
  end
@@ -29,8 +29,8 @@ module Goldendocx
29
29
  end
30
30
 
31
31
  def add_header(title, width: nil)
32
- header.build_cell(content: title, width: width)
33
- grid_property.build_grid_column(width: width) if width
32
+ header.build_cell(content: title, width:)
33
+ grid_property.build_grid_column(width:) if width
34
34
  header
35
35
  end
36
36
 
@@ -11,6 +11,6 @@ end
11
11
  require 'goldendocx/components/properties'
12
12
  require 'goldendocx/components/chart'
13
13
 
14
- Dir.glob(File.join(File.dirname(__FILE__), 'components', '*.rb').to_s).sort.each do |file|
14
+ Dir.glob(File.join(File.dirname(__FILE__), 'components', '*.rb').to_s).each do |file|
15
15
  require file
16
16
  end
@@ -6,13 +6,9 @@ module Goldendocx
6
6
  include Goldendocx::Element
7
7
 
8
8
  tag :Default
9
- attribute :extension, alias_name: :Extension, readonly: true
10
- attribute :content_type, alias_name: :ContentType, readonly: true
11
9
 
12
- def initialize(extension, content_type)
13
- @extension = extension
14
- @content_type = content_type
15
- end
10
+ attribute :extension, alias_name: :Extension
11
+ attribute :content_type, alias_name: :ContentType
16
12
 
17
13
  def ==(other)
18
14
  extension == other.extension && content_type == other.content_type