powerpoint 1.7 → 1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/lib/powerpoint.rb +2 -0
- data/lib/powerpoint/presentation.rb +10 -1
- data/lib/powerpoint/slide/intro.rb +4 -0
- data/lib/powerpoint/slide/pictorial.rb +1 -6
- data/lib/powerpoint/slide/picture_description.rb +63 -0
- data/lib/powerpoint/slide/text_picture_split.rb +56 -0
- data/lib/powerpoint/util.rb +6 -0
- data/lib/powerpoint/version.rb +1 -1
- data/lib/powerpoint/views/app.xml.erb +51 -0
- data/lib/powerpoint/views/picture_description_rels.xml.erb +5 -0
- data/lib/powerpoint/views/picture_description_slide.xml.erb +115 -0
- data/lib/powerpoint/views/text_picture_split_rel.xml.erb +5 -0
- data/lib/powerpoint/views/text_picture_split_slide.xml.erb +114 -0
- data/samples/pptx/sample.pptx +0 -0
- data/spec/test_spec.rb +4 -1
- metadata +25 -19
- data/template/docProps/app.xml +0 -2
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MGNjNGJmODJlNzI2YTFiYzEyMzVlZGYxZTJhMDVmMTAyY2M5NWY0MQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7a80c6b2960438a7bfd273568aee8700938e7fa0
|
4
|
+
data.tar.gz: 4f93cf34deaed1102e592d65913442fbeef606f4
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YzUxZjBmZDE0YTVhYTMxNjE1OGZlNjg0OGQ1ODhjZTlmM2EzMDk3N2U3MTYz
|
11
|
-
NGY2OGE0ZjRiMjYwNzI1N2EyNzI4NDNkNzA5NTliYjg1MThhYTA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MWJkZDI5OTdiYzc5YTBmYmQ4ZTM3NjhiZmJjODk2ODUxNzMwY2E5YTg5YmZi
|
14
|
-
MzlkMjY4ZWZlMmIzNDk0MTAzYTZiYWU1NTUyZmI4YzA4NjViNGMwMWU0MzYw
|
15
|
-
OGNkOThjNmY5OGJhNGUzODRjOTQ0OWVkZjY5ODI4ZDJmMmVmYjE=
|
6
|
+
metadata.gz: b755db84b862f3f3e8a1fa80ed0d76cbaea664c6b6cdda879ba39060b485c31463642854b5c19f64a4603a1e87babde2cbe7bd9b61025ad99653ceccf4bc897d
|
7
|
+
data.tar.gz: e930379e6409787cf768f3011456e60a8eb9382176fa985e04e7f43d0ace1d495a431f080f654dc54ddf8b37ee97c43a52489306e04348290f4488df580896ac
|
data/lib/powerpoint.rb
CHANGED
@@ -3,6 +3,8 @@ require 'powerpoint/util'
|
|
3
3
|
require 'powerpoint/slide/intro'
|
4
4
|
require 'powerpoint/slide/textual'
|
5
5
|
require 'powerpoint/slide/pictorial'
|
6
|
+
require 'powerpoint/slide/text_picture_split'
|
7
|
+
require 'powerpoint/slide/picture_description'
|
6
8
|
require 'powerpoint/compression'
|
7
9
|
require 'powerpoint/presentation'
|
8
10
|
|
@@ -30,6 +30,14 @@ module Powerpoint
|
|
30
30
|
@slides << Powerpoint::Slide::Pictorial.new(presentation: self, title: title, image_path: image_path, coords: coords)
|
31
31
|
end
|
32
32
|
|
33
|
+
def add_text_picture_slide(title, image_path, content = [])
|
34
|
+
@slides << Powerpoint::Slide::TextPicSplit.new(presentation: self, title: title, image_path: image_path, content: content)
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_picture_description_slide(title, image_path, content = [])
|
38
|
+
@slides << Powerpoint::Slide::DescriptionPic.new(presentation: self, title: title, image_path: image_path, content: content)
|
39
|
+
end
|
40
|
+
|
33
41
|
def save(path)
|
34
42
|
Dir.mktmpdir do |dir|
|
35
43
|
extract_path = "#{dir}/extract_#{Time.now.strftime("%Y-%m-%d-%H%M%S")}"
|
@@ -46,6 +54,7 @@ module Powerpoint
|
|
46
54
|
render_view('content_type.xml.erb', "#{extract_path}/[Content_Types].xml")
|
47
55
|
render_view('presentation.xml.rel.erb', "#{extract_path}/ppt/_rels/presentation.xml.rels")
|
48
56
|
render_view('presentation.xml.erb', "#{extract_path}/ppt/presentation.xml")
|
57
|
+
render_view('app.xml.erb', "#{extract_path}/docProps/app.xml")
|
49
58
|
|
50
59
|
# Save slides
|
51
60
|
slides.each_with_index do |slide, index|
|
@@ -61,7 +70,7 @@ module Powerpoint
|
|
61
70
|
end
|
62
71
|
|
63
72
|
def file_types
|
64
|
-
slides.
|
73
|
+
slides.map {|slide| slide.file_type if slide.respond_to? :file_type }.compact.uniq
|
65
74
|
end
|
66
75
|
end
|
67
76
|
end
|
@@ -18,7 +18,7 @@ module Powerpoint
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def save(extract_path, index)
|
21
|
-
copy_media(extract_path)
|
21
|
+
copy_media(extract_path, @image_path)
|
22
22
|
save_rel_xml(extract_path, index)
|
23
23
|
save_slide_xml(extract_path, index)
|
24
24
|
end
|
@@ -40,11 +40,6 @@ module Powerpoint
|
|
40
40
|
end
|
41
41
|
private :default_coords
|
42
42
|
|
43
|
-
def copy_media(extract_path)
|
44
|
-
FileUtils.copy_file(@image_path, "#{extract_path}/ppt/media/#{@image_name}")
|
45
|
-
end
|
46
|
-
private :copy_media
|
47
|
-
|
48
43
|
def save_rel_xml(extract_path, index)
|
49
44
|
render_view('pictorial_rel.xml.erb', "#{extract_path}/ppt/slides/_rels/slide#{index}.xml.rels")
|
50
45
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'zip/filesystem'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'fastimage'
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
module Powerpoint
|
7
|
+
module Slide
|
8
|
+
class DescriptionPic
|
9
|
+
include Powerpoint::Util
|
10
|
+
|
11
|
+
attr_reader :title, :content, :image_name, :image_path, :coords
|
12
|
+
|
13
|
+
def initialize(options={})
|
14
|
+
require_arguments [:presentation, :title, :image_path, :content], options
|
15
|
+
options.each {|k, v| instance_variable_set("@#{k}", v)}
|
16
|
+
@coords = default_coords
|
17
|
+
@image_name = File.basename(@image_path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def save(extract_path, index)
|
21
|
+
copy_media(extract_path, @image_path)
|
22
|
+
save_rel_xml(extract_path, index)
|
23
|
+
save_slide_xml(extract_path, index)
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_type
|
27
|
+
File.extname(image_name).gsub('.', '')
|
28
|
+
end
|
29
|
+
|
30
|
+
def default_coords
|
31
|
+
slide_width = pixle_to_pt(720)
|
32
|
+
default_width = pixle_to_pt(550)
|
33
|
+
default_height = pixle_to_pt(300)
|
34
|
+
|
35
|
+
return {} unless dimensions = FastImage.size(image_path)
|
36
|
+
image_width, image_height = dimensions.map {|d| pixle_to_pt(d)}
|
37
|
+
|
38
|
+
capped_width = [default_width, image_width].min
|
39
|
+
w_ratio = capped_width / image_width.to_f
|
40
|
+
|
41
|
+
capped_height = [default_height, image_height].min
|
42
|
+
h_ratio = capped_height / image_height.to_f
|
43
|
+
|
44
|
+
ratio = [w_ratio, h_ratio].min
|
45
|
+
|
46
|
+
new_width = (image_width.to_f * ratio).round
|
47
|
+
new_height = (image_height.to_f * ratio).round
|
48
|
+
{x: (slide_width / 2) - (new_width/2), y: pixle_to_pt(60), cx: new_width, cy: new_height}
|
49
|
+
end
|
50
|
+
private :default_coords
|
51
|
+
|
52
|
+
def save_rel_xml(extract_path, index)
|
53
|
+
render_view('picture_description_rels.xml.erb', "#{extract_path}/ppt/slides/_rels/slide#{index}.xml.rels")
|
54
|
+
end
|
55
|
+
private :save_rel_xml
|
56
|
+
|
57
|
+
def save_slide_xml(extract_path, index)
|
58
|
+
render_view('picture_description_slide.xml.erb', "#{extract_path}/ppt/slides/slide#{index}.xml")
|
59
|
+
end
|
60
|
+
private :save_slide_xml
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'zip/filesystem'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'fastimage'
|
4
|
+
require 'erb'
|
5
|
+
|
6
|
+
module Powerpoint
|
7
|
+
module Slide
|
8
|
+
class TextPicSplit
|
9
|
+
include Powerpoint::Util
|
10
|
+
|
11
|
+
attr_reader :title, :content, :image_name, :image_path, :coords
|
12
|
+
|
13
|
+
def initialize(options={})
|
14
|
+
require_arguments [:presentation, :title, :image_path, :content], options
|
15
|
+
options.each {|k, v| instance_variable_set("@#{k}", v)}
|
16
|
+
@coords = default_coords
|
17
|
+
@image_name = File.basename(@image_path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def save(extract_path, index)
|
21
|
+
copy_media(extract_path, @image_path)
|
22
|
+
save_rel_xml(extract_path, index)
|
23
|
+
save_slide_xml(extract_path, index)
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_type
|
27
|
+
File.extname(image_name).gsub('.', '')
|
28
|
+
end
|
29
|
+
|
30
|
+
def default_coords
|
31
|
+
start_x = pixle_to_pt(360)
|
32
|
+
default_width = pixle_to_pt(300)
|
33
|
+
|
34
|
+
return {} unless dimensions = FastImage.size(image_path)
|
35
|
+
image_width, image_height = dimensions.map {|d| pixle_to_pt(d)}
|
36
|
+
new_width = default_width < image_width ? default_width : image_width
|
37
|
+
ratio = new_width / image_width.to_f
|
38
|
+
new_height = (image_height.to_f * ratio).round
|
39
|
+
{x: start_x, y: pixle_to_pt(120), cx: new_width, cy: new_height}
|
40
|
+
end
|
41
|
+
private :default_coords
|
42
|
+
|
43
|
+
def save_rel_xml(extract_path, index)
|
44
|
+
render_view('text_picture_split_rel.xml.erb', "#{extract_path}/ppt/slides/_rels/slide#{index}.xml.rels")
|
45
|
+
end
|
46
|
+
private :save_rel_xml
|
47
|
+
|
48
|
+
def save_slide_xml(extract_path, index)
|
49
|
+
render_view('text_picture_split_slide.xml.erb', "#{extract_path}/ppt/slides/slide#{index}.xml")
|
50
|
+
end
|
51
|
+
private :save_slide_xml
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
end
|
data/lib/powerpoint/util.rb
CHANGED
@@ -20,5 +20,11 @@ module Powerpoint
|
|
20
20
|
def require_arguments(required_argements, argements)
|
21
21
|
raise ArgumentError unless required_argements.all? {|required_key| argements.keys.include? required_key}
|
22
22
|
end
|
23
|
+
|
24
|
+
def copy_media(extract_path, image_path)
|
25
|
+
image_name = File.basename(image_path)
|
26
|
+
dest_path = "#{extract_path}/ppt/media/#{image_name}"
|
27
|
+
FileUtils.copy_file(image_path, dest_path) unless File.exist?(dest_path)
|
28
|
+
end
|
23
29
|
end
|
24
30
|
end
|
data/lib/powerpoint/version.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"
|
3
|
+
xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
|
4
|
+
<TotalTime>0</TotalTime>
|
5
|
+
<Words>43</Words>
|
6
|
+
<Application>Microsoft Macintosh PowerPoint</Application>
|
7
|
+
<PresentationFormat>On-screen Show (4:3)</PresentationFormat>
|
8
|
+
<Paragraphs>15</Paragraphs>
|
9
|
+
<Slides><%= slides.length %></Slides>
|
10
|
+
<Notes>0</Notes>
|
11
|
+
<HiddenSlides>0</HiddenSlides>
|
12
|
+
<MMClips>0</MMClips>
|
13
|
+
<ScaleCrop>false</ScaleCrop>
|
14
|
+
<HeadingPairs>
|
15
|
+
<vt:vector size="6" baseType="variant">
|
16
|
+
<vt:variant>
|
17
|
+
<vt:lpstr>Fonts Used</vt:lpstr>
|
18
|
+
</vt:variant>
|
19
|
+
<vt:variant>
|
20
|
+
<vt:i4>2</vt:i4>
|
21
|
+
</vt:variant>
|
22
|
+
<vt:variant>
|
23
|
+
<vt:lpstr>Theme</vt:lpstr>
|
24
|
+
</vt:variant>
|
25
|
+
<vt:variant>
|
26
|
+
<vt:i4>1</vt:i4>
|
27
|
+
</vt:variant>
|
28
|
+
<vt:variant>
|
29
|
+
<vt:lpstr>Slide Titles</vt:lpstr>
|
30
|
+
</vt:variant>
|
31
|
+
<vt:variant>
|
32
|
+
<vt:i4><%= slides.length %></vt:i4>
|
33
|
+
</vt:variant>
|
34
|
+
</vt:vector>
|
35
|
+
</HeadingPairs>
|
36
|
+
<TitlesOfParts>
|
37
|
+
<vt:vector size="<%= slides.length + 3 %>" baseType="lpstr">
|
38
|
+
<vt:lpstr>Arial</vt:lpstr>
|
39
|
+
<vt:lpstr>Calibri</vt:lpstr>
|
40
|
+
<vt:lpstr>Office Theme</vt:lpstr>
|
41
|
+
<% slides.each do |slide| %>
|
42
|
+
<vt:lpstr><%= slide.title %></vt:lpstr>
|
43
|
+
<% end %>
|
44
|
+
</vt:vector>
|
45
|
+
</TitlesOfParts>
|
46
|
+
<Company></Company>
|
47
|
+
<LinksUpToDate>false</LinksUpToDate>
|
48
|
+
<SharedDoc>false</SharedDoc>
|
49
|
+
<HyperlinksChanged>false</HyperlinksChanged>
|
50
|
+
<AppVersion>15.0000</AppVersion>
|
51
|
+
</Properties>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
3
|
+
<Relationship Id="rId1" Target="../slideLayouts/slideLayout9.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout"/>
|
4
|
+
<Relationship Id="rId2" Target="../media/<%= image_name %>" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"/>
|
5
|
+
</Relationships>
|
@@ -0,0 +1,115 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
|
3
|
+
<p:cSld>
|
4
|
+
<p:spTree>
|
5
|
+
<p:nvGrpSpPr>
|
6
|
+
<p:cNvPr id="1" name=""/>
|
7
|
+
<p:cNvGrpSpPr/>
|
8
|
+
<p:nvPr/>
|
9
|
+
</p:nvGrpSpPr>
|
10
|
+
<p:grpSpPr>
|
11
|
+
<a:xfrm>
|
12
|
+
<a:off x="0" y="0"/>
|
13
|
+
<a:ext cx="0" cy="0"/>
|
14
|
+
<a:chOff x="0" y="0"/>
|
15
|
+
<a:chExt cx="0" cy="0"/>
|
16
|
+
</a:xfrm>
|
17
|
+
</p:grpSpPr>
|
18
|
+
<p:sp>
|
19
|
+
<p:nvSpPr>
|
20
|
+
<p:cNvPr id="2" name="Title 1"/>
|
21
|
+
<p:cNvSpPr>
|
22
|
+
<a:spLocks noGrp="1"/>
|
23
|
+
</p:cNvSpPr>
|
24
|
+
<p:nvPr>
|
25
|
+
<p:ph type="title"/>
|
26
|
+
</p:nvPr>
|
27
|
+
</p:nvSpPr>
|
28
|
+
<p:spPr/>
|
29
|
+
<p:txBody>
|
30
|
+
<a:bodyPr/>
|
31
|
+
<a:lstStyle/>
|
32
|
+
<a:p>
|
33
|
+
<a:r>
|
34
|
+
<a:rPr lang="en-US" dirty="0" smtClean="0"/>
|
35
|
+
<a:t><%= title %></a:t>
|
36
|
+
</a:r>
|
37
|
+
<a:endParaRPr lang="en-US" dirty="0"/>
|
38
|
+
</a:p>
|
39
|
+
</p:txBody>
|
40
|
+
</p:sp>
|
41
|
+
<p:pic>
|
42
|
+
<p:nvPicPr>
|
43
|
+
<p:cNvPr id="5" name="Picture Placeholder 4"/>
|
44
|
+
<p:cNvPicPr>
|
45
|
+
<a:picLocks noGrp="1" noChangeAspect="1"/>
|
46
|
+
</p:cNvPicPr>
|
47
|
+
<p:nvPr>
|
48
|
+
<p:ph type="pic" idx="1"/>
|
49
|
+
</p:nvPr>
|
50
|
+
</p:nvPicPr>
|
51
|
+
<p:blipFill>
|
52
|
+
<a:blip r:embed="rId2">
|
53
|
+
<a:extLst>
|
54
|
+
<a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
|
55
|
+
<a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/>
|
56
|
+
</a:ext>
|
57
|
+
</a:extLst>
|
58
|
+
</a:blip>
|
59
|
+
<a:stretch>
|
60
|
+
<a:fillRect/>
|
61
|
+
</a:stretch>
|
62
|
+
</p:blipFill>
|
63
|
+
<% if coords.any? %>
|
64
|
+
<p:spPr>
|
65
|
+
<a:xfrm>
|
66
|
+
<a:off x="<%= coords[:x].to_s %>" y="<%= coords[:y].to_s %>"/>
|
67
|
+
<a:ext cx="<%= coords[:cx].to_s %>" cy="<%= coords[:cy].to_s %>"/>
|
68
|
+
</a:xfrm>
|
69
|
+
<a:prstGeom prst="rect">
|
70
|
+
<a:avLst/>
|
71
|
+
</a:prstGeom>
|
72
|
+
</p:spPr>
|
73
|
+
<% else %>
|
74
|
+
<p:spPr/>
|
75
|
+
<% end %>
|
76
|
+
</p:pic>
|
77
|
+
<p:sp>
|
78
|
+
<p:nvSpPr>
|
79
|
+
<p:cNvPr id="4" name="Text Placeholder 4"/>
|
80
|
+
<p:cNvSpPr>
|
81
|
+
<a:spLocks noGrp="1"/>
|
82
|
+
</p:cNvSpPr>
|
83
|
+
<p:nvPr>
|
84
|
+
<p:ph type="body" sz="half" idx="2"/>
|
85
|
+
</p:nvPr>
|
86
|
+
</p:nvSpPr>
|
87
|
+
<p:spPr/>
|
88
|
+
<p:txBody>
|
89
|
+
<a:bodyPr/>
|
90
|
+
<a:lstStyle/>
|
91
|
+
<% content.each_with_index do |c, index| %>
|
92
|
+
<a:p>
|
93
|
+
<a:r>
|
94
|
+
<a:rPr lang="en-US" dirty="0" smtClean="0"/>
|
95
|
+
<a:t><%= c %></a:t>
|
96
|
+
</a:r>
|
97
|
+
<% if content.length == (index + 1) %>
|
98
|
+
<a:endParaRPr lang="en-US"/>
|
99
|
+
<% end %>
|
100
|
+
</a:p>
|
101
|
+
<% end %>
|
102
|
+
</p:txBody>
|
103
|
+
</p:sp>
|
104
|
+
|
105
|
+
</p:spTree>
|
106
|
+
<p:extLst>
|
107
|
+
<p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}">
|
108
|
+
<p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1435759726"/>
|
109
|
+
</p:ext>
|
110
|
+
</p:extLst>
|
111
|
+
</p:cSld>
|
112
|
+
<p:clrMapOvr>
|
113
|
+
<a:masterClrMapping/>
|
114
|
+
</p:clrMapOvr>
|
115
|
+
</p:sld>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
3
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout4.xml" />
|
4
|
+
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="../media/<%= image_name %>" />
|
5
|
+
</Relationships>
|
@@ -0,0 +1,114 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
|
3
|
+
<p:cSld>
|
4
|
+
<p:spTree>
|
5
|
+
<p:nvGrpSpPr>
|
6
|
+
<p:cNvPr id="1" name=""/>
|
7
|
+
<p:cNvGrpSpPr/>
|
8
|
+
<p:nvPr/>
|
9
|
+
</p:nvGrpSpPr>
|
10
|
+
<p:grpSpPr>
|
11
|
+
<a:xfrm>
|
12
|
+
<a:off x="0" y="0"/>
|
13
|
+
<a:ext cx="0" cy="0"/>
|
14
|
+
<a:chOff x="0" y="0"/>
|
15
|
+
<a:chExt cx="0" cy="0"/>
|
16
|
+
</a:xfrm>
|
17
|
+
</p:grpSpPr>
|
18
|
+
<p:sp>
|
19
|
+
<p:nvSpPr>
|
20
|
+
<p:cNvPr id="2" name="Title 1"/>
|
21
|
+
<p:cNvSpPr>
|
22
|
+
<a:spLocks noGrp="1"/>
|
23
|
+
</p:cNvSpPr>
|
24
|
+
<p:nvPr>
|
25
|
+
<p:ph type="title"/>
|
26
|
+
</p:nvPr>
|
27
|
+
</p:nvSpPr>
|
28
|
+
<p:spPr/>
|
29
|
+
<p:txBody>
|
30
|
+
<a:bodyPr/>
|
31
|
+
<a:lstStyle/>
|
32
|
+
<a:p>
|
33
|
+
<a:r>
|
34
|
+
<a:rPr lang="en-US" dirty="0" smtClean="0"/>
|
35
|
+
<a:t><%= title %></a:t>
|
36
|
+
</a:r>
|
37
|
+
<a:endParaRPr lang="en-US" dirty="0"/>
|
38
|
+
</a:p>
|
39
|
+
</p:txBody>
|
40
|
+
</p:sp>
|
41
|
+
<p:sp>
|
42
|
+
<p:nvSpPr>
|
43
|
+
<p:cNvPr id="3" name="Content Placeholder 2"/>
|
44
|
+
<p:cNvSpPr>
|
45
|
+
<a:spLocks noGrp="1"/>
|
46
|
+
</p:cNvSpPr>
|
47
|
+
<p:nvPr>
|
48
|
+
<p:ph sz="half" idx="1"/>
|
49
|
+
</p:nvPr>
|
50
|
+
</p:nvSpPr>
|
51
|
+
<p:spPr/>
|
52
|
+
<p:txBody>
|
53
|
+
<a:bodyPr/>
|
54
|
+
<a:lstStyle/>
|
55
|
+
<% content.each_with_index do |c, index| %>
|
56
|
+
<a:p>
|
57
|
+
<a:r>
|
58
|
+
<a:rPr lang="en-US" dirty="0" smtClean="0"/>
|
59
|
+
<a:t><%= c %></a:t>
|
60
|
+
</a:r>
|
61
|
+
<% if content.length == (index + 1) %>
|
62
|
+
<a:endParaRPr lang="en-US"/>
|
63
|
+
<% end %>
|
64
|
+
</a:p>
|
65
|
+
<% end %>
|
66
|
+
</p:txBody>
|
67
|
+
</p:sp>
|
68
|
+
<p:pic>
|
69
|
+
<p:nvPicPr>
|
70
|
+
<p:cNvPr id="4" name="Content Placeholder 3"/>
|
71
|
+
<p:cNvPicPr>
|
72
|
+
<a:picLocks noGrp="1" noChangeAspect="1"/>
|
73
|
+
</p:cNvPicPr>
|
74
|
+
<p:nvPr>
|
75
|
+
<p:ph sz="half" idx="2"/>
|
76
|
+
</p:nvPr>
|
77
|
+
</p:nvPicPr>
|
78
|
+
<p:blipFill>
|
79
|
+
<a:blip r:embed="rId2">
|
80
|
+
<a:extLst>
|
81
|
+
<a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
|
82
|
+
<a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/>
|
83
|
+
</a:ext>
|
84
|
+
</a:extLst>
|
85
|
+
</a:blip>
|
86
|
+
<a:stretch>
|
87
|
+
<a:fillRect/>
|
88
|
+
</a:stretch>
|
89
|
+
</p:blipFill>
|
90
|
+
<% if coords.any? %>
|
91
|
+
<p:spPr>
|
92
|
+
<a:xfrm>
|
93
|
+
<a:off x="<%= coords[:x].to_s %>" y="<%= coords[:y].to_s %>"/>
|
94
|
+
<a:ext cx="<%= coords[:cx].to_s %>" cy="<%= coords[:cy].to_s %>"/>
|
95
|
+
</a:xfrm>
|
96
|
+
<a:prstGeom prst="rect">
|
97
|
+
<a:avLst/>
|
98
|
+
</a:prstGeom>
|
99
|
+
</p:spPr>
|
100
|
+
<% else %>
|
101
|
+
<p:spPr/>
|
102
|
+
<% end %>
|
103
|
+
</p:pic>
|
104
|
+
</p:spTree>
|
105
|
+
<p:extLst>
|
106
|
+
<p:ext uri="{BB962C8B-B14F-4D97-AF65-F5344CB8AC3E}">
|
107
|
+
<p14:creationId xmlns:p14="http://schemas.microsoft.com/office/powerpoint/2010/main" val="1435759726"/>
|
108
|
+
</p:ext>
|
109
|
+
</p:extLst>
|
110
|
+
</p:cSld>
|
111
|
+
<p:clrMapOvr>
|
112
|
+
<a:masterClrMapping/>
|
113
|
+
</p:clrMapOvr>
|
114
|
+
</p:sld>
|
data/samples/pptx/sample.pptx
CHANGED
Binary file
|
data/spec/test_spec.rb
CHANGED
@@ -6,8 +6,11 @@ describe 'Powerpoint parsing a sample PPTX file' do
|
|
6
6
|
@deck.add_intro 'Bicycle Of the Mind', 'created by Steve Jobs'
|
7
7
|
@deck.add_textual_slide 'Why Mac?', ['Its cool!', 'Its light!']
|
8
8
|
@deck.add_textual_slide 'Why Iphone?', ['Its fast!', 'Its cheap!']
|
9
|
-
@deck.add_pictorial_slide 'JPG Logo', 'samples/images/
|
9
|
+
@deck.add_pictorial_slide 'JPG Logo', 'samples/images/sample_png.png'
|
10
|
+
@deck.add_text_picture_slide('Text Pic Split', 'samples/images/sample_png.png', content = ['Here is a string', 'here is another'])
|
10
11
|
@deck.add_pictorial_slide 'PNG Logo', 'samples/images/sample_png.png'
|
12
|
+
@deck.add_picture_description_slide('Pic Desc', 'samples/images/sample_png.png', content = ['Here is a string', 'here is another'])
|
13
|
+
@deck.add_picture_description_slide('JPG Logo', 'samples/images/sample_jpg.jpg', content = ['descriptions'])
|
11
14
|
@deck.add_pictorial_slide 'GIF Logo', 'samples/images/sample_gif.gif', {x: 124200, y: 3356451, cx: 2895600, cy: 1013460}
|
12
15
|
@deck.add_textual_slide 'Why Android?', ['Its great!', 'Its sweet!']
|
13
16
|
@deck.save 'samples/pptx/sample.pptx' # Examine the PPTX file
|
metadata
CHANGED
@@ -1,97 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: powerpoint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.8'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- pythonicrubyist
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 2.13.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 2.13.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rubyzip
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - ~>
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '1'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - ~>
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: fastimage
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - ~>
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '1'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - ~>
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '1'
|
97
97
|
description: A Ruby gem that can create a PowerPoint presentation.
|
@@ -101,8 +101,8 @@ executables: []
|
|
101
101
|
extensions: []
|
102
102
|
extra_rdoc_files: []
|
103
103
|
files:
|
104
|
-
- .codeclimate.yml
|
105
|
-
- .gitignore
|
104
|
+
- ".codeclimate.yml"
|
105
|
+
- ".gitignore"
|
106
106
|
- Gemfile
|
107
107
|
- LICENSE.txt
|
108
108
|
- README.rdoc
|
@@ -112,15 +112,22 @@ files:
|
|
112
112
|
- lib/powerpoint/presentation.rb
|
113
113
|
- lib/powerpoint/slide/intro.rb
|
114
114
|
- lib/powerpoint/slide/pictorial.rb
|
115
|
+
- lib/powerpoint/slide/picture_description.rb
|
116
|
+
- lib/powerpoint/slide/text_picture_split.rb
|
115
117
|
- lib/powerpoint/slide/textual.rb
|
116
118
|
- lib/powerpoint/util.rb
|
117
119
|
- lib/powerpoint/version.rb
|
120
|
+
- lib/powerpoint/views/app.xml.erb
|
118
121
|
- lib/powerpoint/views/content_type.xml.erb
|
119
122
|
- lib/powerpoint/views/intro_slide.xml.erb
|
120
123
|
- lib/powerpoint/views/pictorial_rel.xml.erb
|
121
124
|
- lib/powerpoint/views/pictorial_slide.xml.erb
|
125
|
+
- lib/powerpoint/views/picture_description_rels.xml.erb
|
126
|
+
- lib/powerpoint/views/picture_description_slide.xml.erb
|
122
127
|
- lib/powerpoint/views/presentation.xml.erb
|
123
128
|
- lib/powerpoint/views/presentation.xml.rel.erb
|
129
|
+
- lib/powerpoint/views/text_picture_split_rel.xml.erb
|
130
|
+
- lib/powerpoint/views/text_picture_split_slide.xml.erb
|
124
131
|
- lib/powerpoint/views/textual_rel.xml.erb
|
125
132
|
- lib/powerpoint/views/textual_slide.xml.erb
|
126
133
|
- powerpoint.gemspec
|
@@ -130,7 +137,6 @@ files:
|
|
130
137
|
- samples/pptx/sample.pptx
|
131
138
|
- spec/test_spec.rb
|
132
139
|
- template/_rels/.rels
|
133
|
-
- template/docProps/app.xml
|
134
140
|
- template/docProps/core.xml
|
135
141
|
- template/ppt/_rels/.keep
|
136
142
|
- template/ppt/media/.keep
|
@@ -173,12 +179,12 @@ require_paths:
|
|
173
179
|
- lib
|
174
180
|
required_ruby_version: !ruby/object:Gem::Requirement
|
175
181
|
requirements:
|
176
|
-
- -
|
182
|
+
- - ">="
|
177
183
|
- !ruby/object:Gem::Version
|
178
184
|
version: 1.9.2
|
179
185
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
186
|
requirements:
|
181
|
-
- -
|
187
|
+
- - ">="
|
182
188
|
- !ruby/object:Gem::Version
|
183
189
|
version: '0'
|
184
190
|
requirements: []
|
data/template/docProps/app.xml
DELETED
@@ -1,2 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
-
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"><TotalTime>0</TotalTime><Words>43</Words><Application>Microsoft Macintosh PowerPoint</Application><PresentationFormat>On-screen Show (4:3)</PresentationFormat><Paragraphs>15</Paragraphs><Slides>8</Slides><Notes>0</Notes><HiddenSlides>0</HiddenSlides><MMClips>0</MMClips><ScaleCrop>false</ScaleCrop><HeadingPairs><vt:vector size="6" baseType="variant"><vt:variant><vt:lpstr>Fonts Used</vt:lpstr></vt:variant><vt:variant><vt:i4>2</vt:i4></vt:variant><vt:variant><vt:lpstr>Theme</vt:lpstr></vt:variant><vt:variant><vt:i4>1</vt:i4></vt:variant><vt:variant><vt:lpstr>Slide Titles</vt:lpstr></vt:variant><vt:variant><vt:i4>8</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts><vt:vector size="11" baseType="lpstr"><vt:lpstr>Arial</vt:lpstr><vt:lpstr>Calibri</vt:lpstr><vt:lpstr>Office Theme</vt:lpstr><vt:lpstr>Bicycle Of the Mind</vt:lpstr><vt:lpstr>Why Mac?</vt:lpstr><vt:lpstr>Why Iphone?</vt:lpstr><vt:lpstr>JPG Logo</vt:lpstr><vt:lpstr>PNG Logo</vt:lpstr><vt:lpstr>GIF Logo</vt:lpstr><vt:lpstr>SVG Logo</vt:lpstr><vt:lpstr>Why Android?</vt:lpstr></vt:vector></TitlesOfParts><Company></Company><LinksUpToDate>false</LinksUpToDate><SharedDoc>false</SharedDoc><HyperlinksChanged>false</HyperlinksChanged><AppVersion>15.0000</AppVersion></Properties>
|