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 +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +6 -0
- data/lib/md2key/cli.rb +23 -8
- data/lib/md2key/config_builder.rb +27 -0
- data/lib/md2key/configuration.rb +71 -0
- data/lib/md2key/converter.rb +15 -14
- data/lib/md2key/keynote.rb +19 -9
- data/lib/md2key/markdown.rb +2 -1
- data/lib/md2key/slide.rb +1 -1
- data/lib/md2key/version.rb +1 -1
- data/lib/md2key.rb +0 -1
- data/scripts/create_slide_and_insert_table.scpt.erb +2 -6
- data/scripts/create_slide_and_select_body.scpt.erb +3 -7
- data/scripts/create_slide_and_write_body.scpt.erb +3 -7
- data/scripts/fetch_master_slide_name.scpt.erb +10 -0
- data/scripts/fetch_master_slide_names.scpt.erb +11 -0
- data/scripts/update_slide.scpt.erb +3 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 410568f3152ab6dcd1869b85bcfb8f2d9e68e1fd
|
4
|
+
data.tar.gz: 2b4c816530181bd706316b94025ffbc1a2830eb5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d5fa52861b324fd7653ad7144c7b76384efddd26a007fba6bcb33be197efb1c461de3dd595e747221f19a406b1206c9d840d7d7aa18693dda49ebc8358922ca
|
7
|
+
data.tar.gz: e99f5e622a77540a4114045e231fea43c023241d631d06e698e3ae93d6f934221b10b9e462171d14089db0b9bfa3bfb702f5bb9eb334bce01374f953677fd8c0
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
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
|
-
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
data/lib/md2key/converter.rb
CHANGED
@@ -1,18 +1,15 @@
|
|
1
1
|
module Md2key
|
2
2
|
class Converter
|
3
|
-
|
4
|
-
abort "md2key: `#{path}` does not exist" unless File.exist?(path)
|
3
|
+
attr_reader :config
|
5
4
|
|
6
|
-
|
5
|
+
def initialize(config)
|
6
|
+
@config = config
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
@markdown = Markdown.new(path)
|
11
|
-
end
|
12
|
-
|
13
|
-
def generate_keynote!
|
9
|
+
def convert!(path)
|
14
10
|
prepare_document_base
|
15
|
-
|
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.
|
29
|
-
|
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
|
data/lib/md2key/keynote.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
113
|
-
|
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
|
data/lib/md2key/markdown.rb
CHANGED
@@ -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
data/lib/md2key/version.rb
CHANGED
data/lib/md2key.rb
CHANGED
@@ -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
|
-
|
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
|
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
|
-
|
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
|
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
|
-
|
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,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
|
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.
|
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-
|
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
|