class Cheatset::Creator

Public Class Methods

new(cheatsheet, filename) click to toggle source
# File lib/cheatset/creator.rb, line 10
def initialize(cheatsheet, filename)
  @cheatsheet = cheatsheet
  @filename = filename
  @docset_path = "#{@cheatsheet.docset_file_name}.docset"
  @path = "#{@docset_path}/Contents/"
end

Public Instance Methods

generate() click to toggle source
# File lib/cheatset/creator.rb, line 17
def generate
  FileUtils.rm_rf(@path)
  FileUtils.mkdir_p(@path)
  generate_html_file
  generate_plist_file
  generate_database
end

Private Instance Methods

generate_database() click to toggle source
# File lib/cheatset/creator.rb, line 74
  def generate_database
    sqlite_file = "#{@path}Resources/docSet.dsidx"
    db = SQLite3::Database.new(sqlite_file)
    db.busy_timeout = 100;
    db.execute <<-SQL
      CREATE TABLE searchIndex(id INTEGER PRIMARY KEY, name TEXT,
                               type TEXT, path TEXT);
      CREATE UNIQUE INDEX anchor ON searchIndex (name, type, path);
    SQL

    sql = 'INSERT INTO searchIndex(name, type, path) VALUES (?, ?, ?)'
    db.execute(sql, @cheatsheet.title, 'Category',
               "index.html")

    @cheatsheet.categories.each do |category|
      category_strip = CGI.escape(category.id.strip).gsub(/\//, '%252F').gsub(/\+/, '%20');
      if @cheatsheet.title != category.id
        db.execute(sql, category.id, 'Category',
                 "index.html\#//dash_ref/Category/#{category_strip}/1")
      end
      category.entries.each_with_index do |entry, index|
        first_command = nil;
        if entry.command && entry.command.length > 0
          first_command = entry.command.first
        end
        href = (entry.name || entry.index_name) ? "index.html\#//dash_ref_#{category_strip}/Entry/#{CGI.escape((entry.index_name) ? entry.index_name.strip : entry.tags_stripped_name.strip).gsub(/\//, '%252F').gsub(/\+/, '%20')}/0" : (first_command) ? "index.html\#//dash_ref_#{category_strip}/Command/#{URI.escape(first_command).gsub(/\//, '%252F').gsub(/\+/, '%20')}/0" : ""
        if entry.command
          entry.command.each do |command|
            if(!command.strip.empty? && !entry.not_in_main_index)
              db.execute(sql, command.strip, 'Command', href)
            end
          end
        end
        if entry.td_command
          entry.td_command.each do |command|
            if(!command.strip.empty? && !entry.not_in_main_index)
              db.execute(sql, command.strip, 'Command', href)
            end
          end
        end
        if entry.name || entry.index_name
          if(!entry.not_in_main_index)
            db.execute(sql, (entry.index_name) ? entry.index_name.strip : entry.tags_stripped_name.strip, 'Entry', href)
          end
        end
        if entry.extra_index_name
          entry.extra_index_name.each do |extra_index_name|
            db.execute(sql, extra_index_name.strip, 'Entry', href)
          end
        end
      end
    end
  end
generate_html_file() click to toggle source
# File lib/cheatset/creator.rb, line 31
def generate_html_file
  # HTML
  template = File.read("#{tpl_path}/template.haml")
  engine = Haml::Engine.new(template)
  out = engine.render(@cheatsheet)
  doc_path = "#{@path}Resources/Documents/"
  FileUtils.mkdir_p(doc_path)
  File.open("#{doc_path}index.html", 'w') { |file| file.write(out) }

  # (static) CSS
  FileUtils.cp("#{tpl_path}/style.css", doc_path)

  # resources
  FileUtils.cp_r("#{tpl_path}/cheatset_resources", doc_path)
  resources = @cheatsheet.resources
  if resources && !resources.empty?
    if Pathname.new(resources).absolute?
      resources_path = resources
    else
      base_dir = File.dirname(@filename)
      resources_path = "#{base_dir}/#{resources}"
    end

    FileUtils.cp_r(resources_path, doc_path)
  end
end
generate_plist_file() click to toggle source
# File lib/cheatset/creator.rb, line 58
def generate_plist_file
  plist_data = {
    'CFBundleIdentifier' => 'cheatsheet',
    'CFBundleName' => (@cheatsheet.title) ? @cheatsheet.title : 'No Title',
    'DocSetPlatformFamily' => 'cheatsheet',
    'DashDocSetFamily' => 'cheatsheet',
    'isDashDocset' => true,
    'dashIndexFilePath' => 'index.html',
    'DashDocSetPluginKeyword' => (@cheatsheet.platform) ? @cheatsheet.platform : (@cheatsheet.keyword) ? @cheatsheet.keyword : 'cheatsheet',
    'DashDocSetKeyword' => (@cheatsheet.keyword) ? @cheatsheet.keyword : 'cheatsheet'
  }
  File.open("#{@path}Info.plist", 'w') do |file|
    file.write(Plist::Emit.dump(plist_data))
  end
end
tpl_path() click to toggle source
# File lib/cheatset/creator.rb, line 27
def tpl_path
  File.expand_path('../templates', __FILE__)
end