caracal 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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