caracal 0.1.0

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.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +941 -0
  6. data/Rakefile +2 -0
  7. data/caracal.gemspec +27 -0
  8. data/lib/caracal.rb +31 -0
  9. data/lib/caracal/core/file_name.rb +39 -0
  10. data/lib/caracal/core/fonts.rb +75 -0
  11. data/lib/caracal/core/images.rb +37 -0
  12. data/lib/caracal/core/line_breaks.rb +29 -0
  13. data/lib/caracal/core/list_styles.rb +92 -0
  14. data/lib/caracal/core/lists.rb +57 -0
  15. data/lib/caracal/core/models/base_model.rb +51 -0
  16. data/lib/caracal/core/models/border_model.rb +120 -0
  17. data/lib/caracal/core/models/font_model.rb +64 -0
  18. data/lib/caracal/core/models/image_model.rb +118 -0
  19. data/lib/caracal/core/models/line_break_model.rb +15 -0
  20. data/lib/caracal/core/models/link_model.rb +65 -0
  21. data/lib/caracal/core/models/list_item_model.rb +105 -0
  22. data/lib/caracal/core/models/list_model.rb +130 -0
  23. data/lib/caracal/core/models/list_style_model.rb +129 -0
  24. data/lib/caracal/core/models/margin_model.rb +76 -0
  25. data/lib/caracal/core/models/page_break_model.rb +15 -0
  26. data/lib/caracal/core/models/page_number_model.rb +69 -0
  27. data/lib/caracal/core/models/page_size_model.rb +70 -0
  28. data/lib/caracal/core/models/paragraph_model.rb +141 -0
  29. data/lib/caracal/core/models/relationship_model.rb +108 -0
  30. data/lib/caracal/core/models/rule_model.rb +27 -0
  31. data/lib/caracal/core/models/style_model.rb +134 -0
  32. data/lib/caracal/core/models/table_cell_model.rb +155 -0
  33. data/lib/caracal/core/models/table_model.rb +206 -0
  34. data/lib/caracal/core/models/text_model.rb +92 -0
  35. data/lib/caracal/core/page_breaks.rb +29 -0
  36. data/lib/caracal/core/page_numbers.rb +51 -0
  37. data/lib/caracal/core/page_settings.rb +72 -0
  38. data/lib/caracal/core/relationships.rb +90 -0
  39. data/lib/caracal/core/rules.rb +35 -0
  40. data/lib/caracal/core/styles.rb +86 -0
  41. data/lib/caracal/core/tables.rb +41 -0
  42. data/lib/caracal/core/text.rb +73 -0
  43. data/lib/caracal/document.rb +242 -0
  44. data/lib/caracal/errors.rb +23 -0
  45. data/lib/caracal/renderers/app_renderer.rb +41 -0
  46. data/lib/caracal/renderers/content_types_renderer.rb +53 -0
  47. data/lib/caracal/renderers/core_renderer.rb +44 -0
  48. data/lib/caracal/renderers/document_renderer.rb +349 -0
  49. data/lib/caracal/renderers/fonts_renderer.rb +56 -0
  50. data/lib/caracal/renderers/footer_renderer.rb +69 -0
  51. data/lib/caracal/renderers/numbering_renderer.rb +87 -0
  52. data/lib/caracal/renderers/package_relationships_renderer.rb +50 -0
  53. data/lib/caracal/renderers/relationships_renderer.rb +48 -0
  54. data/lib/caracal/renderers/settings_renderer.rb +58 -0
  55. data/lib/caracal/renderers/styles_renderer.rb +163 -0
  56. data/lib/caracal/renderers/xml_renderer.rb +83 -0
  57. data/lib/caracal/version.rb +3 -0
  58. data/lib/tilt/caracal.rb +21 -0
  59. data/spec/lib/caracal/core/file_name_spec.rb +54 -0
  60. data/spec/lib/caracal/core/fonts_spec.rb +119 -0
  61. data/spec/lib/caracal/core/images_spec.rb +25 -0
  62. data/spec/lib/caracal/core/line_breaks_spec.rb +25 -0
  63. data/spec/lib/caracal/core/list_styles_spec.rb +121 -0
  64. data/spec/lib/caracal/core/lists_spec.rb +43 -0
  65. data/spec/lib/caracal/core/models/base_model_spec.rb +38 -0
  66. data/spec/lib/caracal/core/models/border_model_spec.rb +159 -0
  67. data/spec/lib/caracal/core/models/font_model_spec.rb +92 -0
  68. data/spec/lib/caracal/core/models/image_model_spec.rb +192 -0
  69. data/spec/lib/caracal/core/models/line_break_model_spec.rb +21 -0
  70. data/spec/lib/caracal/core/models/link_model_spec.rb +139 -0
  71. data/spec/lib/caracal/core/models/list_item_model_spec.rb +190 -0
  72. data/spec/lib/caracal/core/models/list_model_spec.rb +178 -0
  73. data/spec/lib/caracal/core/models/list_style_model_spec.rb +212 -0
  74. data/spec/lib/caracal/core/models/margin_model_spec.rb +111 -0
  75. data/spec/lib/caracal/core/models/page_break_model_spec.rb +21 -0
  76. data/spec/lib/caracal/core/models/page_number_model_spec.rb +101 -0
  77. data/spec/lib/caracal/core/models/page_size_model_spec.rb +91 -0
  78. data/spec/lib/caracal/core/models/paragraph_model_spec.rb +162 -0
  79. data/spec/lib/caracal/core/models/relationship_model_spec.rb +183 -0
  80. data/spec/lib/caracal/core/models/rule_model_spec.rb +108 -0
  81. data/spec/lib/caracal/core/models/style_model_spec.rb +187 -0
  82. data/spec/lib/caracal/core/models/table_cell_model_spec.rb +221 -0
  83. data/spec/lib/caracal/core/models/table_model_spec.rb +222 -0
  84. data/spec/lib/caracal/core/models/text_model_spec.rb +132 -0
  85. data/spec/lib/caracal/core/page_breaks_spec.rb +25 -0
  86. data/spec/lib/caracal/core/page_numbers_spec.rb +80 -0
  87. data/spec/lib/caracal/core/page_settings_spec.rb +143 -0
  88. data/spec/lib/caracal/core/relationships_spec.rb +119 -0
  89. data/spec/lib/caracal/core/rules_spec.rb +25 -0
  90. data/spec/lib/caracal/core/styles_spec.rb +129 -0
  91. data/spec/lib/caracal/core/tables_spec.rb +25 -0
  92. data/spec/lib/caracal/core/text_spec.rb +52 -0
  93. data/spec/lib/caracal/errors_spec.rb +10 -0
  94. data/spec/spec_helper.rb +8 -0
  95. metadata +245 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 81137b2dc72712fd3c5c95ab50d891c9a00a8d48
4
+ data.tar.gz: 1d1759101762572d0582c0146a04de5ccdbd456b
5
+ SHA512:
6
+ metadata.gz: b9ddda6ff2016be507bb7156ad3743954df7c0c20f8bccf5d49014505a9d3599229c82b19cbfc1ee0d782b10ab8c8429807e228c1d7a05f0bb5b7426eaa7a548
7
+ data.tar.gz: 90244ef8ea1e5946ba5e04c496c583571894193e26cde5251a17da37b9033a579d1f6acbed57e40e15048f09f823161ae689fa8ac1710132eb41d83a6aa526a7
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ gemfiles/*.gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Trade Informatics, Inc.
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,941 @@
1
+ # Caracal
2
+
3
+ Caracal is a ruby library for dynamically creating professional-quality Microsoft Word documents (.docx) using an HTML-style syntax.
4
+
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ gem 'caracal'
11
+
12
+ Then execute:
13
+
14
+ $ bundle install
15
+
16
+
17
+ ## Overview
18
+
19
+ Many people don't know that .docx files are little more than a zipped collection of XML documents that follow the OfficeOpen XML (OpenXML or OOXML) standard. This means constructing a .docx file from scratch actually requires the creation of several files. Caracal abstracts users from this process by providing a simple set of Ruby commands and HTML-style syntax for generating Word content.
20
+
21
+ For each Caracal request, the following document structure will be created and zipped into the final output file:
22
+
23
+ example.docx
24
+ |- _rels
25
+ |- docProps
26
+ |- app.xml
27
+ |- core.xml
28
+ |- word
29
+ |- _rels
30
+ |- document.xml.rels
31
+ |- media
32
+ |- image001.png
33
+ |- image002.png
34
+ ...
35
+ |- document.xml
36
+ |- fontTable.xml
37
+ |- footer.xml
38
+ |- numbering.xml
39
+ |- settings.xml
40
+ |- styles.xml
41
+ |- [Content_Types].xml
42
+
43
+ ### File Descriptions
44
+
45
+ The following provides a brief description for each component of the final document:
46
+
47
+ **_rels/.rels**
48
+ Defines an internal identifier and type for global content items. *This file is generated automatically by the library based on other user directives.*
49
+
50
+ **docProps/app.xml**
51
+ Specifies the name of the application that generated the document. *This file is generated automatically by the library based on other user directives.*
52
+
53
+ **docProps/core.xml**
54
+ Specifies the title of the document. *This file is generated automatically by the library based on other user directives.*
55
+
56
+ **word/_rels/document.xml.rels**
57
+ Defines an internal identifier and type with all external content items (images, links, etc). *This file is generated automatically by the library based on other user directives.*
58
+
59
+ **word/media/**
60
+ A collection of media assets (each of which should have an entry in document.xml.rels).
61
+
62
+ **word/document.xml**
63
+ The main content file for the document.
64
+
65
+ **word/fontTable.xml**
66
+ Specifies the fonts used in the document.
67
+
68
+ **word/footer.xml**
69
+ Defines the formatting of the document footer.
70
+
71
+ **word/numbering.xml**
72
+ Defines ordered and unordered list styles.
73
+
74
+ **word/settings.xml**
75
+ Defines global directives for the document (e.g., whether to show background images, tab widths, etc). Also, establishes compatibility with older versions on Word.
76
+
77
+ **word/styles.xml**
78
+ Defines all paragraph and table styles used through the document. Caracal adds a default set of styles to match its HTML-like content syntax. These defaults can be overridden.
79
+
80
+ **[Content_Types].xml**
81
+ Pairs extensions and XML files with schema content types so Word can parse them correctly. *This file is generated automatically by the library based on other user directives.*
82
+
83
+
84
+ ## Units
85
+
86
+ OpenXML uses a few basic units.
87
+
88
+ **Points**
89
+ Most spacing declarations are measured in full points.
90
+
91
+ **Half Points**
92
+ All font sizes are measure in half points. A font size of 24 is equivalent to 12pt.
93
+
94
+ **Eighth Points**
95
+ Borders are measured in 1/8 points. A border size of 4 is equivalent to 0.5pt.
96
+
97
+ **Twips**
98
+ A twip is 1/20 of a point. Word documents are printed at 72dpi. 1in == 72pt == 1440 twips.
99
+
100
+ **Pixels**
101
+ In Word documents, pixels are equivalent to points.
102
+
103
+ **EMUs (English Metric Unit)**
104
+ EMUs are a virtual unit designed to facilitate the smooth conversion between inches, milliimeters, and pixels for images and vector graphics. 1in == 914400 EMUs == 72dpi x 100 x 254.
105
+
106
+
107
+ ## Syntax
108
+
109
+ In the following examples, the variable `docx` is assumed to be an instance of Caracal::Document.
110
+
111
+ docx = Caracal::Document.new('example_document.docx')
112
+
113
+ ### File Name
114
+
115
+ The final output document's title can be set at initialization or via the `file_name` method.
116
+
117
+ docx = Caracal::Document.new('example_document.docx')
118
+
119
+ docx.file_name 'example_document.docx'
120
+
121
+ The current document name can be returned by invoking the `name` method:
122
+
123
+ docx.name # => 'example_document.docx'
124
+
125
+ *The default file name is caracal.docx.*
126
+
127
+ ### Page Size
128
+
129
+ Page dimensions can be set using the `page_size` method. The method accepts two parameters for controlling the width and height of the document.
130
+
131
+ *Pages default to the United States standard A4, portrait dimensions (8.5in x 11in).*
132
+
133
+ # options via block
134
+ docx.page_size do
135
+ width 12240 # sets the page width. units in twips.
136
+ height 15840 # sets the page height. units in twips.
137
+ end
138
+
139
+ # options via hash
140
+ docx.page_size width: 12240, height: 15840
141
+
142
+ The `page_size` command will produce the following XML in the `document.xml` file:
143
+
144
+ <w:sectPr>
145
+ <w:pgSz w:w="12240" w:h="15840"/>
146
+ </w:sectPr>
147
+
148
+ ### Page Margins
149
+
150
+ Page margins can be set using the `page_margins` method. The method accepts four parameters for controlling the margins of the document.
151
+ *Margins default to 1.0in for all sides.*
152
+
153
+ # options via block
154
+ docx.page_margins do
155
+ left 720 # sets the left margin. units in twips.
156
+ right 720 # sets the right margin. units in twips.
157
+ top 1440 # sets the top margin. units in twips.
158
+ bottom 1440 # sets the bottom margin. units in twips.
159
+ end
160
+
161
+ # options via hash
162
+ docx.page_margins left: 720, right: 720, top: 1440, bottom: 1440
163
+
164
+ The `page_margins` command above will produce the following XML in the `document.xml` file:
165
+
166
+ <w:sectPr>
167
+ <w:pgMar w:left="720" w:right="720" w:top="1440" w:bottom="1440"/>
168
+ </w:sectPr>
169
+
170
+ ### Page Breaks
171
+
172
+ Page breaks can be added via the `page` method. The method accepts no parameters.
173
+
174
+ docx.page # starts a new page.
175
+
176
+ The `page` command will produce the following XML in the `document.xml` file:
177
+
178
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
179
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
180
+ <w:br w:type="page"/>
181
+ </w:r>
182
+ </w:p>
183
+
184
+ ### Page Numbers
185
+
186
+ Page numbers can be added to the footer via the `page_numbers` method. The method accepts an optional parameter for controlling the alignment of the text.
187
+
188
+ *Page numbers are turned off by default.*
189
+
190
+ # no options
191
+ docx.page_numbers true
192
+
193
+ # options via block
194
+ docx.page_numbers true do
195
+ align :right # controls text alignment. defaults to :center.
196
+ end
197
+
198
+ # options via hash
199
+ docx.page_numbers true, align: :right
200
+
201
+ The default command will produce the following `footer.xml` file contents.
202
+
203
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
204
+ <w:ftr xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 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: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:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:lc="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram">
205
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
206
+ <w:pPr>
207
+ <w:contextualSpacing w:val="0"/>
208
+ <w:jc w:val="center"/>
209
+ </w:pPr>
210
+ <w:fldSimple w:dirty="0" w:instr="PAGE" w:fldLock="0">
211
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
212
+ <w:rPr/>
213
+ </w:r>
214
+ </w:fldSimple>
215
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
216
+ <w:rPr>
217
+ <w:rtl w:val="0"/>
218
+ </w:rPr>
219
+ </w:r>
220
+ </w:p>
221
+ </w:ftr>
222
+
223
+ *It will also automatically add the correct notation to the `w:sectPr` node of the `document.xml` file.*
224
+
225
+
226
+ ### Fonts
227
+
228
+ Fonts are added to the font table file by calling the `font` method and passing the name of the font. At present, Caracal only supports declaring the primary font name.
229
+
230
+ docx.font name: 'Arial'
231
+ docx.font do
232
+ name 'Droid Serif'
233
+ end
234
+
235
+ These commands will produce the following `fontTable.xml` file contents:
236
+
237
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
238
+ <w:fonts xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 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: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:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:lc="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram">
239
+ <w:font w:name="Arial"/>
240
+ <w:font w:name="Droid Serif"/>
241
+ </w:fonts>
242
+
243
+ ### Styles
244
+
245
+ Style classes can be added using the `style` method. The method accepts several optional parameters to control the rendering of text using the style.
246
+
247
+ # options via block
248
+ docx.style do
249
+ type :paragraph # :paragraph or :table
250
+ id 'Heading1' # sets the internal identifier for the style.
251
+ name 'heading 1' # set the friendly name of the style.
252
+ color '333333' # sets the text color. values in hex RGB.
253
+ font 'Droid Serif' # sets the font family.
254
+ size 28 # set the font size. units in half points.
255
+ bold false # sets the font weight.
256
+ italic false # sets the font style.
257
+ underline false # sets whether or not to underline the text.
258
+ align :left # sets the alignment. accepts :left, :center, :right, and :both.
259
+ top 100 # sets the spacing above the paragraph. units in twips.
260
+ bottom 0 # sets the spacing below the paragraph. units in twips.
261
+ spacing 360 # sets the spacing between lines. units in twips.
262
+ end
263
+
264
+ The `style` command above would produce the following XML:
265
+
266
+ <w:style w:styleId="Heading1" w:type="paragraph">
267
+ <w:name w:val="heading 1"/>
268
+ <w:basedOn w:val="Normal"/>
269
+ <w:next w:val="Normal"/>
270
+ <w:pPr>
271
+ <w:keepNext w:val="0"/>
272
+ <w:keepLines w:val="0"/>
273
+ <w:widowControl w:val="0"/>
274
+ <w:contextualSpacing w:val="1"/>
275
+ </w:pPr>
276
+ <w:rPr>
277
+ <w:rFonts w:cs="Droid Serif" w:hAnsi="Droid Serif" w:eastAsia="Droid Serif" w:ascii="Droid Serif"/>
278
+ <w:sz w:val="28"/>
279
+ </w:rPr>
280
+ </w:style>
281
+
282
+ ### Paragraphs
283
+
284
+ Text can be added using the `p` method. The `p` either takes a string and a `class` option or a block of `text`-like commands.
285
+
286
+ Text within a `p` block can be further defined using the `text` and `link` methods. The `text` method takes a text string and the optional parameters `style`, `color`, `size`, `bold`, `italic`, and `underline`. See below for details on the `link` method.
287
+
288
+ docx.p 'some text', style: 'my_style'
289
+
290
+ docx.p do
291
+ text 'Here is a sentence with a ', style: 'my_style'
292
+ link 'link', 'https://www.example.com'
293
+ text ' to something awesome', color: '555555', size: 16, bold: true, italic: true, underline: true
294
+ end
295
+
296
+
297
+ A `p` block might yield the following XML:
298
+
299
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
300
+ <w:pPr>
301
+ <w:contextualSpacing w:val="0"/>
302
+ </w:pPr>
303
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
304
+ <w:rPr>
305
+ <w:rtl w:val="0"/>
306
+ </w:rPr>
307
+ <w:t xml:space="preserve">Here is a sentence with a </w:t>
308
+ </w:r>
309
+ <w:hyperlink r:id="rId6">
310
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
311
+ <w:rPr>
312
+ <w:color w:val="1155cc"/>
313
+ <w:u w:val="single"/>
314
+ <w:rtl w:val="0"/>
315
+ </w:rPr>
316
+ <w:t xml:space="preserve">link</w:t>
317
+ </w:r>
318
+ </w:hyperlink>
319
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
320
+ <w:rPr>
321
+ <w:b w:val="1"/>
322
+ <w:rtl w:val="0"/>
323
+ </w:rPr>
324
+ <w:t xml:space="preserve"> to something awesome.</w:t>
325
+ </w:r>
326
+ </w:p>
327
+
328
+ ### Headers
329
+
330
+ Headers can be added using the `h1`, `h2`, etc. methods. Text within a header block can be further defined using the `text` method.
331
+
332
+ *Ultimately, headers are just paragraphs that use header styles.*
333
+
334
+ docx.h3 'Heading 3'
335
+
336
+ The `h3` block above will yield the following XML:
337
+
338
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
339
+ <w:pPr>
340
+ <w:pStyle w:val="Heading3"/>
341
+ <w:contextualSpacing w:val="0"/>
342
+ </w:pPr>
343
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
344
+ <w:rPr>
345
+ <w:rtl w:val="0"/>
346
+ </w:rPr>
347
+ <w:t xml:space="preserve">Heading 3</w:t>
348
+ </w:r>
349
+ </w:p>
350
+
351
+ ### Links
352
+
353
+ Links can be added inside paragraphs by using the `link` method. The method accepts several optional parameters for controlling the style and behavior of the rule.
354
+
355
+ *At present, all links are assumed to be external.*
356
+
357
+ # no options
358
+ docx.p do
359
+ link 'Example Text', 'https://wwww.example.com'
360
+ end
361
+
362
+ # options via block
363
+ p do
364
+ link 'Example Text', 'https://wwww.example.com' do
365
+ style 'my_style' # sets the style class. defaults to nil.
366
+ color '0000ff' # sets the color of the text. defaults to 1155cc.
367
+ size 24 # sets the font size. units in half-points. defaults to nil.
368
+ bold false # sets whether or not the text will be bold. defaults to false.
369
+ italic false # sets whether or not the text will be italic. defaults to false.
370
+ underline true # sets whether or not the text will be underlined. defaults to true.
371
+ end
372
+ end
373
+
374
+ # options via hash
375
+ p do
376
+ link 'Example Text', 'https://wwww.example.com', color: '0000ff', underline: false
377
+ end
378
+
379
+ The `link` command with default properties will produce the following XML output:
380
+
381
+ <w:hyperlink r:id="rId1">
382
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
383
+ <w:rPr>
384
+ <w:color w:val="1155cc"/>
385
+ <w:u w:val="single"/>
386
+ <w:rtl w:val="0"/>
387
+ </w:rPr>
388
+ <w:t xml:space="preserve">Example Text</w:t>
389
+ </w:r>
390
+ </w:hyperlink>
391
+
392
+ *Caracal will automatically generate the relationship entries required by the OpenXML standard.*
393
+
394
+ <Relationship Target="https://www.example.com" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" TargetMode="External" Id="rId1"/>
395
+
396
+ ### Images
397
+
398
+ Images can be added by using the `img` method. The method accepts several optional parameters for controlling the style and placement of the asset.
399
+
400
+ # options via block
401
+ docx.img image_url('example.png') do
402
+ width 396 # sets the image width. units specified in pixels.
403
+ height 216 # sets the image height. units specified in pixels.
404
+ align :right # controls the justification of the image. default is :left.
405
+ top 10 # sets the top margin. units specified in pixels.
406
+ bottom 10 # sets the bottom margin. units specified in pixels.
407
+ left 10 # sets the left margin. units specified in pixels.
408
+ right 10 # sets the right margin. units specified in pixels.
409
+ end
410
+
411
+ # options via hash
412
+ docx.img image_url('example.png'), width: 396, height: 216, align: :right
413
+
414
+ The `img` command with default properties will produce the following XML output:
415
+
416
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
417
+ <w:pPr>
418
+ <w:spacing w:lineRule="auto" w:line="276"/>
419
+ <w:contextualSpacing w:val="0"/>
420
+ <w:jc w:val="right"/>
421
+ <w:rPr/>
422
+ </w:pPr>
423
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
424
+ <w:drawing>
425
+ <wp:inline distR="114300" distT="114300" distB="114300" distL="114300">
426
+ <wp:extent cy="2743200" cx="5029200"/>
427
+ <wp:effectExtent t="0" b="0" r="0" l="0"/>
428
+ <wp:docPr id="1" name="image00.png"/>
429
+ <a:graphic>
430
+ <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
431
+ <pic:pic>
432
+ <pic:nvPicPr>
433
+ <pic:cNvPr id="0" name="image00.png"/>
434
+ <pic:cNvPicPr preferRelativeResize="0"/>
435
+ </pic:nvPicPr>
436
+ <pic:blipFill>
437
+ <a:blip r:embed="rId5"/>
438
+ <a:srcRect t="0" b="0" r="0" l="0"/>
439
+ <a:stretch>
440
+ <a:fillRect/>
441
+ </a:stretch>
442
+ </pic:blipFill>
443
+ <pic:spPr>
444
+ <a:xfrm>
445
+ <a:ext cy="2743200" cx="5029200"/>
446
+ </a:xfrm>
447
+ <a:prstGeom prst="rect"/>
448
+ <a:ln/>
449
+ </pic:spPr>
450
+ </pic:pic>
451
+ </a:graphicData>
452
+ </a:graphic>
453
+ </wp:inline>
454
+ </w:drawing>
455
+ </w:r>
456
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
457
+ <w:rPr>
458
+ <w:rtl w:val="0"/>
459
+ </w:rPr>
460
+ </w:r>
461
+ </w:p>
462
+
463
+ *Caracal will automatically generate the relationship entries required by the OpenXML standard.*
464
+
465
+ <Relationship Target="media/image00.png" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Id="rId5"/>
466
+
467
+ ### Rules
468
+
469
+ Horizontal rules can be added using the `hr` method. The method accepts several optional parameters for controlling the style of the rule.
470
+
471
+ # no options
472
+ docx.hr # defaults to a thin, single line.
473
+
474
+ # options via block
475
+ docx.hr do
476
+ color '333333' # controls the color of the line. defaults to auto.
477
+ line :double # controls the line style (single or double). defaults to single.
478
+ size 8 # controls the thickness of the line. units in 1/8 points. defaults to 4.
479
+ spacing 4 # controls the spacing around the line. units in points. defaults to 1.
480
+ end
481
+
482
+ # options via hash
483
+ docx.hr color: '333333', line: :double, size: 8, spacing: 2
484
+
485
+ The `hr` command with default properties will produce the following XML output:
486
+
487
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
488
+ <w:pPr>
489
+ <w:pBdr>
490
+ <w:top w:color="auto" w:space="1" w:val="single" w:sz="4"/>
491
+ </w:pBdr>
492
+ </w:pPr>
493
+ </w:p>
494
+
495
+ ### Ordered Lists
496
+
497
+ Ordered lists can be added using the `ol` and `li` methods. The `li` method substantially follows the same rules as the the `p` method; here, simpler examples are demonstrated.
498
+
499
+ docx.ol do
500
+ li 'First item'
501
+ li 'Second item'
502
+ end
503
+
504
+ The `ol` and `li` commands with default properties will produce the following XML (assuming the ordered list styles have the abstractNumId=2 in the `numbering.xml` file).
505
+
506
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
507
+ <w:pPr>
508
+ <w:numPr>
509
+ <w:ilvl w:val="0"/>
510
+ <w:numId w:val="2"/>
511
+ </w:numPr>
512
+ <w:ind w:left="720" w:hanging="359"/>
513
+ <w:contextualSpacing w:val="1"/>
514
+ <w:rPr>
515
+ <w:u w:val="none"/>
516
+ </w:rPr>
517
+ </w:pPr>
518
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
519
+ <w:rPr>
520
+ <w:rtl w:val="0"/>
521
+ </w:rPr>
522
+ <w:t xml:space="preserve">First item</w:t>
523
+ </w:r>
524
+ </w:p>
525
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
526
+ <w:pPr>
527
+ <w:numPr>
528
+ <w:ilvl w:val="0"/>
529
+ <w:numId w:val="2"/>
530
+ </w:numPr>
531
+ <w:ind w:left="720" w:hanging="359"/>
532
+ <w:contextualSpacing w:val="1"/>
533
+ <w:rPr>
534
+ <w:u w:val="none"/>
535
+ </w:rPr>
536
+ </w:pPr>
537
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
538
+ <w:rPr>
539
+ <w:rtl w:val="0"/>
540
+ </w:rPr>
541
+ <w:t xml:space="preserve">Second item</w:t>
542
+ </w:r>
543
+ </w:p>
544
+
545
+ ### Unordered Lists
546
+
547
+ Unordered lists can be added using the `ul` and `li` methods. The `li` method substantially follows the same rules as the the `p` method; here, simpler examples are demonstrated.
548
+
549
+ docx.ul do
550
+ li 'First item'
551
+ li 'Second item'
552
+ end
553
+
554
+ The `ul` and `li` commands with default properties will produce the following XML (assuming the ordered list styles have the abstractNumId=1 in the `numbering.xml` file).
555
+
556
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
557
+ <w:pPr>
558
+ <w:numPr>
559
+ <w:ilvl w:val="0"/>
560
+ <w:numId w:val="1"/>
561
+ </w:numPr>
562
+ <w:ind w:left="720" w:hanging="359"/>
563
+ <w:contextualSpacing w:val="1"/>
564
+ <w:rPr>
565
+ <w:u w:val="none"/>
566
+ </w:rPr>
567
+ </w:pPr>
568
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
569
+ <w:rPr>
570
+ <w:rtl w:val="0"/>
571
+ </w:rPr>
572
+ <w:t xml:space="preserve">First item</w:t>
573
+ </w:r>
574
+ </w:p>
575
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
576
+ <w:pPr>
577
+ <w:numPr>
578
+ <w:ilvl w:val="0"/>
579
+ <w:numId w:val="1"/>
580
+ </w:numPr>
581
+ <w:ind w:left="720" w:hanging="359"/>
582
+ <w:contextualSpacing w:val="1"/>
583
+ <w:rPr>
584
+ <w:u w:val="none"/>
585
+ </w:rPr>
586
+ </w:pPr>
587
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
588
+ <w:rPr>
589
+ <w:rtl w:val="0"/>
590
+ </w:rPr>
591
+ <w:t xml:space="preserve">Second item</w:t>
592
+ </w:r>
593
+ </w:p>
594
+
595
+ ### Tables
596
+
597
+ Tables can be added using the `table` method. The method accepts several optional paramters to control the layout and style of the table cells.
598
+
599
+ table data, border: 8 do
600
+ cell_style rows(0), background_color: '4a86e8', bold: true
601
+ end
602
+
603
+ Given the a data structure with two rows and five columns, the `table` method would produce the following XML:
604
+
605
+ <w:tbl>
606
+ <w:tblPr>
607
+ <w:tblStyle w:val="KixTable1"/>
608
+ <w:bidiVisual w:val="0"/>
609
+ <w:tblW w:w="10800.0" w:type="dxa"/>
610
+ <w:jc w:val="left"/>
611
+ <w:tblBorders>
612
+ <w:top w:color="000000" w:space="0" w:val="single" w:sz="8"/>
613
+ <w:left w:color="000000" w:space="0" w:val="single" w:sz="8"/>
614
+ <w:bottom w:color="000000" w:space="0" w:val="single" w:sz="8"/>
615
+ <w:right w:color="000000" w:space="0" w:val="single" w:sz="8"/>
616
+ <w:insideH w:color="000000" w:space="0" w:val="single" w:sz="8"/>
617
+ <w:insideV w:color="000000" w:space="0" w:val="single" w:sz="8"/>
618
+ </w:tblBorders>
619
+ <w:tblLayout w:type="fixed"/>
620
+ <w:tblLook w:val="0600"/>
621
+ </w:tblPr>
622
+ <w:tblGrid>
623
+ <w:gridCol w:w="2160"/>
624
+ <w:gridCol w:w="2160"/>
625
+ <w:gridCol w:w="2160"/>
626
+ <w:gridCol w:w="2160"/>
627
+ <w:gridCol w:w="2160"/>
628
+ <w:tblGridChange w:id="0">
629
+ <w:tblGrid>
630
+ <w:gridCol w:w="2160"/>
631
+ <w:gridCol w:w="2160"/>
632
+ <w:gridCol w:w="2160"/>
633
+ <w:gridCol w:w="2160"/>
634
+ <w:gridCol w:w="2160"/>
635
+ </w:tblGrid>
636
+ </w:tblGridChange>
637
+ </w:tblGrid>
638
+ <w:tr>
639
+ <w:tc>
640
+ <w:tcPr>
641
+ <w:shd w:fill="4a86e8"/>
642
+ <w:tcMar>
643
+ <w:top w:w="100.0" w:type="dxa"/>
644
+ <w:left w:w="100.0" w:type="dxa"/>
645
+ <w:bottom w:w="100.0" w:type="dxa"/>
646
+ <w:right w:w="100.0" w:type="dxa"/>
647
+ </w:tcMar>
648
+ </w:tcPr>
649
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
650
+ <w:pPr>
651
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
652
+ <w:ind w:left="0" w:firstLine="0"/>
653
+ <w:contextualSpacing w:val="0"/>
654
+ </w:pPr>
655
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
656
+ <w:rPr>
657
+ <w:b w:val="1"/>
658
+ <w:color w:val="ffffff"/>
659
+ <w:rtl w:val="0"/>
660
+ </w:rPr>
661
+ <w:t xml:space="preserve">Field</w:t>
662
+ </w:r>
663
+ </w:p>
664
+ </w:tc>
665
+ <w:tc>
666
+ <w:tcPr>
667
+ <w:shd w:fill="4a86e8"/>
668
+ <w:tcMar>
669
+ <w:top w:w="100.0" w:type="dxa"/>
670
+ <w:left w:w="100.0" w:type="dxa"/>
671
+ <w:bottom w:w="100.0" w:type="dxa"/>
672
+ <w:right w:w="100.0" w:type="dxa"/>
673
+ </w:tcMar>
674
+ </w:tcPr>
675
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
676
+ <w:pPr>
677
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
678
+ <w:ind w:left="0" w:firstLine="0"/>
679
+ <w:contextualSpacing w:val="0"/>
680
+ </w:pPr>
681
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
682
+ <w:rPr>
683
+ <w:b w:val="1"/>
684
+ <w:color w:val="ffffff"/>
685
+ <w:rtl w:val="0"/>
686
+ </w:rPr>
687
+ <w:t xml:space="preserve">Response</w:t>
688
+ </w:r>
689
+ </w:p>
690
+ </w:tc>
691
+ <w:tc>
692
+ <w:tcPr>
693
+ <w:shd w:fill="4a86e8"/>
694
+ <w:tcMar>
695
+ <w:top w:w="100.0" w:type="dxa"/>
696
+ <w:left w:w="100.0" w:type="dxa"/>
697
+ <w:bottom w:w="100.0" w:type="dxa"/>
698
+ <w:right w:w="100.0" w:type="dxa"/>
699
+ </w:tcMar>
700
+ </w:tcPr>
701
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
702
+ <w:pPr>
703
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
704
+ <w:ind w:left="0" w:firstLine="0"/>
705
+ <w:contextualSpacing w:val="0"/>
706
+ </w:pPr>
707
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
708
+ <w:rPr>
709
+ <w:b w:val="1"/>
710
+ <w:color w:val="ffffff"/>
711
+ <w:rtl w:val="0"/>
712
+ </w:rPr>
713
+ <w:t xml:space="preserve">Perf. Quality</w:t>
714
+ </w:r>
715
+ </w:p>
716
+ </w:tc>
717
+ <w:tc>
718
+ <w:tcPr>
719
+ <w:shd w:fill="4a86e8"/>
720
+ <w:tcMar>
721
+ <w:top w:w="100.0" w:type="dxa"/>
722
+ <w:left w:w="100.0" w:type="dxa"/>
723
+ <w:bottom w:w="100.0" w:type="dxa"/>
724
+ <w:right w:w="100.0" w:type="dxa"/>
725
+ </w:tcMar>
726
+ </w:tcPr>
727
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
728
+ <w:pPr>
729
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
730
+ <w:ind w:left="0" w:firstLine="0"/>
731
+ <w:contextualSpacing w:val="0"/>
732
+ </w:pPr>
733
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
734
+ <w:rPr>
735
+ <w:b w:val="1"/>
736
+ <w:color w:val="ffffff"/>
737
+ <w:rtl w:val="0"/>
738
+ </w:rPr>
739
+ <w:t xml:space="preserve">Data Quality</w:t>
740
+ </w:r>
741
+ </w:p>
742
+ </w:tc>
743
+ <w:tc>
744
+ <w:tcPr>
745
+ <w:shd w:fill="4a86e8"/>
746
+ <w:tcMar>
747
+ <w:top w:w="100.0" w:type="dxa"/>
748
+ <w:left w:w="100.0" w:type="dxa"/>
749
+ <w:bottom w:w="100.0" w:type="dxa"/>
750
+ <w:right w:w="100.0" w:type="dxa"/>
751
+ </w:tcMar>
752
+ </w:tcPr>
753
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
754
+ <w:pPr>
755
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
756
+ <w:ind w:left="0" w:firstLine="0"/>
757
+ <w:contextualSpacing w:val="0"/>
758
+ </w:pPr>
759
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
760
+ <w:rPr>
761
+ <w:b w:val="1"/>
762
+ <w:color w:val="ffffff"/>
763
+ <w:rtl w:val="0"/>
764
+ </w:rPr>
765
+ <w:t xml:space="preserve">State</w:t>
766
+ </w:r>
767
+ </w:p>
768
+ </w:tc>
769
+ </w:tr>
770
+ <w:tr>
771
+ <w:tc>
772
+ <w:tcPr>
773
+ <w:tcMar>
774
+ <w:top w:w="100.0" w:type="dxa"/>
775
+ <w:left w:w="100.0" w:type="dxa"/>
776
+ <w:bottom w:w="100.0" w:type="dxa"/>
777
+ <w:right w:w="100.0" w:type="dxa"/>
778
+ </w:tcMar>
779
+ </w:tcPr>
780
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
781
+ <w:pPr>
782
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
783
+ <w:ind w:left="0" w:firstLine="0"/>
784
+ <w:contextualSpacing w:val="0"/>
785
+ </w:pPr>
786
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
787
+ <w:rPr>
788
+ <w:rtl w:val="0"/>
789
+ </w:rPr>
790
+ <w:t xml:space="preserve">After-Hours trading</w:t>
791
+ </w:r>
792
+ </w:p>
793
+ </w:tc>
794
+ <w:tc>
795
+ <w:tcPr>
796
+ <w:tcMar>
797
+ <w:top w:w="100.0" w:type="dxa"/>
798
+ <w:left w:w="100.0" w:type="dxa"/>
799
+ <w:bottom w:w="100.0" w:type="dxa"/>
800
+ <w:right w:w="100.0" w:type="dxa"/>
801
+ </w:tcMar>
802
+ </w:tcPr>
803
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
804
+ <w:pPr>
805
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
806
+ <w:ind w:left="0" w:firstLine="0"/>
807
+ <w:contextualSpacing w:val="0"/>
808
+ </w:pPr>
809
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
810
+ <w:rPr>
811
+ <w:rtl w:val="0"/>
812
+ </w:rPr>
813
+ <w:t xml:space="preserve">Yes</w:t>
814
+ </w:r>
815
+ </w:p>
816
+ </w:tc>
817
+ <w:tc>
818
+ <w:tcPr>
819
+ <w:tcMar>
820
+ <w:top w:w="100.0" w:type="dxa"/>
821
+ <w:left w:w="100.0" w:type="dxa"/>
822
+ <w:bottom w:w="100.0" w:type="dxa"/>
823
+ <w:right w:w="100.0" w:type="dxa"/>
824
+ </w:tcMar>
825
+ </w:tcPr>
826
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
827
+ <w:pPr>
828
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
829
+ <w:ind w:left="0" w:firstLine="0"/>
830
+ <w:contextualSpacing w:val="0"/>
831
+ </w:pPr>
832
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
833
+ <w:rPr>
834
+ <w:rtl w:val="0"/>
835
+ </w:rPr>
836
+ <w:t xml:space="preserve">B</w:t>
837
+ </w:r>
838
+ </w:p>
839
+ </w:tc>
840
+ <w:tc>
841
+ <w:tcPr>
842
+ <w:tcMar>
843
+ <w:top w:w="100.0" w:type="dxa"/>
844
+ <w:left w:w="100.0" w:type="dxa"/>
845
+ <w:bottom w:w="100.0" w:type="dxa"/>
846
+ <w:right w:w="100.0" w:type="dxa"/>
847
+ </w:tcMar>
848
+ </w:tcPr>
849
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
850
+ <w:pPr>
851
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
852
+ <w:ind w:left="0" w:firstLine="0"/>
853
+ <w:contextualSpacing w:val="0"/>
854
+ </w:pPr>
855
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
856
+ <w:rPr>
857
+ <w:rtl w:val="0"/>
858
+ </w:rPr>
859
+ <w:t xml:space="preserve">B</w:t>
860
+ </w:r>
861
+ </w:p>
862
+ </w:tc>
863
+ <w:tc>
864
+ <w:tcPr>
865
+ <w:tcMar>
866
+ <w:top w:w="100.0" w:type="dxa"/>
867
+ <w:left w:w="100.0" w:type="dxa"/>
868
+ <w:bottom w:w="100.0" w:type="dxa"/>
869
+ <w:right w:w="100.0" w:type="dxa"/>
870
+ </w:tcMar>
871
+ </w:tcPr>
872
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
873
+ <w:pPr>
874
+ <w:spacing w:lineRule="auto" w:after="0" w:line="240" w:before="0"/>
875
+ <w:ind w:left="0" w:firstLine="0"/>
876
+ <w:contextualSpacing w:val="0"/>
877
+ </w:pPr>
878
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
879
+ <w:rPr>
880
+ <w:rtl w:val="0"/>
881
+ </w:rPr>
882
+ <w:t xml:space="preserve">published</w:t>
883
+ </w:r>
884
+ </w:p>
885
+ </w:tc>
886
+ </w:tr>
887
+
888
+ ### Line Breaks
889
+
890
+ Line breaks can be added via the `br` method. The method accepts no parameters.
891
+
892
+ docx.br # adds a blank line using the default paragrpah style.
893
+
894
+ The `br` command will produce the folowing XML:
895
+
896
+ <w:p w:rsidP="00000000" w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000" w:rsidRDefault="00000000">
897
+ <w:pPr>
898
+ <w:contextualSpacing w:val="0"/>
899
+ </w:pPr>
900
+ <w:r w:rsidRPr="00000000" w:rsidR="00000000" w:rsidDel="00000000">
901
+ <w:rPr>
902
+ <w:rtl w:val="0"/>
903
+ </w:rPr>
904
+ </w:r>
905
+ </w:p>
906
+
907
+
908
+ ## Template Rendering
909
+
910
+ Caracal includes [Tilt](https://github.com/rtomayko/tilt) integration to facilitate its inclusion in other frameworks. Rails integration can be added via the [Caracal-Rails](https://github.com/trade-informatics/caracal-rails) gem.
911
+
912
+
913
+ ## Defaults
914
+
915
+ [Unsure how best to handle this without code exploration. Not a critical element for the first version.]
916
+
917
+
918
+ ## Contributing
919
+
920
+ 1. Fork it ( https://github.com/trade-informatics/caracal/fork )
921
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
922
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
923
+ 4. Push to the branch (`git push origin my-new-feature`)
924
+ 5. Create a new Pull Request
925
+
926
+
927
+ ## Why is It Called Caracal?
928
+
929
+ Because my son likes caracals. :)
930
+
931
+
932
+ ## Inspiration
933
+
934
+ A tip of the hat to the wonderful PDF generation library [Prawn](https://github.com/prawnpdf/prawn).
935
+
936
+
937
+ ## License
938
+
939
+ Copyright (c) 2014 Trade Informatics, Inc
940
+
941
+ [MIT License](https://github.com/trade-informatics/caracal/blob/master/LICENSE.txt)