caracal 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +941 -0
- data/Rakefile +2 -0
- data/caracal.gemspec +27 -0
- data/lib/caracal.rb +31 -0
- data/lib/caracal/core/file_name.rb +39 -0
- data/lib/caracal/core/fonts.rb +75 -0
- data/lib/caracal/core/images.rb +37 -0
- data/lib/caracal/core/line_breaks.rb +29 -0
- data/lib/caracal/core/list_styles.rb +92 -0
- data/lib/caracal/core/lists.rb +57 -0
- data/lib/caracal/core/models/base_model.rb +51 -0
- data/lib/caracal/core/models/border_model.rb +120 -0
- data/lib/caracal/core/models/font_model.rb +64 -0
- data/lib/caracal/core/models/image_model.rb +118 -0
- data/lib/caracal/core/models/line_break_model.rb +15 -0
- data/lib/caracal/core/models/link_model.rb +65 -0
- data/lib/caracal/core/models/list_item_model.rb +105 -0
- data/lib/caracal/core/models/list_model.rb +130 -0
- data/lib/caracal/core/models/list_style_model.rb +129 -0
- data/lib/caracal/core/models/margin_model.rb +76 -0
- data/lib/caracal/core/models/page_break_model.rb +15 -0
- data/lib/caracal/core/models/page_number_model.rb +69 -0
- data/lib/caracal/core/models/page_size_model.rb +70 -0
- data/lib/caracal/core/models/paragraph_model.rb +141 -0
- data/lib/caracal/core/models/relationship_model.rb +108 -0
- data/lib/caracal/core/models/rule_model.rb +27 -0
- data/lib/caracal/core/models/style_model.rb +134 -0
- data/lib/caracal/core/models/table_cell_model.rb +155 -0
- data/lib/caracal/core/models/table_model.rb +206 -0
- data/lib/caracal/core/models/text_model.rb +92 -0
- data/lib/caracal/core/page_breaks.rb +29 -0
- data/lib/caracal/core/page_numbers.rb +51 -0
- data/lib/caracal/core/page_settings.rb +72 -0
- data/lib/caracal/core/relationships.rb +90 -0
- data/lib/caracal/core/rules.rb +35 -0
- data/lib/caracal/core/styles.rb +86 -0
- data/lib/caracal/core/tables.rb +41 -0
- data/lib/caracal/core/text.rb +73 -0
- data/lib/caracal/document.rb +242 -0
- data/lib/caracal/errors.rb +23 -0
- data/lib/caracal/renderers/app_renderer.rb +41 -0
- data/lib/caracal/renderers/content_types_renderer.rb +53 -0
- data/lib/caracal/renderers/core_renderer.rb +44 -0
- data/lib/caracal/renderers/document_renderer.rb +349 -0
- data/lib/caracal/renderers/fonts_renderer.rb +56 -0
- data/lib/caracal/renderers/footer_renderer.rb +69 -0
- data/lib/caracal/renderers/numbering_renderer.rb +87 -0
- data/lib/caracal/renderers/package_relationships_renderer.rb +50 -0
- data/lib/caracal/renderers/relationships_renderer.rb +48 -0
- data/lib/caracal/renderers/settings_renderer.rb +58 -0
- data/lib/caracal/renderers/styles_renderer.rb +163 -0
- data/lib/caracal/renderers/xml_renderer.rb +83 -0
- data/lib/caracal/version.rb +3 -0
- data/lib/tilt/caracal.rb +21 -0
- data/spec/lib/caracal/core/file_name_spec.rb +54 -0
- data/spec/lib/caracal/core/fonts_spec.rb +119 -0
- data/spec/lib/caracal/core/images_spec.rb +25 -0
- data/spec/lib/caracal/core/line_breaks_spec.rb +25 -0
- data/spec/lib/caracal/core/list_styles_spec.rb +121 -0
- data/spec/lib/caracal/core/lists_spec.rb +43 -0
- data/spec/lib/caracal/core/models/base_model_spec.rb +38 -0
- data/spec/lib/caracal/core/models/border_model_spec.rb +159 -0
- data/spec/lib/caracal/core/models/font_model_spec.rb +92 -0
- data/spec/lib/caracal/core/models/image_model_spec.rb +192 -0
- data/spec/lib/caracal/core/models/line_break_model_spec.rb +21 -0
- data/spec/lib/caracal/core/models/link_model_spec.rb +139 -0
- data/spec/lib/caracal/core/models/list_item_model_spec.rb +190 -0
- data/spec/lib/caracal/core/models/list_model_spec.rb +178 -0
- data/spec/lib/caracal/core/models/list_style_model_spec.rb +212 -0
- data/spec/lib/caracal/core/models/margin_model_spec.rb +111 -0
- data/spec/lib/caracal/core/models/page_break_model_spec.rb +21 -0
- data/spec/lib/caracal/core/models/page_number_model_spec.rb +101 -0
- data/spec/lib/caracal/core/models/page_size_model_spec.rb +91 -0
- data/spec/lib/caracal/core/models/paragraph_model_spec.rb +162 -0
- data/spec/lib/caracal/core/models/relationship_model_spec.rb +183 -0
- data/spec/lib/caracal/core/models/rule_model_spec.rb +108 -0
- data/spec/lib/caracal/core/models/style_model_spec.rb +187 -0
- data/spec/lib/caracal/core/models/table_cell_model_spec.rb +221 -0
- data/spec/lib/caracal/core/models/table_model_spec.rb +222 -0
- data/spec/lib/caracal/core/models/text_model_spec.rb +132 -0
- data/spec/lib/caracal/core/page_breaks_spec.rb +25 -0
- data/spec/lib/caracal/core/page_numbers_spec.rb +80 -0
- data/spec/lib/caracal/core/page_settings_spec.rb +143 -0
- data/spec/lib/caracal/core/relationships_spec.rb +119 -0
- data/spec/lib/caracal/core/rules_spec.rb +25 -0
- data/spec/lib/caracal/core/styles_spec.rb +129 -0
- data/spec/lib/caracal/core/tables_spec.rb +25 -0
- data/spec/lib/caracal/core/text_spec.rb +52 -0
- data/spec/lib/caracal/errors_spec.rb +10 -0
- data/spec/spec_helper.rb +8 -0
- 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
|