class Md2key::Keynote

Constants

CODE_BACKGROUND_PATH
COVER_SLIDE_INDEX
TEMPLATE_SLIDE_INDEX

Public Class Methods

create_slide(slide, master_name) click to toggle source

@param [Md2key::Nodes::Slide] slide @param [String] master_name

# File lib/md2key/keynote.rb, line 20
def create_slide(slide, master_name)
  if slide.lines.any?(&:indented?)
    create_indented_slide(slide, master_name)
  else
    # Not using `create_indented_slide` because this is faster.
    execute_applescript('create_slide_and_write_body', slide.title, slide.lines.map(&:text).join("\n"), master_name, TEMPLATE_SLIDE_INDEX)
  end
end
create_slide_with_table(slide, rows, columns, master_name) click to toggle source

@param [Md2key::Nodes::Slide] slide

# File lib/md2key/keynote.rb, line 30
def create_slide_with_table(slide, rows, columns, master_name)
  execute_applescript('create_slide_and_insert_table', slide.title, TEMPLATE_SLIDE_INDEX, rows, columns, master_name)
end
delete_extra_slides() click to toggle source

All slides after a second slide are unnecessary and deleted.

# File lib/md2key/keynote.rb, line 40
def delete_extra_slides
  execute_applescript('delete_extra_slides', slides_count)
end
delete_template_slide() click to toggle source
# File lib/md2key/keynote.rb, line 44
def delete_template_slide
  execute_applescript('delete_slide', TEMPLATE_SLIDE_INDEX)
end
ensure_template_slide_availability() click to toggle source
# File lib/md2key/keynote.rb, line 34
def ensure_template_slide_availability
  return if slides_count >= 2
  execute_applescript('create_empty_slide')
end
fetch_master_slide_name(slide_index) click to toggle source

@param [Integer] slide_index @return [String]

# File lib/md2key/keynote.rb, line 96
def fetch_master_slide_name(slide_index)
  execute_applescript('fetch_master_slide_name', slide_index).rstrip
end
fetch_master_slide_names() click to toggle source

@return [Array<String>]

# File lib/md2key/keynote.rb, line 101
def fetch_master_slide_names
  execute_applescript('fetch_master_slide_names').strip.split("\n")
end
insert_code(code) click to toggle source
# File lib/md2key/keynote.rb, line 53
def insert_code(code)
  draw_diagram = false
  prefix = ""
  case code.extension
  when 'mermaid'
    draw_diagram = true
  when 'seq', 'sequence'
    prefix = "sequenceDiagram\n"
    draw_diagram = true
  else
    Highlight.pbcopy_highlighted_code(code)
    insert_code_background
    activate_last_slide
    paste_clipboard
  end

  if draw_diagram
    code.source = prefix + code.source
    path = Diagram.generate_image_file(code)
    insert_image(path)
    File.unlink(path)
  end
end
insert_image(path) click to toggle source

Insert image to the last slide

# File lib/md2key/keynote.rb, line 49
def insert_image(path)
  execute_applescript('insert_image', slides_count, File.absolute_path(path), TEMPLATE_SLIDE_INDEX)
end
insert_note(note) click to toggle source

Insert presenter note

# File lib/md2key/keynote.rb, line 90
def insert_note(note)
  execute_applescript('insert_note', slides_count, note)
end
insert_table(data) click to toggle source
# File lib/md2key/keynote.rb, line 77
def insert_table(data)
  row_index = 1
  data.each do |row|
    param = [slides_count, row_index]
    row.each do |cell|
      param << cell
    end
    execute_applescript('update_table', *param)
    row_index += 1
  end
end
update_cover(slide, master_name) click to toggle source

You must provide a first slide as a cover slide. @param [Md2key::Nodes::Slide] slide

# File lib/md2key/keynote.rb, line 14
def update_cover(slide, master_name)
  execute_applescript('update_slide', slide.title, slide.lines.map(&:text).join("\n"), master_name, COVER_SLIDE_INDEX)
end

Private Class Methods

activate_last_slide() click to toggle source
# File lib/md2key/keynote.rb, line 111
def activate_last_slide
  execute_applescript('activate_slide', slides_count)
end
create_indented_slide(slide, master_name) click to toggle source

@param [Md2key::Nodes::Slide] slide @param [String] master_name

# File lib/md2key/keynote.rb, line 125
def create_indented_slide(slide, master_name)
  execute_applescript('create_slide_and_select_body', slide.title, master_name, TEMPLATE_SLIDE_INDEX)

  last_index = slide.lines.size - 1
  current_indent = 0
  slide.lines.each_with_index do |line, index|
    # Using copy and paste to input multibyte chars
    pbcopy(line.text)
    paste_and_indent(line.indent - current_indent, insert_newline: index < last_index)
    current_indent = line.indent
  end
end
execute_applescript(script_name, *args) click to toggle source

@return [String] - script's output

# File lib/md2key/keynote.rb, line 150
def execute_applescript(script_name, *args)
  path = script_path(script_name)
  script = ERB.new(File.read(path)).result
  IO.popen(['osascript', '-', *args.map(&:to_s)], 'r+') do |io|
    io.write(script)
    io.close_write
    io.read
  end
end
insert_code_background() click to toggle source
# File lib/md2key/keynote.rb, line 107
def insert_code_background
  execute_applescript('insert_code_background', slides_count, CODE_BACKGROUND_PATH)
end
paste_and_indent(indent, insert_newline: true) click to toggle source
# File lib/md2key/keynote.rb, line 145
def paste_and_indent(indent, insert_newline: true)
  execute_applescript('paste_and_indent', indent, insert_newline)
end
paste_clipboard() click to toggle source
# File lib/md2key/keynote.rb, line 115
def paste_clipboard
  execute_applescript('paste_clipboard')
end
pbcopy(str) click to toggle source
# File lib/md2key/keynote.rb, line 138
def pbcopy(str)
  IO.popen('pbcopy', 'w') do |io|
    io.write(str)
    io.close_write
  end
end
script_path(script_name) click to toggle source
# File lib/md2key/keynote.rb, line 160
def script_path(script_name)
  scripts_path = File.expand_path('../../scripts', __dir__)
  File.join(scripts_path, "#{script_name}.scpt.erb")
end
slides_count() click to toggle source
# File lib/md2key/keynote.rb, line 119
def slides_count
  execute_applescript('slides_count').to_i
end