pptx 0.0.1

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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +57 -0
  3. data/lib/pptx.rb +24 -0
  4. data/lib/pptx/base.pptx/[Content_Types].xml +30 -0
  5. data/lib/pptx/base.pptx/docProps/app.xml +41 -0
  6. data/lib/pptx/base.pptx/docProps/core.xml +13 -0
  7. data/lib/pptx/base.pptx/docProps/thumbnail.jpeg +0 -0
  8. data/lib/pptx/base.pptx/ppt/_rels/presentation.xml.rels +9 -0
  9. data/lib/pptx/base.pptx/ppt/presProps.xml +11 -0
  10. data/lib/pptx/base.pptx/ppt/presentation.xml +105 -0
  11. data/lib/pptx/base.pptx/ppt/printerSettings/printerSettings1.bin +0 -0
  12. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels +4 -0
  13. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels +4 -0
  14. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels +4 -0
  15. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels +4 -0
  16. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels +4 -0
  17. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels +4 -0
  18. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels +4 -0
  19. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels +4 -0
  20. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels +4 -0
  21. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels +4 -0
  22. data/lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels +4 -0
  23. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout1.xml +240 -0
  24. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout10.xml +168 -0
  25. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout11.xml +178 -0
  26. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout2.xml +168 -0
  27. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout3.xml +244 -0
  28. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout4.xml +286 -0
  29. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout5.xml +420 -0
  30. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout6.xml +116 -0
  31. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout7.xml +93 -0
  32. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout8.xml +275 -0
  33. data/lib/pptx/base.pptx/ppt/slideLayouts/slideLayout9.xml +251 -0
  34. data/lib/pptx/base.pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels +15 -0
  35. data/lib/pptx/base.pptx/ppt/slideMasters/slideMaster1.xml +508 -0
  36. data/lib/pptx/base.pptx/ppt/tableStyles.xml +2 -0
  37. data/lib/pptx/base.pptx/ppt/theme/theme1.xml +318 -0
  38. data/lib/pptx/base.pptx/ppt/viewProps.xml +32 -0
  39. data/lib/pptx/generate_sample.rb +57 -0
  40. data/lib/pptx/opc.rb +14 -0
  41. data/lib/pptx/opc/base_part.rb +36 -0
  42. data/lib/pptx/opc/binary_part.rb +20 -0
  43. data/lib/pptx/opc/content_types.rb +18 -0
  44. data/lib/pptx/opc/file_part.rb +28 -0
  45. data/lib/pptx/opc/package.rb +115 -0
  46. data/lib/pptx/opc/package_streamer.rb +48 -0
  47. data/lib/pptx/opc/part.rb +27 -0
  48. data/lib/pptx/opc/relationships.rb +32 -0
  49. data/lib/pptx/opc/s3_object_part.rb +25 -0
  50. data/lib/pptx/presentation.rb +33 -0
  51. data/lib/pptx/shapes.rb +10 -0
  52. data/lib/pptx/shapes/filled_rectangle.rb +32 -0
  53. data/lib/pptx/shapes/picture.rb +40 -0
  54. data/lib/pptx/shapes/shape.rb +46 -0
  55. data/lib/pptx/shapes/slide_number.rb +39 -0
  56. data/lib/pptx/shapes/textbox.rb +95 -0
  57. data/lib/pptx/slide.rb +79 -0
  58. data/lib/pptx/version.rb +3 -0
  59. metadata +156 -0
@@ -0,0 +1,39 @@
1
+ module PPTX
2
+ module Shapes
3
+ class SlideNumber < Textbox
4
+ def initialize(transform, slidenum, formatting={})
5
+ super(transform, slidenum.to_s, formatting)
6
+ end
7
+
8
+ def build_node
9
+ node = super
10
+
11
+ placeholder_xml = """
12
+ <p:ph xmlns:p='#{Presentation::NS}' sz='quarter' type='sldNum'/>"""
13
+ placeholder = Nokogiri::XML::DocumentFragment.parse(placeholder_xml)
14
+ node.xpath('./p:sp/p:nvSpPr/p:nvPr', p:Presentation::NS).first.add_child placeholder
15
+
16
+ node
17
+ end
18
+
19
+ def build_paragraph(slidenum)
20
+ paragraph_xml = """
21
+ <a:p xmlns:a='http://schemas.openxmlformats.org/drawingml/2006/main'>
22
+ <a:pPr/>
23
+ <a:fld id='REPLACE ME' type='slidenum'>
24
+ <a:rPr lang='en-US' smtClean='0'/>
25
+ <a:t>REPLACE ME</a:t>
26
+ </a:fld>
27
+ <a:endParaRPr lang='en-US'/>
28
+ </a:p>
29
+ """
30
+
31
+ Nokogiri::XML::DocumentFragment.parse(paragraph_xml).tap do |node|
32
+ node.xpath('./a:p/a:fld/a:t', a: DRAWING_NS).first.content = slidenum
33
+ field_id = "{#{SecureRandom.uuid}}"
34
+ node.xpath('./a:p/a:fld', a: DRAWING_NS).first['id'] = field_id
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,95 @@
1
+ module PPTX
2
+ module Shapes
3
+ class Textbox < Shape
4
+ def initialize(transform, content, formatting={})
5
+ super(transform)
6
+ @content = content
7
+ @formatting = formatting
8
+ end
9
+
10
+ def base_xml
11
+ # TODO replace cNvPr descr, id and name
12
+ """
13
+ <p:sp xmlns:a='http://schemas.openxmlformats.org/drawingml/2006/main'
14
+ xmlns:p='http://schemas.openxmlformats.org/presentationml/2006/main'>
15
+ <p:nvSpPr>
16
+ <p:cNvPr id='2' name='TextBox'/>
17
+ <p:cNvSpPr txBox='1'/>
18
+ <p:nvPr/>
19
+ </p:nvSpPr>
20
+ <p:spPr>
21
+ </p:spPr>
22
+ <p:txBody>
23
+ <a:bodyPr rtlCol='0' wrap='square' vertOverflow='clip'>
24
+ <a:spAutoFit/>
25
+ </a:bodyPr>
26
+ <a:lstStyle/>
27
+ </p:txBody>
28
+ </p:sp>
29
+ """
30
+ end
31
+
32
+ def build_node
33
+ txbody = base_node.xpath('./p:sp/p:txBody', p:Presentation::NS).first
34
+
35
+ @content.split("\n").each do |line|
36
+ paragraph = build_paragraph line
37
+ set_formatting(paragraph, @formatting)
38
+ txbody.add_child paragraph
39
+ end
40
+
41
+ # txBody always needs a paragraph
42
+ unless txbody.xpath('./a:p', a: DRAWING_NS).size >= 1
43
+ txbody.add_child empty_paragraph
44
+ end
45
+
46
+ base_node
47
+ end
48
+
49
+ def build_paragraph(line)
50
+ paragraph_xml = """
51
+ <a:p xmlns:a='http://schemas.openxmlformats.org/drawingml/2006/main'>
52
+ <a:pPr/>
53
+ <a:r>
54
+ <a:rPr lang='en-US' smtClean='0'/>
55
+ <a:t></a:t>
56
+ </a:r>
57
+ <a:endParaRPr lang='en-US'/>
58
+ </a:p>
59
+ """
60
+
61
+ Nokogiri::XML::DocumentFragment.parse(paragraph_xml).tap do |node|
62
+ tn = node.xpath('./a:p/a:r/a:t', a: DRAWING_NS).first
63
+ tn.content = line
64
+ end
65
+ end
66
+
67
+ def empty_paragraph
68
+ paragraph_xml = """
69
+ <a:p xmlns:a='http://schemas.openxmlformats.org/drawingml/2006/main'></a:p>
70
+ """
71
+ Nokogiri::XML::DocumentFragment.parse(paragraph_xml)
72
+ end
73
+
74
+ # Set paragraph and text run properties on a paragraph.
75
+ # Node must already have pPr and rPr elements.
76
+ def set_formatting(paragraph, formatting)
77
+ formatting = formatting.dup
78
+ color = formatting.delete(:color)
79
+ align = formatting.delete(:align)
80
+
81
+ if align
82
+ p_properties = paragraph.xpath('./a:p/a:pPr', a: DRAWING_NS).first
83
+ p_properties['algn'] = align
84
+ end
85
+
86
+ run_properties = paragraph.xpath('.//a:rPr', a: DRAWING_NS).first
87
+ formatting.each do |key, val|
88
+ run_properties[key] = val
89
+ end
90
+
91
+ run_properties.add_child build_solid_fill(color) if color
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,79 @@
1
+ require 'securerandom'
2
+
3
+ module PPTX
4
+ class Slide < OPC::Part
5
+ def initialize(package)
6
+ part_name = package.next_part_with_prefix('ppt/slides/slide', '.xml')
7
+ super(package, part_name)
8
+ relationships.add('../slideLayouts/slideLayout7.xml', RELTYPE_SLIDE_LAYOUT)
9
+ end
10
+
11
+ def base_xml
12
+ '''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
13
+ <p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
14
+ xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main"
15
+ xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
16
+ <p:cSld>
17
+ <p:spTree>
18
+ <p:nvGrpSpPr>
19
+ <p:cNvPr id="1" name=""/>
20
+ <p:cNvGrpSpPr/>
21
+ <p:nvPr/>
22
+ </p:nvGrpSpPr>
23
+ <p:grpSpPr/>
24
+ </p:spTree>
25
+ </p:cSld>
26
+ <p:clrMapOvr>
27
+ <a:masterClrMapping/>
28
+ </p:clrMapOvr>
29
+ </p:sld>
30
+ '''
31
+ end
32
+
33
+ def content_type
34
+ 'application/vnd.openxmlformats-officedocument.presentationml.slide+xml'
35
+ end
36
+
37
+ # Add rectangle filled with given color.
38
+ # Give color in RGB hex format (e.g. '558ed5')
39
+ def add_filled_rectangle(transform, color)
40
+ shape = Shapes::FilledRectangle.new(transform, color)
41
+ shape_tree_xml.add_child(shape.build_node)
42
+ end
43
+
44
+ def add_picture(transform, name, image)
45
+ # TODO do something with name or remove
46
+ rid = relationships.add(relative_part_name(image.part_name), PPTX::RELTYPE_IMAGE)
47
+
48
+ shape = Shapes::Picture.new(transform, rid)
49
+ shape_tree_xml.add_child(shape.build_node)
50
+ end
51
+
52
+ # Add a text box at the given position with the given dimensions
53
+ #
54
+ # Pass distance values in EMUs (use PPTX::CM)
55
+ # Formatting values a are mostly raw OOXML Text Run Properties (rPr) element
56
+ # attributes. Examples:
57
+ # * sz: font size (use PPTX::POINT)
58
+ # * b: 1 for bold
59
+ # * i: 1 for italic
60
+ # There are two custom properties:
61
+ # * color: aabbcc (hex RGB color)
62
+ # * align: ctr|dist|just|justLow|l|r|thaiDist (ST_TextAlignType (Text Alignment Types))
63
+ def add_textbox(transform, content, formatting={})
64
+ shape = Shapes::Textbox.new(transform, content, formatting)
65
+ shape_tree_xml.add_child(shape.build_node)
66
+ end
67
+
68
+ # Add a slide number that is recognized by Powerpoint as such and automatically updated
69
+ # See textbox for formatting.
70
+ def add_slide_number(transform, number, formatting={})
71
+ shape = Shapes::SlideNumber.new(transform, number, formatting)
72
+ shape_tree_xml.add_child(shape.build_node)
73
+ end
74
+
75
+ def shape_tree_xml
76
+ @shape_tree_xml ||= doc.xpath('/p:sld/p:cSld/p:spTree').first
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,3 @@
1
+ module PPTX
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pptx
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - nuvyu
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubyzip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: zipline
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.9
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.9
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.2'
69
+ description: Write PPTX files with slides, textboxes, and images.
70
+ email: contact@nuvyu.com
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - README.md
76
+ - lib/pptx.rb
77
+ - lib/pptx/base.pptx/[Content_Types].xml
78
+ - lib/pptx/base.pptx/docProps/app.xml
79
+ - lib/pptx/base.pptx/docProps/core.xml
80
+ - lib/pptx/base.pptx/docProps/thumbnail.jpeg
81
+ - lib/pptx/base.pptx/ppt/_rels/presentation.xml.rels
82
+ - lib/pptx/base.pptx/ppt/presProps.xml
83
+ - lib/pptx/base.pptx/ppt/presentation.xml
84
+ - lib/pptx/base.pptx/ppt/printerSettings/printerSettings1.bin
85
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout1.xml.rels
86
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout10.xml.rels
87
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout11.xml.rels
88
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout2.xml.rels
89
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout3.xml.rels
90
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout4.xml.rels
91
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout5.xml.rels
92
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout6.xml.rels
93
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout7.xml.rels
94
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout8.xml.rels
95
+ - lib/pptx/base.pptx/ppt/slideLayouts/_rels/slideLayout9.xml.rels
96
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout1.xml
97
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout10.xml
98
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout11.xml
99
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout2.xml
100
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout3.xml
101
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout4.xml
102
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout5.xml
103
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout6.xml
104
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout7.xml
105
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout8.xml
106
+ - lib/pptx/base.pptx/ppt/slideLayouts/slideLayout9.xml
107
+ - lib/pptx/base.pptx/ppt/slideMasters/_rels/slideMaster1.xml.rels
108
+ - lib/pptx/base.pptx/ppt/slideMasters/slideMaster1.xml
109
+ - lib/pptx/base.pptx/ppt/tableStyles.xml
110
+ - lib/pptx/base.pptx/ppt/theme/theme1.xml
111
+ - lib/pptx/base.pptx/ppt/viewProps.xml
112
+ - lib/pptx/generate_sample.rb
113
+ - lib/pptx/opc.rb
114
+ - lib/pptx/opc/base_part.rb
115
+ - lib/pptx/opc/binary_part.rb
116
+ - lib/pptx/opc/content_types.rb
117
+ - lib/pptx/opc/file_part.rb
118
+ - lib/pptx/opc/package.rb
119
+ - lib/pptx/opc/package_streamer.rb
120
+ - lib/pptx/opc/part.rb
121
+ - lib/pptx/opc/relationships.rb
122
+ - lib/pptx/opc/s3_object_part.rb
123
+ - lib/pptx/presentation.rb
124
+ - lib/pptx/shapes.rb
125
+ - lib/pptx/shapes/filled_rectangle.rb
126
+ - lib/pptx/shapes/picture.rb
127
+ - lib/pptx/shapes/shape.rb
128
+ - lib/pptx/shapes/slide_number.rb
129
+ - lib/pptx/shapes/textbox.rb
130
+ - lib/pptx/slide.rb
131
+ - lib/pptx/version.rb
132
+ homepage: https://github.com/nuvyu/ruby-pptx
133
+ licenses:
134
+ - MIT
135
+ metadata: {}
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project:
152
+ rubygems_version: 2.4.5
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: PPTX
156
+ test_files: []