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
@@ -0,0 +1,56 @@
1
+ require 'nokogiri'
2
+
3
+ require 'caracal/renderers/xml_renderer'
4
+
5
+
6
+ module Caracal
7
+ module Renderers
8
+ class FontsRenderer < XmlRenderer
9
+
10
+ #-------------------------------------------------------------
11
+ # Public Methods
12
+ #-------------------------------------------------------------
13
+
14
+ # This method produces the xml required for the `word/fontTable.xml`
15
+ # sub-document.
16
+ #
17
+ def to_xml
18
+ builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
19
+ xml.send 'w:fonts', root_options do
20
+ document.fonts.each do |font|
21
+ xml.send 'w:font', { 'w:name' => font.font_name }
22
+ end
23
+ end
24
+ end
25
+ builder.to_xml(save_options)
26
+ end
27
+
28
+
29
+ #-------------------------------------------------------------
30
+ # Private Methods
31
+ #-------------------------------------------------------------
32
+ private
33
+
34
+ def root_options
35
+ {
36
+ 'xmlns:mc' => 'http://schemas.openxmlformats.org/markup-compatibility/2006',
37
+ 'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
38
+ 'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
39
+ 'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
40
+ 'xmlns:v' => 'urn:schemas-microsoft-com:vml',
41
+ 'xmlns:wp' => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
42
+ 'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
43
+ 'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
44
+ 'xmlns:wne' => 'http://schemas.microsoft.com/office/word/2006/wordml',
45
+ 'xmlns:sl' => 'http://schemas.openxmlformats.org/schemaLibrary/2006/main',
46
+ 'xmlns:a' => 'http://schemas.openxmlformats.org/drawingml/2006/main',
47
+ 'xmlns:pic' => 'http://schemas.openxmlformats.org/drawingml/2006/picture',
48
+ 'xmlns:c' => 'http://schemas.openxmlformats.org/drawingml/2006/chart',
49
+ 'xmlns:lc' => 'http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas',
50
+ 'xmlns:dgm' => 'http://schemas.openxmlformats.org/drawingml/2006/diagram'
51
+ }
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,69 @@
1
+ require 'nokogiri'
2
+
3
+ require 'caracal/renderers/xml_renderer'
4
+
5
+
6
+ module Caracal
7
+ module Renderers
8
+ class FooterRenderer < XmlRenderer
9
+
10
+ #-------------------------------------------------------------
11
+ # Public Methods
12
+ #-------------------------------------------------------------
13
+
14
+ # This method produces the xml required for the `word/settings.xml`
15
+ # sub-document.
16
+ #
17
+ def to_xml
18
+ builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
19
+ xml.send 'w:ftr', root_options do
20
+ xml.send 'w:p', paragraph_options do
21
+ xml.send 'w:pPr' do
22
+ xml.send 'w:contextualSpacing', { 'w:val' => '0' }
23
+ xml.send 'w:jc', { 'w:val' => "#{ document.page_number_align }" }
24
+ end
25
+ xml.send 'w:fldSimple', { 'w:dirty' => '0', 'w:instr' => 'PAGE', 'w:fldLock' => '0' } do
26
+ xml.send 'w:r', run_options do
27
+ xml.send 'w:rPr'
28
+ end
29
+ end
30
+ xml.send 'w:r', run_options do
31
+ xml.send 'w:rPr' do
32
+ xml.send 'w:rtl', { 'w:val' => '0' }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ builder.to_xml(save_options)
39
+ end
40
+
41
+
42
+ #-------------------------------------------------------------
43
+ # Private Methods
44
+ #-------------------------------------------------------------
45
+ private
46
+
47
+ def root_options
48
+ {
49
+ 'xmlns:mc' => 'http://schemas.openxmlformats.org/markup-compatibility/2006',
50
+ 'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
51
+ 'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
52
+ 'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
53
+ 'xmlns:v' => 'urn:schemas-microsoft-com:vml',
54
+ 'xmlns:wp' => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
55
+ 'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
56
+ 'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
57
+ 'xmlns:wne' => 'http://schemas.microsoft.com/office/word/2006/wordml',
58
+ 'xmlns:sl' => 'http://schemas.openxmlformats.org/schemaLibrary/2006/main',
59
+ 'xmlns:a' => 'http://schemas.openxmlformats.org/drawingml/2006/main',
60
+ 'xmlns:pic' => 'http://schemas.openxmlformats.org/drawingml/2006/picture',
61
+ 'xmlns:c' => 'http://schemas.openxmlformats.org/drawingml/2006/chart',
62
+ 'xmlns:lc' => 'http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas',
63
+ 'xmlns:dgm' => 'http://schemas.openxmlformats.org/drawingml/2006/diagram'
64
+ }
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,87 @@
1
+ require 'nokogiri'
2
+
3
+ require 'caracal/core/models/list_style_model'
4
+ require 'caracal/core/models/list_model'
5
+ require 'caracal/renderers/xml_renderer'
6
+
7
+
8
+ module Caracal
9
+ module Renderers
10
+ class NumberingRenderer < XmlRenderer
11
+
12
+ #-------------------------------------------------------------
13
+ # Public Methods
14
+ #-------------------------------------------------------------
15
+
16
+ # This method produces the xml required for the `word/numbering.xml`
17
+ # sub-document.
18
+ #
19
+ def to_xml
20
+ builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
21
+ xml.send 'w:numbering', root_options do
22
+
23
+ # add abstract definitions
24
+ document.toplevel_lists.each_with_index do |model, i|
25
+ xml.send 'w:abstractNum', { 'w:abstractNumId' => i + 1 } do
26
+ model.level_map.each do |(level, type)|
27
+ if s = document.find_list_style(type, level)
28
+ xml.send 'w:lvl', { 'w:ilvl' => s.style_level } do
29
+ xml.send 'w:start', { 'w:val' => s.style_start }
30
+ xml.send 'w:numFmt', { 'w:val' => s.style_format }
31
+ xml.send 'w:lvlRestart', { 'w:val' => s.formatted_restart }
32
+ xml.send 'w:lvlText', { 'w:val' => s.style_value }
33
+ xml.send 'w:lvlJc', { 'w:val' => s.style_align }
34
+ xml.send 'w:pPr' do
35
+ xml.send 'w:ind', { 'w:left' => s.style_left, 'w:firstLine' => s.style_line }
36
+ end
37
+ xml.send 'w:rPr' do
38
+ xml.send 'w:u', { 'w:val' => 'none' }
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ # bind individual tables to abstract definitions
47
+ document.toplevel_lists.each_with_index do |model, i|
48
+ xml.send 'w:num', { 'w:numId' => i + 1 } do
49
+ xml.send 'w:abstractNumId', { 'w:val' => i + 1 }
50
+ end
51
+ end
52
+ end
53
+
54
+ end
55
+ builder.to_xml(save_options)
56
+ end
57
+
58
+
59
+
60
+ #-------------------------------------------------------------
61
+ # Private Methods
62
+ #-------------------------------------------------------------
63
+ private
64
+
65
+ def root_options
66
+ {
67
+ 'xmlns:mc' => 'http://schemas.openxmlformats.org/markup-compatibility/2006',
68
+ 'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
69
+ 'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
70
+ 'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
71
+ 'xmlns:v' => 'urn:schemas-microsoft-com:vml',
72
+ 'xmlns:wp' => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
73
+ 'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
74
+ 'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
75
+ 'xmlns:wne' => 'http://schemas.microsoft.com/office/word/2006/wordml',
76
+ 'xmlns:sl' => 'http://schemas.openxmlformats.org/schemaLibrary/2006/main',
77
+ 'xmlns:a' => 'http://schemas.openxmlformats.org/drawingml/2006/main',
78
+ 'xmlns:pic' => 'http://schemas.openxmlformats.org/drawingml/2006/picture',
79
+ 'xmlns:c' => 'http://schemas.openxmlformats.org/drawingml/2006/chart',
80
+ 'xmlns:lc' => 'http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas',
81
+ 'xmlns:dgm' => 'http://schemas.openxmlformats.org/drawingml/2006/diagram'
82
+ }
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,50 @@
1
+ require 'nokogiri'
2
+
3
+ require 'caracal/renderers/xml_renderer'
4
+
5
+
6
+ module Caracal
7
+ module Renderers
8
+ class PackageRelationshipsRenderer < XmlRenderer
9
+
10
+ #-------------------------------------------------------------
11
+ # Public Methods
12
+ #-------------------------------------------------------------
13
+
14
+ # This method produces the xml required for the `word/settings.xml`
15
+ # sub-document.
16
+ #
17
+ def to_xml
18
+ builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
19
+ xml.send 'Relationships', root_options do
20
+ relationship_data.each_with_index do |rel, index|
21
+ xml.send 'Relationship', { 'Target' => rel.first, 'Type' => rel.last, 'Id' => "rId#{ index + 1 }" }
22
+ end
23
+ end
24
+ end
25
+ builder.to_xml(save_options)
26
+ end
27
+
28
+
29
+ #-------------------------------------------------------------
30
+ # Private Methods
31
+ #-------------------------------------------------------------
32
+ private
33
+
34
+ def relationship_data
35
+ [
36
+ ['docProps/app.xml', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties'],
37
+ ['docProps/core.xml', 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties'],
38
+ ['word/document.xml', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument']
39
+ ]
40
+ end
41
+
42
+ def root_options
43
+ {
44
+ 'xmlns' => 'http://schemas.openxmlformats.org/package/2006/relationships'
45
+ }
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,48 @@
1
+ require 'nokogiri'
2
+
3
+ require 'caracal/renderers/xml_renderer'
4
+
5
+
6
+ module Caracal
7
+ module Renderers
8
+ class RelationshipsRenderer < XmlRenderer
9
+
10
+ #-------------------------------------------------------------
11
+ # Public Methods
12
+ #-------------------------------------------------------------
13
+
14
+ # This method produces the xml required for the `word/settings.xml`
15
+ # sub-document.
16
+ #
17
+ def to_xml
18
+ builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
19
+ xml.send 'Relationships', root_options do
20
+ document.relationships.each do |rel|
21
+ xml.send 'Relationship', rel_options(rel)
22
+ end
23
+ end
24
+ end
25
+ builder.to_xml(save_options)
26
+ end
27
+
28
+
29
+ #-------------------------------------------------------------
30
+ # Private Methods
31
+ #-------------------------------------------------------------
32
+ private
33
+
34
+ def rel_options(rel)
35
+ opts = { 'Target' => rel.formatted_target, 'Type' => rel.formatted_type, 'Id' => rel.formatted_id}
36
+ opts['TargetMode'] = 'External' if rel.target_mode?
37
+ opts
38
+ end
39
+
40
+ def root_options
41
+ {
42
+ 'xmlns' => 'http://schemas.openxmlformats.org/package/2006/relationships'
43
+ }
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,58 @@
1
+ require 'nokogiri'
2
+
3
+ require 'caracal/renderers/xml_renderer'
4
+
5
+
6
+ module Caracal
7
+ module Renderers
8
+ class SettingsRenderer < XmlRenderer
9
+
10
+ #-------------------------------------------------------------
11
+ # Public Methods
12
+ #-------------------------------------------------------------
13
+
14
+ # This method produces the xml required for the `word/settings.xml`
15
+ # sub-document.
16
+ #
17
+ def to_xml
18
+ builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
19
+ xml.send 'w:settings', root_options do
20
+ xml.send 'w:displayBackgroundShape', { 'w:val' => '1' }
21
+ xml.send 'w:defaultTabStop', { 'w:val' => '720' }
22
+ xml.send 'w:compat' do
23
+ xml.send 'w:compatSetting', { 'w:val' => '14', 'w:name' => 'compatibilityMode', 'w:uri' => 'http://schemas.microsoft.com/office/word' }
24
+ end
25
+ end
26
+ end
27
+ builder.to_xml(save_options)
28
+ end
29
+
30
+
31
+ #-------------------------------------------------------------
32
+ # Private Methods
33
+ #-------------------------------------------------------------
34
+ private
35
+
36
+ def root_options
37
+ {
38
+ 'xmlns:mc' => 'http://schemas.openxmlformats.org/markup-compatibility/2006',
39
+ 'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
40
+ 'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
41
+ 'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
42
+ 'xmlns:v' => 'urn:schemas-microsoft-com:vml',
43
+ 'xmlns:wp' => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
44
+ 'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
45
+ 'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
46
+ 'xmlns:wne' => 'http://schemas.microsoft.com/office/word/2006/wordml',
47
+ 'xmlns:sl' => 'http://schemas.openxmlformats.org/schemaLibrary/2006/main',
48
+ 'xmlns:a' => 'http://schemas.openxmlformats.org/drawingml/2006/main',
49
+ 'xmlns:pic' => 'http://schemas.openxmlformats.org/drawingml/2006/picture',
50
+ 'xmlns:c' => 'http://schemas.openxmlformats.org/drawingml/2006/chart',
51
+ 'xmlns:lc' => 'http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas',
52
+ 'xmlns:dgm' => 'http://schemas.openxmlformats.org/drawingml/2006/diagram'
53
+ }
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,163 @@
1
+ require 'nokogiri'
2
+
3
+ require 'caracal/renderers/xml_renderer'
4
+ require 'caracal/errors'
5
+
6
+
7
+ module Caracal
8
+ module Renderers
9
+ class StylesRenderer < XmlRenderer
10
+
11
+ #-------------------------------------------------------------
12
+ # Public Methods
13
+ #-------------------------------------------------------------
14
+
15
+ # This method produces the xml required for the `word/styles.xml`
16
+ # sub-document.
17
+ #
18
+ def to_xml
19
+ builder = ::Nokogiri::XML::Builder.with(declaration_xml) do |xml|
20
+ xml.send 'w:styles', root_options do
21
+
22
+ #============ DEFAULT STYLES ================================
23
+
24
+ unless s = document.default_style
25
+ raise Caracal::Errors::NoDefaultStyleError 'Document must declare a default paragraph style.'
26
+ end
27
+ xml.send 'w:docDefaults' do
28
+ xml.send 'w:rPrDefault' do
29
+ xml.send 'w:rPr' do
30
+ xml.send 'w:rFonts', font_options(s)
31
+ xml.send 'w:b', { 'w:val' => (s.style_bold ? '1' : '0') }
32
+ xml.send 'w:i', { 'w:val' => (s.style_italic ? '1' : '0') }
33
+ xml.send 'w:smallCaps', { 'w:val' => '0' }
34
+ xml.send 'w:strike', { 'w:val' => '0' }
35
+ xml.send 'w:color', { 'w:val' => s.style_color }
36
+ xml.send 'w:sz', { 'w:val' => s.style_size }
37
+ xml.send 'w:u', { 'w:val' => (s.style_underline ? 'single' : 'none') }
38
+ xml.send 'w:vertAlign', { 'w:val' => 'baseline' }
39
+ end
40
+ end
41
+ xml.send 'w:pPrDefault' do
42
+ xml.send 'w:pPr' do
43
+ xml.send 'w:keepNext', { 'w:val' => '0' }
44
+ xml.send 'w:keepLines', { 'w:val' => '0' }
45
+ xml.send 'w:widowControl', { 'w:val' => '1' }
46
+ xml.send 'w:spacing', { 'w:lineRule' => 'auto', 'w:line' => s.style_line, 'w:before' => '0', 'w:after' => '0' }
47
+ xml.send 'w:ind', { 'w:left' => '0', 'w:firstLine' => '0', 'w:right' => '0' }
48
+ xml.send 'w:jc', { 'w:val' => s.style_align.to_s }
49
+ end
50
+ end
51
+ end
52
+ xml.send 'w:style', { 'w:styleId' => s.style_id, 'w:type' => 'paragraph', 'w:default' => '1' } do
53
+ xml.send 'w:name', { 'w:val' => s.style_name }
54
+ end
55
+ xml.send 'w:style', { 'w:styleId' => 'TableNormal', 'w:type' => 'table', 'w:default' => '1' } do
56
+ xml.send 'w:name', { 'w:val' => 'Table Normal'}
57
+ xml.send 'w:pPr' do
58
+ xml.send 'w:spacing', { 'w:lineRule' => 'auto', 'w:line' => (s.style_size * 20 * 1.15), 'w:before' => '0', 'w:after' => '0' }
59
+ end
60
+ end
61
+ default_id = s.style_id
62
+
63
+
64
+ #============ PARAGRAPH STYLES ================================
65
+
66
+ document.styles.reject { |s| s.style_id == default_id }.each do |s|
67
+ xml.send 'w:style', { 'w:styleId' => s.style_id, 'w:type' => 'paragraph' } do
68
+ xml.send 'w:name', { 'w:val' => s.style_name }
69
+ xml.send 'w:basedOn', { 'w:val' => s.style_base }
70
+ xml.send 'w:next', { 'w:val' => s.style_next }
71
+ xml.send 'w:pPr' do
72
+ xml.send 'w:keepNext', { 'w:val' => '1' }
73
+ xml.send 'w:keepLines', { 'w:val' => '1' }
74
+ xml.send 'w:spacing', spacing_options(s) unless spacing_options(s).nil?
75
+ xml.send 'w:contextualSpacing', { 'w:val' => '1' }
76
+ xml.send 'w:jc', { 'w:val' => s.style_align.to_s } unless s.style_align.nil?
77
+ end
78
+ xml.send 'w:rPr' do
79
+ xml.send 'w:rFonts', font_options(s) unless s.style_font.nil?
80
+ xml.send 'w:b', { 'w:val' => (s.style_bold ? '1' : '0') } unless s.style_bold.nil?
81
+ xml.send 'w:i', { 'w:val' => (s.style_italic ? '1' : '0') } unless s.style_italic.nil?
82
+ xml.send 'w:color', { 'w:val' => s.style_color } unless s.style_color.nil?
83
+ xml.send 'w:sz', { 'w:val' => s.style_size } unless s.style_size.nil?
84
+ xml.send 'w:u', { 'w:val' => (s.style_underline ? 'single' : 'none') } unless s.style_underline.nil?
85
+ end
86
+ end
87
+ end
88
+
89
+ #============ TABLE STYLES ================================
90
+
91
+ xml.send 'w:style', { 'w:styleId' => 'DefaultTable', 'w:type' => 'table' } do
92
+ xml.send 'w:basedOn', { 'w:val' => 'TableNormal' }
93
+ xml.send 'w:tblPr' do
94
+ xml.send 'w:tblStyleRowBandSize', { 'w:val' => '1' }
95
+ xml.send 'w:tblStyleColBandSize', { 'w:val' => '1' }
96
+ end
97
+ %w(band1Horz band1Vert band2Horz band2Vert).each do |type|
98
+ xml.send 'w:tblStylePr', { 'w:type' => type }
99
+ end
100
+ %w(firstCol firstRow lastCol lastRow).each do |type|
101
+ xml.send 'w:tblStylePr', { 'w:type' => type }
102
+ end
103
+ %w(neCell nwCell seCell swCell).each do |type|
104
+ xml.send 'w:tblStylePr', { 'w:type' => type }
105
+ end
106
+ end
107
+
108
+ end
109
+ end
110
+ builder.to_xml(save_options)
111
+ end
112
+
113
+
114
+
115
+ #-------------------------------------------------------------
116
+ # Private Methods
117
+ #-------------------------------------------------------------
118
+ private
119
+
120
+ def font_options(style)
121
+ name = style.style_font
122
+ { 'w:cs' => name, 'w:hAnsi' => name, 'w:eastAsia' => name, 'w:ascii' => name }
123
+ end
124
+
125
+ def spacing_options(style)
126
+ top = style.style_top
127
+ bottom = style.style_bottom
128
+ line = style.style_line
129
+
130
+ options = nil
131
+ if [top, bottom, line].compact.size > 0
132
+ options = {}
133
+ options['w:lineRule'] = 'auto'
134
+ options['w:before'] = top unless top.nil?
135
+ options['w:after'] = bottom unless bottom.nil?
136
+ options['w:line'] = line unless line.nil?
137
+ end
138
+ options
139
+ end
140
+
141
+ def root_options
142
+ {
143
+ 'xmlns:mc' => 'http://schemas.openxmlformats.org/markup-compatibility/2006',
144
+ 'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
145
+ 'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
146
+ 'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
147
+ 'xmlns:v' => 'urn:schemas-microsoft-com:vml',
148
+ 'xmlns:wp' => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
149
+ 'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
150
+ 'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
151
+ 'xmlns:wne' => 'http://schemas.microsoft.com/office/word/2006/wordml',
152
+ 'xmlns:sl' => 'http://schemas.openxmlformats.org/schemaLibrary/2006/main',
153
+ 'xmlns:a' => 'http://schemas.openxmlformats.org/drawingml/2006/main',
154
+ 'xmlns:pic' => 'http://schemas.openxmlformats.org/drawingml/2006/picture',
155
+ 'xmlns:c' => 'http://schemas.openxmlformats.org/drawingml/2006/chart',
156
+ 'xmlns:lc' => 'http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas',
157
+ 'xmlns:dgm' => 'http://schemas.openxmlformats.org/drawingml/2006/diagram'
158
+ }
159
+ end
160
+
161
+ end
162
+ end
163
+ end