powerpointer 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +5 -1
- data/lib/example.rb +9 -0
- data/lib/powerpointer/content_types/default.rb +22 -0
- data/lib/powerpointer/content_types/override.rb +25 -0
- data/lib/powerpointer/content_types.rb +26 -0
- data/lib/powerpointer/export_file.rb +33 -0
- data/lib/powerpointer/globals.rb +3 -0
- data/lib/powerpointer/presentation.rb +62 -0
- data/lib/powerpointer/presentation_package.rb +103 -0
- data/lib/powerpointer/relationships.rb +36 -0
- data/lib/powerpointer/slide.rb +36 -0
- data/lib/powerpointer/version.rb +1 -1
- data/lib/powerpointer.rb +14 -5
- metadata +30 -5
- data/lib/powerpointer/pp.rb +0 -2
data/README.md
CHANGED
@@ -7,4 +7,8 @@ PowerPointer is an easy to use ruby library allowing you to create .pptx files f
|
|
7
7
|
* To provide full support for the features of .pptx files.
|
8
8
|
* To provide two levels of abstraction:
|
9
9
|
1. A set of low-level classes that export directly to .pptx files.
|
10
|
-
2. A high-level set of classes that encapsulate the low-level classes
|
10
|
+
2. A high-level set of classes that encapsulate the low-level classes in a very simple, yet powerful and intuitive, way.
|
11
|
+
|
12
|
+
## Contributing
|
13
|
+
|
14
|
+
At this point, PowerPointer is at such an early stage that having more people would hurt the project more than it would help. However as soon as the basic code structure is finished, all contributions are welcome!
|
data/lib/example.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module PowerPointer
|
2
|
+
class ContentTypes
|
3
|
+
class Default
|
4
|
+
def initialize(extension, contentType)
|
5
|
+
@extension = extension
|
6
|
+
@contentType = contentType
|
7
|
+
end
|
8
|
+
|
9
|
+
def getExtension
|
10
|
+
@extension
|
11
|
+
end
|
12
|
+
|
13
|
+
def getContentType
|
14
|
+
@contentType
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_xml
|
18
|
+
"<Default Extension=\"#{@extension}\" ContentType=\"#{@contentType}\" />"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module PowerPointer
|
2
|
+
class ContentTypes
|
3
|
+
class Override
|
4
|
+
def initialize(partName, contentType)
|
5
|
+
@partName = partName
|
6
|
+
if @partName[0] != "/"
|
7
|
+
@partName = "/" + @partName
|
8
|
+
end
|
9
|
+
@contentType = contentType
|
10
|
+
end
|
11
|
+
|
12
|
+
def getPartName
|
13
|
+
@partName
|
14
|
+
end
|
15
|
+
|
16
|
+
def getContentType
|
17
|
+
@contentType
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_xml
|
21
|
+
"<Override PartName=\"#{@partName}\" ContentType=\"#{@contentType}\" />"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module PowerPointer
|
2
|
+
class ContentTypes
|
3
|
+
def initialize
|
4
|
+
@contentTypes = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def add_content_type(ct)
|
8
|
+
if ct.respond_to?(:to_xml)
|
9
|
+
@contentTypes << ct
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def export_xml(folder, package)
|
14
|
+
# Export me
|
15
|
+
export = ExportFile.new(folder, "[Content_Types].xml")
|
16
|
+
export << "<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">"
|
17
|
+
@contentTypes.each do |contentType|
|
18
|
+
export << contentType.to_xml
|
19
|
+
end
|
20
|
+
export << "</Types>"
|
21
|
+
package.add export
|
22
|
+
|
23
|
+
# Content Types is a hardcoded file. No need to add references.
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module PowerPointer
|
2
|
+
class ExportFile
|
3
|
+
def initialize(path, filename)
|
4
|
+
@path = path
|
5
|
+
@filename = filename
|
6
|
+
@content = ""
|
7
|
+
end
|
8
|
+
|
9
|
+
def <<(content)
|
10
|
+
@content << content
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_content
|
14
|
+
@content
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_path
|
18
|
+
@path
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_filename
|
22
|
+
@filename
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_full_path (leading_slash = false)
|
26
|
+
if leading_slash
|
27
|
+
return "/" + @path + @filename
|
28
|
+
else
|
29
|
+
return @path + @filename
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module PowerPointer
|
2
|
+
class Presentation
|
3
|
+
def initialize
|
4
|
+
@slides = []
|
5
|
+
@slideMasters = []
|
6
|
+
@noteMasters = []
|
7
|
+
@handoutMasters = []
|
8
|
+
@relationshipId = "rId_presentation"
|
9
|
+
|
10
|
+
@filename = "presentation.xml"
|
11
|
+
|
12
|
+
@relationships = Relationships.new @filename
|
13
|
+
|
14
|
+
@notesSize = [913607, 913607]
|
15
|
+
@slideSize = [10080625, 7559675]
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_slide
|
19
|
+
s = Slide.new(@slides.count + 1)
|
20
|
+
@slides << s
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_relationships
|
24
|
+
@relationships
|
25
|
+
end
|
26
|
+
|
27
|
+
def export_xml(folder, package)
|
28
|
+
me_folder = folder + "ppt/"
|
29
|
+
|
30
|
+
# Export me
|
31
|
+
export = ExportFile.new(me_folder, @filename)
|
32
|
+
export << XML_HEADER
|
33
|
+
export << "<p:presentation xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">"
|
34
|
+
|
35
|
+
# Export slide masters
|
36
|
+
export << "<p:sldMasterIdLst>"
|
37
|
+
export << "</p:sldMasterIdLst>"
|
38
|
+
|
39
|
+
# Export slide list
|
40
|
+
export << "<p:sldIdLst>"
|
41
|
+
@slides.each do |slide|
|
42
|
+
slide.export_xml(export.get_path, self, package)
|
43
|
+
export << "<p:sldId id=\"#{slide.get_id}\" r:id=\"#{slide.get_relationship_id}\" />"
|
44
|
+
end
|
45
|
+
export << "</p:sldIdLst>"
|
46
|
+
|
47
|
+
# Export sizes
|
48
|
+
export << "<p:sldSz cx=\"#{@slideSize[0]}\" cy=\"#{@slideSize[1]}\" />"
|
49
|
+
export << "<p:notesSz cx=\"#{@notesSize[0]}\" cy=\"#{@notesSize[1]}\" />"
|
50
|
+
export << "</p:presentation>"
|
51
|
+
package.add export
|
52
|
+
|
53
|
+
# Add references to me
|
54
|
+
package.get_relationships.add(@relationshipId, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", export.get_full_path)
|
55
|
+
c = ContentTypes::Override.new(export.get_full_path, "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml")
|
56
|
+
package.add_content_type(c)
|
57
|
+
|
58
|
+
# Export relationships
|
59
|
+
@relationships.export_xml(export.get_path, package)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
module PowerPointer
|
5
|
+
class PresentationPackage
|
6
|
+
def initialize
|
7
|
+
@presentation = Presentation.new
|
8
|
+
@contentTypes = ContentTypes.new
|
9
|
+
@relationships = Relationships.new("")
|
10
|
+
|
11
|
+
@exportFiles = []
|
12
|
+
|
13
|
+
@verbose = false
|
14
|
+
end
|
15
|
+
|
16
|
+
def export_xml output
|
17
|
+
rootFolder = ""
|
18
|
+
|
19
|
+
vputs ""
|
20
|
+
vputs "Preparing..."
|
21
|
+
vputs ""
|
22
|
+
|
23
|
+
# 1. Prepare presentation (Adds relationships and content types)
|
24
|
+
@presentation.export_xml(rootFolder, self)
|
25
|
+
|
26
|
+
# 2. Prepare relationships (Adds content types)
|
27
|
+
@relationships.export_xml(rootFolder, self)
|
28
|
+
|
29
|
+
# 3. Prepare content types
|
30
|
+
@contentTypes.export_xml(rootFolder, self)
|
31
|
+
|
32
|
+
# Create tmp directory
|
33
|
+
Dir.mktmpdir do |tmp_folder|
|
34
|
+
vputs "Created temporary directory: #{tmp_folder}"
|
35
|
+
|
36
|
+
# Do the export
|
37
|
+
@exportFiles.each do |file|
|
38
|
+
vputs "Exporting #{file.get_full_path}"
|
39
|
+
|
40
|
+
# Create the path if it doesn't exist
|
41
|
+
path = "#{tmp_folder}/#{file.get_path}"
|
42
|
+
FileUtils::mkdir_p path
|
43
|
+
|
44
|
+
# Write the file
|
45
|
+
File.open("#{path}/#{file.get_filename}", "w") do |f|
|
46
|
+
f << file.get_content
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
vputs ""
|
51
|
+
vputs "Export complete."
|
52
|
+
vputs ""
|
53
|
+
vputs "Zipping..."
|
54
|
+
vputs ""
|
55
|
+
|
56
|
+
# Init zip file
|
57
|
+
Zip::File.open(output, Zip::File::CREATE) do |zip|
|
58
|
+
# Add each file to zip
|
59
|
+
@exportFiles.each do |file|
|
60
|
+
zip.add(file.get_full_path, File.join(tmp_folder, file.get_full_path))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
vputs "Zipping complete."
|
65
|
+
vputs ""
|
66
|
+
|
67
|
+
# tmp directory is erased
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_content_type(ct)
|
72
|
+
@contentTypes.add_content_type ct
|
73
|
+
end
|
74
|
+
|
75
|
+
def verbose=(verbose)
|
76
|
+
@verbose = verbose
|
77
|
+
end
|
78
|
+
|
79
|
+
def verbose
|
80
|
+
@verbose
|
81
|
+
end
|
82
|
+
|
83
|
+
def get_relationships
|
84
|
+
@relationships
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_presentation
|
88
|
+
@presentation
|
89
|
+
end
|
90
|
+
|
91
|
+
def add file
|
92
|
+
@exportFiles << file
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def vputs s
|
98
|
+
if verbose
|
99
|
+
puts s
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module PowerPointer
|
2
|
+
class Relationships
|
3
|
+
def initialize(filename)
|
4
|
+
@filename = filename
|
5
|
+
@relationships = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def add(id, type, target)
|
9
|
+
relationship = {
|
10
|
+
:id => id,
|
11
|
+
:type => type,
|
12
|
+
:target => target
|
13
|
+
}
|
14
|
+
@relationships << relationship
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_filename
|
18
|
+
@filename
|
19
|
+
end
|
20
|
+
|
21
|
+
def export_xml(folder, package)
|
22
|
+
# Export me
|
23
|
+
export = ExportFile.new(folder + "_rels/", @filename + ".rels")
|
24
|
+
export << XML_HEADER.dup
|
25
|
+
export << "<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">"
|
26
|
+
@relationships.each do |relationship|
|
27
|
+
export << "<Relationship Id=\"#{relationship[:id]}\" Type=\"#{relationship[:type]}\" Target=\"#{relationship[:target]}\" />"
|
28
|
+
end
|
29
|
+
export << "</Relationships>"
|
30
|
+
package.add export
|
31
|
+
|
32
|
+
# Add references to me
|
33
|
+
package.add_content_type ContentTypes::Override.new(export.get_full_path, "application/vnd.openxmlformats-package.relationships+xml")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module PowerPointer
|
2
|
+
class Slide
|
3
|
+
def initialize(slideId)
|
4
|
+
@slideId = slideId
|
5
|
+
@relationshipId = "rId_slide" + slideId.to_s
|
6
|
+
|
7
|
+
@filename = "slide#{@slideId}.xml"
|
8
|
+
@relationships = Relationships.new @filename
|
9
|
+
end
|
10
|
+
|
11
|
+
def export_xml(folder, presentation, package)
|
12
|
+
# Export me
|
13
|
+
export = ExportFile.new(folder + "slides/", @filename)
|
14
|
+
export << XML_HEADER
|
15
|
+
export << "<p:sld xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">"
|
16
|
+
export << "</p:sld>"
|
17
|
+
package.add export
|
18
|
+
|
19
|
+
# Add references to me
|
20
|
+
presentation.get_relationships.add(@relationshipId, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide", "slides/#{export.get_filename}")
|
21
|
+
c = ContentTypes::Override.new(export.get_full_path, "application/vnd.openxmlformats-officedocument.presentationml.slide+xml")
|
22
|
+
package.add_content_type(c)
|
23
|
+
|
24
|
+
# Export relationships
|
25
|
+
@relationships.export_xml(export.get_path, package)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_id
|
29
|
+
@slideId
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_relationship_id
|
33
|
+
@relationshipId
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/powerpointer/version.rb
CHANGED
data/lib/powerpointer.rb
CHANGED
@@ -1,5 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'zip'
|
4
|
+
|
5
|
+
require 'powerpointer/version'
|
6
|
+
require 'powerpointer/globals'
|
7
|
+
require 'powerpointer/export_file'
|
8
|
+
require 'powerpointer/relationships'
|
9
|
+
require 'powerpointer/content_types'
|
10
|
+
require 'powerpointer/slide'
|
11
|
+
require 'powerpointer/presentation'
|
12
|
+
require 'powerpointer/presentation_package'
|
13
|
+
require 'powerpointer/content_types/default'
|
14
|
+
require 'powerpointer/content_types/override'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: powerpointer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-11-
|
13
|
-
dependencies:
|
12
|
+
date: 2014-11-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rubyzip
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.0
|
14
30
|
description: PowerPointer is an easy to use ruby library allowing you to create .pptx
|
15
31
|
files from scratch.
|
16
32
|
email:
|
@@ -19,7 +35,16 @@ executables: []
|
|
19
35
|
extensions: []
|
20
36
|
extra_rdoc_files: []
|
21
37
|
files:
|
22
|
-
- lib/
|
38
|
+
- lib/example.rb
|
39
|
+
- lib/powerpointer/content_types/default.rb
|
40
|
+
- lib/powerpointer/content_types/override.rb
|
41
|
+
- lib/powerpointer/content_types.rb
|
42
|
+
- lib/powerpointer/export_file.rb
|
43
|
+
- lib/powerpointer/globals.rb
|
44
|
+
- lib/powerpointer/presentation.rb
|
45
|
+
- lib/powerpointer/presentation_package.rb
|
46
|
+
- lib/powerpointer/relationships.rb
|
47
|
+
- lib/powerpointer/slide.rb
|
23
48
|
- lib/powerpointer/version.rb
|
24
49
|
- lib/powerpointer.rb
|
25
50
|
- LICENSE
|
@@ -44,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
44
69
|
version: 1.3.6
|
45
70
|
requirements: []
|
46
71
|
rubyforge_project:
|
47
|
-
rubygems_version: 1.8.
|
72
|
+
rubygems_version: 1.8.29
|
48
73
|
signing_key:
|
49
74
|
specification_version: 3
|
50
75
|
summary: PowerPointer is an easy to use ruby library allowing you to create .pptx
|
data/lib/powerpointer/pp.rb
DELETED