standard-procedure-consolidate 0.1.2 → 0.1.4
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/.nova/Configuration.json +3 -0
- data/CHANGELOG.md +18 -6
- data/README.md +13 -1
- data/checksums/standard-procedure-consolidate-0.1.3.gem.sha512 +1 -0
- data/checksums/standard-procedure-consolidate-0.1.4.gem.sha512 +1 -0
- data/lib/consolidate/docx/merge.rb +23 -16
- data/lib/consolidate/version.rb +1 -1
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f45c16dc8e6f37f91043673804db8076030a804ab6c08fa1139f4d86cdf54b79
|
4
|
+
data.tar.gz: 7c77802d6b578ac50b9f9c8b5bad9ff097918fab5644eb3c771b2baf98451a36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ed822b460867d75395fdb9253ef3501619781d3ab31acaca7db4daf699658f8253d4a063336bcc2321bf6dd08f0207e91600172f8ec84e4263af055ee9107a7
|
7
|
+
data.tar.gz: 37a8f85beb0b9c65ba76bf9457edcb9e141d1e87aca1f65c01b5a4e43f45f143c66695d5922eb3ffafca43625f9e3745db8fd2e3c516dd6ffb73172a8c9437ac
|
data/CHANGELOG.md
CHANGED
@@ -1,15 +1,27 @@
|
|
1
|
+
## [0.1.4] - 2023-09-11
|
1
2
|
|
2
|
-
|
3
|
+
Updated which files get exclusions after crashes in production with some client files
|
3
4
|
|
4
|
-
## [0.1.
|
5
|
+
## [0.1.3] - 2023-09-07
|
5
6
|
|
6
|
-
|
7
|
+
Customer had an issue where some fields were not merging correctly
|
8
|
+
|
9
|
+
- Altered the code so it tries to perform the substitution in all .xml files that aren't obviously configuration data
|
10
|
+
- Added verbose option to show what the code was doing
|
11
|
+
- Added a list of files to `examine`
|
12
|
+
- Still no tests for the header/footer support
|
13
|
+
|
14
|
+
## [0.1.2] - 2023-08-23
|
15
|
+
|
16
|
+
- Added untested support for headers and footers
|
17
|
+
- this work was done in a rush to deal with a customer requirement - tests to come soon
|
7
18
|
|
8
19
|
## [0.1.1] - 2023-08-02
|
9
20
|
|
10
21
|
- Added `examine` to list the merge fields within a document
|
11
22
|
|
12
|
-
##
|
23
|
+
## [0.1.0] - 2023-07-25
|
13
24
|
|
14
|
-
-
|
15
|
-
|
25
|
+
- Initial release
|
26
|
+
|
27
|
+
## [Unreleased]
|
data/README.md
CHANGED
@@ -17,7 +17,7 @@ To list the merge fields within a document:
|
|
17
17
|
|
18
18
|
```ruby
|
19
19
|
Consolidate::Docx::Merge.open "/path/to/docx" do |merge|
|
20
|
-
|
20
|
+
merge.examine
|
21
21
|
end and nil
|
22
22
|
```
|
23
23
|
To perform a merge, replacing merge fields with supplied values:
|
@@ -31,6 +31,18 @@ end
|
|
31
31
|
|
32
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).
|
33
33
|
|
34
|
+
If your merge isn't working, you can pass `verbose: true` to `open` and it will list the internal .xml documents it finds, the fields it finds within those .xml documents and the substitutions it is trying to perform.
|
35
|
+
|
36
|
+
## How it works
|
37
|
+
|
38
|
+
This is a bit sketchy and pieced together from the [code I found]((https://gist.github.com/ericmason/7200448)) and various bits of skimming through the published file format.
|
39
|
+
|
40
|
+
A .docx file (unlike the previous .doc file), is actually a .zip file that contains a number of .xml files. The contents of the document are stored in these .xml files, along with configuration information and stuff like fonts and styles.
|
41
|
+
|
42
|
+
When setting up a merge field, Word adds some special tags into the .xml file. There appear to be two different versions of how it does this - using `w:fldSimple` or `w:instrText` tags. Consolidate goes through each .xml file within the document (ignoring some which are configuration related) and looks for these two types of tag.
|
43
|
+
|
44
|
+
The `data` method uses the hash of `field: value` data you supply, copies the .xml files and performs a straight text substitution on any matching merge fields. Then `write_to`
|
45
|
+
|
34
46
|
## Development
|
35
47
|
|
36
48
|
The repo contains a .devcontainer folder - this contains instructions for a development container that has everything needed to build the project. Once the container has started, you can use `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -0,0 +1 @@
|
|
1
|
+
fcf685ae67c99908b9d67a57e9bd4bfe6dc8f61c3e421e167d0c9912ab6ac32fd4ad9a273cbbee47e9157cafb311aaecb8db0995eb227aa0afe0bdcc3bc01ee3
|
@@ -0,0 +1 @@
|
|
1
|
+
da681c73463215031518b2606899503d3217ab92e1877bd8f966e5dc3ebc971ae686958b78da821feb24374f84d179e86cdaf29dbb90f0bacb0a7cbde8e66c6b
|
@@ -6,12 +6,14 @@ require "nokogiri"
|
|
6
6
|
module Consolidate
|
7
7
|
module Docx
|
8
8
|
class Merge
|
9
|
-
def self.open(path,
|
10
|
-
new(path,
|
9
|
+
def self.open(path, verbose: false, &block)
|
10
|
+
new(path, verbose: verbose, &block)
|
11
|
+
path
|
11
12
|
end
|
12
13
|
|
13
14
|
def examine
|
14
|
-
|
15
|
+
puts "Documents: #{extract_document_names}"
|
16
|
+
puts "Merge fields: #{extract_field_names}"
|
15
17
|
end
|
16
18
|
|
17
19
|
def data fields = {}
|
@@ -38,37 +40,44 @@ module Consolidate
|
|
38
40
|
|
39
41
|
protected
|
40
42
|
|
43
|
+
attr_reader :verbose
|
41
44
|
attr_reader :zip
|
42
45
|
attr_reader :xml
|
43
46
|
attr_reader :documents
|
44
47
|
attr_accessor :output
|
45
48
|
|
46
|
-
def initialize(path,
|
49
|
+
def initialize(path, verbose: false, &block)
|
47
50
|
raise "No block given" unless block
|
51
|
+
@verbose = verbose
|
48
52
|
@output = {}
|
49
53
|
@documents = {}
|
50
|
-
set_standard_settings if force_settings
|
51
54
|
begin
|
52
55
|
@zip = Zip::File.open(path)
|
53
|
-
|
54
|
-
next unless
|
55
|
-
|
56
|
-
|
57
|
-
|
56
|
+
@zip.entries.each do |entry|
|
57
|
+
next unless entry.name =~ /word\/(document|header|footer|footnotes|endnotes).?\.xml/
|
58
|
+
puts "Reading #{entry.name}" if verbose
|
59
|
+
xml = @zip.get_input_stream entry
|
60
|
+
@documents[entry.name] = Nokogiri::XML(xml) { |x| x.noent }
|
58
61
|
end
|
62
|
+
yield self
|
59
63
|
ensure
|
60
64
|
@zip.close
|
61
65
|
end
|
62
66
|
end
|
63
67
|
|
68
|
+
def extract_document_names
|
69
|
+
@zip.entries.collect { |entry| entry.name }.join(", ")
|
70
|
+
end
|
71
|
+
|
64
72
|
def extract_field_names
|
65
|
-
(extract_style_one + extract_style_two).uniq
|
73
|
+
(extract_style_one + extract_style_two).uniq.join(", ")
|
66
74
|
end
|
67
75
|
|
68
76
|
def extract_style_one
|
69
77
|
documents.collect do |name, document|
|
70
78
|
(document / "//w:fldSimple").collect do |field|
|
71
79
|
value = field.attributes["instr"].value.strip
|
80
|
+
puts "...found #{value} (v1) in #{name}" if verbose
|
72
81
|
value.include?("MERGEFIELD") ? value.gsub("MERGEFIELD", "").strip : nil
|
73
82
|
end.compact
|
74
83
|
end.flatten
|
@@ -78,6 +87,7 @@ module Consolidate
|
|
78
87
|
documents.collect do |name, document|
|
79
88
|
(document / "//w:instrText").collect do |instr|
|
80
89
|
value = instr.inner_text
|
90
|
+
puts "...found #{value} (v2) in #{name}" if verbose
|
81
91
|
value.include?("MERGEFIELD") ? value.gsub("MERGEFIELD", "").strip : nil
|
82
92
|
end.compact
|
83
93
|
end.flatten
|
@@ -89,6 +99,7 @@ module Consolidate
|
|
89
99
|
if field.attributes["instr"].value =~ /MERGEFIELD (\S+)/
|
90
100
|
text_node = (field / ".//w:t").first
|
91
101
|
next unless text_node
|
102
|
+
puts "...substituting v1 #{field.attributes["instr"]} with #{fields[$1]}" if verbose
|
92
103
|
text_node.inner_html = fields[$1].to_s
|
93
104
|
end
|
94
105
|
end
|
@@ -102,17 +113,13 @@ module Consolidate
|
|
102
113
|
text_node = instr.parent.next_sibling.next_sibling.xpath(".//w:t").first
|
103
114
|
text_node ||= instr.parent.next_sibling.next_sibling.next_sibling.xpath(".//w:t").first
|
104
115
|
next unless text_node
|
116
|
+
puts "...substituting v2 #{instr.inner_text} with #{fields[$1]}" if verbose
|
105
117
|
text_node.inner_html = fields[$1].to_s
|
106
118
|
end
|
107
119
|
end
|
108
120
|
document
|
109
121
|
end
|
110
122
|
|
111
|
-
def set_standard_settings
|
112
|
-
output["word/settings.xml"] = %(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
113
|
-
<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>)
|
114
|
-
end
|
115
|
-
|
116
123
|
def close
|
117
124
|
zip.close
|
118
125
|
end
|
data/lib/consolidate/version.rb
CHANGED
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.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rahoul Baruah
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -47,6 +47,7 @@ extensions: []
|
|
47
47
|
extra_rdoc_files: []
|
48
48
|
files:
|
49
49
|
- ".devcontainer/devcontainer.json"
|
50
|
+
- ".nova/Configuration.json"
|
50
51
|
- ".rspec"
|
51
52
|
- ".ruby-version"
|
52
53
|
- ".standard.yml"
|
@@ -57,6 +58,8 @@ files:
|
|
57
58
|
- Rakefile
|
58
59
|
- checksums/standard-procedure-consolidate-0.1.0.gem.sha512
|
59
60
|
- checksums/standard-procedure-consolidate-0.1.2.gem.sha512
|
61
|
+
- checksums/standard-procedure-consolidate-0.1.3.gem.sha512
|
62
|
+
- checksums/standard-procedure-consolidate-0.1.4.gem.sha512
|
60
63
|
- exe/consolidate
|
61
64
|
- lib/consolidate.rb
|
62
65
|
- lib/consolidate/docx/merge.rb
|
@@ -71,7 +74,7 @@ metadata:
|
|
71
74
|
homepage_uri: https://github.com/standard-procedure/standard-procedure-consolidate
|
72
75
|
source_code_uri: https://github.com/standard-procedure/standard-procedure-consolidate
|
73
76
|
changelog_uri: https://github.com/standard-procedure/standard-procedure-consolidate/blob/main/CHANGELOG.md
|
74
|
-
post_install_message:
|
77
|
+
post_install_message:
|
75
78
|
rdoc_options: []
|
76
79
|
require_paths:
|
77
80
|
- lib
|
@@ -87,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
90
|
version: '0'
|
88
91
|
requirements: []
|
89
92
|
rubygems_version: 3.4.10
|
90
|
-
signing_key:
|
93
|
+
signing_key:
|
91
94
|
specification_version: 4
|
92
95
|
summary: Simple ruby mailmerge for Microsoft Word .docx files.
|
93
96
|
test_files: []
|