keynote-client 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c4744a2aa2fb814a90ac556a0713e2eb774c9f2
4
- data.tar.gz: 10a2e69dce31aede9cb96c6c340250a7dce40c87
3
+ metadata.gz: 199382e0930b6b78573c3991566bd4486beef77a
4
+ data.tar.gz: 8cf1d0be8b19e9725a9e4612c28e90d5dff92260
5
5
  SHA512:
6
- metadata.gz: 7885c96f7b91d6d5e89ff5d135d05c1745c8a911834eb10843725e7a74925cc947200cfd341fc025aeb3e97e40edc86ff815ee9c10f8a4c12076bdfd8678c938
7
- data.tar.gz: b053a819f7e65aced80c6bf0ecac85c4db65606938b258e38ba3f2c947d9389519dd7449d0357cddf7142c26ff0de8fe6ad148ea95eddda925c674c20abf2964
6
+ metadata.gz: 57f4e0440b614ae1faca604b5e1b0be7ade18cdcfabaabf21cdc0f60295a96bc6ed31f6a299f7ec45bd94ab5e66389a3e7545da97fc7d8de6e2282916a199915
7
+ data.tar.gz: 06552907f222c935ff961cf44eb2051826b6fe7f0ac993fe10128e3943fc44a627e4170f9aff686e7aff8c7ab681a76d2f30298b73211d6a3eb724156056d97f
data/README.md CHANGED
@@ -4,16 +4,17 @@
4
4
 
5
5
  Currently this project is in alpha stage. It supports these features.
6
6
 
7
- - Creating a new document with specified theme
8
- - Appending a new slide with specified master slide
9
- - Saving a document
7
+ - Create a new document with specified theme
8
+ - Append a new slide with specified master slide
9
+ - Update slides
10
+ - Save a document
10
11
 
11
12
  ## Install
12
13
 
13
14
  Add this line to your application's Gemfile:
14
15
 
15
16
  ```sh
16
- gem keynote-client'
17
+ gem 'keynote-client'
17
18
  ```
18
19
 
19
20
  And then execute:
@@ -35,69 +36,31 @@ $ gem install keynote-client
35
36
  require 'keynote-client'
36
37
  inlude Keynote
37
38
 
38
- themes = Theme.find_by(:all)
39
- # => [#<Keynote::Theme:0x007fd9ec821748 @id="Application/Black/Standard", @name="ブラック">,
40
- # #<Keynote::Theme:0x007fd9ec821518 @id="Application/White/Standard", @name="ホワイト">,
41
- # #<Keynote::Theme:0x007fd9ec820fa0 @id="Application/Gradient/Standard", @name="グラデーション">,
42
- # #<Keynote::Theme:0x007fd9ec813e40 @id="Application/Parchment/Standard", @name="羊皮紙">,
43
- # ...
44
- # #<Keynote::Theme:0x007fd9ec813d78 @id="User/AC506922-367E-4300-AF77-8040B9CFA2B7", @name="cookpad">]
39
+ # Fetch all themes
40
+ themes = Theme.all
45
41
 
42
+ # Fetch theme specified name
46
43
  theme = Theme.find_by(name: 'ブラック').first
47
- # #<Keynote::Theme:0x007fd9ec821748 @id="Application/Black/Standard", @name="ブラック">,
48
44
 
45
+ # Create a new document with theme
49
46
  doc = Document.create(theme: theme, file_path: '/path/to/foo.key')
50
- # => #<Keynote::Document:0x007fbe03224228
51
- # @auto_loop=false,
52
- # @auto_play=false,
53
- # @auto_restart=false,
54
- # @current_slide=nil,
55
- # @document_theme=#<Keynote::Theme:0x007fbe031f6e68 @id="Application/Black/Standard", @name="ブラック">,
56
- # @height=768,
57
- # @maximum_idle_duration=15,
58
- # @name="名称未設定",
59
- # @slide_numbers_showing=false,
60
- # @slides=[],
61
- # @width=1024>
62
47
 
48
+ # Save a document at file_path
63
49
  doc.save
64
- # => true
65
-
66
- doc.slides
67
- # => [#<Keynote::Slide:0x007fa17c2bcb98
68
- # @base_slide=#<Keynote::MasterSlide:0x007fa17c2bcbe8 @name="タイトル & サブタイトル">,
69
- # @body_showing=true,
70
- # @default_body_item=nil,
71
- # @default_title_item=nil,
72
- # @presenter_notes="",
73
- # @skipped=false,
74
- # @slide_number=1,
75
- # @title_showing=true,
76
- # @transition_properties={"transitionDelay"=>0.5, "automaticTransition"=>false, "transitionEffect"=>"no transition effect", "transitionDuration"=>1}>]
77
-
78
- doc.append_slide("空白")
79
- # => [#<Keynote::Slide:0x007fa17c2bcb98
80
- # @base_slide=#<Keynote::MasterSlide:0x007fa17c2bcbe8 @name="タイトル & サブタイトル">,
81
- # @body_showing=true,
82
- # @default_body_item=nil,
83
- # @default_title_item=nil,
84
- # @presenter_notes="",
85
- # @skipped=false,
86
- # @slide_number=1,
87
- # @title_showing=true,
88
- # @transition_properties={"transitionDelay"=>0.5, "automaticTransition"=>false, "transitionEffect"=>"no transition effect", "transitionDuration"=>1}>,
89
- # #<Keynote::Slide:0x007fa17a8bbc08
90
- # @base_slide=#<Keynote::MasterSlide:0x007fa17a8bbc58 @name="空白">,
91
- # @body_showing=false,
92
- # @default_body_item=nil,
93
- # @default_title_item=nil,
94
- # @presenter_notes="",
95
- # @skipped=false,
96
- # @slide_number=2,
97
- # @title_showing=false,
98
- # @transition_properties={"transitionDelay"=>0.5, "automaticTransition"=>false, "transitionEffect"=>"no transition effect", "transitionDuration"=>1}>]
99
- ```
100
50
 
51
+ # Initialize a new slide
52
+ slide = Slide.new("タイトル & 箇条書き", title: 'Pen', body: ["This is a pen", "Is this a pen?"].join("\n"))
53
+
54
+ # Append slides
55
+ doc.slides << slide
56
+
57
+ # Fetch last slide
58
+ slide = doc.slides.last
59
+
60
+ # Update a slide
61
+ slide.title = "About pen"
62
+ slide.body = "Hello, pen."
63
+ ```
101
64
 
102
65
  ## Supported OS
103
66
  - OSX Mavericks
@@ -1,5 +1,6 @@
1
1
  require 'unindent'
2
2
  require 'keynote/theme'
3
+ require 'keynote/slide_array'
3
4
  require 'keynote/util'
4
5
 
5
6
  module Keynote
@@ -78,8 +79,8 @@ module Keynote
78
79
  skipped: slide.skipped(),
79
80
  slide_number: slide.slideNumber(),
80
81
  title_showing: slide.titleShowing(),
81
- default_body_item: slide.defaultBodyItem(),
82
- default_title_item: slide.defaultTitleItem(),
82
+ body: slide.defaultBodyItem.objectText(),
83
+ title: slide.defaultTitleItem.objectText(),
83
84
  presenter_notes: slide.presenterNotes(),
84
85
  transition_properties: slide.transitionProperties()
85
86
  })
@@ -87,59 +88,24 @@ module Keynote
87
88
  JSON.stringify(results);
88
89
  APPLE
89
90
 
90
- @slides = results.map do |result|
91
- Slide.new(
92
- base_slide: MasterSlide.new(result["base_slide"]),
93
- body_showing: result["body_showing"],
94
- skipped: result["skipped"],
95
- slide_number: result["slide_number"],
96
- title_showing: result["title_showing"],
97
- default_body_item: result["default_body_item"],
98
- default_title_item: result["default_title_item"],
99
- presenter_notes: result["presenter_notes"],
100
- transition_properties: result["transition_properties"],
101
- )
102
- end
103
- end
104
-
105
- # arguments is not implemented
106
- # It will support title, body, ... or so on.
107
- def append_slide(master_slide_name, arguments = {})
108
- raise ArgumentError.new "nil master_slide_name is given" unless master_slide_name
109
-
110
- result = eval_script <<-APPLE.unindent
111
- var Keynote = Application("Keynote")
112
- var doc = Keynote.documents.byId("#{self.id}")
113
- var masterSlide = doc.masterSlides.whose({name: "#{master_slide_name}"}).first
114
- var slide = Keynote.Slide({ baseSlide: masterSlide })
115
- doc.slides.push(slide)
116
- slide = doc.slides()[doc.slides().length - 1]
117
-
118
- var slideResult = {
119
- body_showing: slide.bodyShowing(),
120
- skipped: slide.skipped(),
121
- slide_number: slide.slideNumber(),
122
- title_showing: slide.titleShowing(),
123
- default_body_item: slide.defaultBodyItem(),
124
- default_title_item: slide.defaultTitleItem(),
125
- presenter_notes: slide.presenterNotes(),
126
- transition_properties: slide.transitionProperties()
127
- }
128
- JSON.stringify(slideResult)
129
- APPLE
130
-
131
- slide = Slide.new(
132
- base_slide: MasterSlide.new(master_slide_name),
133
- body_showing: result["body_showing"],
134
- skipped: result["skipped"],
135
- slide_number: result["slide_number"],
136
- title_showing: result["title_showing"],
137
- default_body_item: result["default_body_item"],
138
- default_title_item: result["default_title_item"],
139
- presenter_notes: result["presenter_notes"],
140
- transition_properties: result["transition_properties"],
91
+ @slides = SlideArray.new(
92
+ results.map do |result|
93
+ Slide.new(
94
+ MasterSlide.new(result["base_slide"]),
95
+ document: self,
96
+ body_showing: result["body_showing"],
97
+ skipped: result["skipped"],
98
+ slide_number: result["slide_number"],
99
+ title_showing: result["title_showing"],
100
+ body: result["body"],
101
+ title: result["title"],
102
+ presenter_notes: result["presenter_notes"],
103
+ transition_properties: result["transition_properties"],
104
+ )
105
+ end
141
106
  )
142
- @slides << slide
107
+ @slides.document = self
108
+ @slides
143
109
  end
144
110
 
145
111
  def save
@@ -182,17 +148,33 @@ module Keynote
182
148
  self.new(symbolize_keys(result).merge(theme: theme, width: width, height: height))
183
149
  end
184
150
 
151
+ def self.all
152
+ self.find_with_conditions
153
+ end
154
+
185
155
  def self.find_by(args)
186
156
  raise ArgumentError.new('nil argument is given') unless args
187
157
 
188
158
  if args.is_a?(Hash) && args.has_key?(:id)
189
159
  conditions = ".whose({ id: '#{args[:id]}' })"
190
- elsif args == :all
191
- conditions = ''
192
160
  else
193
161
  raise ArgumentError.new('Unsupported argument is given')
194
162
  end
195
163
 
164
+ find_with_conditions(conditions)
165
+ end
166
+
167
+ def self.current
168
+ self.all.first
169
+ end
170
+
171
+ private
172
+
173
+ def self.symbolize_keys(hash)
174
+ Hash[hash.map { |k, v| [k.to_sym, v] }]
175
+ end
176
+
177
+ def self.find_with_conditions(conditions = '')
196
178
  results = eval_script <<-APPLE.unindent
197
179
  var documents = Application("Keynote").documents#{conditions};
198
180
  var results = [];
@@ -208,15 +190,5 @@ module Keynote
208
190
  self.new(symbolize_keys(result))
209
191
  end
210
192
  end
211
-
212
- def self.current
213
- self.find_by(:all).first
214
- end
215
-
216
- private
217
-
218
- def self.symbolize_keys(hash)
219
- Hash[hash.map { |k, v| [k.to_sym, v] }]
220
- end
221
193
  end
222
194
  end
@@ -7,22 +7,49 @@ module Keynote
7
7
  include Keynote::Util
8
8
 
9
9
  attr_accessor(
10
- :id,
10
+ :document,
11
11
  :base_slide,
12
12
  :body_showing,
13
13
  :skipped,
14
14
  :slide_number,
15
15
  :title_showing,
16
- :default_body_item,
17
- :default_title_item,
16
+ :body,
17
+ :title,
18
18
  :presenter_notes,
19
19
  :transition_properties,
20
20
  )
21
21
 
22
- def initialize(arguments = {})
22
+ def initialize(base_slide, arguments = {})
23
+ @base_slide = base_slide
23
24
  arguments.each do |attr, val|
24
25
  send("#{attr}=", val)
25
26
  end
26
27
  end
28
+
29
+ def title=(title)
30
+ @title = title
31
+ return unless @document
32
+ return unless @slide_number
33
+ result = eval_script <<-APPLE.unindent
34
+ var Keynote = Application("Keynote")
35
+ var doc = Keynote.documents.byId("#{@document.id}")
36
+ var slide = doc.slides()[#{@slide_number - 1}]
37
+ slide.defaultTitleItem.objectText = "#{title}"
38
+ JSON.stringify({ result: true })
39
+ APPLE
40
+ end
41
+
42
+ def body=(body)
43
+ @body = body
44
+ return unless @document
45
+ return unless @slide_number
46
+ result = eval_script <<-APPLE.unindent
47
+ var Keynote = Application("Keynote")
48
+ var doc = Keynote.documents.byId("#{@document.id}")
49
+ var slide = doc.slides()[#{@slide_number - 1}]
50
+ slide.defaultBodyItem.objectText = "#{body}"
51
+ JSON.stringify({ result: true })
52
+ APPLE
53
+ end
27
54
  end
28
55
  end
@@ -0,0 +1,53 @@
1
+ require 'unindent'
2
+ require 'keynote/util'
3
+
4
+ module Keynote
5
+ module ArrayMethods
6
+ def <<(slide)
7
+ raise ArgumentError.new "master_slide_name is not specified" unless slide.base_slide
8
+
9
+ title = slide.title.gsub(/(\r\n|\r|\n)/) { '\\n' }
10
+ body = slide.body.gsub(/(\r\n|\r|\n)/) { '\\n' }
11
+
12
+ result = eval_script <<-APPLE.unindent
13
+ var Keynote = Application("Keynote")
14
+ var doc = Keynote.documents.byId("#{self.document.id}")
15
+ var masterSlide = doc.masterSlides.whose({name: "#{slide.base_slide}"}).first
16
+ var slide = Keynote.Slide({ baseSlide: masterSlide })
17
+ doc.slides.push(slide)
18
+ slide = doc.slides()[doc.slides().length - 1]
19
+ slide.defaultTitleItem.objectText = "#{title}"
20
+ slide.defaultBodyItem.objectText = "#{body}"
21
+
22
+ var slideResult = {
23
+ body_showing: slide.bodyShowing(),
24
+ skipped: slide.skipped(),
25
+ slide_number: slide.slideNumber(),
26
+ title_showing: slide.titleShowing(),
27
+ body: slide.defaultBodyItem.objectText(),
28
+ title: slide.defaultTitleItem.objectText(),
29
+ presenter_notes: slide.presenterNotes(),
30
+ transition_properties: slide.transitionProperties()
31
+ }
32
+ JSON.stringify(slideResult)
33
+ APPLE
34
+
35
+ slide.document = self.document
36
+ slide.body_showing = result["body_showing"]
37
+ slide.skipped = result["skipped"]
38
+ slide.slide_number = result["slide_number"]
39
+ slide.title_showing = result["title_showing"]
40
+ slide.presenter_notes = result["presenter_notes"]
41
+ slide.transition_properties = result["transition_properties"]
42
+
43
+ super
44
+ end
45
+ end
46
+
47
+ class SlideArray < Array
48
+ prepend ArrayMethods
49
+ attr_accessor :document
50
+
51
+ include Keynote::Util
52
+ end
53
+ end
@@ -13,7 +13,11 @@ module Keynote
13
13
  end
14
14
 
15
15
  def self.default
16
- self.find_by(:all).first
16
+ self.all.first
17
+ end
18
+
19
+ def self.all
20
+ self.find_with_conditions
17
21
  end
18
22
 
19
23
  def self.find_by(args)
@@ -21,12 +25,16 @@ module Keynote
21
25
 
22
26
  if args.is_a?(Hash) && args.has_key?(:name)
23
27
  conditions = ".whose({ name: '#{args[:name]}' })"
24
- elsif args == :all
25
- conditions = ''
26
28
  else
27
29
  raise ArgumentError.new('Unsupported argument is given')
28
30
  end
29
31
 
32
+ find_with_conditions(conditions)
33
+ end
34
+
35
+ private
36
+
37
+ def self.find_with_conditions(conditions = '')
30
38
  results = eval_script <<-APPLE.unindent
31
39
  var themes = Application("Keynote").themes#{conditions};
32
40
  var results = [];
@@ -1,5 +1,5 @@
1
1
  module Keynote
2
2
  module Client
3
- VERSION = "0.0.2"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keynote-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ryo katsuma
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-11 00:00:00.000000000 Z
11
+ date: 2015-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,6 +100,7 @@ files:
100
100
  - lib/keynote/document.rb
101
101
  - lib/keynote/master_slide.rb
102
102
  - lib/keynote/slide.rb
103
+ - lib/keynote/slide_array.rb
103
104
  - lib/keynote/theme.rb
104
105
  - lib/keynote/util.rb
105
106
  - lib/keynote/version.rb
@@ -125,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
126
  version: '0'
126
127
  requirements: []
127
128
  rubyforge_project:
128
- rubygems_version: 2.2.2
129
+ rubygems_version: 2.4.5
129
130
  signing_key:
130
131
  specification_version: 4
131
132
  summary: keynote client with high level API.