md2key 0.7.0 → 0.8.0

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 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