md2key 0.7.0 → 0.8.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: 5160e8e3f9c8a30aed93d347178d4ece5b8406d9
4
- data.tar.gz: e9bf49a0c93e7e6e3d20f33d0e64b61619a8c50e
3
+ metadata.gz: 410568f3152ab6dcd1869b85bcfb8f2d9e68e1fd
4
+ data.tar.gz: 2b4c816530181bd706316b94025ffbc1a2830eb5
5
5
  SHA512:
6
- metadata.gz: e2ee89a2f607a077768655978f14873de2c52e5afe9a8a78b32003824abd2b87b991afb7df61ae7b879fa09b1353fa970efd6608071afb641449a175f9bf0172
7
- data.tar.gz: a8c48b7ae5f2c569bc5066f4e0c7146f6c480debfe06538e2a63354abb203a16f899fe714df5f0d9fa4061ac3d60abf2fad2708bc6ede3963ded87e0326db0f1
6
+ metadata.gz: 5d5fa52861b324fd7653ad7144c7b76384efddd26a007fba6bcb33be197efb1c461de3dd595e747221f19a406b1206c9d840d7d7aa18693dda49ebc8358922ca
7
+ data.tar.gz: e99f5e622a77540a4114045e231fea43c023241d631d06e698e3ae93d6f934221b10b9e462171d14089db0b9bfa3bfb702f5bb9eb334bce01374f953677fd8c0
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  .DS_Store
11
+ .md2key
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ # v0.8.0
2
+
3
+ - Add `md2key init` subcommand to generate .md2key
4
+ - Allow changing master slide by .md2key
5
+ - See https://github.com/k0kubun/md2key/pull/32 for details
6
+
1
7
  # v0.7.0
2
8
 
3
9
  - Support presenter notes
data/lib/md2key/cli.rb CHANGED
@@ -1,22 +1,37 @@
1
+ require 'md2key/config_builder'
2
+ require 'md2key/configuration'
3
+ require 'md2key/converter'
1
4
  require 'thor'
5
+ require 'yaml'
2
6
 
3
7
  module Md2key
4
8
  class CLI < Thor
5
9
  desc 'convert MARKDOWN', 'Convert markdown to keynote'
6
10
  def convert(path)
7
- Converter.convert_markdown(path)
11
+ abort "md2key: `#{path}` does not exist" unless File.exist?(path)
12
+
13
+ config = Configuration.load
14
+ Converter.new(config).convert!(path)
15
+ end
16
+
17
+ desc 'init', 'Put .md2key template to current directory'
18
+ option :skip_options, type: :boolean, default: false, aliases: %w[-n]
19
+ def init
20
+ yaml = ConfigBuilder.build(skip_options: options[:skip_options])
21
+ File.write('.md2key', yaml)
22
+ puts "# Successfully generated .md2key!\n#{yaml}"
8
23
  end
9
24
 
10
25
  private
11
26
 
12
- # Shorthand for `md2key convert`
27
+ # Shorthand for `md2key convert *.md`
13
28
  def method_missing(*args)
14
- return super(*args) if args.length > 1
15
- default_task(args.first.to_s)
16
- end
17
-
18
- def default_task(arg)
19
- convert(arg)
29
+ path = args.first.to_s
30
+ if args.length == 1 && path.end_with?('.md')
31
+ convert(path)
32
+ else
33
+ return super(*args)
34
+ end
20
35
  end
21
36
  end
22
37
  end
@@ -0,0 +1,27 @@
1
+ module Md2key
2
+ module ConfigBuilder
3
+ class << self
4
+ def build(skip_options: true)
5
+ master_names = Keynote.fetch_master_slide_names
6
+ masters = master_names.map.with_index do |name, i|
7
+ build_master_config(name, i, skip_options: skip_options)
8
+ end
9
+ ["masters:\n", *masters].join
10
+ end
11
+
12
+ private
13
+
14
+ def build_master_config(master_name, index, skip_options:)
15
+ " - name: #{master_name.inspect}\n".tap do |config|
16
+ next if skip_options
17
+
18
+ if index == 0
19
+ config << " cover: true\n"
20
+ elsif (1..3).cover?(index)
21
+ config << " template: #{index}\n"
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,71 @@
1
+ require 'yaml'
2
+
3
+ module Md2key
4
+ class Configuration
5
+ class << self
6
+ def load
7
+ config = {}
8
+ config.merge!(load_if_available(File.expand_path('~/.md2key')))
9
+ config.merge!(load_if_available(File.expand_path('./.md2key')))
10
+ new(symbolize_keys(config))
11
+ end
12
+
13
+ private
14
+
15
+ def load_if_available(path)
16
+ if File.exist?(path)
17
+ YAML.load(File.read(path))
18
+ else
19
+ {}
20
+ end
21
+ end
22
+
23
+ def symbolize_keys(object)
24
+ case object
25
+ when Hash
26
+ Hash.new.tap do |result|
27
+ object.each do |key, value|
28
+ result[key.to_sym] = symbolize_keys(value)
29
+ end
30
+ end
31
+ when Array
32
+ object.map(&method(:symbolize_keys))
33
+ else
34
+ object
35
+ end
36
+ end
37
+ end
38
+
39
+ def initialize(masters: [])
40
+ @masters = masters
41
+ validate!
42
+ end
43
+
44
+ def cover_master
45
+ master = @masters.find do |master|
46
+ master[:cover]
47
+ end
48
+ master && master[:name]
49
+ end
50
+
51
+ def slide_master(level)
52
+ master = @masters.find do |master|
53
+ master[:template] == level
54
+ end
55
+ master && master[:name]
56
+ end
57
+
58
+ private
59
+
60
+ def validate!
61
+ if @masters.select { |m| m[:cover] }.length > 1
62
+ abort "Config error!\n`cover: true` cannot be specified multiple times"
63
+ end
64
+ (1..5).each do |level|
65
+ if @masters.select { |m| m[:template] == level }.length > 1
66
+ abort "`Config error!\ntemplate: #{level}` cannot be specified multiple times"
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,18 +1,15 @@
1
1
  module Md2key
2
2
  class Converter
3
- def self.convert_markdown(path)
4
- abort "md2key: `#{path}` does not exist" unless File.exist?(path)
3
+ attr_reader :config
5
4
 
6
- self.new(path).generate_keynote!
5
+ def initialize(config)
6
+ @config = config
7
7
  end
8
8
 
9
- def initialize(path)
10
- @markdown = Markdown.new(path)
11
- end
12
-
13
- def generate_keynote!
9
+ def convert!(path)
14
10
  prepare_document_base
15
- generate_contents
11
+ markdown = Markdown.new(path)
12
+ generate_contents(markdown)
16
13
  ensure
17
14
  Keynote.delete_template_slide
18
15
  end
@@ -24,14 +21,18 @@ module Md2key
24
21
  Keynote.delete_extra_slides
25
22
  end
26
23
 
27
- def generate_contents
28
- Keynote.update_cover(@markdown.cover)
29
- @markdown.slides.each do |slide|
24
+ def generate_contents(markdown)
25
+ cover_master = Keynote.fetch_master_slide_name(1)
26
+ main_master = Keynote.fetch_master_slide_name(2)
27
+
28
+ Keynote.update_cover(markdown.cover, config.cover_master || cover_master)
29
+ markdown.slides.each do |slide|
30
+ master = config.slide_master(slide.level) || main_master
30
31
  if slide.table
31
- Keynote.create_slide_with_table(slide, slide.table.rows, slide.table.columns)
32
+ Keynote.create_slide_with_table(slide, slide.table.rows, slide.table.columns, master)
32
33
  Keynote.insert_table(slide.table.data)
33
34
  else
34
- Keynote.create_slide(slide)
35
+ Keynote.create_slide(slide, master)
35
36
  Keynote.insert_image(slide.image) if slide.image
36
37
  Keynote.insert_code(slide.code) if slide.code
37
38
  end
@@ -11,23 +11,24 @@ module Md2key
11
11
  class << self
12
12
  # You must provide a first slide as a cover slide.
13
13
  # @param [Md2key::Slide] slide
14
- def update_cover(slide)
15
- execute_applescript('update_slide', slide.title, slide.lines.map(&:text).join("\n"), COVER_SLIDE_INDEX)
14
+ def update_cover(slide, master_name)
15
+ execute_applescript('update_slide', slide.title, slide.lines.map(&:text).join("\n"), master_name, COVER_SLIDE_INDEX)
16
16
  end
17
17
 
18
18
  # @param [Md2key::Slide] slide
19
- def create_slide(slide)
19
+ # @param [String] master_name
20
+ def create_slide(slide, master_name)
20
21
  if slide.lines.any?(&:indented?)
21
- create_indented_slide(slide)
22
+ create_indented_slide(slide, master_name)
22
23
  else
23
24
  # Not using `create_indented_slide` because this is faster.
24
- execute_applescript('create_slide_and_write_body', slide.title, slide.lines.map(&:text).join("\n"), TEMPLATE_SLIDE_INDEX)
25
+ execute_applescript('create_slide_and_write_body', slide.title, slide.lines.map(&:text).join("\n"), master_name, TEMPLATE_SLIDE_INDEX)
25
26
  end
26
27
  end
27
28
 
28
29
  # @param [Md2key::Slide] slide
29
- def create_slide_with_table(slide, rows, columns)
30
- execute_applescript('create_slide_and_insert_table', slide.title, TEMPLATE_SLIDE_INDEX, rows, columns)
30
+ def create_slide_with_table(slide, rows, columns, master_name)
31
+ execute_applescript('create_slide_and_insert_table', slide.title, TEMPLATE_SLIDE_INDEX, rows, columns, master_name)
31
32
  end
32
33
 
33
34
  def ensure_template_slide_availability
@@ -90,6 +91,14 @@ module Md2key
90
91
  execute_applescript('insert_note', slides_count, note)
91
92
  end
92
93
 
94
+ def fetch_master_slide_name(slide_index)
95
+ execute_applescript('fetch_master_slide_name', slide_index).rstrip
96
+ end
97
+
98
+ def fetch_master_slide_names
99
+ execute_applescript('fetch_master_slide_names').strip.split("\n")
100
+ end
101
+
93
102
  private
94
103
 
95
104
  def insert_code_background
@@ -109,8 +118,9 @@ module Md2key
109
118
  end
110
119
 
111
120
  # @param [Md2key::Slide] slide
112
- def create_indented_slide(slide)
113
- execute_applescript('create_slide_and_select_body', slide.title, TEMPLATE_SLIDE_INDEX)
121
+ # @param [String] master_name
122
+ def create_indented_slide(slide, master_name)
123
+ execute_applescript('create_slide_and_select_body', slide.title, master_name, TEMPLATE_SLIDE_INDEX)
114
124
 
115
125
  last_index = slide.lines.size - 1
116
126
  current_indent = 0
@@ -39,7 +39,7 @@ module Md2key
39
39
  next unless node.is_a?(Oga::XML::Element)
40
40
 
41
41
  case node.name
42
- when /^h[1-9]$/
42
+ when /^h(?<level>[1-9])$/
43
43
  # New slide by header. You can skip to write `---`.
44
44
  # This feature will be removed in the future to provide
45
45
  # more compatibility with Deckset.
@@ -50,6 +50,7 @@ module Md2key
50
50
 
51
51
  slides << slide
52
52
  slide.title = node.text
53
+ slide.level = Regexp.last_match[:level].to_i
53
54
  when 'ul'
54
55
  slide.lines.concat(li_lines(node))
55
56
  when 'ol'
data/lib/md2key/slide.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Md2key
2
- class Slide < Struct.new(:title, :lines, :image, :code, :table, :note)
2
+ class Slide < Struct.new(:title, :lines, :image, :code, :table, :note, :level)
3
3
  def initialize(*)
4
4
  super
5
5
  self.lines ||= []
@@ -1,3 +1,3 @@
1
1
  module Md2key
2
- VERSION = "0.7.0"
2
+ VERSION = "0.8.0"
3
3
  end
data/lib/md2key.rb CHANGED
@@ -2,5 +2,4 @@ require 'md2key/code'
2
2
  require 'md2key/markdown'
3
3
  require 'md2key/highlight'
4
4
  require 'md2key/keynote'
5
- require 'md2key/converter'
6
5
  require 'md2key/cli'
@@ -3,6 +3,7 @@ on run argv
3
3
  set templateIndex to item 2 of argv as number
4
4
  set rowCount to item 3 of argv as number
5
5
  set columnCount to item 4 of argv as number
6
+ set masterName to item 5 of argv as string
6
7
 
7
8
  set headerRowCount to 1
8
9
  set headerColumnCount to 0
@@ -11,12 +12,7 @@ on run argv
11
12
  tell application "Keynote"
12
13
  set thisDocument to the front document
13
14
  tell thisDocument
14
- -- Workaround to select correct master slide. In spite of master slide can be selected by name,
15
- -- name property is not limited to be unique.
16
- -- So move the focus to second slide and force "make new slide" to use the exact master slide.
17
- move slide templateIndex to before slide templateIndex
18
-
19
- set newSlide to make new slide
15
+ set newSlide to make new slide with properties {base slide:master slide masterName}
20
16
  tell newSlide
21
17
  try
22
18
  set base slide to master slide "Title - Top" of thisDocument
@@ -1,17 +1,13 @@
1
1
  on run argv
2
2
  set slideTitle to item 1 of argv
3
- set templateIndex to item 2 of argv as number
3
+ set masterName to item 2 of argv as string
4
+ set templateIndex to item 3 of argv as number
4
5
 
5
6
  tell application "Keynote"
6
7
  activate
7
8
 
8
9
  tell the front document
9
- -- Workaround to select correct master slide. In spite of master slide can be selected by name,
10
- -- name property is not limited to be unique.
11
- -- So move the focus to second slide and force "make new slide" to use the exact master slide.
12
- move slide templateIndex to before slide templateIndex
13
-
14
- set newSlide to make new slide
10
+ set newSlide to make new slide with properties {base slide:master slide masterName}
15
11
  tell newSlide
16
12
  set object text of default title item to slideTitle
17
13
 
@@ -1,16 +1,12 @@
1
1
  on run argv
2
2
  set slideTitle to item 1 of argv
3
3
  set slideBody to item 2 of argv
4
- set templateIndex to item 3 of argv as number
4
+ set masterName to item 3 of argv as string
5
+ set templateIndex to item 4 of argv as number
5
6
 
6
7
  tell application "Keynote"
7
8
  tell the front document
8
- -- Workaround to select correct master slide. In spite of master slide can be selected by name,
9
- -- name property is not limited to be unique.
10
- -- So move the focus to second slide and force "make new slide" to use the exact master slide.
11
- move slide templateIndex to before slide templateIndex
12
-
13
- set newSlide to make new slide
9
+ set newSlide to make new slide with properties {base slide:master slide masterName}
14
10
  tell newSlide
15
11
  set object text of default title item to slideTitle
16
12
  set object text of default body item to slideBody
@@ -0,0 +1,10 @@
1
+ on run argv
2
+ set slideIndex to item 1 of argv as number
3
+
4
+ tell application "Keynote"
5
+ tell the front document
6
+ set masterName to the name of the base slide of slide slideIndex
7
+ return masterName
8
+ end tell
9
+ end tell
10
+ end run
@@ -0,0 +1,11 @@
1
+ tell application "Keynote"
2
+ tell the front document
3
+ set the ret to ""
4
+
5
+ set the masterSlideNames to the name of every master slide
6
+ repeat with masterName in the masterSlideNames
7
+ set the ret to ret & "\n" & masterName
8
+ end repeat
9
+ return ret
10
+ end tell
11
+ end tell
@@ -1,10 +1,12 @@
1
1
  on run argv
2
2
  set slideTitle to item 1 of argv
3
3
  set slideBody to item 2 of argv
4
- set slideIndex to item 3 of argv as number
4
+ set masterName to item 3 of argv as string
5
+ set slideIndex to item 4 of argv as number
5
6
 
6
7
  tell application "Keynote"
7
8
  tell the front document
9
+ set the base slide of the slide slideIndex to master slide masterName
8
10
  tell slide slideIndex
9
11
  set object text of default title item to slideTitle
10
12
  set object text of default body item to slideBody
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: md2key
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-26 00:00:00.000000000 Z
11
+ date: 2016-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -112,6 +112,8 @@ files:
112
112
  - lib/md2key.rb
113
113
  - lib/md2key/cli.rb
114
114
  - lib/md2key/code.rb
115
+ - lib/md2key/config_builder.rb
116
+ - lib/md2key/configuration.rb
115
117
  - lib/md2key/converter.rb
116
118
  - lib/md2key/diagram.rb
117
119
  - lib/md2key/highlight.rb
@@ -130,6 +132,8 @@ files:
130
132
  - scripts/create_slide_and_write_body.scpt.erb
131
133
  - scripts/delete_extra_slides.scpt.erb
132
134
  - scripts/delete_slide.scpt.erb
135
+ - scripts/fetch_master_slide_name.scpt.erb
136
+ - scripts/fetch_master_slide_names.scpt.erb
133
137
  - scripts/insert_code_background.scpt.erb
134
138
  - scripts/insert_image.scpt.erb
135
139
  - scripts/insert_note.scpt.erb