class Showoff::Config

Public Class Methods

expand_sections() click to toggle source

Expand and normalize all the different variations that the sections structure can exist in. When finished, this should return an ordered hash of one or more section titles pointing to an array of filenames, for example:

{

"Section name": [ "array.md, "of.md, "files.md"],
"Another Section": [ "two/array.md, "two/of.md, "two/files.md"],

}

See valid input forms at

https://puppetlabs.github.io/showoff/documentation/PRESENTATION_rdoc.html#label-Defining+slides+using+the+sections+setting.

Source:

https://github.com/puppetlabs/showoff/blob/3f43754c84f97be4284bb34f9bc7c42175d45226/lib/showoff_utils.rb#L427-L475
# File lib/showoff/config.rb, line 63
def self.expand_sections
  begin
    if @@config.is_a?(Hash)
      # dup so we don't overwrite the original data structure and make it impossible to re-localize
      sections = @@config['sections'].dup
    else
      sections = @@config.dup
    end

    if sections.is_a? Array
      sections = self.legacy_sections(sections)
    elsif sections.is_a? Hash
      raise "Named sections are unsupported on Ruby versions less than 1.9." if RUBY_VERSION.start_with? '1.8'
      sections.each do |key, value|
        next if value.is_a? Array
        path = File.dirname(value)
        data = JSON.parse(File.read(File.join(@@root, value)))
        raise "The section file #{value} must contain an array of filenames." unless data.is_a? Array

        # get relative paths to each slide in the array
        sections[key] = data.map do |filename|
          Pathname.new("#{path}/#{filename}").cleanpath.to_path
        end
      end
    else
      raise "The `sections` key must be an Array or Hash, not a #{sections.class}."
    end

  rescue => e
    Showoff::Logger.error "There was a problem with the presentation file #{index}"
    Showoff::Logger.error e.message
    Showoff::Logger.debug e.backtrace
    sections = {}
  end

  sections
end
get(*setting) click to toggle source

Retrieve settings from the config hash. If multiple arguments are given then it will dig down through data structures argument by argument.

Returns the data type & value requested, nil on error.

# File lib/showoff/config.rb, line 14
def self.get(*setting)
  @@config.dig(*setting) rescue nil
end
includeNotes?(section) click to toggle source

Identifies whether we’re including a given notes section

@param section [String] The name of the notes section of interest. @return [Boolean] Whether to include this section in the output

# File lib/showoff/config.rb, line 36
def self.includeNotes?(section)
  return true # todo make this work
end
keys() click to toggle source
# File lib/showoff/config.rb, line 5
def self.keys
  @@config.keys
end
legacy_sections(data) click to toggle source

Source:

https://github.com/puppetlabs/showoff/blob/3f43754c84f97be4284bb34f9bc7c42175d45226/lib/showoff_utils.rb#L477-L545
# File lib/showoff/config.rb, line 103
def self.legacy_sections(data)
  # each entry in sections can be:
  # - "filename.md"
  # - "directory"
  # - { "section": "filename.md" }
  # - { "section": "directory" }
  # - { "section": [ "array.md, "of.md, "files.md"] }
  # - { "include": "sections.json" }
  sections = {}
  counters = {}
  lastpath = nil

  data.map do |entry|
    next entry if entry.is_a? String
    next nil unless entry.is_a? Hash
    next entry['section'] if entry.include? 'section'

    section = nil
    if entry.include? 'include'
      file = entry['include']
      path = File.dirname(file)
      data = JSON.parse(File.read(File.join(@@root, file)))
      if data.is_a? Array
        if path == '.'
          section = data
        else
          section = data.map do |source|
            "#{path}/#{source}"
          end
        end
      end
    end
    section
  end.flatten.compact.each do |entry|
    # We do this in two passes simply because most of it was already done
    # and I don't want to waste time on legacy functionality.

    # Normalize to a proper path from presentation root
    if File.directory? File.join(@@root, entry)
      sections[entry] = Dir.glob("#{@@root}/#{entry}/**/*.md").map {|e| e.sub(/^#{@@root}\//, '') }
      lastpath = entry
    else
      path = File.dirname(entry)

      # this lastpath business allows us to reference files in a directory that aren't
      # necessarily contiguous.
      if path != lastpath
        counters[path] ||= 0
        counters[path]  += 1
      end

      # now record the last path we've seen
      lastpath = path

      # and if there are more than one disparate occurences of path, add a counter to this string
      path = "#{path} (#{counters[path]})" unless counters[path] == 1

      sections[path] ||= []
      sections[path]  << entry
    end
  end

  sections
end
load(path = 'showoff.json') click to toggle source
# File lib/showoff/config.rb, line 40
def self.load(path = 'showoff.json')
  raise 'Presentation file does not exist at the specified path' unless File.exist? path

  @@root     = File.dirname(path)
  @@config   = JSON.parse(File.read(path))
  @@sections = self.expand_sections

  self.load_defaults!
end
load_defaults!() click to toggle source
# File lib/showoff/config.rb, line 168
def self.load_defaults!
  # use a symbol which cannot clash with a string key loaded from json
  @@config['markdown'] ||= :default
  renderer = @@config['markdown']
  defaults = case renderer
    when 'rdiscount'
      {
        :autolink          => true,
      }
    when 'maruku'
      {
        :use_tex           => false,
        :png_dir           => 'images',
        :html_png_url      => '/file/images/',
      }
    when 'bluecloth'
      {
        :auto_links        => true,
        :definition_lists  => true,
        :superscript       => true,
        :tables            => true,
      }
    when 'kramdown'
      {}
    else
      {
        :autolink          => true,
        :no_intra_emphasis => true,
        :superscript       => true,
        :tables            => true,
        :underline         => true,
        :escape_html       => false,
      }
    end

  @@config[renderer] ||= {}
  @@config[renderer]   = defaults.merge!(@@config[renderer])

  # run `wkhtmltopdf --extended-help` for a full list of valid options here
  pdf_defaults = {
    :page_size        => 'Letter',
    :orientation      => 'Portrait',
    :print_media_type => true,
    :quiet            => false}
  pdf_options = @@config['pdf_options'] || {}
  pdf_options = Hash[pdf_options.map {|k, v| [k.to_sym, v]}]

  @@config['pdf_options'] = pdf_defaults.merge!(pdf_options)
end
path(path) click to toggle source

Relative path to an item in the presentation directory structure

# File lib/showoff/config.rb, line 28
def self.path(path)
  File.expand_path(File.join(@@root, path)).sub(/^#{@@root}\//, '')
end
root() click to toggle source

Absolute root of presentation

# File lib/showoff/config.rb, line 23
def self.root
  @@root
end
sections() click to toggle source
# File lib/showoff/config.rb, line 18
def self.sections
  @@sections
end