class Vimdeck::Slideshow

Public Class Methods

generate(filename, options) click to toggle source
# File lib/vimdeck.rb, line 155
def self.generate(filename, options)
  @options = options
  extension = options[:no_filetype] ? ".txt" : ".md"
  if options[:dos_newlines]
    $nl = "\r\n"
  end
  slides = File.read(filename)

  renderer = Redcarpet::Markdown.new(Vimdeck::Render, :fenced_code_blocks => true)
  Dir.mkdir("presentation") unless File.exists?("presentation")
  @buffers = []

  # Slide separator is 3 newlines
  slides = slides.split(/(?:\r\n?|\n)(?:\r\n?|\n)(?:\r\n?|\n)/)
  i = 0
  slides.each do |slide|
    # Pad file names with zeros. e.g. slide001.md, slide023.md, etc.
    slide_num = "%03d" % (i+1)
    slide = renderer.render(slide)

    regex = /\<\@\~(.*?)\~\@\>/m
    match = slide.match(regex)
    while match && match[1] && match.post_match do
      list = match[1].split(/\r\n?|\n/)
      j = 0
      list = list.map do |li|
        j += 1
        "#{j}. #{li}"
      end
      slide.sub!(regex, list.join($nl))
      match = match.post_match.match(regex)
    end

    regex = /\<\!\~(.*?)\~\!\>/m
    match = slide.match(regex)
    while match && match[1] && match.post_match do
      list = match[1].split(/\r\n?|\n/)
      list = list.map do |li|
        "\u2022 #{li}"
      end
      slide.sub!(regex, list.join($nl))
      match = match.post_match.match(regex)
    end

    # buffer gets stashed into @buffers array for script template
    # needs to track things like the buffer number, code highlighting
    # and focus/unfocus stuff
    buffer = {:num => i + 1}
    code_height = 0
    code = nil
    code = slide.match( /```([^\r\n]*)(\r\n?|\n).*(\r\n?|\n)```/m )
    if code
      buffer[:code] = []
      code_hash = { :language => code[1] }
      code_height = code[0].split(/\r\n?|\n/).length - 2
      code = code[0].gsub( /```[^\r\n]*(\r\n?|\n)/, '' ).gsub( /(\r\n?|\n)```/, '' )
      slide = slide.gsub( /```[^\r\n]*(\r\n?|\n)/, '' ).gsub( /(\r\n?|\n)```/, '' )

      if code_height > 0
        start = slide.index(code)
        start = slide[0..start].split(/\r\n?|\n/).length
        code_hash[:end] = code_height + start - 1
        code_hash[:start] = start
      end
      buffer[:code] << code_hash
    end

    # Prepending each line with slide_padding
    # Removing trailing spaces
    # Add newlines at end of the file to hide the slide identifier
    slide = slide_padding + slide.gsub( /\r\n?|\n/, "#{$nl}#{slide_padding}" ).gsub( / *$/, "" ) + ($nl * 80) + "slide #{slide_num}"

    # Buffers comments refers to items that need to be less focused/"unhighlighted"
    # We add a regex to the vimscript for each slide with "comments"
    # We use the hidden slide identifier to differentiate between slides
    regex = /\{\~(.*?)\~\}/m
    match = slide.match(regex)
    buffer[:comments] = []
    while match && match[1] && match.post_match do
      slide.sub!(regex, match[1])
      pattern = match[1] + "||(||_.*slide #{slide_num}||)||@="
      buffer[:comments] << pattern.gsub(/\r\n?|\n/, "||n").gsub(/\[/, "||[").gsub(/\]/, "||]").gsub(/\|/, "\\").gsub(/\"/, "\\\"")
      match = match.post_match.match(regex)
    end

    File.open("presentation/slide#{slide_num}#{extension}", "w") do |file|
      file.write("#{slide}#{$nl}")
    end

    @buffers << buffer
    i += 1
  end

  File.open("presentation/script.vim", "w") do |file|
    file.write script_template
  end
end
open() click to toggle source
# File lib/vimdeck.rb, line 253
def self.open
  extension = @options[:no_filetype] ? ".txt" : ".md"
  editor = options[:editor] || "vim"
  exec "#{editor} presentation/*#{extension} -S presentation/script.vim"
end
options() click to toggle source
# File lib/vimdeck.rb, line 134
def self.options
  @options
end
script_template() click to toggle source
# File lib/vimdeck.rb, line 150
def self.script_template
  template = ERB.new(File.read(File.dirname(__FILE__) + "/templates/script.vim.erb"), nil, '-')
  template.result(binding)
end
slide_padding() click to toggle source
# File lib/vimdeck.rb, line 138
def self.slide_padding
  padding = "        "

  if @options[:no_indent]
    padding = ""
  elsif @options[:padding]
    padding *= @options[:padding]
  end

  padding
end
start(filename, options) click to toggle source
# File lib/vimdeck.rb, line 259
def self.start(filename, options)
  generate(filename, options)
  open
end