md2key 0.8.4 → 0.9.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 +5 -5
- data/CHANGELOG.md +5 -0
- data/Gemfile +4 -0
- data/lib/md2key/cli.rb +4 -2
- data/lib/md2key/config_loader.rb +41 -0
- data/lib/md2key/configuration.rb +20 -37
- data/lib/md2key/keynote.rb +3 -0
- data/lib/md2key/renderer.rb +71 -0
- data/lib/md2key/version.rb +1 -1
- data/md2key.gemspec +0 -1
- metadata +5 -18
- data/lib/md2key/converter.rb +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a24069768cd5c06091add93733afb5dd4ce5442fcc94795e5c47f4d263cfe6ec
|
4
|
+
data.tar.gz: 4b9c7b2f8aeaba697e42df6fbab3416c82631410d71e8e5a4df949cdb8e4f8af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ae1c513793ada5d034f2118029f1faf51a2e7b00805b1476a6ed37d2bb62a8335cb3bcdefc33b208cee5af49ec914c9fd170f578076aa62f5b2cdefc3545c29
|
7
|
+
data.tar.gz: 1c847482c40c60cf0e57e086240c1dbe5e4c13281be5917aab9b00d42b5ca9b25d6d51ee1596dada1dea5874c992808a45c88c4f1c088bea1e010908eb81e3e2
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/lib/md2key/cli.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'md2key/config_builder'
|
2
|
-
require 'md2key/
|
2
|
+
require 'md2key/config_loader'
|
3
3
|
require 'md2key/parser'
|
4
|
+
require 'md2key/renderer'
|
4
5
|
require 'thor'
|
5
6
|
require 'yaml'
|
6
7
|
|
@@ -11,8 +12,9 @@ module Md2key
|
|
11
12
|
abort "md2key: `#{path}` does not exist" unless File.exist?(path)
|
12
13
|
|
13
14
|
markdown = File.read(path)
|
15
|
+
config = ConfigLoader.load('~/.md2key', './.md2key')
|
14
16
|
ast = Parser.new.parse(markdown)
|
15
|
-
|
17
|
+
Renderer.new(config).render!(ast)
|
16
18
|
end
|
17
19
|
|
18
20
|
desc 'init', 'Put .md2key template to current directory'
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'md2key/configuration'
|
2
|
+
|
3
|
+
module Md2key
|
4
|
+
class ConfigLoader
|
5
|
+
class << self
|
6
|
+
# @param [Array<String>] paths - paths of YAML configs. Latter config overwrites former ones.
|
7
|
+
def load(*paths)
|
8
|
+
hash = {}
|
9
|
+
paths.each do |path|
|
10
|
+
hash.merge!(load_if_available(File.expand_path(path)))
|
11
|
+
end
|
12
|
+
Configuration.new(symbolize_keys(hash))
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def load_if_available(path)
|
18
|
+
if File.exist?(path)
|
19
|
+
YAML.load(File.read(path))
|
20
|
+
else
|
21
|
+
{}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def symbolize_keys(object)
|
26
|
+
case object
|
27
|
+
when Hash
|
28
|
+
Hash.new.tap do |result|
|
29
|
+
object.each do |key, value|
|
30
|
+
result[key.to_sym] = symbolize_keys(value)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
when Array
|
34
|
+
object.map(&method(:symbolize_keys))
|
35
|
+
else
|
36
|
+
object
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/md2key/configuration.rb
CHANGED
@@ -2,67 +2,50 @@ require 'yaml'
|
|
2
2
|
|
3
3
|
module Md2key
|
4
4
|
class Configuration
|
5
|
-
class
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
class Master
|
6
|
+
# @param [String] name
|
7
|
+
# @param [TrueClass,FalseClass,nil] cover
|
8
|
+
# @param [Integer,nil] template
|
9
|
+
def initialize(name:, cover: nil, template: nil)
|
10
|
+
@name = name
|
11
|
+
@cover = cover
|
12
|
+
@template = template
|
11
13
|
end
|
12
14
|
|
13
|
-
|
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
|
15
|
+
attr_reader :name, :cover, :template
|
37
16
|
end
|
38
17
|
|
18
|
+
# @param [Array<Hash{ Symbol => String,Integer,TrueClass,FalseClass }>] masters
|
39
19
|
def initialize(masters: [])
|
40
|
-
@masters = masters
|
20
|
+
@masters = masters.map { |m| Master.new(m) }
|
41
21
|
validate!
|
42
22
|
end
|
43
23
|
|
24
|
+
# @return [String,nil]
|
44
25
|
def cover_master
|
45
26
|
master = @masters.find do |master|
|
46
|
-
master
|
27
|
+
master.cover
|
47
28
|
end
|
48
|
-
master && master
|
29
|
+
master && master.name
|
49
30
|
end
|
50
31
|
|
32
|
+
# @param [Integer] level
|
33
|
+
# @return [String,nil]
|
51
34
|
def slide_master(level)
|
52
35
|
master = @masters.find do |master|
|
53
|
-
master
|
36
|
+
master.template == level
|
54
37
|
end
|
55
|
-
master && master
|
38
|
+
master && master.name
|
56
39
|
end
|
57
40
|
|
58
41
|
private
|
59
42
|
|
60
43
|
def validate!
|
61
|
-
if @masters.select
|
44
|
+
if @masters.select(&:cover).length > 1
|
62
45
|
abort "Config error!\n`cover: true` cannot be specified multiple times"
|
63
46
|
end
|
64
47
|
(1..5).each do |level|
|
65
|
-
if @masters.select { |m| m
|
48
|
+
if @masters.select { |m| m.template == level }.length > 1
|
66
49
|
abort "`Config error!\ntemplate: #{level}` cannot be specified multiple times"
|
67
50
|
end
|
68
51
|
end
|
data/lib/md2key/keynote.rb
CHANGED
@@ -91,10 +91,13 @@ module Md2key
|
|
91
91
|
execute_applescript('insert_note', slides_count, note)
|
92
92
|
end
|
93
93
|
|
94
|
+
# @param [Integer] slide_index
|
95
|
+
# @return [String]
|
94
96
|
def fetch_master_slide_name(slide_index)
|
95
97
|
execute_applescript('fetch_master_slide_name', slide_index).rstrip
|
96
98
|
end
|
97
99
|
|
100
|
+
# @return [Array<String>]
|
98
101
|
def fetch_master_slide_names
|
99
102
|
execute_applescript('fetch_master_slide_names').strip.split("\n")
|
100
103
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'md2key/configuration'
|
2
|
+
require 'md2key/keynote'
|
3
|
+
|
4
|
+
module Md2key
|
5
|
+
class Renderer
|
6
|
+
# Magic number index for master slide named "cover"
|
7
|
+
COVER_LEVEL = 0
|
8
|
+
|
9
|
+
# @param [Md2key::Configuration] config
|
10
|
+
def initialize(config)
|
11
|
+
@config = config
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param [Md2key::Nodes::Presentation] ast
|
15
|
+
def render!(ast)
|
16
|
+
prepare_document_base
|
17
|
+
generate_contents(ast)
|
18
|
+
ensure
|
19
|
+
Keynote.delete_template_slide
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def prepare_document_base
|
25
|
+
Keynote.ensure_template_slide_availability
|
26
|
+
Keynote.delete_extra_slides
|
27
|
+
end
|
28
|
+
|
29
|
+
# @param [Md2key::Nodes::Presentation] ast
|
30
|
+
def generate_contents(ast)
|
31
|
+
first_master = Keynote.fetch_master_slide_name(1)
|
32
|
+
second_master = Keynote.fetch_master_slide_name(2)
|
33
|
+
master_by_level = fetch_master_by_level
|
34
|
+
|
35
|
+
cover_master = @config.cover_master || master_by_level.fetch(COVER_LEVEL, first_master)
|
36
|
+
Keynote.update_cover(ast.cover, cover_master)
|
37
|
+
|
38
|
+
ast.slides.each do |slide|
|
39
|
+
slide_master = @config.slide_master(slide.level) || master_by_level.fetch(slide.level, second_master)
|
40
|
+
|
41
|
+
if slide.table
|
42
|
+
Keynote.create_slide_with_table(slide, slide.table.rows, slide.table.columns, slide_master)
|
43
|
+
Keynote.insert_table(slide.table.data)
|
44
|
+
else
|
45
|
+
Keynote.create_slide(slide, slide_master)
|
46
|
+
Keynote.insert_image(slide.image) if slide.image
|
47
|
+
Keynote.insert_code(slide.code) if slide.code
|
48
|
+
end
|
49
|
+
|
50
|
+
Keynote.insert_note(slide.note) if slide.note
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Find master names like "h1", "h2", ... and return { 1 => "h1", 2 => "h2" } only for available ones.
|
55
|
+
# @return [Hash{ Integer => String }]
|
56
|
+
def fetch_master_by_level
|
57
|
+
masters = Keynote.fetch_master_slide_names
|
58
|
+
|
59
|
+
{}.tap do |result|
|
60
|
+
masters.each do |master|
|
61
|
+
if master.match(/\Ah(?<level>[1-5])\z/)
|
62
|
+
level = Integer(Regexp.last_match[:level])
|
63
|
+
result[level] = master
|
64
|
+
elsif master == 'cover'
|
65
|
+
result[COVER_LEVEL] = 'cover'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/md2key/version.rb
CHANGED
data/md2key.gemspec
CHANGED
@@ -25,7 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_dependency 'redcarpet', '~> 3.3'
|
26
26
|
spec.add_dependency 'oga', '~> 1.2'
|
27
27
|
spec.add_development_dependency 'bundler', '~> 1.12'
|
28
|
-
spec.add_development_dependency 'listen', '~> 3.0'
|
29
28
|
spec.add_development_dependency 'rake', '~> 10.0'
|
30
29
|
spec.add_development_dependency 'pry'
|
31
30
|
end
|
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.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.12'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: listen
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '3.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '3.0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: rake
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,8 +118,8 @@ files:
|
|
132
118
|
- lib/md2key.rb
|
133
119
|
- lib/md2key/cli.rb
|
134
120
|
- lib/md2key/config_builder.rb
|
121
|
+
- lib/md2key/config_loader.rb
|
135
122
|
- lib/md2key/configuration.rb
|
136
|
-
- lib/md2key/converter.rb
|
137
123
|
- lib/md2key/diagram.rb
|
138
124
|
- lib/md2key/highlight.rb
|
139
125
|
- lib/md2key/keynote.rb
|
@@ -144,6 +130,7 @@ files:
|
|
144
130
|
- lib/md2key/nodes/slide.rb
|
145
131
|
- lib/md2key/nodes/table.rb
|
146
132
|
- lib/md2key/parser.rb
|
133
|
+
- lib/md2key/renderer.rb
|
147
134
|
- lib/md2key/version.rb
|
148
135
|
- md2key.gemspec
|
149
136
|
- scripts/activate_slide.scpt.erb
|
@@ -183,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
170
|
version: '0'
|
184
171
|
requirements: []
|
185
172
|
rubyforge_project:
|
186
|
-
rubygems_version: 2.
|
173
|
+
rubygems_version: 2.6.14
|
187
174
|
signing_key:
|
188
175
|
specification_version: 4
|
189
176
|
summary: Convert markdown to keynote
|
data/lib/md2key/converter.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'md2key/configuration'
|
2
|
-
require 'md2key/keynote'
|
3
|
-
|
4
|
-
module Md2key
|
5
|
-
class Converter
|
6
|
-
attr_reader :config
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
@config = Configuration.load
|
10
|
-
end
|
11
|
-
|
12
|
-
# @param [Md2key::Nodes::Presentation] ast
|
13
|
-
def convert!(ast)
|
14
|
-
prepare_document_base
|
15
|
-
generate_contents(ast)
|
16
|
-
ensure
|
17
|
-
Keynote.delete_template_slide
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def prepare_document_base
|
23
|
-
Keynote.ensure_template_slide_availability
|
24
|
-
Keynote.delete_extra_slides
|
25
|
-
end
|
26
|
-
|
27
|
-
def generate_contents(ast)
|
28
|
-
cover_master = Keynote.fetch_master_slide_name(1)
|
29
|
-
main_master = Keynote.fetch_master_slide_name(2)
|
30
|
-
|
31
|
-
Keynote.update_cover(ast.cover, config.cover_master || cover_master)
|
32
|
-
ast.slides.each do |slide|
|
33
|
-
master = config.slide_master(slide.level) || main_master
|
34
|
-
if slide.table
|
35
|
-
Keynote.create_slide_with_table(slide, slide.table.rows, slide.table.columns, master)
|
36
|
-
Keynote.insert_table(slide.table.data)
|
37
|
-
else
|
38
|
-
Keynote.create_slide(slide, master)
|
39
|
-
Keynote.insert_image(slide.image) if slide.image
|
40
|
-
Keynote.insert_code(slide.code) if slide.code
|
41
|
-
end
|
42
|
-
Keynote.insert_note(slide.note) if slide.note
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|