template_docx 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,60 @@
1
+ require 'optparse'
2
+
3
+ module DocxTemplater
4
+ class Command
5
+ def initialize(args)
6
+ @args = args
7
+ @options = {}
8
+ end
9
+
10
+ def run
11
+ @opts = OptionParser.new(&method(:set_opts))
12
+ @opts.parse!(@args)
13
+ process!
14
+ exit 0
15
+ rescue Exception => ex
16
+ raise ex if @options[:trace] || SystemExit === ex
17
+ $stderr.print "#{ex.class}: " if ex.class != RuntimeError
18
+ $stderr.puts ex.message
19
+ $stderr.puts ' Use --trace for backtrace.'
20
+ exit 1
21
+ end
22
+
23
+ def self.generate_doc(options = {})
24
+ puts "options: #{options}"
25
+
26
+ DocxTemplater::DocxCreator.new(options[:input_file], options[:data]).generate_docx_file(options[:output_file])
27
+
28
+ archive = Zip::File.open(options[:output_file])
29
+ archive.close
30
+
31
+ DocxTemplater.open_output_file options[:output_file]
32
+ end
33
+
34
+ protected
35
+
36
+ def process!
37
+ args = @args.dup
38
+
39
+ @options[:input] = file = args.shift
40
+ @options[:output] = destination = args.shift
41
+
42
+ @options[:input] = file = "-" unless file
43
+
44
+ if File.directory?(@options[:input])
45
+ Dir["#{@options[:input]}/**/*.#{format}"].each { |file| _process(file, destination) }
46
+ else
47
+ _process(file, destination)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def input_is_dir?
54
+ File.directory? @options[:input]
55
+ end
56
+
57
+ def _process(file, destination = nil)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,39 @@
1
+ require 'zip'
2
+
3
+ module DocxTemplater
4
+ class DocxCreator
5
+ attr_reader :template_path, :template_processor
6
+
7
+ def initialize(template_path, data, escape_html = true)
8
+ @template_path = template_path
9
+ @template_processor = TemplateProcessor.new(data, escape_html)
10
+ end
11
+
12
+ def generate_docx_file(file_name = "output_#{Time.now.strftime('%Y-%m-%d_%H%M')}.docx")
13
+ File.open(file_name, 'w') do |f|
14
+ f.write(generate_docx_bytes.string)
15
+ end
16
+ end
17
+
18
+ def generate_docx_bytes
19
+ Zip::OutputStream.write_buffer(StringIO.new) do |out|
20
+ Zip::File.open(template_path).each do |entry|
21
+ entry_name = entry.name
22
+ out.put_next_entry(entry_name)
23
+ out.write(copy_or_template(entry_name, entry.get_input_stream.read))
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def copy_or_template(entry_name, entry_bytes)
31
+ # Inside the word document archive is one file with contents of the actual document. Modify it.
32
+ if entry_name == 'word/document.xml'
33
+ template_processor.render(entry_bytes)
34
+ else
35
+ entry_bytes
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,84 @@
1
+ require 'nokogiri'
2
+
3
+ module DocxTemplater
4
+ class TemplateProcessor
5
+ attr_reader :data, :escape_html
6
+
7
+ # data is expected to be a hash of symbols => string or arrays of hashes.
8
+ def initialize(data, escape_html = true)
9
+ @data = data
10
+ @escape_html = escape_html
11
+ end
12
+
13
+ def render(document)
14
+ document.force_encoding(Encoding::UTF_8) if document.respond_to?(:force_encoding)
15
+ data.each do |key, value|
16
+ if value.class == Array
17
+ document = enter_multiple_values(document, key)
18
+ document.gsub!("#SUM:#{key.to_s.upcase}#", value.count.to_s)
19
+ else
20
+ document.gsub!("$#{key.to_s.upcase}$", safe(value))
21
+ end
22
+ end
23
+ document
24
+ end
25
+
26
+ private
27
+
28
+ def safe(text)
29
+ if escape_html
30
+ text.to_s.gsub('&', '&amp;').gsub('>', '&gt;').gsub('<', '&lt;')
31
+ else
32
+ text.to_s
33
+ end
34
+ end
35
+
36
+ def enter_multiple_values(document, key)
37
+ DocxTemplater.log("enter_multiple_values for: #{key}")
38
+ # TODO: ideally we would not re-parse xml doc every time
39
+ xml = Nokogiri::XML(document)
40
+
41
+ begin_row = "#BEGIN_ROW:#{key.to_s.upcase}#"
42
+ end_row = "#END_ROW:#{key.to_s.upcase}#"
43
+ begin_row_template = xml.xpath("//w:tr[contains(., '#{begin_row}')]", xml.root.namespaces).first
44
+ end_row_template = xml.xpath("//w:tr[contains(., '#{end_row}')]", xml.root.namespaces).first
45
+ DocxTemplater.log("begin_row_template: #{begin_row_template}")
46
+ DocxTemplater.log("end_row_template: #{end_row_template}")
47
+ fail "unmatched template markers: #{begin_row} nil: #{begin_row_template.nil?}, #{end_row} nil: #{end_row_template.nil?}. This could be because word broke up tags with it's own xml entries. See README." unless begin_row_template && end_row_template
48
+
49
+ row_templates = []
50
+ row = begin_row_template.next_sibling
51
+ while row != end_row_template
52
+ row_templates.unshift(row)
53
+ row = row.next_sibling
54
+ end
55
+ DocxTemplater.log("row_templates: (#{row_templates.count}) #{row_templates.map(&:to_s).inspect}")
56
+
57
+ # for each data, reversed so they come out in the right order
58
+ data[key].reverse_each do |each_data|
59
+ DocxTemplater.log("each_data: #{each_data.inspect}")
60
+
61
+ # dup so we have new nodes to append
62
+ row_templates.map(&:dup).each do |new_row|
63
+ DocxTemplater.log(" new_row: #{new_row}")
64
+ innards = new_row.inner_html
65
+ matches = innards.scan(/\$EACH:([^\$]+)\$/)
66
+ unless matches.empty?
67
+ DocxTemplater.log(" matches: #{matches.inspect}")
68
+ matches.map(&:first).each do |each_key|
69
+ DocxTemplater.log(" each_key: #{each_key}")
70
+ innards.gsub!("$EACH:#{each_key}$", safe(each_data[each_key.downcase.to_sym]))
71
+ end
72
+ end
73
+ # change all the internals of the new node, even if we did not template
74
+ new_row.inner_html = innards
75
+ # DocxTemplater::log("new_row new innards: #{new_row.inner_html}")
76
+
77
+ begin_row_template.add_next_sibling(new_row)
78
+ end
79
+ end
80
+ (row_templates + [begin_row_template, end_row_template]).each(&:unlink)
81
+ xml.to_s
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,3 @@
1
+ module DocxTemplater
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,1122 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2
+ <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mo="http://schemas.microsoft.com/office/mac/office/2008/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="urn:schemas-microsoft-com:mac:vml" 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:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14">
3
+ <w:body>
4
+ <w:p w14:paraId="1D2C4277" w14:textId="77777777" w:rsidR="00DD4FA9" w:rsidRPr="00B90852" w:rsidRDefault="00CC5193" w:rsidP="0069391E">
5
+ <w:pPr>
6
+ <w:pStyle w:val="Heading2"/>
7
+ <w:jc w:val="center"/>
8
+ </w:pPr>
9
+ <w:r w:rsidRPr="00B90852">
10
+ <w:t xml:space="preserve">Sample Class Information for: </w:t>
11
+ </w:r>
12
+ <w:r w:rsidRPr="00B90852">
13
+ <w:rPr>
14
+ <w:i/>
15
+ </w:rPr>
16
+ <w:t>$TEACHER$</w:t>
17
+ </w:r>
18
+ </w:p>
19
+ <w:p w14:paraId="45FE9391" w14:textId="77777777" w:rsidR="00CC5193" w:rsidRDefault="00CC5193"/>
20
+ <w:p w14:paraId="526FEE54" w14:textId="77777777" w:rsidR="00CC5193" w:rsidRDefault="00CC5193"/>
21
+ <w:tbl>
22
+ <w:tblPr>
23
+ <w:tblStyle w:val="MediumShading2-Accent1"/>
24
+ <w:tblW w:w="0" w:type="auto"/>
25
+ <w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
26
+ </w:tblPr>
27
+ <w:tblGrid>
28
+ <w:gridCol w:w="4428"/>
29
+ <w:gridCol w:w="4428"/>
30
+ </w:tblGrid>
31
+ <w:tr w:rsidR="00CC5193" w14:paraId="2831217E" w14:textId="77777777" w:rsidTr="00B90852">
32
+ <w:trPr>
33
+ <w:cnfStyle w:val="100000000000" w:firstRow="1" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
34
+ </w:trPr>
35
+ <w:tc>
36
+ <w:tcPr>
37
+ <w:cnfStyle w:val="001000000100" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="1" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
38
+ <w:tcW w:w="4428" w:type="dxa"/>
39
+ </w:tcPr>
40
+ <w:p w14:paraId="2B16DF63" w14:textId="1EFC7516" w:rsidR="00CC5193" w:rsidRDefault="005E509A" w:rsidP="005E509A">
41
+ <w:pPr>
42
+ <w:tabs>
43
+ <w:tab w:val="left" w:pos="3507"/>
44
+ </w:tabs>
45
+ </w:pPr>
46
+ <w:r>
47
+ <w:t>Summary</w:t>
48
+ </w:r>
49
+ </w:p>
50
+ </w:tc>
51
+ <w:tc>
52
+ <w:tcPr>
53
+ <w:tcW w:w="4428" w:type="dxa"/>
54
+ </w:tcPr>
55
+ <w:p w14:paraId="2784AEC2" w14:textId="4C3D47A9" w:rsidR="00CC5193" w:rsidRDefault="00CC5193">
56
+ <w:pPr>
57
+ <w:cnfStyle w:val="100000000000" w:firstRow="1" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
58
+ </w:pPr>
59
+ </w:p>
60
+ </w:tc>
61
+ </w:tr>
62
+ <w:tr w:rsidR="00CC5193" w14:paraId="726DBD19" w14:textId="77777777" w:rsidTr="00B90852">
63
+ <w:trPr>
64
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
65
+ </w:trPr>
66
+ <w:tc>
67
+ <w:tcPr>
68
+ <w:cnfStyle w:val="001000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
69
+ <w:tcW w:w="4428" w:type="dxa"/>
70
+ </w:tcPr>
71
+ <w:p w14:paraId="7FDEB084" w14:textId="77777777" w:rsidR="00CC5193" w:rsidRDefault="00CC5193">
72
+ <w:r>
73
+ <w:t>Building</w:t>
74
+ </w:r>
75
+ </w:p>
76
+ </w:tc>
77
+ <w:tc>
78
+ <w:tcPr>
79
+ <w:tcW w:w="4428" w:type="dxa"/>
80
+ </w:tcPr>
81
+ <w:p w14:paraId="1D26BEAD" w14:textId="77777777" w:rsidR="00CC5193" w:rsidRDefault="00CC5193">
82
+ <w:pPr>
83
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
84
+ </w:pPr>
85
+ <w:r>
86
+ <w:t>$BUILDING$</w:t>
87
+ </w:r>
88
+ </w:p>
89
+ </w:tc>
90
+ </w:tr>
91
+ <w:tr w:rsidR="005E509A" w14:paraId="6B97DE41" w14:textId="77777777" w:rsidTr="00B90852">
92
+ <w:tc>
93
+ <w:tcPr>
94
+ <w:cnfStyle w:val="001000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
95
+ <w:tcW w:w="4428" w:type="dxa"/>
96
+ </w:tcPr>
97
+ <w:p w14:paraId="23CC8817" w14:textId="6461E8F4" w:rsidR="005E509A" w:rsidRDefault="005E509A">
98
+ <w:r>
99
+ <w:t>Classroom</w:t>
100
+ </w:r>
101
+ <w:r>
102
+ <w:tab/>
103
+ </w:r>
104
+ </w:p>
105
+ </w:tc>
106
+ <w:tc>
107
+ <w:tcPr>
108
+ <w:tcW w:w="4428" w:type="dxa"/>
109
+ </w:tcPr>
110
+ <w:p w14:paraId="788D9B9D" w14:textId="1B32C3DE" w:rsidR="005E509A" w:rsidRDefault="005E509A">
111
+ <w:pPr>
112
+ <w:cnfStyle w:val="000000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
113
+ </w:pPr>
114
+ <w:r>
115
+ <w:t>$CLASSROOM$</w:t>
116
+ </w:r>
117
+ </w:p>
118
+ </w:tc>
119
+ </w:tr>
120
+ <w:tr w:rsidR="005E509A" w14:paraId="215050AE" w14:textId="77777777" w:rsidTr="00B90852">
121
+ <w:trPr>
122
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
123
+ </w:trPr>
124
+ <w:tc>
125
+ <w:tcPr>
126
+ <w:cnfStyle w:val="001000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
127
+ <w:tcW w:w="4428" w:type="dxa"/>
128
+ </w:tcPr>
129
+ <w:p w14:paraId="76FC6882" w14:textId="77777777" w:rsidR="005E509A" w:rsidRDefault="005E509A">
130
+ <w:r>
131
+ <w:t>District</w:t>
132
+ </w:r>
133
+ </w:p>
134
+ </w:tc>
135
+ <w:tc>
136
+ <w:tcPr>
137
+ <w:tcW w:w="4428" w:type="dxa"/>
138
+ </w:tcPr>
139
+ <w:p w14:paraId="4C4229F4" w14:textId="77777777" w:rsidR="005E509A" w:rsidRDefault="005E509A">
140
+ <w:pPr>
141
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
142
+ </w:pPr>
143
+ <w:r>
144
+ <w:t>$DISTRICT$</w:t>
145
+ </w:r>
146
+ </w:p>
147
+ </w:tc>
148
+ </w:tr>
149
+ <w:tr w:rsidR="005E509A" w14:paraId="35FCE43F" w14:textId="77777777" w:rsidTr="00B90852">
150
+ <w:tc>
151
+ <w:tcPr>
152
+ <w:cnfStyle w:val="001000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
153
+ <w:tcW w:w="4428" w:type="dxa"/>
154
+ </w:tcPr>
155
+ <w:p w14:paraId="2133F14A" w14:textId="77777777" w:rsidR="005E509A" w:rsidRDefault="005E509A">
156
+ <w:r>
157
+ <w:t>Seniority</w:t>
158
+ </w:r>
159
+ </w:p>
160
+ </w:tc>
161
+ <w:tc>
162
+ <w:tcPr>
163
+ <w:tcW w:w="4428" w:type="dxa"/>
164
+ </w:tcPr>
165
+ <w:p w14:paraId="60BC61B2" w14:textId="3494105A" w:rsidR="005E509A" w:rsidRDefault="005E509A">
166
+ <w:pPr>
167
+ <w:cnfStyle w:val="000000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
168
+ </w:pPr>
169
+ <w:r>
170
+ <w:t>$SENORITY$ y</w:t>
171
+ </w:r>
172
+ <w:r w:rsidR="00550EF0">
173
+ <w:t>ea</w:t>
174
+ </w:r>
175
+ <w:r>
176
+ <w:t>rs</w:t>
177
+ </w:r>
178
+ </w:p>
179
+ </w:tc>
180
+ </w:tr>
181
+ </w:tbl>
182
+ <w:p w14:paraId="76120C60" w14:textId="77777777" w:rsidR="00CC5193" w:rsidRDefault="00CC5193"/>
183
+ <w:p w14:paraId="5DF76164" w14:textId="5E0C880F" w:rsidR="00B90852" w:rsidRPr="00B90852" w:rsidRDefault="00CC5193">
184
+ <w:pPr>
185
+ <w:rPr>
186
+ <w:u w:val="single"/>
187
+ </w:rPr>
188
+ </w:pPr>
189
+ <w:r w:rsidRPr="0069391E">
190
+ <w:rPr>
191
+ <w:u w:val="single"/>
192
+ </w:rPr>
193
+ <w:t>Class Roster</w:t>
194
+ </w:r>
195
+ <w:r w:rsidR="005F534D">
196
+ <w:rPr>
197
+ <w:u w:val="single"/>
198
+ </w:rPr>
199
+ <w:t xml:space="preserve"> #SUM:ROSTER# Students</w:t>
200
+ </w:r>
201
+ </w:p>
202
+ <w:p w14:paraId="4B07EAB4" w14:textId="18ADB97C" w:rsidR="00585580" w:rsidRDefault="005D52B6">
203
+ <w:pPr>
204
+ <w:rPr>
205
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
206
+ <w:sz w:val="22"/>
207
+ </w:rPr>
208
+ </w:pPr>
209
+ <w:r>
210
+ <w:rPr>
211
+ <w:b/>
212
+ <w:color w:val="FF0000"/>
213
+ <w:sz w:val="22"/>
214
+ </w:rPr>
215
+ <w:t xml:space="preserve">TECHNICAL </w:t>
216
+ </w:r>
217
+ <w:r w:rsidR="00585580" w:rsidRPr="00B90852">
218
+ <w:rPr>
219
+ <w:b/>
220
+ <w:color w:val="FF0000"/>
221
+ <w:sz w:val="22"/>
222
+ </w:rPr>
223
+ <w:t xml:space="preserve">NOTE: </w:t>
224
+ </w:r>
225
+ <w:r w:rsidR="00B90852" w:rsidRPr="00B90852">
226
+ <w:rPr>
227
+ <w:b/>
228
+ <w:color w:val="FF0000"/>
229
+ <w:sz w:val="22"/>
230
+ </w:rPr>
231
+ <w:t xml:space="preserve">You will probably need to </w:t>
232
+ </w:r>
233
+ <w:r w:rsidR="00747C65">
234
+ <w:rPr>
235
+ <w:b/>
236
+ <w:color w:val="FF0000"/>
237
+ <w:sz w:val="22"/>
238
+ </w:rPr>
239
+ <w:t xml:space="preserve">extract and </w:t>
240
+ </w:r>
241
+ <w:r w:rsidR="00B90852" w:rsidRPr="00B90852">
242
+ <w:rPr>
243
+ <w:b/>
244
+ <w:color w:val="FF0000"/>
245
+ <w:sz w:val="22"/>
246
+ </w:rPr>
247
+ <w:t xml:space="preserve">edit the </w:t>
248
+ </w:r>
249
+ <w:r w:rsidR="00747C65">
250
+ <w:rPr>
251
+ <w:b/>
252
+ <w:color w:val="FF0000"/>
253
+ <w:sz w:val="22"/>
254
+ </w:rPr>
255
+ <w:t xml:space="preserve">xml </w:t>
256
+ </w:r>
257
+ <w:r w:rsidR="00B90852" w:rsidRPr="00B90852">
258
+ <w:rPr>
259
+ <w:b/>
260
+ <w:color w:val="FF0000"/>
261
+ <w:sz w:val="22"/>
262
+ </w:rPr>
263
+ <w:t>template manually after creating</w:t>
264
+ </w:r>
265
+ <w:r w:rsidR="00747C65">
266
+ <w:rPr>
267
+ <w:b/>
268
+ <w:color w:val="FF0000"/>
269
+ <w:sz w:val="22"/>
270
+ </w:rPr>
271
+ <w:t xml:space="preserve"> in Word</w:t>
272
+ </w:r>
273
+ <w:r w:rsidR="00B90852" w:rsidRPr="00B90852">
274
+ <w:rPr>
275
+ <w:b/>
276
+ <w:color w:val="FF0000"/>
277
+ <w:sz w:val="22"/>
278
+ </w:rPr>
279
+ <w:t xml:space="preserve">, to prepare the </w:t>
280
+ </w:r>
281
+ <w:r w:rsidR="00747C65">
282
+ <w:rPr>
283
+ <w:b/>
284
+ <w:color w:val="FF0000"/>
285
+ <w:sz w:val="22"/>
286
+ </w:rPr>
287
+ <w:t xml:space="preserve">ruby </w:t>
288
+ </w:r>
289
+ <w:r w:rsidR="00B90852" w:rsidRPr="00B90852">
290
+ <w:rPr>
291
+ <w:b/>
292
+ <w:color w:val="FF0000"/>
293
+ <w:sz w:val="22"/>
294
+ </w:rPr>
295
+ <w:t xml:space="preserve">script </w:t>
296
+ </w:r>
297
+ <w:r w:rsidR="00747C65">
298
+ <w:rPr>
299
+ <w:b/>
300
+ <w:color w:val="FF0000"/>
301
+ <w:sz w:val="22"/>
302
+ </w:rPr>
303
+ <w:t xml:space="preserve">template with </w:t>
304
+ </w:r>
305
+ <w:r w:rsidR="00B90852" w:rsidRPr="00B90852">
306
+ <w:rPr>
307
+ <w:b/>
308
+ <w:color w:val="FF0000"/>
309
+ <w:sz w:val="22"/>
310
+ </w:rPr>
311
+ <w:t>it.</w:t>
312
+ </w:r>
313
+ <w:r w:rsidR="00B90852" w:rsidRPr="00B90852">
314
+ <w:rPr>
315
+ <w:sz w:val="22"/>
316
+ </w:rPr>
317
+ <w:t xml:space="preserve"> </w:t>
318
+ </w:r>
319
+ <w:r w:rsidR="00585580">
320
+ <w:rPr>
321
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
322
+ <w:sz w:val="22"/>
323
+ </w:rPr>
324
+ <w:t xml:space="preserve">This is very </w:t>
325
+ </w:r>
326
+ <w:r w:rsidR="00C8406D">
327
+ <w:rPr>
328
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
329
+ <w:sz w:val="22"/>
330
+ </w:rPr>
331
+ <w:t>fiddly</w:t>
332
+ </w:r>
333
+ <w:r w:rsidR="00747C65">
334
+ <w:rPr>
335
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
336
+ <w:sz w:val="22"/>
337
+ </w:rPr>
338
+ <w:t xml:space="preserve"> / hacky. You can’t have Wo</w:t>
339
+ </w:r>
340
+ <w:r w:rsidR="00585580">
341
+ <w:rPr>
342
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
343
+ <w:sz w:val="22"/>
344
+ </w:rPr>
345
+ <w:t xml:space="preserve">rd’s ugly markup around the fields to </w:t>
346
+ </w:r>
347
+ <w:r w:rsidR="007146EA">
348
+ <w:rPr>
349
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
350
+ <w:sz w:val="22"/>
351
+ </w:rPr>
352
+ <w:t>template</w:t>
353
+ </w:r>
354
+ <w:r w:rsidR="00585580">
355
+ <w:rPr>
356
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
357
+ <w:sz w:val="22"/>
358
+ </w:rPr>
359
+ <w:t>. It will try to break up fields with markup. Test the template, fixing it until the extra</w:t>
360
+ </w:r>
361
+ <w:r w:rsidR="00082AB5">
362
+ <w:rPr>
363
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
364
+ <w:sz w:val="22"/>
365
+ </w:rPr>
366
+ <w:t>cted word/document.xml as</w:t>
367
+ </w:r>
368
+ <w:r w:rsidR="00585580">
369
+ <w:rPr>
370
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
371
+ <w:sz w:val="22"/>
372
+ </w:rPr>
373
+ <w:t xml:space="preserve"> needed.</w:t>
374
+ </w:r>
375
+ </w:p>
376
+ <w:p w14:paraId="39FDCEBC" w14:textId="77777777" w:rsidR="008F0A35" w:rsidRDefault="008F0A35">
377
+ <w:pPr>
378
+ <w:rPr>
379
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
380
+ <w:sz w:val="22"/>
381
+ </w:rPr>
382
+ </w:pPr>
383
+ </w:p>
384
+ <w:p w14:paraId="58F0C462" w14:textId="5D631C03" w:rsidR="008F0A35" w:rsidRDefault="008F0A35" w:rsidP="008F0A35">
385
+ <w:pPr>
386
+ <w:ind w:firstLine="720"/>
387
+ <w:rPr>
388
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
389
+ <w:sz w:val="22"/>
390
+ </w:rPr>
391
+ </w:pPr>
392
+ <w:r>
393
+ <w:rPr>
394
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
395
+ <w:sz w:val="22"/>
396
+ </w:rPr>
397
+ <w:t>I frequently use this command:</w:t>
398
+ </w:r>
399
+ </w:p>
400
+ <w:p w14:paraId="27AAC563" w14:textId="6DD11339" w:rsidR="008F0A35" w:rsidRPr="008F0A35" w:rsidRDefault="008F0A35" w:rsidP="008F0A35">
401
+ <w:pPr>
402
+ <w:rPr>
403
+ <w:i/>
404
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
405
+ <w:sz w:val="22"/>
406
+ </w:rPr>
407
+ </w:pPr>
408
+ <w:proofErr w:type="spellStart"/>
409
+ <w:proofErr w:type="gramStart"/>
410
+ <w:r w:rsidRPr="008F0A35">
411
+ <w:rPr>
412
+ <w:i/>
413
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
414
+ <w:sz w:val="22"/>
415
+ </w:rPr>
416
+ <w:t>rm</w:t>
417
+ </w:r>
418
+ <w:proofErr w:type="spellEnd"/>
419
+ <w:proofErr w:type="gramEnd"/>
420
+ <w:r w:rsidRPr="008F0A35">
421
+ <w:rPr>
422
+ <w:i/>
423
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
424
+ <w:sz w:val="22"/>
425
+ </w:rPr>
426
+ <w:t xml:space="preserve"> -</w:t>
427
+ </w:r>
428
+ <w:proofErr w:type="spellStart"/>
429
+ <w:r w:rsidRPr="008F0A35">
430
+ <w:rPr>
431
+ <w:i/>
432
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
433
+ <w:sz w:val="22"/>
434
+ </w:rPr>
435
+ <w:t>rf</w:t>
436
+ </w:r>
437
+ <w:proofErr w:type="spellEnd"/>
438
+ <w:r w:rsidRPr="008F0A35">
439
+ <w:rPr>
440
+ <w:i/>
441
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
442
+ <w:sz w:val="22"/>
443
+ </w:rPr>
444
+ <w:t xml:space="preserve"> word/; </w:t>
445
+ </w:r>
446
+ <w:r>
447
+ <w:rPr>
448
+ <w:i/>
449
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
450
+ <w:sz w:val="22"/>
451
+ </w:rPr>
452
+ <w:t xml:space="preserve"> </w:t>
453
+ </w:r>
454
+ <w:r w:rsidRPr="008F0A35">
455
+ <w:rPr>
456
+ <w:i/>
457
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
458
+ <w:sz w:val="22"/>
459
+ </w:rPr>
460
+ <w:t xml:space="preserve">unzip ExampleTemplate.docx </w:t>
461
+ </w:r>
462
+ <w:r>
463
+ <w:rPr>
464
+ <w:i/>
465
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
466
+ <w:sz w:val="22"/>
467
+ </w:rPr>
468
+ <w:t xml:space="preserve"> </w:t>
469
+ </w:r>
470
+ <w:r w:rsidRPr="008F0A35">
471
+ <w:rPr>
472
+ <w:i/>
473
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
474
+ <w:sz w:val="22"/>
475
+ </w:rPr>
476
+ <w:t>word/document.xml;</w:t>
477
+ </w:r>
478
+ <w:r>
479
+ <w:rPr>
480
+ <w:i/>
481
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
482
+ <w:sz w:val="22"/>
483
+ </w:rPr>
484
+ <w:t xml:space="preserve"> </w:t>
485
+ </w:r>
486
+ <w:r w:rsidRPr="008F0A35">
487
+ <w:rPr>
488
+ <w:i/>
489
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
490
+ <w:sz w:val="22"/>
491
+ </w:rPr>
492
+ <w:t xml:space="preserve"> mate word/document.xml</w:t>
493
+ </w:r>
494
+ </w:p>
495
+ <w:p w14:paraId="5BB1810B" w14:textId="261C92C9" w:rsidR="007146EA" w:rsidRDefault="007146EA" w:rsidP="008F0A35">
496
+ <w:pPr>
497
+ <w:ind w:firstLine="720"/>
498
+ <w:rPr>
499
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
500
+ <w:sz w:val="22"/>
501
+ </w:rPr>
502
+ </w:pPr>
503
+ <w:proofErr w:type="spellStart"/>
504
+ <w:r>
505
+ <w:rPr>
506
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
507
+ <w:sz w:val="22"/>
508
+ </w:rPr>
509
+ <w:t>Grep</w:t>
510
+ </w:r>
511
+ <w:proofErr w:type="spellEnd"/>
512
+ <w:r>
513
+ <w:rPr>
514
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
515
+ <w:sz w:val="22"/>
516
+ </w:rPr>
517
+ <w:t xml:space="preserve">/search for all $ and # lines and ensure no </w:t>
518
+ </w:r>
519
+ <w:proofErr w:type="spellStart"/>
520
+ <w:r>
521
+ <w:rPr>
522
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
523
+ <w:sz w:val="22"/>
524
+ </w:rPr>
525
+ <w:t>templating</w:t>
526
+ </w:r>
527
+ <w:proofErr w:type="spellEnd"/>
528
+ <w:r>
529
+ <w:rPr>
530
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
531
+ <w:sz w:val="22"/>
532
+ </w:rPr>
533
+ <w:t xml:space="preserve"> is split with xml markup.</w:t>
534
+ </w:r>
535
+ </w:p>
536
+ <w:p w14:paraId="722A9C10" w14:textId="31653087" w:rsidR="008F0A35" w:rsidRDefault="008F0A35" w:rsidP="008F0A35">
537
+ <w:pPr>
538
+ <w:ind w:firstLine="720"/>
539
+ <w:rPr>
540
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
541
+ <w:sz w:val="22"/>
542
+ </w:rPr>
543
+ </w:pPr>
544
+ <w:r>
545
+ <w:rPr>
546
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
547
+ <w:sz w:val="22"/>
548
+ </w:rPr>
549
+ <w:t>And then re-add the edited document:</w:t>
550
+ </w:r>
551
+ </w:p>
552
+ <w:p w14:paraId="33B7E8A7" w14:textId="2EDBE459" w:rsidR="008F0A35" w:rsidRPr="008F0A35" w:rsidRDefault="008F0A35" w:rsidP="008F0A35">
553
+ <w:pPr>
554
+ <w:rPr>
555
+ <w:i/>
556
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
557
+ <w:sz w:val="22"/>
558
+ </w:rPr>
559
+ </w:pPr>
560
+ <w:proofErr w:type="gramStart"/>
561
+ <w:r w:rsidRPr="008F0A35">
562
+ <w:rPr>
563
+ <w:i/>
564
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
565
+ <w:sz w:val="22"/>
566
+ </w:rPr>
567
+ <w:t>zip</w:t>
568
+ </w:r>
569
+ <w:proofErr w:type="gramEnd"/>
570
+ <w:r w:rsidRPr="008F0A35">
571
+ <w:rPr>
572
+ <w:i/>
573
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
574
+ <w:sz w:val="22"/>
575
+ </w:rPr>
576
+ <w:t xml:space="preserve"> ExampleTemplate.docx word/document.xml</w:t>
577
+ </w:r>
578
+ </w:p>
579
+ <w:p w14:paraId="2CD2E4BC" w14:textId="77777777" w:rsidR="00B90852" w:rsidRDefault="00B90852" w:rsidP="00B90852">
580
+ <w:pPr>
581
+ <w:rPr>
582
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
583
+ <w:sz w:val="22"/>
584
+ </w:rPr>
585
+ </w:pPr>
586
+ </w:p>
587
+ <w:p w14:paraId="36566E51" w14:textId="610737F3" w:rsidR="00B90852" w:rsidRDefault="00D80FC0" w:rsidP="00B90852">
588
+ <w:pPr>
589
+ <w:rPr>
590
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
591
+ <w:sz w:val="22"/>
592
+ </w:rPr>
593
+ </w:pPr>
594
+ <w:r>
595
+ <w:rPr>
596
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
597
+ <w:sz w:val="22"/>
598
+ </w:rPr>
599
+ <w:t>PRO TIP:</w:t>
600
+ </w:r>
601
+ <w:r w:rsidR="00B90852">
602
+ <w:rPr>
603
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
604
+ <w:sz w:val="22"/>
605
+ </w:rPr>
606
+ <w:t xml:space="preserve"> You don’t want any grammar errors on the template Keys, or they will not substitute. </w:t>
607
+ </w:r>
608
+ <w:r w:rsidR="008F0A35">
609
+ <w:rPr>
610
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
611
+ <w:sz w:val="22"/>
612
+ </w:rPr>
613
+ <w:t>(</w:t>
614
+ </w:r>
615
+ <w:r w:rsidR="00254FEB">
616
+ <w:rPr>
617
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
618
+ <w:sz w:val="22"/>
619
+ </w:rPr>
620
+ <w:t>Grammar suggestion markup</w:t>
621
+ </w:r>
622
+ <w:r w:rsidR="008F0A35">
623
+ <w:rPr>
624
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
625
+ <w:sz w:val="22"/>
626
+ </w:rPr>
627
+ <w:t xml:space="preserve"> split</w:t>
628
+ </w:r>
629
+ <w:r w:rsidR="00254FEB">
630
+ <w:rPr>
631
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
632
+ <w:sz w:val="22"/>
633
+ </w:rPr>
634
+ <w:t>s up the tokens in the</w:t>
635
+ </w:r>
636
+ <w:r w:rsidR="008F0A35">
637
+ <w:rPr>
638
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
639
+ <w:sz w:val="22"/>
640
+ </w:rPr>
641
+ <w:t xml:space="preserve"> xml).</w:t>
642
+ </w:r>
643
+ <w:r w:rsidR="00871363">
644
+ <w:rPr>
645
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
646
+ <w:sz w:val="22"/>
647
+ </w:rPr>
648
+ <w:t xml:space="preserve"> Right click and choose Ignore each grammar error.</w:t>
649
+ </w:r>
650
+ <w:bookmarkStart w:id="0" w:name="_GoBack"/>
651
+ <w:bookmarkEnd w:id="0"/>
652
+ </w:p>
653
+ <w:p w14:paraId="7F274836" w14:textId="77777777" w:rsidR="009F2DA5" w:rsidRDefault="009F2DA5">
654
+ <w:pPr>
655
+ <w:rPr>
656
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
657
+ <w:sz w:val="22"/>
658
+ </w:rPr>
659
+ </w:pPr>
660
+ </w:p>
661
+ <w:p w14:paraId="4C607FC6" w14:textId="57C1EBE3" w:rsidR="00D05893" w:rsidRPr="00D05893" w:rsidRDefault="00D05893">
662
+ <w:pPr>
663
+ <w:rPr>
664
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
665
+ <w:sz w:val="22"/>
666
+ </w:rPr>
667
+ </w:pPr>
668
+ <w:r w:rsidRPr="00D05893">
669
+ <w:rPr>
670
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
671
+ <w:sz w:val="22"/>
672
+ </w:rPr>
673
+ <w:t xml:space="preserve">Example repeating </w:t>
674
+ </w:r>
675
+ <w:r>
676
+ <w:rPr>
677
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
678
+ <w:sz w:val="22"/>
679
+ </w:rPr>
680
+ <w:t>table template</w:t>
681
+ </w:r>
682
+ <w:r w:rsidRPr="00D05893">
683
+ <w:rPr>
684
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
685
+ <w:sz w:val="22"/>
686
+ </w:rPr>
687
+ <w:t xml:space="preserve"> for several rows, along with summation of total number of rows above.</w:t>
688
+ </w:r>
689
+ </w:p>
690
+ <w:p w14:paraId="2E3C7D01" w14:textId="1133B401" w:rsidR="00EA6631" w:rsidRDefault="00EA6631" w:rsidP="00EA6631"/>
691
+ <w:tbl>
692
+ <w:tblPr>
693
+ <w:tblStyle w:val="LightList"/>
694
+ <w:tblW w:w="0" w:type="auto"/>
695
+ <w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
696
+ </w:tblPr>
697
+ <w:tblGrid>
698
+ <w:gridCol w:w="2952"/>
699
+ <w:gridCol w:w="2952"/>
700
+ <w:gridCol w:w="2952"/>
701
+ </w:tblGrid>
702
+ <w:tr w:rsidR="00EA6631" w14:paraId="516F11A8" w14:textId="77777777" w:rsidTr="00974FD1">
703
+ <w:trPr>
704
+ <w:cnfStyle w:val="100000000000" w:firstRow="1" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
705
+ </w:trPr>
706
+ <w:tc>
707
+ <w:tcPr>
708
+ <w:cnfStyle w:val="001000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
709
+ <w:tcW w:w="2952" w:type="dxa"/>
710
+ </w:tcPr>
711
+ <w:p w14:paraId="5F32D215" w14:textId="1C5C7930" w:rsidR="00EA6631" w:rsidRDefault="00EA6631" w:rsidP="00EA6631">
712
+ <w:r>
713
+ <w:t>Name</w:t>
714
+ </w:r>
715
+ </w:p>
716
+ </w:tc>
717
+ <w:tc>
718
+ <w:tcPr>
719
+ <w:tcW w:w="2952" w:type="dxa"/>
720
+ </w:tcPr>
721
+ <w:p w14:paraId="3BB26AA9" w14:textId="22A1E155" w:rsidR="00EA6631" w:rsidRDefault="00EA6631" w:rsidP="00EA6631">
722
+ <w:pPr>
723
+ <w:cnfStyle w:val="100000000000" w:firstRow="1" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
724
+ </w:pPr>
725
+ <w:r>
726
+ <w:t>Age</w:t>
727
+ </w:r>
728
+ </w:p>
729
+ </w:tc>
730
+ <w:tc>
731
+ <w:tcPr>
732
+ <w:tcW w:w="2952" w:type="dxa"/>
733
+ </w:tcPr>
734
+ <w:p w14:paraId="46B2B8F9" w14:textId="749AB38A" w:rsidR="00EA6631" w:rsidRDefault="007146EA" w:rsidP="00EA6631">
735
+ <w:pPr>
736
+ <w:cnfStyle w:val="100000000000" w:firstRow="1" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
737
+ </w:pPr>
738
+ <w:r>
739
+ <w:t>Attendance</w:t>
740
+ </w:r>
741
+ </w:p>
742
+ </w:tc>
743
+ </w:tr>
744
+ <w:tr w:rsidR="00EA6631" w14:paraId="242E3964" w14:textId="77777777" w:rsidTr="00974FD1">
745
+ <w:trPr>
746
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
747
+ </w:trPr>
748
+ <w:tc>
749
+ <w:tcPr>
750
+ <w:cnfStyle w:val="001000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
751
+ <w:tcW w:w="2952" w:type="dxa"/>
752
+ </w:tcPr>
753
+ <w:p w14:paraId="2D0534C5" w14:textId="77AACF60" w:rsidR="00EA6631" w:rsidRPr="00927C6F" w:rsidRDefault="00927C6F" w:rsidP="00B95480">
754
+ <w:pPr>
755
+ <w:rPr>
756
+ <w:b w:val="0"/>
757
+ </w:rPr>
758
+ </w:pPr>
759
+ <w:r>
760
+ <w:rPr>
761
+ <w:b w:val="0"/>
762
+ </w:rPr>
763
+ <w:t>#BEGIN_ROW:ROSTER#</w:t>
764
+ </w:r>
765
+ <w:r w:rsidR="001C1230" w:rsidRPr="00927C6F">
766
+ <w:rPr>
767
+ <w:b w:val="0"/>
768
+ </w:rPr>
769
+ <w:t xml:space="preserve"> </w:t>
770
+ </w:r>
771
+ </w:p>
772
+ </w:tc>
773
+ <w:tc>
774
+ <w:tcPr>
775
+ <w:tcW w:w="2952" w:type="dxa"/>
776
+ </w:tcPr>
777
+ <w:p w14:paraId="3BC64222" w14:textId="329079BD" w:rsidR="00EA6631" w:rsidRPr="00D05893" w:rsidRDefault="001C1230" w:rsidP="001C1230">
778
+ <w:pPr>
779
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
780
+ <w:rPr>
781
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
782
+ </w:rPr>
783
+ </w:pPr>
784
+ <w:r w:rsidRPr="00D05893">
785
+ <w:rPr>
786
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
787
+ <w:sz w:val="20"/>
788
+ </w:rPr>
789
+ <w:t>(</w:t>
790
+ </w:r>
791
+ <w:r w:rsidR="00D05893" w:rsidRPr="00D05893">
792
+ <w:rPr>
793
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
794
+ <w:sz w:val="20"/>
795
+ </w:rPr>
796
+ <w:t>This</w:t>
797
+ </w:r>
798
+ <w:r w:rsidR="00B95480" w:rsidRPr="00D05893">
799
+ <w:rPr>
800
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
801
+ <w:sz w:val="20"/>
802
+ </w:rPr>
803
+ <w:t xml:space="preserve"> </w:t>
804
+ </w:r>
805
+ <w:r w:rsidR="001C145B" w:rsidRPr="00D05893">
806
+ <w:rPr>
807
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
808
+ <w:sz w:val="20"/>
809
+ </w:rPr>
810
+ <w:t xml:space="preserve">row </w:t>
811
+ </w:r>
812
+ <w:r w:rsidRPr="00D05893">
813
+ <w:rPr>
814
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
815
+ <w:sz w:val="20"/>
816
+ </w:rPr>
817
+ <w:t xml:space="preserve">only appears in </w:t>
818
+ </w:r>
819
+ <w:r w:rsidR="00D26401" w:rsidRPr="00D05893">
820
+ <w:rPr>
821
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
822
+ <w:sz w:val="20"/>
823
+ </w:rPr>
824
+ <w:t xml:space="preserve">the </w:t>
825
+ </w:r>
826
+ <w:r w:rsidRPr="00D05893">
827
+ <w:rPr>
828
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
829
+ <w:sz w:val="20"/>
830
+ </w:rPr>
831
+ <w:t>template)</w:t>
832
+ </w:r>
833
+ </w:p>
834
+ </w:tc>
835
+ <w:tc>
836
+ <w:tcPr>
837
+ <w:tcW w:w="2952" w:type="dxa"/>
838
+ </w:tcPr>
839
+ <w:p w14:paraId="3FE3E0A7" w14:textId="10DE66CE" w:rsidR="00EA6631" w:rsidRPr="00927C6F" w:rsidRDefault="00EA6631" w:rsidP="00EA6631">
840
+ <w:pPr>
841
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
842
+ </w:pPr>
843
+ </w:p>
844
+ </w:tc>
845
+ </w:tr>
846
+ <w:tr w:rsidR="001C1230" w14:paraId="5E99CB84" w14:textId="77777777" w:rsidTr="00974FD1">
847
+ <w:tc>
848
+ <w:tcPr>
849
+ <w:cnfStyle w:val="001000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
850
+ <w:tcW w:w="2952" w:type="dxa"/>
851
+ </w:tcPr>
852
+ <w:p w14:paraId="12D150C3" w14:textId="6A09F9A0" w:rsidR="001C1230" w:rsidRPr="00927C6F" w:rsidRDefault="00927C6F" w:rsidP="001219BD">
853
+ <w:pPr>
854
+ <w:rPr>
855
+ <w:b w:val="0"/>
856
+ </w:rPr>
857
+ </w:pPr>
858
+ <w:r w:rsidRPr="00927C6F">
859
+ <w:rPr>
860
+ <w:b w:val="0"/>
861
+ </w:rPr>
862
+ <w:t>$EACH:NAME$</w:t>
863
+ </w:r>
864
+ </w:p>
865
+ </w:tc>
866
+ <w:tc>
867
+ <w:tcPr>
868
+ <w:tcW w:w="2952" w:type="dxa"/>
869
+ </w:tcPr>
870
+ <w:p w14:paraId="031410DA" w14:textId="2F6B7F6B" w:rsidR="001C1230" w:rsidRPr="00927C6F" w:rsidRDefault="00927C6F" w:rsidP="00EA6631">
871
+ <w:pPr>
872
+ <w:cnfStyle w:val="000000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
873
+ </w:pPr>
874
+ <w:r w:rsidRPr="00927C6F">
875
+ <w:t>$EACH:AGE$</w:t>
876
+ </w:r>
877
+ </w:p>
878
+ </w:tc>
879
+ <w:tc>
880
+ <w:tcPr>
881
+ <w:tcW w:w="2952" w:type="dxa"/>
882
+ </w:tcPr>
883
+ <w:p w14:paraId="33D71DAA" w14:textId="15568012" w:rsidR="001C1230" w:rsidRPr="00927C6F" w:rsidRDefault="00362284" w:rsidP="00EA6631">
884
+ <w:pPr>
885
+ <w:cnfStyle w:val="000000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
886
+ </w:pPr>
887
+ <w:r>
888
+ <w:t>$EACH:ATTENDENCE$</w:t>
889
+ </w:r>
890
+ </w:p>
891
+ </w:tc>
892
+ </w:tr>
893
+ <w:tr w:rsidR="001C1230" w14:paraId="250EE9E9" w14:textId="77777777" w:rsidTr="00974FD1">
894
+ <w:trPr>
895
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
896
+ </w:trPr>
897
+ <w:tc>
898
+ <w:tcPr>
899
+ <w:cnfStyle w:val="001000000000" w:firstRow="0" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="0" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
900
+ <w:tcW w:w="2952" w:type="dxa"/>
901
+ </w:tcPr>
902
+ <w:p w14:paraId="089754BB" w14:textId="06762580" w:rsidR="001C1230" w:rsidRPr="00927C6F" w:rsidRDefault="00927C6F" w:rsidP="00EA6631">
903
+ <w:pPr>
904
+ <w:rPr>
905
+ <w:b w:val="0"/>
906
+ </w:rPr>
907
+ </w:pPr>
908
+ <w:r>
909
+ <w:rPr>
910
+ <w:b w:val="0"/>
911
+ </w:rPr>
912
+ <w:t>#END_ROW:ROSTER#</w:t>
913
+ </w:r>
914
+ </w:p>
915
+ </w:tc>
916
+ <w:tc>
917
+ <w:tcPr>
918
+ <w:tcW w:w="2952" w:type="dxa"/>
919
+ </w:tcPr>
920
+ <w:p w14:paraId="309A3A43" w14:textId="5A20C4FC" w:rsidR="001C1230" w:rsidRPr="00D05893" w:rsidRDefault="001C1230" w:rsidP="001C1230">
921
+ <w:pPr>
922
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
923
+ <w:rPr>
924
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
925
+ <w:sz w:val="22"/>
926
+ </w:rPr>
927
+ </w:pPr>
928
+ <w:r w:rsidRPr="00D05893">
929
+ <w:rPr>
930
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
931
+ <w:sz w:val="22"/>
932
+ </w:rPr>
933
+ <w:t>(</w:t>
934
+ </w:r>
935
+ <w:r w:rsidR="00D05893" w:rsidRPr="00D05893">
936
+ <w:rPr>
937
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
938
+ <w:sz w:val="22"/>
939
+ </w:rPr>
940
+ <w:t>This</w:t>
941
+ </w:r>
942
+ <w:r w:rsidR="001C145B" w:rsidRPr="00D05893">
943
+ <w:rPr>
944
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
945
+ <w:sz w:val="22"/>
946
+ </w:rPr>
947
+ <w:t xml:space="preserve"> row </w:t>
948
+ </w:r>
949
+ <w:r w:rsidRPr="00D05893">
950
+ <w:rPr>
951
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
952
+ <w:sz w:val="22"/>
953
+ </w:rPr>
954
+ <w:t xml:space="preserve">only appears in </w:t>
955
+ </w:r>
956
+ <w:r w:rsidR="00D26401" w:rsidRPr="00D05893">
957
+ <w:rPr>
958
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
959
+ <w:sz w:val="22"/>
960
+ </w:rPr>
961
+ <w:t xml:space="preserve">the </w:t>
962
+ </w:r>
963
+ <w:r w:rsidRPr="00D05893">
964
+ <w:rPr>
965
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
966
+ <w:sz w:val="22"/>
967
+ </w:rPr>
968
+ <w:t>template)</w:t>
969
+ </w:r>
970
+ </w:p>
971
+ </w:tc>
972
+ <w:tc>
973
+ <w:tcPr>
974
+ <w:tcW w:w="2952" w:type="dxa"/>
975
+ </w:tcPr>
976
+ <w:p w14:paraId="27B9FC40" w14:textId="77777777" w:rsidR="001C1230" w:rsidRPr="00927C6F" w:rsidRDefault="001C1230" w:rsidP="00EA6631">
977
+ <w:pPr>
978
+ <w:cnfStyle w:val="000000100000" w:firstRow="0" w:lastRow="0" w:firstColumn="0" w:lastColumn="0" w:oddVBand="0" w:evenVBand="0" w:oddHBand="1" w:evenHBand="0" w:firstRowFirstColumn="0" w:firstRowLastColumn="0" w:lastRowFirstColumn="0" w:lastRowLastColumn="0"/>
979
+ </w:pPr>
980
+ </w:p>
981
+ </w:tc>
982
+ </w:tr>
983
+ </w:tbl>
984
+ <w:p w14:paraId="078D3959" w14:textId="77777777" w:rsidR="00EA6631" w:rsidRDefault="00EA6631" w:rsidP="00EA6631"/>
985
+ <w:p w14:paraId="1671C406" w14:textId="522BF22F" w:rsidR="00575599" w:rsidRPr="00575599" w:rsidRDefault="00575599" w:rsidP="00EA6631">
986
+ <w:pPr>
987
+ <w:rPr>
988
+ <w:u w:val="single"/>
989
+ </w:rPr>
990
+ </w:pPr>
991
+ <w:r w:rsidRPr="00575599">
992
+ <w:rPr>
993
+ <w:u w:val="single"/>
994
+ </w:rPr>
995
+ <w:t>#SUM:EVENT_REPORTS# Events</w:t>
996
+ </w:r>
997
+ </w:p>
998
+ <w:p w14:paraId="32800210" w14:textId="669FDE32" w:rsidR="00D05893" w:rsidRPr="00D05893" w:rsidRDefault="00D05893" w:rsidP="00D05893">
999
+ <w:pPr>
1000
+ <w:rPr>
1001
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
1002
+ <w:sz w:val="22"/>
1003
+ </w:rPr>
1004
+ </w:pPr>
1005
+ <w:r w:rsidRPr="00D05893">
1006
+ <w:rPr>
1007
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
1008
+ <w:sz w:val="22"/>
1009
+ </w:rPr>
1010
+ <w:t xml:space="preserve">Example </w:t>
1011
+ </w:r>
1012
+ <w:r>
1013
+ <w:rPr>
1014
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
1015
+ <w:sz w:val="22"/>
1016
+ </w:rPr>
1017
+ <w:t>table template when we have 2 inner rows that repeat.</w:t>
1018
+ </w:r>
1019
+ </w:p>
1020
+ <w:p w14:paraId="5069BD28" w14:textId="77777777" w:rsidR="00575599" w:rsidRDefault="00575599" w:rsidP="00EA6631"/>
1021
+ <w:tbl>
1022
+ <w:tblPr>
1023
+ <w:tblStyle w:val="TableGrid"/>
1024
+ <w:tblW w:w="0" w:type="auto"/>
1025
+ <w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/>
1026
+ </w:tblPr>
1027
+ <w:tblGrid>
1028
+ <w:gridCol w:w="7831"/>
1029
+ </w:tblGrid>
1030
+ <w:tr w:rsidR="00575599" w14:paraId="4243995F" w14:textId="77777777" w:rsidTr="00575599">
1031
+ <w:trPr>
1032
+ <w:trHeight w:val="257"/>
1033
+ </w:trPr>
1034
+ <w:tc>
1035
+ <w:tcPr>
1036
+ <w:tcW w:w="7831" w:type="dxa"/>
1037
+ </w:tcPr>
1038
+ <w:p w14:paraId="234BCDEC" w14:textId="1BD4C190" w:rsidR="00575599" w:rsidRDefault="00575599" w:rsidP="00EA6631">
1039
+ <w:r>
1040
+ <w:t>#BEGIN_ROW:EVENT_REPORTS#</w:t>
1041
+ </w:r>
1042
+ </w:p>
1043
+ </w:tc>
1044
+ </w:tr>
1045
+ <w:tr w:rsidR="00575599" w14:paraId="277C9B38" w14:textId="77777777" w:rsidTr="00575599">
1046
+ <w:trPr>
1047
+ <w:trHeight w:val="257"/>
1048
+ </w:trPr>
1049
+ <w:tc>
1050
+ <w:tcPr>
1051
+ <w:tcW w:w="7831" w:type="dxa"/>
1052
+ </w:tcPr>
1053
+ <w:p w14:paraId="365F9912" w14:textId="15EC7A9C" w:rsidR="00575599" w:rsidRDefault="00575599" w:rsidP="00EA6631">
1054
+ <w:r>
1055
+ <w:t>Name: $EACH:NAME$</w:t>
1056
+ </w:r>
1057
+ </w:p>
1058
+ </w:tc>
1059
+ </w:tr>
1060
+ <w:tr w:rsidR="00575599" w14:paraId="4577EA3A" w14:textId="77777777" w:rsidTr="00575599">
1061
+ <w:trPr>
1062
+ <w:trHeight w:val="257"/>
1063
+ </w:trPr>
1064
+ <w:tc>
1065
+ <w:tcPr>
1066
+ <w:tcW w:w="7831" w:type="dxa"/>
1067
+ </w:tcPr>
1068
+ <w:p w14:paraId="725B72E1" w14:textId="375EF1A9" w:rsidR="00575599" w:rsidRDefault="00575599" w:rsidP="00EA6631">
1069
+ <w:r>
1070
+ <w:t>$EACH:NOTES$</w:t>
1071
+ </w:r>
1072
+ </w:p>
1073
+ </w:tc>
1074
+ </w:tr>
1075
+ <w:tr w:rsidR="00575599" w14:paraId="47FFEA7F" w14:textId="77777777" w:rsidTr="00575599">
1076
+ <w:trPr>
1077
+ <w:trHeight w:val="257"/>
1078
+ </w:trPr>
1079
+ <w:tc>
1080
+ <w:tcPr>
1081
+ <w:tcW w:w="7831" w:type="dxa"/>
1082
+ </w:tcPr>
1083
+ <w:p w14:paraId="5AD783D4" w14:textId="72CAE419" w:rsidR="00575599" w:rsidRDefault="00575599" w:rsidP="00575599">
1084
+ <w:r>
1085
+ <w:t>#END_ROW:EVENT_REPORTS#</w:t>
1086
+ </w:r>
1087
+ </w:p>
1088
+ </w:tc>
1089
+ </w:tr>
1090
+ </w:tbl>
1091
+ <w:p w14:paraId="2579E629" w14:textId="77777777" w:rsidR="00575599" w:rsidRPr="00EA6631" w:rsidRDefault="00575599" w:rsidP="00EA6631"/>
1092
+ <w:p w14:paraId="59AFCE89" w14:textId="7220D9D3" w:rsidR="00CC5193" w:rsidRPr="0069391E" w:rsidRDefault="00CC5193" w:rsidP="0069391E">
1093
+ <w:pPr>
1094
+ <w:jc w:val="right"/>
1095
+ <w:rPr>
1096
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
1097
+ <w:sz w:val="22"/>
1098
+ </w:rPr>
1099
+ </w:pPr>
1100
+ <w:r w:rsidRPr="0069391E">
1101
+ <w:rPr>
1102
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
1103
+ <w:sz w:val="22"/>
1104
+ </w:rPr>
1105
+ <w:t>Report created $CREATED_AT$</w:t>
1106
+ </w:r>
1107
+ <w:r w:rsidR="007B0688">
1108
+ <w:rPr>
1109
+ <w:color w:val="A6A6A6" w:themeColor="background1" w:themeShade="A6"/>
1110
+ <w:sz w:val="22"/>
1111
+ </w:rPr>
1112
+ <w:t xml:space="preserve"> for Teacher: $TEACHER$</w:t>
1113
+ </w:r>
1114
+ </w:p>
1115
+ <w:sectPr w:rsidR="00CC5193" w:rsidRPr="0069391E" w:rsidSect="00B016F7">
1116
+ <w:pgSz w:w="12240" w:h="15840"/>
1117
+ <w:pgMar w:top="720" w:right="1170" w:bottom="720" w:left="1170" w:header="708" w:footer="708" w:gutter="0"/>
1118
+ <w:cols w:space="708"/>
1119
+ <w:docGrid w:linePitch="360"/>
1120
+ </w:sectPr>
1121
+ </w:body>
1122
+ </w:document>