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 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, in a very simple, yet powerful and intuitive, way.
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,9 @@
1
+ require 'powerpointer'
2
+
3
+ pack = PowerPointer::PresentationPackage.new
4
+ pres = pack.get_presentation
5
+
6
+ pres.add_slide
7
+
8
+ pack.verbose = true
9
+ pack.export_xml "powerpoint.pptx"
@@ -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,3 @@
1
+ module PowerPointer
2
+ XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
3
+ 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
@@ -1,3 +1,3 @@
1
1
  module PowerPointer
2
- VERSION = "0.0.0"
2
+ VERSION = "0.0.1"
3
3
  end
data/lib/powerpointer.rb CHANGED
@@ -1,5 +1,14 @@
1
- class PowerPointer
2
- def self.test
3
- puts "Hello world"
4
- end
5
- end
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.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-24 00:00:00.000000000 Z
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/powerpointer/pp.rb
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.28
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
@@ -1,2 +0,0 @@
1
- module PowerPointer
2
- end