docstache 0.2.1 → 0.3.0

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
  SHA1:
3
- metadata.gz: ebc3b1a35a807456664b2f75b8f636fc7417075f
4
- data.tar.gz: 92fb9f96b317ed48ccdd9b10b889116bef154abf
3
+ metadata.gz: 64b050be7b5b3314f3970e3cf195dd436c18bbb8
4
+ data.tar.gz: ca44b9c1d7f1e2881edb09cac633a759b538412d
5
5
  SHA512:
6
- metadata.gz: 8a4830e510ea526919d69734b496767c596869e014cf775563c86dd7d84a52687ebfb6fd98eb0d56f927412dfb28aff5a314ae19cf7ac7b919d2144a2ab0dc4a
7
- data.tar.gz: 3a09c43efa037551271a60c8c7c704e7d954288c7ffbc176740bae2cde8238d3c96b5c43bfad86fad50bbb8c2706120f32a86e25a31c2181b741694ed5f5cd81
6
+ metadata.gz: c363eed61fd680c394a7fd47db76f2f1a134d1606bddc2645be3ca36ec09211689b6baf6318b7dcd6a0f676817d0d8e2cbee5b209560e1dc8f363f0dd495fda1
7
+ data.tar.gz: 2369c45c26d8e3613277e164d76c9ff17554aaa1f37c8b9251364db393565c69897e2889c29d0332d47a886482901edc41723657d33159c74b2a543a20de3aa0
data/changelog.md CHANGED
@@ -1,7 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0
4
+ * [???] Added ability to do tag interpolation in headers and footers. The header/footer used is the header or footer from the first document passed into `Document.new()`
5
+
3
6
  ## 0.2.1
4
- * [25b4c2e9e3dcb19b6fe9a255fec2c2bfd92029a6] Fixed a bug where a tag with regular expression characters could not be fixed with the `fix_errors` method
7
+ * [25b4c2e9e3dcb19b6fe9a255fec2c2bfd92029a6] Fixed a bug where a tag with regular expression characters could not be fixed with the `fix_errors` method
5
8
 
6
9
  ## 0.2.0
7
10
 
@@ -4,6 +4,7 @@ module Docstache
4
4
  raise ArgumentError if paths.empty?
5
5
  @path = paths.shift
6
6
  @zip_file = Zip::File.open(@path)
7
+ load_references
7
8
  @document = Nokogiri::XML(unzip_read(@zip_file, "word/document.xml"))
8
9
  zip_files = paths.map{|p| Zip::File.open(p)}
9
10
  documents = zip_files.map{|f| Nokogiri::XML(unzip_read(f, "word/document.xml"))}
@@ -11,16 +12,21 @@ module Docstache
11
12
  @document.css('w|p').last.add_next_sibling(page_break)
12
13
  @document.css('w|p').last.add_next_sibling(doc.css('w|body > *:not(w|sectPr)'))
13
14
  end
15
+ find_documents_to_interpolate
14
16
  end
15
17
 
16
18
  def tags
17
- @document.text.gsub(/\s+/, '').scan(/\{\{.+?\}\}/)
19
+ @documents.values.flat_map { |document|
20
+ document.text.gsub(/\s+/, '').scan(/\{\{.+?\}\}/)
21
+ }
18
22
  end
19
23
 
20
24
  def usable_tags
21
- @document.css('w|t').select { |tag| tag.text =~ /\{\{.+?\}\}/ }.map { |tag|
22
- tag.text.scan(/\{\{.+?\}\}/)
23
- }.flatten
25
+ @documents.values.flat_map { |document|
26
+ document.css('w|t').select { |tag| tag.text =~ /\{\{.+?\}\}/ }.flat_map { |tag|
27
+ tag.text.scan(/\{\{.+?\}\}/)
28
+ }
29
+ }
24
30
  end
25
31
 
26
32
  def fix_errors
@@ -34,19 +40,27 @@ module Docstache
34
40
  end
35
41
 
36
42
  def save
37
- buffer = zip_buffer(@document)
43
+ buffer = zip_buffer(@documents)
38
44
  File.open(@path, "w") {|f| f.write buffer.string}
39
45
  end
40
46
 
41
47
  def render_file(output, data={})
42
- rendered = Docstache::Renderer.new(@document, data).render
43
- buffer = zip_buffer(rendered)
48
+ rendered_documents = Hash[
49
+ @documents.map { |(path, document)|
50
+ [path, Docstache::Renderer.new(document.dup, data).render]
51
+ }
52
+ ]
53
+ buffer = zip_buffer(rendered_documents)
44
54
  File.open(output, "w") {|f| f.write buffer.string}
45
55
  end
46
56
 
47
57
  def render_stream(data={})
48
- rendered = Docstache::Renderer.new(@document, data).render
49
- buffer = zip_buffer(rendered)
58
+ rendered_documents = Hash[
59
+ @documents.map { |(path, document)|
60
+ [path, Docstache::Renderer.new(document.dup, data).render]
61
+ }
62
+ ]
63
+ buffer = zip_buffer(rendered_documents)
50
64
  buffer.rewind
51
65
  return buffer.sysread
52
66
  end
@@ -54,10 +68,16 @@ module Docstache
54
68
  private
55
69
 
56
70
  def problem_paragraphs
57
- missing_tags = tags - usable_tags
58
- missing_tags.flat_map do |tag|
59
- @document.css('w|p').select {|t| t.text =~ /#{Regexp.escape(tag)}/}
71
+ missing_tags = tags
72
+ usable_tags.each do |usable_tag|
73
+ index = missing_tags.index(usable_tag)
74
+ missing_tags.delete_at(index) if index
60
75
  end
76
+ missing_tags.flat_map { |tag|
77
+ @documents.values.inject([]) { |tags, document|
78
+ tags + document.css('w|p').select {|t| t.text =~ /#{Regexp.escape(tag)}/}
79
+ }
80
+ }
61
81
  end
62
82
 
63
83
  def flatten_paragraph(p)
@@ -78,16 +98,18 @@ module Docstache
78
98
  return contents
79
99
  end
80
100
 
81
- def zip_buffer(document)
101
+ def zip_buffer(documents)
82
102
  buffer = Zip::OutputStream.write_buffer do |out|
83
103
  @zip_file.entries.each do |e|
84
- unless ["word/document.xml"].include?(e.name)
104
+ unless documents.keys.include?(e.name)
85
105
  out.put_next_entry(e.name)
86
106
  out.write(e.get_input_stream.read)
87
107
  end
88
108
  end
89
- out.put_next_entry("word/document.xml")
90
- out.write(@document.to_xml(indent: 0).gsub("\n", ""))
109
+ documents.each do |path, document|
110
+ out.put_next_entry(path)
111
+ out.write(document.to_xml(indent: 0).gsub("\n", ""))
112
+ end
91
113
  end
92
114
  return buffer
93
115
  end
@@ -102,5 +124,28 @@ module Docstache
102
124
  br['w:type'] = "page"
103
125
  return p
104
126
  end
127
+
128
+ def load_references
129
+ @references = {}
130
+ ref_xml = Nokogiri::XML(unzip_read(@zip_file, "word/_rels/document.xml.rels"))
131
+ ref_xml.css("Relationship").each do |ref|
132
+ id = ref.attributes["Id"].value
133
+ @references[id] = {
134
+ id: id,
135
+ type: ref.attributes["Type"].value.split("/")[-1].to_sym,
136
+ target: ref.attributes["Target"].value
137
+ }
138
+ end
139
+ end
140
+
141
+ def find_documents_to_interpolate
142
+ @documents = {"word/document.xml" => @document}
143
+ @document.css("w|headerReference, w|footerReference").each do |header_ref|
144
+ if @references.has_key?(header_ref.attributes["id"].value)
145
+ ref = @references[header_ref.attributes["id"].value]
146
+ @documents["word/#{ref[:target]}"] = Nokogiri::XML(unzip_read(@zip_file, "word/#{ref[:target]}"))
147
+ end
148
+ end
149
+ end
105
150
  end
106
151
  end
@@ -1,3 +1,3 @@
1
1
  module Docstache
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docstache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Will Cosgrove
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-09 00:00:00.000000000 Z
11
+ date: 2016-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri