standard-procedure-consolidate 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 52bf3de85226b0aa00c8a2d5ad8caa7e0dbc7aa2e8707150d844e34a3313fcf9
4
- data.tar.gz: cf92c7c1fc1978cc7e615674d01e542d4ca5b4588da08856b6608301efd83109
3
+ metadata.gz: f240fafdaf4fea72b63ba38b70c0e49736bb46a3f1f793ed79030f0f184d7760
4
+ data.tar.gz: '08930023d6b6865933a65a1cbefcd026d3a33b56323f702b5b46c9eedb76a210'
5
5
  SHA512:
6
- metadata.gz: 1a2c3dfa7bc6fe20d8f3ddc2bdfe9f1c94fe53ddd1daf75009f96af35ba20f1d7acdaf6b1f3563b9484f50fa4a0a5b53ab4c2e161008f0131fd03d39b67df76f
7
- data.tar.gz: f169d41a245b6dbe95d20eeded64c5ff684ec4822dfab36ed342374916c6e7eb2c6dee82cc14fc89bc1d141ba4c1b259629e8b6ba219952bd949db0f53384aa8
6
+ metadata.gz: b205661ee1cd85599254559477ef73809086a9c232036c34a090b706437a01f46a947def4dfe3a90c12b50a0a589dcac671c1b5c5f1d9cea69bfadf160de5b02
7
+ data.tar.gz: 917b84c6116e50936b1de0a31605c345d8ec4ac48c466bd97afec9f937ebe81b67f0b56f9c5a75fda735d71f496382ef714d7b5e9012878b2f1af4223833a8d0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
+
1
2
  ## [Unreleased]
2
3
 
3
4
  ## [0.1.0] - 2023-07-25
4
5
 
5
6
  - Initial release
7
+
8
+ ## [0.1.1] - 2023-08-02
9
+
10
+ - Added `examine` to list the merge fields within a document
data/README.md CHANGED
@@ -13,12 +13,20 @@ It's pretty simple, so it probably won't work with complex Word documents, but i
13
13
 
14
14
  ## Usage
15
15
 
16
+ To list the merge fields within a document:
17
+
18
+ ```ruby
19
+ Consolidate::Docx::Merge.open "/path/to/docx" do |merge|
20
+ puts merge.examine
21
+ end and nil
22
+ ```
23
+ To perform a merge, replacing merge fields with supplied values:
24
+
16
25
  ```ruby
17
26
  Consolidate::Docx::Merge.open "/path/to/docx" do |merge|
18
27
  merge.data "Name" => "Alice Aadvark", "Company" => "TinyCo", "Job_Title" => "CEO"
19
28
  merge.write_to "/path/to/output.docx"
20
29
  end
21
-
22
30
  ```
23
31
 
24
32
  NOTE: The merge fields are case-sensitive - which is why they should be supplied as strings (using the older `{ "key" => "value" }` style ruby hash).
@@ -10,23 +10,25 @@ module Consolidate
10
10
  new(path, force_settings: force_settings, &block)
11
11
  end
12
12
 
13
+ def examine
14
+ extract_field_names
15
+ end
16
+
13
17
  def data fields = {}
14
18
  fields = fields.transform_keys(&:to_s)
15
19
 
16
- xml = @zip.read("word/document.xml")
17
- doc = Nokogiri::XML(xml) { |x| x.noent }
18
-
19
- doc = substitute_style_one_with xml, doc, fields
20
- doc = substitute_style_two_with xml, doc, fields
20
+ result = doc.dup
21
+ result = substitute_style_one_with result, fields
22
+ result = substitute_style_two_with result, fields
21
23
 
22
- @output["word/document.xml"] = doc.serialize save_with: 0
24
+ @output["word/document.xml"] = result.serialize save_with: 0
23
25
  end
24
26
 
25
27
  def write_to path
26
28
  Zip::File.open(path, Zip::File::CREATE) do |out|
27
- @zip.each do |entry|
29
+ zip.each do |entry|
28
30
  out.get_output_stream(entry.name) do |o|
29
- o.write(@output[entry.name] || @zip.read(entry.name))
31
+ o.write(output[entry.name] || zip.read(entry.name))
30
32
  end
31
33
  end
32
34
  end
@@ -34,33 +36,59 @@ module Consolidate
34
36
 
35
37
  protected
36
38
 
39
+ attr_reader :zip
40
+ attr_reader :xml
41
+ attr_reader :doc
42
+ attr_accessor :output
43
+
37
44
  def initialize(path, force_settings: true, &block)
38
45
  raise "No block given" unless block
39
46
  @output = {}
40
47
  set_standard_settings if force_settings
41
48
  begin
42
49
  @zip = Zip::File.open(path)
50
+ @xml = @zip.read("word/document.xml")
51
+ @doc = Nokogiri::XML(xml) { |x| x.noent }
52
+
43
53
  yield self
44
54
  ensure
45
55
  @zip.close
46
56
  end
47
57
  end
48
58
 
49
- def substitute_style_one_with xml, doc, fields
59
+ def extract_field_names
60
+ (extract_style_one + extract_style_two).uniq
61
+ end
62
+
63
+ def extract_style_one
64
+ (doc / "//w:fldSimple").collect do |field|
65
+ value = field.attributes["instr"].value.strip
66
+ value.include?("MERGEFIELD") ? value.gsub("MERGEFIELD", "").strip : nil
67
+ end.compact
68
+ end
69
+
70
+ def extract_style_two
71
+ (doc / "//w:instrText").collect do |instr|
72
+ value = instr.inner_text
73
+ value.include?("MERGEFIELD") ? value.gsub("MERGEFIELD", "").strip : nil
74
+ end.compact
75
+ end
76
+
77
+ def substitute_style_one_with document, fields
50
78
  # Word's first way of doing things
51
- (doc / "//w:fldSimple").each do |field|
79
+ (document / "//w:fldSimple").each do |field|
52
80
  if field.attributes["instr"].value =~ /MERGEFIELD (\S+)/
53
81
  text_node = (field / ".//w:t").first
54
82
  next unless text_node
55
83
  text_node.inner_html = fields[$1].to_s
56
84
  end
57
85
  end
58
- doc
86
+ document
59
87
  end
60
88
 
61
- def substitute_style_two_with xml, doc, fields
89
+ def substitute_style_two_with document, fields
62
90
  # Word's second way of doing things
63
- (doc / "//w:instrText").each do |instr|
91
+ (document / "//w:instrText").each do |instr|
64
92
  if instr.inner_text =~ /MERGEFIELD (\S+)/
65
93
  text_node = instr.parent.next_sibling.next_sibling.xpath(".//w:t").first
66
94
  text_node ||= instr.parent.next_sibling.next_sibling.next_sibling.xpath(".//w:t").first
@@ -68,16 +96,16 @@ module Consolidate
68
96
  text_node.inner_html = fields[$1].to_s
69
97
  end
70
98
  end
71
- doc
99
+ document
72
100
  end
73
101
 
74
102
  def set_standard_settings
75
- @output["word/settings.xml"] = %(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
103
+ output["word/settings.xml"] = %(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
76
104
  <w:settings xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main"><w:zoom w:percent="100"/></w:settings>)
77
105
  end
78
106
 
79
107
  def close
80
- @zip.close
108
+ zip.close
81
109
  end
82
110
  end
83
111
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Consolidate
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: standard-procedure-consolidate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rahoul Baruah
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-25 00:00:00.000000000 Z
11
+ date: 2023-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubyzip