rubyword 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +1 -0
- data/CHANGELOG.txt +10 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +125 -0
- data/Rakefile +4 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/doc/README.md +1 -0
- data/doc/text.md +1 -0
- data/lib/rubyword/configuration.rb +5 -0
- data/lib/rubyword/document.rb +81 -0
- data/lib/rubyword/element/base.rb +12 -0
- data/lib/rubyword/element/image.rb +45 -0
- data/lib/rubyword/element/link.rb +35 -0
- data/lib/rubyword/element/list.rb +35 -0
- data/lib/rubyword/element/page_break.rb +26 -0
- data/lib/rubyword/element/section.rb +67 -0
- data/lib/rubyword/element/text.rb +137 -0
- data/lib/rubyword/element/text_break.rb +20 -0
- data/lib/rubyword/version.rb +3 -0
- data/lib/rubyword/writer/part/base.rb +13 -0
- data/lib/rubyword/writer/part/content_types.rb +39 -0
- data/lib/rubyword/writer/part/doc_props_app.rb +20 -0
- data/lib/rubyword/writer/part/doc_props_core.rb +32 -0
- data/lib/rubyword/writer/part/doc_props_custom.rb +16 -0
- data/lib/rubyword/writer/part/document.rb +56 -0
- data/lib/rubyword/writer/part/font_table.rb +12 -0
- data/lib/rubyword/writer/part/footer.rb +50 -0
- data/lib/rubyword/writer/part/header.rb +40 -0
- data/lib/rubyword/writer/part/numbering.rb +51 -0
- data/lib/rubyword/writer/part/rels.rb +26 -0
- data/lib/rubyword/writer/part/rels_document.rb +31 -0
- data/lib/rubyword/writer/part/settings.rb +93 -0
- data/lib/rubyword/writer/part/styles.rb +91 -0
- data/lib/rubyword/writer/part/theme.rb +12 -0
- data/lib/rubyword/writer/part/toc.rb +89 -0
- data/lib/rubyword/writer/part/web_settings.rb +21 -0
- data/lib/rubyword/writer/style/base.rb +16 -0
- data/lib/rubyword/writer/style/section.rb +65 -0
- data/lib/rubyword/writer.rb +87 -0
- data/lib/rubyword.rb +9 -0
- data/rubyword.gemspec +27 -0
- data/sample/test.rb +78 -0
- data/spec/rubyword/document_spec.rb +11 -0
- data/spec/spec_helper.rb +32 -0
- data/template/fontTable.xml +54 -0
- data/template/theme.xml +284 -0
- metadata +197 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Element
|
4
|
+
class TextBreak < Base
|
5
|
+
attr_accessor :numbers
|
6
|
+
def save(numbers)
|
7
|
+
@numbers ||= Queue.new
|
8
|
+
@numbers << numbers.to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
def write(section=nil, xml=nil)
|
12
|
+
text_break = self.numbers.pop
|
13
|
+
text_break.to_i.times.each do |i|
|
14
|
+
xml.send('w:p')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class ContentTypes < Base
|
6
|
+
def write
|
7
|
+
openXMLPrefix = 'application/vnd.openxmlformats-';
|
8
|
+
wordMLPrefix = "#{openXMLPrefix}officedocument.wordprocessingml";
|
9
|
+
overrides = {
|
10
|
+
'/docProps/core.xml' => "#{openXMLPrefix}package.core-properties+xml",
|
11
|
+
'/docProps/app.xml' => "#{openXMLPrefix}officedocument.extended-properties+xml",
|
12
|
+
'/docProps/custom.xml' => "#{openXMLPrefix}officedocument.custom-properties+xml",
|
13
|
+
'/word/document.xml' => "#{wordMLPrefix}.document.main+xml",
|
14
|
+
'/word/styles.xml' => "#{wordMLPrefix}.styles+xml",
|
15
|
+
'/word/numbering.xml' => "#{wordMLPrefix}.numbering+xml",
|
16
|
+
'/word/settings.xml' => "#{wordMLPrefix}.settings+xml",
|
17
|
+
'/word/theme/theme1.xml' => "#{openXMLPrefix}officedocument.theme+xml",
|
18
|
+
'/word/webSettings.xml' => "#{wordMLPrefix}.webSettings+xml",
|
19
|
+
'/word/fontTable.xml' => "#{wordMLPrefix}.fontTable+xml"
|
20
|
+
}
|
21
|
+
@rubyword.content_types.each do |target|
|
22
|
+
overrides.merge!(target)
|
23
|
+
end
|
24
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
25
|
+
xml.Types(xmlns: 'http://schemas.openxmlformats.org/package/2006/content-types') do
|
26
|
+
xml.Default(Extension: 'rels', ContentType: "application/vnd.openxmlformats-package.relationships+xml")
|
27
|
+
xml.Default(Extension: 'xml', ContentType: 'application/xml')
|
28
|
+
xml.Default(Extension: 'jpg', ContentType: 'image/jpeg')
|
29
|
+
overrides.each do |part_name, content_type|
|
30
|
+
xml.Override(PartName: part_name, ContentType: content_type)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
builder.to_xml
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class DocPropsApp < Base
|
6
|
+
def write
|
7
|
+
infomartion = @rubyword.doc_info
|
8
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
9
|
+
xml.Properties(xmlns: 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties',
|
10
|
+
'xmlns:vt' => 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes') do
|
11
|
+
xml.Company(@rubyword.doc_info[:company])
|
12
|
+
xml.Manager(@rubyword.doc_info[:creator])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
builder.to_xml
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class DocPropsCore < Base
|
6
|
+
def write
|
7
|
+
xmlns = {
|
8
|
+
'xmlns:cp' => 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties',
|
9
|
+
'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
|
10
|
+
'xmlns:dcterms' => 'http://purl.org/dc/terms/',
|
11
|
+
'xmlns:dcmitype' => 'http://purl.org/dc/dcmitype/',
|
12
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
|
13
|
+
}
|
14
|
+
infomartion = @rubyword.doc_info
|
15
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
16
|
+
xml.send('cp:coreProperties', xmlns) do
|
17
|
+
xml.send('dc:title', infomartion[:title])
|
18
|
+
xml.send('dc:subject', infomartion[:subject])
|
19
|
+
xml.send('dc:creator', infomartion[:creator])
|
20
|
+
xml.send('cp:keywords', infomartion[:keywords])
|
21
|
+
xml.send('dc:description', infomartion[:description])
|
22
|
+
xml.send('cp:lastModifiedBy', 'rubyword')
|
23
|
+
xml.send('cp:category', infomartion[:category])
|
24
|
+
xml.send('dcterms:created', {'xsi:type' => 'dcterms:W3CDTF'}, Time.now.strftime('%Y-%m-%dT%H:%M:%SZ').to_s)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
builder.to_xml
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class DocPropsCustom < Base
|
6
|
+
def write
|
7
|
+
# 需要定制
|
8
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
9
|
+
xml.Properties(xmlns: 'http://schemas.openxmlformats.org/officeDocument/2006/custom-properties', 'xmlns:vt' => 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes')
|
10
|
+
end
|
11
|
+
builder.to_xml
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- encoding : utf-8 -*
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
class Part::Document < Part::Base
|
5
|
+
include ::Rubyword::Writer::Part::Toc
|
6
|
+
DOCUMENT_ATTR = {
|
7
|
+
'xmlns:ve' => "http://schemas.openxmlformats.org/markup-compatibility/2006",
|
8
|
+
'xmlns:o' => "urn:schemas-microsoft-com:office:office",
|
9
|
+
'xmlns:r' => "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
|
10
|
+
'xmlns:m' => "http://schemas.openxmlformats.org/officeDocument/2006/math",
|
11
|
+
'xmlns:v' => "urn:schemas-microsoft-com:vml",
|
12
|
+
'xmlns:wp' => "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing",
|
13
|
+
'xmlns:w10' => "urn:schemas-microsoft-com:office:word",
|
14
|
+
'xmlns:w' => "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
|
15
|
+
'xmlns:wne' => "http://schemas.microsoft.com/office/word/2006/wordml"
|
16
|
+
}
|
17
|
+
|
18
|
+
def write
|
19
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
20
|
+
xml.send('w:document', DOCUMENT_ATTR) {
|
21
|
+
xml.send('w:body') {
|
22
|
+
section_write(xml)
|
23
|
+
}
|
24
|
+
}
|
25
|
+
end
|
26
|
+
builder.to_xml
|
27
|
+
end
|
28
|
+
|
29
|
+
def section_write(xml)
|
30
|
+
@object_blocks = []
|
31
|
+
sections_count = @rubyword.sections.count
|
32
|
+
current_section = 0
|
33
|
+
# write TOC
|
34
|
+
toc_block = write_toc(@rubyword, xml)
|
35
|
+
@object_blocks.push(toc_block) if toc_block
|
36
|
+
@rubyword.sections.each do |section|
|
37
|
+
current_section = current_section + 1
|
38
|
+
# 遍历输出各对象 object 信息
|
39
|
+
section.objects.each{|object| @object_blocks << object.write(section, xml)}
|
40
|
+
if current_section == sections_count
|
41
|
+
@object_blocks << Style::Section.new(section, xml, @rubyword).write
|
42
|
+
else
|
43
|
+
p_block = xml.send('w:p') {
|
44
|
+
xml.send('w:pPr') {
|
45
|
+
@object_blocks << Style::Section.new(section, xml, @rubyword).write
|
46
|
+
}
|
47
|
+
}
|
48
|
+
@object_blocks << p_block
|
49
|
+
end
|
50
|
+
end
|
51
|
+
@object_blocks
|
52
|
+
end
|
53
|
+
|
54
|
+
end # end of class
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class Footer < Base
|
6
|
+
ATTRIBUTE = {
|
7
|
+
'xmlns:ve' => 'http://schemas.openxmlformats.org/markup-compatibility/2006',
|
8
|
+
'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
|
9
|
+
'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
|
10
|
+
'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
|
11
|
+
'xmlns:v' => 'urn:schemas-microsoft-com:vml',
|
12
|
+
'xmlns:wp' => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
|
13
|
+
'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
|
14
|
+
'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
|
15
|
+
'xmlns:wne' => 'http://schemas.microsoft.com/office/word/2006/wordml'
|
16
|
+
}
|
17
|
+
|
18
|
+
def write
|
19
|
+
footer = @rubyword.footer
|
20
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
21
|
+
xml.send('w:ftr', ATTRIBUTE) {
|
22
|
+
xml.p {
|
23
|
+
if footer[:text_align]
|
24
|
+
xml.send('w:pPr') {
|
25
|
+
xml.send('w:jc', 'w:val' => footer[:text_align])
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
nums_type = footer[:nums_type].to_s.downcase
|
30
|
+
if footer[:text].nil? || nums_type == 'roman' || nums_type == 'number'
|
31
|
+
text = 'PAGE'
|
32
|
+
text = 'PAGE \* ROMAN' if nums_type == 'roman'
|
33
|
+
xml.send('w:r') { xml.send('w:fldChar', {'w:fldCharType' => "begin"}) }
|
34
|
+
xml.send('w:r') { xml.send('w:instrText', {'w:space' => "preserve"}, text) }
|
35
|
+
xml.send('w:r') { xml.send('w:fldChar', {'w:fldCharType' => "separate"}) }
|
36
|
+
xml.send('w:r') { xml.send('w:fldChar', {'w:fldCharType' => "end"}) }
|
37
|
+
else
|
38
|
+
text = footer[:text]
|
39
|
+
xml.send('w:r') { xml.send('w:t', {'w:space' => "preserve"}, text) }
|
40
|
+
end
|
41
|
+
}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
builder.to_xml
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class Header < Base
|
6
|
+
ATTRIBUTE = {
|
7
|
+
'xmlns:ve' => 'http://schemas.openxmlformats.org/markup-compatibility/2006',
|
8
|
+
'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
|
9
|
+
'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
|
10
|
+
'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
|
11
|
+
'xmlns:v' => 'urn:schemas-microsoft-com:vml',
|
12
|
+
'xmlns:wp' => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
|
13
|
+
'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
|
14
|
+
'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
|
15
|
+
'xmlns:wne' => 'http://schemas.microsoft.com/office/word/2006/wordml'
|
16
|
+
}
|
17
|
+
|
18
|
+
def write
|
19
|
+
text_align = @rubyword.header[:text_align]
|
20
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
21
|
+
xml.send('w:hdr', ATTRIBUTE) {
|
22
|
+
xml.p {
|
23
|
+
if text_align
|
24
|
+
xml.send('w:pPr') {
|
25
|
+
xml.send('w:jc', 'w:val' => text_align)
|
26
|
+
}
|
27
|
+
end
|
28
|
+
xml.send('w:r') {
|
29
|
+
xml.send('w:t', {'xml:space' => "preserve"}, @rubyword.header[:text])
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}
|
33
|
+
end
|
34
|
+
builder.to_xml
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class Numbering < Base
|
6
|
+
def write
|
7
|
+
xmlns = {
|
8
|
+
'xmlns:ve' => 'http://schemas.openxmlformats.org/markup-compatibility/2006',
|
9
|
+
'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
|
10
|
+
'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
|
11
|
+
'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
|
12
|
+
'xmlns:v' => 'urn:schemas-microsoft-com:vml',
|
13
|
+
'xmlns:wp' => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
|
14
|
+
'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
|
15
|
+
'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
|
16
|
+
'xmlns:wne' => 'http://schemas.microsoft.com/office/word/2006/wordml'
|
17
|
+
}
|
18
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
19
|
+
xml.send('w:numbering', xmlns) {
|
20
|
+
xml.send('w:abstractNum', 'w:abstractNumId' => 3) {
|
21
|
+
xml.send('w:nsid', 'w:val' => '5E15211D')
|
22
|
+
xml.send('w:multiLevelType', 'w:val' => 'multilevel')
|
23
|
+
2.times.each do |index|
|
24
|
+
num = index + 1
|
25
|
+
left = num * 360
|
26
|
+
xml.send('w:lvl', 'w:ilvl' => index) {
|
27
|
+
xml.send('w:start', 'w:val' => 1)
|
28
|
+
xml.send('w:numFmt', 'w:val' => 'decimal')
|
29
|
+
xml.send('w:suff', 'w:val' => 'tab')
|
30
|
+
xml.send('w:lvlText', 'w:val' => "%#{num}.")
|
31
|
+
xml.send('w:pPr') {
|
32
|
+
xml.send('w:tabs') {
|
33
|
+
xml.send('w:tab', 'w:val' => 'num', 'w:pos' => 360)
|
34
|
+
}
|
35
|
+
xml.send('w:ind', 'w:left'=> left, 'w:hanging' => 360)
|
36
|
+
}
|
37
|
+
}
|
38
|
+
end
|
39
|
+
} # end of lvl style
|
40
|
+
|
41
|
+
xml.send('w:num', 'w:numId' => 3) {
|
42
|
+
xml.send('w:abstractNumId', 'w:val' => 3)
|
43
|
+
}
|
44
|
+
}
|
45
|
+
end
|
46
|
+
builder.to_xml
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class Rels < Base
|
6
|
+
def write
|
7
|
+
xmlRels = {
|
8
|
+
'docProps/core.xml' => 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties',
|
9
|
+
'docProps/app.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',
|
10
|
+
'docProps/custom.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties',
|
11
|
+
'word/document.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument'
|
12
|
+
}
|
13
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
14
|
+
xml.Relationships(xmlns: 'http://schemas.openxmlformats.org/package/2006/relationships') do
|
15
|
+
3.times.each do |num|
|
16
|
+
num = num + 1
|
17
|
+
xml.Relationship(Id: "rId#{num}", Type: xmlRels.values[num], Target: xmlRels.keys[num])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
builder.to_xml
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class RelsDocument < Base
|
6
|
+
def write
|
7
|
+
xmlRels = {
|
8
|
+
'styles.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles',
|
9
|
+
'numbering.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering',
|
10
|
+
'settings.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings',
|
11
|
+
'theme/theme1.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme',
|
12
|
+
'webSettings.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings',
|
13
|
+
'fontTable.xml' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable',
|
14
|
+
}
|
15
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
16
|
+
xml.Relationships(xmlns: 'http://schemas.openxmlformats.org/package/2006/relationships') do
|
17
|
+
xmlRels.keys.each_with_index do |rel_name, index|
|
18
|
+
id = index + 1
|
19
|
+
xml.Relationship(Id: "rId#{id}", Type: xmlRels[rel_name], Target: rel_name)
|
20
|
+
end
|
21
|
+
@rubyword.rels_documents.each do |attribute|
|
22
|
+
xml.Relationship(attribute)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
builder.to_xml
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class Settings < Base
|
6
|
+
def write
|
7
|
+
xmlns = {
|
8
|
+
'xmlns:o' => 'urn:schemas-microsoft-com:office:office',
|
9
|
+
'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
|
10
|
+
'xmlns:m' => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
|
11
|
+
'xmlns:v' => 'urn:schemas-microsoft-com:vml',
|
12
|
+
'xmlns:sl' => 'http://schemas.openxmlformats.org/schemaLibrary/2006/main',
|
13
|
+
'xmlns:w10' => 'urn:schemas-microsoft-com:office:word',
|
14
|
+
'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'
|
15
|
+
}
|
16
|
+
|
17
|
+
default_setting = {
|
18
|
+
'w:zoom' => { 'w:percent' => '100'},
|
19
|
+
'w:defaultTabStop' => {'w:val' => '708'},
|
20
|
+
'w:hyphenationZone' => {'w:val' => '425'},
|
21
|
+
'w:characterSpacingControl' => {'w:val' => 'doNotCompress'},
|
22
|
+
'w:themeFontLang' => {'w:val' => 'en-US'},
|
23
|
+
'w:decimalSymbol' => {'w:val' => '.'},
|
24
|
+
'w:listSeparator' => {'w:val' => ';'}
|
25
|
+
}
|
26
|
+
|
27
|
+
default_math = {
|
28
|
+
'm:mathPr' => {
|
29
|
+
'm:mathFont' => {'m:val' => 'Cambria Math'},
|
30
|
+
'm:brkBin' => {'m:val' => 'before'},
|
31
|
+
'm:brkBinSub' => {'m:val' => '--'},
|
32
|
+
'm:smallFrac' => {'m:val' => 'off'},
|
33
|
+
'm:dispDef' => '',
|
34
|
+
'm:lMargin' => {'m:val' => '0'},
|
35
|
+
'm:rMargin' => {'m:val' => '0'},
|
36
|
+
'm:defJc' => {'m:val' => 'centerGroup'},
|
37
|
+
'm:wrapIndent' => {'m:val' => '1440'},
|
38
|
+
'm:intLim' => {'m:val' => 'subSup'},
|
39
|
+
'm:naryLim' => {'m:val' => 'undOvr'}
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
default_scheme = {
|
44
|
+
'w:clrSchemeMapping' => {
|
45
|
+
'w:bg1' => 'light1',
|
46
|
+
'w:t1' => 'dark1',
|
47
|
+
'w:bg2' => 'light2',
|
48
|
+
'w:t2' => 'dark2',
|
49
|
+
'w:accent1' => 'accent1',
|
50
|
+
'w:accent2' => 'accent2',
|
51
|
+
'w:accent3' => 'accent3',
|
52
|
+
'w:accent4' => 'accent4',
|
53
|
+
'w:accent5' => 'accent5',
|
54
|
+
'w:accent6' => 'accent6',
|
55
|
+
'w:hyperlink' => 'hyperlink',
|
56
|
+
'w:followedHyperlink' => 'followedHyperlink'
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
61
|
+
xml.send('w:settings', xmlns) do
|
62
|
+
default_setting.each do |key, value|
|
63
|
+
xml.send(key, value)
|
64
|
+
end
|
65
|
+
|
66
|
+
# 需定制
|
67
|
+
xml.send('w:compat') {
|
68
|
+
xml.send('w:compatSetting', {
|
69
|
+
'w:name' => 'compatibilityMode',
|
70
|
+
'w:uri' => 'http://schemas.microsoft.com/office/word',
|
71
|
+
'w:val' => 12
|
72
|
+
})
|
73
|
+
}
|
74
|
+
|
75
|
+
default_math.each do |k, v|
|
76
|
+
xml.send(k) {
|
77
|
+
v.each do |sk, sv|
|
78
|
+
xml.send(sk, sv)
|
79
|
+
end
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
default_scheme.each do |k, v|
|
84
|
+
xml.send(k, v)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
builder.to_xml
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class Styles < Base
|
6
|
+
|
7
|
+
# font default setting
|
8
|
+
DEFAULT_FONT_NAME = 'Arial'
|
9
|
+
DEFAULT_FONT_SIZE = 10
|
10
|
+
DEFAULT_FONT_COLOR = '000000'
|
11
|
+
DEFAULT_FONT_CONTENT_TYPE = 'default'
|
12
|
+
|
13
|
+
def title_style
|
14
|
+
[
|
15
|
+
{'size' => 20, 'color' => '333333', 'bold' => true},
|
16
|
+
{'size' => 16, 'color' => '333333', 'bold' => true},
|
17
|
+
{'size' => 14, 'color' => '333333', 'bold' => true},
|
18
|
+
{'size' => 12, 'color' => '333333', 'bold' => true}
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
def write
|
23
|
+
attribute = {
|
24
|
+
'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
|
25
|
+
'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
|
26
|
+
}
|
27
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
28
|
+
xml.send('w:styles', attribute) {
|
29
|
+
default_setting(xml)
|
30
|
+
normal_style(xml)
|
31
|
+
footer_note_style(xml)
|
32
|
+
write_font_style(xml)
|
33
|
+
}
|
34
|
+
end
|
35
|
+
builder.to_xml
|
36
|
+
end
|
37
|
+
|
38
|
+
def default_setting(xml)
|
39
|
+
xml.send('w:docDefaults') {
|
40
|
+
xml.send('w:rPrDefault') {
|
41
|
+
xml.send('w:rPr') {
|
42
|
+
xml.send('w:rFonts', {'w:ascii'=>DEFAULT_FONT_NAME, 'w:hAnsi'=>DEFAULT_FONT_NAME, 'w:eastAsia'=>DEFAULT_FONT_NAME, 'w:cs'=>DEFAULT_FONT_NAME})
|
43
|
+
xml.send('w:sz', 'w:val' => DEFAULT_FONT_SIZE * 2 )
|
44
|
+
xml.send('w:szCs', 'w:val' => DEFAULT_FONT_SIZE * 2 )
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def normal_style(xml)
|
51
|
+
attribute = {
|
52
|
+
'w:type' => 'paragraph',
|
53
|
+
'w:default' => 1,
|
54
|
+
'w:styleId' => 'Normal'
|
55
|
+
}
|
56
|
+
xml.send('w:style', attribute) {
|
57
|
+
xml.send('w:name', 'w:val' => 'Normal')
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def footer_note_style(xml)
|
62
|
+
xml.send('w:style', {'w:type' => 'character', 'w:styleId' => 'FootnoteReference'}) {
|
63
|
+
xml.send('w:name', 'w:val' => 'Footnote Reference')
|
64
|
+
xml.send('w:semiHidden')
|
65
|
+
xml.send('w:unhideWhenUsed')
|
66
|
+
xml.send('w:rPr') {
|
67
|
+
xml.send('w:verAlign', 'w:val' => 'superscript')
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def write_font_style(xml)
|
73
|
+
title_style.each_with_index do |style, index|
|
74
|
+
index = index + 1
|
75
|
+
xml.send('w:style', {'w:type' => 'paragraph', 'w:styleId' => "Heading#{index}"}) {
|
76
|
+
xml.send('w:link', {'w:val' => "Heading#{index}Char"})
|
77
|
+
xml.send('w:name', {'w:val' => "heading #{index}"})
|
78
|
+
xml.send('w:rPr') {
|
79
|
+
xml.send('w:color', 'w:val' => style['color'])
|
80
|
+
xml.send('w:sz', 'w:val' => style['size'] * 2)
|
81
|
+
xml.send('w:szCs', 'w:val' => style['size'] * 2)
|
82
|
+
xml.send('w:b')
|
83
|
+
}
|
84
|
+
}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|