class Textbringer::PresentationMode

Constants

PRESENTATION_MODE_MAP

Public Class Methods

new(buffer) click to toggle source
Calls superclass method
# File lib/textbringer/modes/presentation_mode.rb, line 33
def initialize(buffer)
  super(buffer)
  buffer.keymap = PRESENTATION_MODE_MAP
  show_current_slide
end

Public Instance Methods

backward_slide() click to toggle source
# File lib/textbringer/modes/presentation_mode.rb, line 79
def backward_slide
  @buffer[:slide_list].backward_slide
  show_current_slide
end
forward_slide() click to toggle source
# File lib/textbringer/modes/presentation_mode.rb, line 74
def forward_slide
  @buffer[:slide_list].forward_slide
  show_current_slide
end
quit_presentation() click to toggle source
# File lib/textbringer/modes/presentation_mode.rb, line 84
def quit_presentation
  Window.delete_other_windows
  buffer = Buffer["*Code*"]
  if buffer
    buffer.kill
  end
  src_buffer = @buffer[:source_buffer]
  pos = @buffer[:slide_list].current.start_pos
  kill_buffer(@buffer)
  switch_to_buffer(src_buffer)
  src_buffer.goto_char(pos)
  Window.current.recenter
  Window.redraw
end
show_current_slide() click to toggle source
# File lib/textbringer/modes/presentation_mode.rb, line 39
def show_current_slide
  Window.delete_other_windows
  Window.redraw
  @buffer.read_only = false
  begin
    @buffer.clear
    slide_list = buffer[:slide_list]
    slide = slide_list.current
    if slide
      @buffer.insert("\n" * @buffer[:presentation_top_margin])
      left_margin = " " * @buffer[:presentation_left_margin]
      @buffer.insert("#{left_margin}#{slide.title}\n\n")
      body = slide.body
      img_re = /!\[.*?\]\((.*\.(?:jpg|png))\)/
      img = body.slice(img_re, 1)
      code_re = /^```([a-z]+)?\n(.*?)^```$/m
      lang, code = body.scan(code_re)[0]
      s = body.sub(img_re, "").sub(code_re, "").
        gsub(/\[(.*?)\]\(https?:.*?\)/, '\1').
        strip.gsub(/^/, left_margin)
      @buffer.insert(s)
      beginning_of_buffer
      if img
        show_image(img, s)
      end
      if code
        show_code(code, lang)
      end
      show_slide_number(slide_list)
    end
  ensure
    @buffer.read_only = true
  end
end

Private Instance Methods

show_code(code, lang) click to toggle source
# File lib/textbringer/modes/presentation_mode.rb, line 125
def show_code(code, lang)
  Window.current.split
  Window.current.shrink_if_larger_than_buffer
  Window.other_window
  buffer = Buffer.find_or_new("*Code*")
  buffer.clear
  switch_to_buffer(buffer)
  if lang
    send(lang.downcase + "_mode")
  else
    fundamental_mode
  end
  insert("\n" * @buffer[:presentation_code_top_margin])
  left_margin = " " * @buffer[:presentation_code_left_margin]
  insert(code.gsub(/^/, left_margin))
  beginning_of_buffer
  Window.other_window
end
show_image(img, body) click to toggle source
# File lib/textbringer/modes/presentation_mode.rb, line 101
def show_image(img, body)
  Window.redisplay
  width = CONFIG[:presentation_window_width]
  height = CONFIG[:presentation_window_height]
  if width.nil? || height.nil?
    wininfo = `xwininfo -id $WINDOWID`
    width = wininfo.slice(/Width: (\d+)/, 1).to_i
    height = wininfo.slice(/Height: (\d+)/, 1).to_i
  end
  lines = Window.lines
  columns = Window.columns
  y = @buffer[:presentation_top_margin] +
    (/\A\s*\z/.match(body) ? 3 : body.count("\n") + 5)
  left_margin = @buffer[:presentation_image_left_margin]
  img_width = width * (columns - left_margin * 2) / columns
  img_height = height * (lines - y - 2) / lines
  STDOUT.printf("\e[%d;%dH", y, left_margin + 1)
  img_size = "#{img_width}x#{img_height}"
  img_bg = @buffer[:presentation_image_background]
  options = CONFIG.fetch(:presentation_img2sixel_options, "")
  STDOUT.print(`convert -resize #{img_size} -gravity center -background '#{img_bg}' -extent #{img_size} '#{img}' - | img2sixel #{options} 2> /dev/null`)
  STDOUT.flush
end
show_slide_number(slide_list) click to toggle source
# File lib/textbringer/modes/presentation_mode.rb, line 144
def show_slide_number(slide_list)
  slide = slide_list.current
  msg = "#{slide.number}/#{slide_list.size}"
  message(msg, log: false)
end