Sha256: d4571eb0c519c306519717eb0d56a5bc2190fb08ef5925a5a2e28c36e406005c

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

require 'redcarpet'
require 'ostruct'
require 'yaml'

module Marksman
  class Parser

    def parse(file)
      metadata, markdown = load_file(file)
      slides = split_slides(markdown).map do |slide|
        sections = separate_presenter_notes(slide)
        Slide.new(
          slide: generate_html(sections.slide).strip,
          notes: generate_html(sections.notes).strip
        )
      end

      Presentation.new(filename: File.basename(file), metadata: metadata, slides: slides)
    end

    private

    def load_file(file)
      content = File.read(file)
      if content.match /^(---\s*\n.*?\n?)^(?:---\s*$\n?)(.*)/m
        [parse_yaml($1), $2]
      else
        [{}, content]
      end
    end

    def parse_yaml(data)
      yaml = YAML.load(data)
      yaml.keys.each do |key|
        yaml[key.to_sym] = yaml.delete key
      end
      yaml
    end

    def separate_presenter_notes(slide)
      sections = slide.split(/^(?:\*{1}\s?){3,}\s*$/).each(&:strip)
      Slide.new(slide: sections[0], notes: sections[1])
    end

    def split_slides(markdown)
      slides = markdown.split(/^(?:[-]{1}\s?){3,}\s*$/).each(&:strip)
    end

    def generate_html(slide)
      markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML,{fenced_code_blocks: true})
      markdown.render(slide || '')
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
marksman-0.1 lib/marksman/parser.rb