goldendocx 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +2 -0
- data/.rubocop.yml +47 -0
- data/CHANGELOG.md +43 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +101 -0
- data/README.md +76 -0
- data/Rakefile +10 -0
- data/coverage/.last_run.json +5 -0
- data/demo/charts/create_bar_chart.rb +30 -0
- data/demo/charts/create_column_chart.rb +29 -0
- data/demo/charts/create_doughnut_chart.rb +28 -0
- data/demo/charts/create_line_chart.rb +41 -0
- data/demo/images/append_image.rb +21 -0
- data/demo/images/append_styled_image.rb +14 -0
- data/demo/tables/create_embed_image_table.rb +42 -0
- data/demo/tables/create_plain_table.rb +22 -0
- data/demo/tables/create_styled_table.rb +36 -0
- data/demo/templates/bg.png +0 -0
- data/demo/templates/blankDocument.docx +0 -0
- data/demo/templates/image_base64 +1 -0
- data/demo/templates/styles/reportLabel +19 -0
- data/demo/templates/styles/reportSubTitle +20 -0
- data/demo/templates/styles/reportTable +27 -0
- data/demo/templates/styles/reportTitle +19 -0
- data/demo/texts/append_plain_text.rb +13 -0
- data/demo/texts/append_styled_text.rb +23 -0
- data/lib/goldendocx/charts/category_axis.rb +20 -0
- data/lib/goldendocx/charts/properties/auto_title_deleted_property.rb +16 -0
- data/lib/goldendocx/charts/properties/axis_property.rb +16 -0
- data/lib/goldendocx/charts/properties/bar_chart_property.rb +28 -0
- data/lib/goldendocx/charts/properties/chart_property.rb +16 -0
- data/lib/goldendocx/charts/properties/column_chart_property.rb +28 -0
- data/lib/goldendocx/charts/properties/cross_axis_property.rb +16 -0
- data/lib/goldendocx/charts/properties/data_lables_property.rb +16 -0
- data/lib/goldendocx/charts/properties/direction_property.rb +16 -0
- data/lib/goldendocx/charts/properties/doughnut_chart_property.rb +17 -0
- data/lib/goldendocx/charts/properties/grouping_property.rb +16 -0
- data/lib/goldendocx/charts/properties/hole_property.rb +16 -0
- data/lib/goldendocx/charts/properties/index_property.rb +16 -0
- data/lib/goldendocx/charts/properties/label_hidden_property.rb +16 -0
- data/lib/goldendocx/charts/properties/layout_property.rb +14 -0
- data/lib/goldendocx/charts/properties/line_chart_property.rb +24 -0
- data/lib/goldendocx/charts/properties/marker_property.rb +16 -0
- data/lib/goldendocx/charts/properties/number_list_property.rb +17 -0
- data/lib/goldendocx/charts/properties/order_property.rb +16 -0
- data/lib/goldendocx/charts/properties/plot_area_property.rb +23 -0
- data/lib/goldendocx/charts/properties/point_count_property.rb +16 -0
- data/lib/goldendocx/charts/properties/point_property.rb +18 -0
- data/lib/goldendocx/charts/properties/rounded_corner_property.rb +16 -0
- data/lib/goldendocx/charts/properties/series_category_property.rb +16 -0
- data/lib/goldendocx/charts/properties/series_text_property.rb +16 -0
- data/lib/goldendocx/charts/properties/series_value_property.rb +16 -0
- data/lib/goldendocx/charts/properties/smooth_property.rb +14 -0
- data/lib/goldendocx/charts/properties/string_list_property.rb +17 -0
- data/lib/goldendocx/charts/properties/symbol_property.rb +16 -0
- data/lib/goldendocx/charts/properties/text_value_property.rb +16 -0
- data/lib/goldendocx/charts/properties.rb +12 -0
- data/lib/goldendocx/charts/reference.rb +16 -0
- data/lib/goldendocx/charts/series.rb +57 -0
- data/lib/goldendocx/charts/value_axis.rb +20 -0
- data/lib/goldendocx/charts.rb +26 -0
- data/lib/goldendocx/components/bar_chart.rb +17 -0
- data/lib/goldendocx/components/chart.rb +55 -0
- data/lib/goldendocx/components/column_chart.rb +17 -0
- data/lib/goldendocx/components/doughnut_chart.rb +17 -0
- data/lib/goldendocx/components/image.rb +77 -0
- data/lib/goldendocx/components/line_chart.rb +17 -0
- data/lib/goldendocx/components/paragraph.rb +23 -0
- data/lib/goldendocx/components/properties/align_property.rb +16 -0
- data/lib/goldendocx/components/properties/bold_property.rb +16 -0
- data/lib/goldendocx/components/properties/color_property.rb +16 -0
- data/lib/goldendocx/components/properties/drawing.rb +16 -0
- data/lib/goldendocx/components/properties/extents_property.rb +17 -0
- data/lib/goldendocx/components/properties/graphic_data_property.rb +17 -0
- data/lib/goldendocx/components/properties/graphic_frame_locks_property.rb +18 -0
- data/lib/goldendocx/components/properties/graphic_frame_property.rb +16 -0
- data/lib/goldendocx/components/properties/graphic_property.rb +16 -0
- data/lib/goldendocx/components/properties/inline.rb +20 -0
- data/lib/goldendocx/components/properties/non_visual_property.rb +17 -0
- data/lib/goldendocx/components/properties/padding_property.rb +19 -0
- data/lib/goldendocx/components/properties/property.rb +17 -0
- data/lib/goldendocx/components/properties/run.rb +20 -0
- data/lib/goldendocx/components/properties/run_property.rb +17 -0
- data/lib/goldendocx/components/properties/style_property.rb +16 -0
- data/lib/goldendocx/components/properties/textual.rb +16 -0
- data/lib/goldendocx/components/properties.rb +12 -0
- data/lib/goldendocx/components/table.rb +44 -0
- data/lib/goldendocx/components/text.rb +35 -0
- data/lib/goldendocx/components.rb +16 -0
- data/lib/goldendocx/configuration.rb +18 -0
- data/lib/goldendocx/content_types/default.rb +22 -0
- data/lib/goldendocx/content_types/override.rb +22 -0
- data/lib/goldendocx/document.rb +51 -0
- data/lib/goldendocx/documents/body.rb +90 -0
- data/lib/goldendocx/documents/document.rb +29 -0
- data/lib/goldendocx/documents/element.rb +23 -0
- data/lib/goldendocx/documents/relationship.rb +17 -0
- data/lib/goldendocx/documents/relationships.rb +39 -0
- data/lib/goldendocx/documents/style.rb +21 -0
- data/lib/goldendocx/documents/styles.rb +74 -0
- data/lib/goldendocx/documents/unparsed_style.rb +17 -0
- data/lib/goldendocx/documents.rb +10 -0
- data/lib/goldendocx/docx.rb +108 -0
- data/lib/goldendocx/element.rb +192 -0
- data/lib/goldendocx/images/picture.rb +41 -0
- data/lib/goldendocx/images/properties/blip_property.rb +16 -0
- data/lib/goldendocx/images/properties/drawing_property.rb +14 -0
- data/lib/goldendocx/images/properties/extents_property.rb +17 -0
- data/lib/goldendocx/images/properties/fill_rectangle_property.rb +14 -0
- data/lib/goldendocx/images/properties/image_data_property.rb +17 -0
- data/lib/goldendocx/images/properties/non_visual_drawing_property.rb +17 -0
- data/lib/goldendocx/images/properties/non_visual_picture_property.rb +17 -0
- data/lib/goldendocx/images/properties/picture_fill_property.rb +17 -0
- data/lib/goldendocx/images/properties/picture_shape_property.rb +16 -0
- data/lib/goldendocx/images/properties/shape_property.rb +30 -0
- data/lib/goldendocx/images/properties/stretch_property.rb +17 -0
- data/lib/goldendocx/images/properties/transform_property.rb +16 -0
- data/lib/goldendocx/images/properties.rb +12 -0
- data/lib/goldendocx/images/shape.rb +32 -0
- data/lib/goldendocx/images.rb +12 -0
- data/lib/goldendocx/parts/content_types.rb +63 -0
- data/lib/goldendocx/parts/documents.rb +103 -0
- data/lib/goldendocx/parts/media.rb +43 -0
- data/lib/goldendocx/parts.rb +10 -0
- data/lib/goldendocx/tables/cell.rb +33 -0
- data/lib/goldendocx/tables/header_cell.rb +16 -0
- data/lib/goldendocx/tables/header_row.rb +14 -0
- data/lib/goldendocx/tables/image_cell.rb +23 -0
- data/lib/goldendocx/tables/properties/cell_property.rb +19 -0
- data/lib/goldendocx/tables/properties/cell_width_property.rb +17 -0
- data/lib/goldendocx/tables/properties/grid_column_property.rb +16 -0
- data/lib/goldendocx/tables/properties/grid_property.rb +16 -0
- data/lib/goldendocx/tables/properties/grid_span_property.rb +16 -0
- data/lib/goldendocx/tables/properties/header_row_property.rb +14 -0
- data/lib/goldendocx/tables/properties/property.rb +17 -0
- data/lib/goldendocx/tables/properties/row_height_property.rb +17 -0
- data/lib/goldendocx/tables/properties/row_property.rb +16 -0
- data/lib/goldendocx/tables/properties/shading_property.rb +18 -0
- data/lib/goldendocx/tables/properties/style_property.rb +16 -0
- data/lib/goldendocx/tables/properties/vertical_align_property.rb +16 -0
- data/lib/goldendocx/tables/properties/width_property.rb +17 -0
- data/lib/goldendocx/tables/properties.rb +12 -0
- data/lib/goldendocx/tables/row.rb +28 -0
- data/lib/goldendocx/tables.rb +19 -0
- data/lib/goldendocx/units.rb +11 -0
- data/lib/goldendocx/version.rb +5 -0
- data/lib/goldendocx/xml_serializers/nokogiri.rb +66 -0
- data/lib/goldendocx/xml_serializers/ox.rb +63 -0
- data/lib/goldendocx.rb +72 -0
- data/sig/goldendocx.rbs +4 -0
- metadata +347 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class BoldProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :w
|
10
|
+
tag :b
|
11
|
+
|
12
|
+
attribute :enabled, alias_name: :val, namespace: :w
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class ColorProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :w
|
10
|
+
tag :color
|
11
|
+
|
12
|
+
attribute :hex, alias_name: :val, namespace: :w
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class Drawing
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :w
|
10
|
+
tag :drawing
|
11
|
+
|
12
|
+
embeds_one :inline, class_name: 'Goldendocx::Components::Properties::Inline', auto_build: true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class ExtentsProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :wp
|
10
|
+
tag :extent
|
11
|
+
|
12
|
+
attribute :width, alias_name: :cx, default: Goldendocx::Components::DEFAULT_WIDTH
|
13
|
+
attribute :height, alias_name: :cy, default: Goldendocx::Components::DEFAULT_HEIGHT
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class GraphicDataProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :a
|
10
|
+
tag :graphicData
|
11
|
+
|
12
|
+
embeds_one :picture, class_name: 'Goldendocx::Images::Picture', auto_build: false
|
13
|
+
embeds_one :chart, class_name: 'Goldendocx::Charts::Properties::Reference', auto_build: false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class GraphicFrameLocksProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :a
|
10
|
+
tag :graphicFrameLocks
|
11
|
+
|
12
|
+
attribute :lock_position, alias_name: :noMove, default: true
|
13
|
+
attribute :lock_size, alias_name: :noResize, default: true
|
14
|
+
attribute :lock_aspect, alias_name: :noChangeAspect, default: true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class GraphicFrameProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :wp
|
10
|
+
tag :cNvGraphicFramePr
|
11
|
+
|
12
|
+
embeds_one :locker, class_name: 'Goldendocx::Components::Properties::GraphicFrameLocksProperty', auto_build: true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class GraphicProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :a
|
10
|
+
tag :graphic
|
11
|
+
|
12
|
+
embeds_one :data, class_name: 'Goldendocx::Components::Properties::GraphicDataProperty', auto_build: true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class Inline
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :wp
|
10
|
+
tag :inline
|
11
|
+
|
12
|
+
embeds_one :extents, class_name: 'Goldendocx::Components::Properties::ExtentsProperty', auto_build: true
|
13
|
+
embeds_one :padding, class_name: 'Goldendocx::Components::Properties::PaddingProperty', auto_build: true
|
14
|
+
embeds_one :non_visual_property, class_name: 'Goldendocx::Components::Properties::NonVisualProperty', auto_build: true
|
15
|
+
embeds_one :graphic_frame, class_name: 'Goldendocx::Components::Properties::GraphicFrameProperty', auto_build: true
|
16
|
+
embeds_one :graphic, class_name: 'Goldendocx::Components::Properties::GraphicProperty', auto_build: true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class NonVisualProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :wp
|
10
|
+
tag :docPr
|
11
|
+
|
12
|
+
attribute :relationship_id, alias_name: :id
|
13
|
+
attribute :name
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class PaddingProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :wp
|
10
|
+
tag :effectExtent
|
11
|
+
|
12
|
+
attribute :left, alias_name: :l, default: 0
|
13
|
+
attribute :right, alias_name: :r, default: 0
|
14
|
+
attribute :top, alias_name: :t, default: 0
|
15
|
+
attribute :bottom, alias_name: :b, default: 0
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class Property
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :w
|
10
|
+
tag :pPr
|
11
|
+
|
12
|
+
embeds_one :style, class_name: 'Goldendocx::Components::Properties::StyleProperty', auto_build: true
|
13
|
+
embeds_one :align, class_name: 'Goldendocx::Components::Properties::AlignProperty', auto_build: true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class Run
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :w
|
10
|
+
tag :r
|
11
|
+
|
12
|
+
embeds_one :property, class_name: 'Goldendocx::Components::Properties::RunProperty', auto_build: false
|
13
|
+
|
14
|
+
embeds_one :text, class_name: 'Goldendocx::Components::Properties::Textual', auto_build: false
|
15
|
+
embeds_one :shape, class_name: 'Goldendocx::Images::Shape', auto_build: false
|
16
|
+
embeds_one :drawing, class_name: 'Goldendocx::Components::Properties::Drawing', auto_build: false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class RunProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :w
|
10
|
+
tag :rPr
|
11
|
+
|
12
|
+
embeds_one :color, class_name: 'Goldendocx::Components::Properties::ColorProperty', auto_build: false
|
13
|
+
embeds_one :bold, class_name: 'Goldendocx::Components::Properties::BoldProperty', auto_build: false
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
module Properties
|
6
|
+
class StyleProperty
|
7
|
+
include Goldendocx::Element
|
8
|
+
|
9
|
+
namespace :w
|
10
|
+
tag :pStyle
|
11
|
+
|
12
|
+
attribute :style_id, alias_name: :val, namespace: :w
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# TODO: Only support create new table for now.
|
4
|
+
# TODO: To parse a table from exist file for replacement someday
|
5
|
+
require 'goldendocx/tables'
|
6
|
+
|
7
|
+
module Goldendocx
|
8
|
+
module Components
|
9
|
+
class Table
|
10
|
+
include Goldendocx::Element
|
11
|
+
|
12
|
+
attr_reader :headers
|
13
|
+
|
14
|
+
namespace :w
|
15
|
+
tag :tbl
|
16
|
+
|
17
|
+
embeds_one :property, class_name: 'Goldendocx::Tables::Properties::Property', auto_build: true
|
18
|
+
embeds_one :grid_property, class_name: 'Goldendocx::Tables::Properties::GridProperty', auto_build: true
|
19
|
+
|
20
|
+
embeds_one :header, class_name: 'Goldendocx::Tables::HeaderRow', auto_build: true
|
21
|
+
embeds_many :rows, class_name: 'Goldendocx::Tables::Row'
|
22
|
+
|
23
|
+
def width=(width)
|
24
|
+
property.table_width.width = width if width
|
25
|
+
end
|
26
|
+
|
27
|
+
def style=(style)
|
28
|
+
property.table_style.style_id = style if style
|
29
|
+
end
|
30
|
+
|
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
|
34
|
+
header
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_row(cells)
|
38
|
+
row = build_row
|
39
|
+
cells.each { |data| row.add_cell data }
|
40
|
+
row
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
class Text
|
6
|
+
include Goldendocx::Element
|
7
|
+
|
8
|
+
namespace :w
|
9
|
+
tag :p
|
10
|
+
|
11
|
+
embeds_one :property, class_name: 'Goldendocx::Components::Properties::Property', auto_build: true
|
12
|
+
embeds_one :run, class_name: 'Goldendocx::Components::Properties::Run', auto_build: true
|
13
|
+
|
14
|
+
def align=(align)
|
15
|
+
property.align.align = align if align
|
16
|
+
end
|
17
|
+
|
18
|
+
def style=(style)
|
19
|
+
property.style.style_id = style if style
|
20
|
+
end
|
21
|
+
|
22
|
+
def text=(text)
|
23
|
+
run.build_text.value = text if text
|
24
|
+
end
|
25
|
+
|
26
|
+
def color=(color_hex)
|
27
|
+
(run.property || run.build_property).build_color(hex: color_hex) if color_hex
|
28
|
+
end
|
29
|
+
|
30
|
+
def bold=(bold)
|
31
|
+
(run.property || run.build_property).build_bold(enabled: bold) if bold
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Components
|
5
|
+
# 1 : 0.618
|
6
|
+
DEFAULT_WIDTH = Goldendocx::Units::EMU_PER_CENTIMETER * 15
|
7
|
+
DEFAULT_HEIGHT = Goldendocx::Units::EMU_PER_CENTIMETER * 9.27
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'goldendocx/components/properties'
|
12
|
+
require 'goldendocx/components/chart'
|
13
|
+
|
14
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'components', '*.rb').to_s).sort.each do |file|
|
15
|
+
require file
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
class Configuration
|
5
|
+
DEFAULT = {
|
6
|
+
xml_serializer: :ox
|
7
|
+
}.freeze
|
8
|
+
|
9
|
+
attr_accessor :xml_serializer
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
DEFAULT.each do |key, value|
|
13
|
+
var_name = :"@#{key}"
|
14
|
+
instance_variable_set var_name, value
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module ContentTypes
|
5
|
+
class Default
|
6
|
+
include Goldendocx::Element
|
7
|
+
|
8
|
+
tag :Default
|
9
|
+
attribute :extension, alias_name: :Extension, readonly: true
|
10
|
+
attribute :content_type, alias_name: :ContentType, readonly: true
|
11
|
+
|
12
|
+
def initialize(extension, content_type)
|
13
|
+
@extension = extension
|
14
|
+
@content_type = content_type
|
15
|
+
end
|
16
|
+
|
17
|
+
def ==(other)
|
18
|
+
extension == other.extension && content_type == other.content_type
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module ContentTypes
|
5
|
+
class Override
|
6
|
+
include Goldendocx::Element
|
7
|
+
|
8
|
+
tag :Override
|
9
|
+
attribute :part_name, alias_name: :PartName, readonly: true
|
10
|
+
attribute :content_type, alias_name: :ContentType, readonly: true
|
11
|
+
|
12
|
+
def initialize(part_name, content_type)
|
13
|
+
@part_name = part_name
|
14
|
+
@content_type = content_type
|
15
|
+
end
|
16
|
+
|
17
|
+
def ==(other)
|
18
|
+
part_name == other.part_name && content_type == other.content_type
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Just to mark a element as a root document node
|
4
|
+
module Goldendocx
|
5
|
+
module Document
|
6
|
+
def self.included(base)
|
7
|
+
base.include(Goldendocx::Element)
|
8
|
+
base.extend(ClassMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
def concern_namespaces(*namespaces)
|
13
|
+
namespaces.each do |namespace|
|
14
|
+
concerned_namespaces << namespace unless concerned_namespaces.include?(namespace)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def concerned_namespaces
|
19
|
+
@concerned_namespaces ||= []
|
20
|
+
end
|
21
|
+
|
22
|
+
def ignore_namespaces(*namespaces)
|
23
|
+
namespaces.each do |namespace|
|
24
|
+
ignorable_namespaces << namespace.to_sym unless ignorable_namespaces.include?(namespace)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def ignorable_namespaces
|
29
|
+
@ignorable_namespaces ||= []
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def concerned_namespaces
|
34
|
+
self.class.concerning_ancestors.flat_map(&:concerned_namespaces)
|
35
|
+
end
|
36
|
+
|
37
|
+
def ignorable_namespaces
|
38
|
+
self.class.concerning_ancestors.flat_map(&:ignorable_namespaces)
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_document_xml
|
42
|
+
Goldendocx.xml_serializer.build_document_xml(root_tag, concerned_namespaces, ignorable_namespaces) do |xml|
|
43
|
+
attributes.each { |name, value| xml[name] = value }
|
44
|
+
|
45
|
+
yield(xml) if block_given?
|
46
|
+
|
47
|
+
children.each { |child| xml << child }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Documents
|
5
|
+
class Body
|
6
|
+
include Goldendocx::Element
|
7
|
+
|
8
|
+
XML_PATH = 'word/document.xml'
|
9
|
+
|
10
|
+
attr_reader :components, :properties, :charts
|
11
|
+
|
12
|
+
namespace :w
|
13
|
+
tag :body
|
14
|
+
|
15
|
+
embeds_many :texts, class_name: 'Goldendocx::Components::Text'
|
16
|
+
embeds_many :images, class_name: 'Goldendocx::Components::Image'
|
17
|
+
embeds_many :tables, class_name: 'Goldendocx::Components::Table'
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@components = []
|
21
|
+
@charts = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def read_from(docx_file)
|
25
|
+
Goldendocx.xml_serializer.parse(docx_file.read(XML_PATH), %w[w:document w:body *]).map do |node|
|
26
|
+
element = Goldendocx::Documents::Element.new(node)
|
27
|
+
@components << element if element.component?
|
28
|
+
@properties = element if element.properties?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# FIXME: Override for children not in correctly order
|
33
|
+
def to_element(**_context)
|
34
|
+
Goldendocx.xml_serializer.build_element(root_tag) do |xml|
|
35
|
+
components.each { |component| xml << component }
|
36
|
+
xml << properties if properties
|
37
|
+
|
38
|
+
yield(xml) if block_given?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def create_text(text, options = {})
|
43
|
+
text = build_text(text: text, **options.slice(:align, :color, :bold))
|
44
|
+
|
45
|
+
components << text
|
46
|
+
|
47
|
+
text
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_table(options = {})
|
51
|
+
table = build_table
|
52
|
+
table.width = options[:width] if options[:width]
|
53
|
+
|
54
|
+
components << table
|
55
|
+
|
56
|
+
table
|
57
|
+
end
|
58
|
+
|
59
|
+
def create_image(relationship_id, options)
|
60
|
+
image = build_image(relationship_id: relationship_id, width: options[:width], height: options[:height])
|
61
|
+
|
62
|
+
components << image
|
63
|
+
|
64
|
+
image
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_embed_image(relationship_id, options)
|
68
|
+
Goldendocx::Components::Image.new(relationship_id: relationship_id, width: options[:width], height: options[:height])
|
69
|
+
end
|
70
|
+
|
71
|
+
def ensure_chart_type(chart_type)
|
72
|
+
chart_class = "::Goldendocx::Components::#{chart_type.capitalize}Chart"
|
73
|
+
raise Goldendocx::Charts::InvalidChartType unless Kernel.const_defined?(chart_class)
|
74
|
+
|
75
|
+
Kernel.const_get(chart_class)
|
76
|
+
end
|
77
|
+
|
78
|
+
def create_chart(chart_type, chart_id, relationship_id, options)
|
79
|
+
chart_class = ensure_chart_type(chart_type)
|
80
|
+
|
81
|
+
chart = chart_class.new(chart_id, relationship_id, options)
|
82
|
+
|
83
|
+
charts << chart
|
84
|
+
components << chart
|
85
|
+
|
86
|
+
chart
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Documents
|
5
|
+
class Document
|
6
|
+
include Goldendocx::Document
|
7
|
+
|
8
|
+
XML_PATH = 'word/document.xml'
|
9
|
+
|
10
|
+
namespace :w
|
11
|
+
tag :document
|
12
|
+
concern_namespaces :wpc, :o, :mo, :mv, :r, :m, :v, :wp14, :wp, :w10,
|
13
|
+
:w, :w14, :w15, :w16cid, :w16se, :wpg, :wpi, :wne, :wps, :mc,
|
14
|
+
:a, :a14, :pic, :c
|
15
|
+
ignore_namespaces :w14, :w15, :w16se, :w16cid, :wp14
|
16
|
+
|
17
|
+
embeds_one :body, class_name: 'Goldendocx::Documents::Body', auto_build: true
|
18
|
+
|
19
|
+
def read_from(docx_file)
|
20
|
+
body.read_from(docx_file)
|
21
|
+
end
|
22
|
+
|
23
|
+
def write_to(zos)
|
24
|
+
zos.put_next_entry XML_PATH
|
25
|
+
zos.write to_document_xml
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Goldendocx
|
4
|
+
module Documents
|
5
|
+
class Element
|
6
|
+
def initialize(node)
|
7
|
+
@node = node
|
8
|
+
end
|
9
|
+
|
10
|
+
def component?
|
11
|
+
%w[w:p w:tbl].include?(@node.name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def properties?
|
15
|
+
@node.name == 'w:sectPr'
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_element(**_context)
|
19
|
+
@node
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|