class Octopress::Ink::Plugin

Constants

DEFAULT_CONFIG

Attributes

assets_path[R]
bootstrap[R]
description[R]
docs[R]
files[R]
files_dir[R]
fonts[R]
gem[R]
images[R]
images_dir[R]
includes[R]
includes_dir[R]
javascripts_dir[R]
layouts[R]
layouts_dir[R]
local[R]
name[R]
pages[R]
path[R]
source_url[R]
stylesheets_dir[R]
templates[R]
templates_dir[R]
type[R]
version[R]
website[R]

Public Class Methods

new(options) click to toggle source
# File lib/octopress-ink/plugin.rb, line 18
def initialize(options)
  @options = Jekyll::Utils.symbolize_hash_keys(options || configuration)

  DEFAULT_CONFIG.merge(options).each { |k,v| set_config(k,v) }

  @layouts_dir       = 'layouts'
  @files_dir         = 'files'
  @pages_dir         = 'pages'
  @docs_dir          = 'docs'
  @fonts_dir         = 'fonts'
  @images_dir        = 'images'
  @includes_dir      = 'includes'
  @javascripts_dir   = 'javascripts'
  @stylesheets_dir   = 'stylesheets'
  @templates_dir     = 'templates'
  @slug            ||= @name
  @assets_path     ||= File.join(@path, 'assets')
end

Public Instance Methods

add_asset_files(options) click to toggle source

Add asset files which aren’t disabled

# File lib/octopress-ink/plugin.rb, line 98
def add_asset_files(options)
  select_assets(options).each do |name, assets|
    next if name == 'config-file'
    assets.each {|file| file.add unless file.disabled? }
  end
end
add_template_pages() click to toggle source

Plugin authors override with template page adding

# File lib/octopress-ink/plugin.rb, line 107
def add_template_pages; end
config(lang=nil) click to toggle source

Plugin configuration

returns: Hash of merged user and default config.yml files

# File lib/octopress-ink/plugin.rb, line 155
def config(lang=nil)
  if lang
    lang_config_hash[lang] || read_config
  else
    read_config
  end
end
copy_asset_files(path, options) click to toggle source

Copy asset files to plugin override path

# File lib/octopress-ink/plugin.rb, line 111
def copy_asset_files(path, options)
  copied = []

  select_assets(options).each do |name, assets|
    next if name == 'user-lang-configs'
    assets.each { |a| copied << a.copy(path) }
  end

  copied.compact
end
find_page(path) click to toggle source
# File lib/octopress-ink/plugin.rb, line 228
def find_page(path)
  @pages.find {|page| page.filename == path }
end
include(file) click to toggle source
# File lib/octopress-ink/plugin.rb, line 224
def include(file)
  Pathname.new(@includes.find{|i| i.filename == file }.path)
end
javascripts() click to toggle source
# File lib/octopress-ink/plugin.rb, line 139
def javascripts
  sort(js.clone.concat(coffee), config['order_js'] || [])
end
lang_config_files(dir) click to toggle source
# File lib/octopress-ink/plugin.rb, line 205
def lang_config_files(dir)
  configs = {}
  if defined?(Octopress::Multilingual) && Octopress.site.config['lang']
    files = Dir[File.join(dir, 'config_*.yml')]
    files.each do |file|
      # Determine the language from the filename pattern: conifg_[lang].yml
      lang = File.basename(file, '.*').split('_').last
      configs[lang] = file
    end
  end
  configs
end
lang_config_hash() click to toggle source

Language configurations

returns: Hash of configs for files matching: conifg_.yml

Example:
{ 
  'de' => { configs },
  'fr' => { configs }
}
# File lib/octopress-ink/plugin.rb, line 177
def lang_config_hash
  @lang_config_hash ||= begin 
    configs = {}

    user_lang_configs.each do |lang, file|
      configs[lang] = Jekyll::Utils.deep_merge_hashes(config, SafeYAML.load_file(file))
    end

    plugin_lang_configs.each do |lang, file|
      # Add to lang
      @lang_configs << Assets::LangConfig.new(self, File.basename(file), lang)
      configs[lang] = Jekyll::Utils.deep_merge_hashes(config, @lang_configs.last.read)
    end

    configs
  end
end
list(options={}) click to toggle source

List info about plugin’s assets

returs: String filled with asset info

# File lib/octopress-ink/plugin.rb, line 88
def list(options={})
  if options['minimal']
    minimal_list
  else
    detailed_list(options)
  end
end
no_compress_js() click to toggle source
# File lib/octopress-ink/plugin.rb, line 143
def no_compress_js
  @no_compress_js.reject(&:disabled?).compact
end
plugin_lang_configs() click to toggle source
# File lib/octopress-ink/plugin.rb, line 195
def plugin_lang_configs
  lang_config_files(@assets_path)
end
read_config() click to toggle source
# File lib/octopress-ink/plugin.rb, line 163
def read_config
  @config ||= configs.first.read
end
register() click to toggle source
# File lib/octopress-ink/plugin.rb, line 53
def register
  reset
  unless @assets_path.nil?
    disable_assets
    add_assets
    add_images

    if Octopress::Docs.enabled?
      add_docs
    end

    if Octopress::Ink.enabled?
      add_includes
      add_layouts
      add_javascripts
      add_stylesheets
      add_fonts
      add_files
      add_pages
      add_templates
      bootstrap_plugin if @bootstrap
    end
  end
end
remove_jekyll_assets(files) click to toggle source

Remove files from Jekyll since they’ll be proccessed by Ink instead

# File lib/octopress-ink/plugin.rb, line 220
def remove_jekyll_assets(files)
  files.each {|f| f.remove_jekyll_asset }
end
reset() click to toggle source
# File lib/octopress-ink/plugin.rb, line 37
def reset
  @lang_configs      = []
  @layouts           = []
  @includes          = []
  @css               = []
  @js                = []
  @no_compress_js    = []
  @coffee            = []
  @images            = []
  @sass              = []
  @fonts             = []
  @files             = []
  @pages             = []
  @templates         = []
end
slug() click to toggle source

Themes should always have the slug “theme”

# File lib/octopress-ink/plugin.rb, line 80
def slug
  Filters.sluggify @type == 'theme' ? 'theme' : @slug
end
sort(files, config) click to toggle source
# File lib/octopress-ink/plugin.rb, line 122
def sort(files, config)
  sorted = []
  config.each do |item|
    files.each do |file|
      sorted << files.delete(file) if file.path.to_s.include? item
    end
  end

  sorted.concat files
end
stylesheets() click to toggle source

stylesheets should include Sass and CSS

# File lib/octopress-ink/plugin.rb, line 135
def stylesheets
  sort(css.clone.concat(sass_without_partials), config['order_css'] || [])
end
user_lang_configs() click to toggle source
# File lib/octopress-ink/plugin.rb, line 199
def user_lang_configs
  files = lang_config_files(user_plugin_dir)
  plugin_lang_configs.keys.each {|k| files.delete(k)}
  files
end
user_plugin_dir() click to toggle source
# File lib/octopress-ink/plugin.rb, line 147
def user_plugin_dir
  File.join(Plugins.custom_dir, slug)
end

Private Instance Methods

add_assets() click to toggle source
# File lib/octopress-ink/plugin.rb, line 567
def add_assets; end
add_docs() click to toggle source
# File lib/octopress-ink/plugin.rb, line 474
def add_docs
  Octopress::Docs.add_plugin_docs(self)
end
add_files() click to toggle source
# File lib/octopress-ink/plugin.rb, line 478
def add_files
  @files = add_new_assets(@files_dir, Assets::FileAsset)
end
add_fonts() click to toggle source
# File lib/octopress-ink/plugin.rb, line 492
def add_fonts
  @fonts = add_new_assets(@fonts_dir, Assets::Asset)
end
add_images() click to toggle source
# File lib/octopress-ink/plugin.rb, line 496
def add_images
  @images = add_new_assets(@images_dir, Assets::Asset)
end
add_includes() click to toggle source
# File lib/octopress-ink/plugin.rb, line 448
def add_includes
  @includes = add_new_assets(@includes_dir, Assets::Asset)
end
add_javascripts() click to toggle source
# File lib/octopress-ink/plugin.rb, line 482
def add_javascripts
  find_assets(@javascripts_dir).each do |asset|
    if asset.end_with?('js')
      @js << Assets::Javascript.new(self, @javascripts_dir, asset)
    elsif asset.end_with?('coffee')
      @coffee << Assets::Coffeescript.new(self, @javascripts_dir, asset)
    end
  end
end
add_layouts() click to toggle source
# File lib/octopress-ink/plugin.rb, line 444
def add_layouts
  @layouts = add_new_assets(@layouts_dir, Assets::Layout)
end
add_new_assets(dir, asset_type) click to toggle source
# File lib/octopress-ink/plugin.rb, line 500
def add_new_assets(dir, asset_type)
  find_assets(dir).map do |asset|
    asset_type.new(self, dir, asset)
  end
end
add_pages() click to toggle source
# File lib/octopress-ink/plugin.rb, line 452
def add_pages
  @pages = add_new_assets(@pages_dir, Assets::PageAsset)
end
add_stylesheets() click to toggle source
# File lib/octopress-ink/plugin.rb, line 434
def add_stylesheets
  find_assets(@stylesheets_dir).each do |asset|
    if File.extname(asset) =~ /s[ca]ss/
      @sass << Assets::Sass.new(self, @stylesheets_dir, asset)
    else
      @css << Assets::Stylesheet.new(self, @stylesheets_dir, asset)
    end
  end
end
add_template_page(template, data={}) click to toggle source
# File lib/octopress-ink/plugin.rb, line 461
def add_template_page(template, data={})
  template = find_template(template) if template.is_a? String
  unless template.nil?
    page = template.new_page(data)
    Octopress.site.pages << page
    page
  end
end
add_templates() click to toggle source
# File lib/octopress-ink/plugin.rb, line 456
def add_templates
  @templates = add_new_assets(@templates_dir, Assets::Template)
  add_template_pages
end
asset_list(assets, heading) click to toggle source
# File lib/octopress-ink/plugin.rb, line 327
def asset_list(assets, heading)
  list = " #{heading}:\n".bold
  assets.each do |asset|
    list << "#{asset.info.rstrip}\n"
  end

  list
end
assets() click to toggle source
# File lib/octopress-ink/plugin.rb, line 270
def assets
  {
    'layouts'      => @layouts,
    'includes'     => @includes,
    'templates'    => @templates,
    'pages'        => @pages,
    'sass'         => @sass,
    'css'          => @css,
    'js'           => @js,
    'minjs'        => @no_compress_js,
    'coffee'       => @coffee,
    'images'       => @images,
    'fonts'        => @fonts,
    'files'        => @files,
    'config-file'  => @configs,
    'lang-configs' => @lang_configs
  }
end
assets_list(options) click to toggle source

Return information about each asset

# File lib/octopress-ink/plugin.rb, line 290
def assets_list(options)
  message = ''
  no_assets = []

  select_assets(options).each do |name, assets|
    next if assets.compact.size == 0

    case name
    when 'pages'
      header = "pages:".ljust(36).bold + "urls"
      message << asset_list(assets.sort_by(&:file), header)
    when 'config-file'
      message << " config:\n".bold
      message << Ink::Utils.pretty_print_yaml(@config)
      message << "\n"

      lang_config_hash.keys.each do |lang|
        message << "\n"
        message << " config_#{lang}:\n".bold
        message << Ink::Utils.pretty_print_yaml(config(lang))
      end

    # Lang configs are listed above with the config hash, ensuring
    # that user configured files can be listed even if the plugin
    # does not ship with alternate language config files
    #
    when 'lang-configs'; next
    else
      message << asset_list(assets, name)
    end

    message << "\n"
  end

  message
end
can_disable() click to toggle source
# File lib/octopress-ink/plugin.rb, line 254
def can_disable
  [
    'pages',
    'templates',
    'sass',
    'css',
    'stylesheets',
    'javascripts',
    'js',
    'coffee',
    'images',
    'fonts',
    'files'
  ]
end
coffee() click to toggle source
# File lib/octopress-ink/plugin.rb, line 552
def coffee
  @coffee.reject(&:disabled?).compact
end
configs() click to toggle source
# File lib/octopress-ink/plugin.rb, line 430
def configs
  @configs ||= [Assets::Config.new(self, 'config.yml')]
end
configuration() click to toggle source
# File lib/octopress-ink/plugin.rb, line 556
def configuration; {}; end
css() click to toggle source
# File lib/octopress-ink/plugin.rb, line 523
def css
  @css.reject(&:disabled?).compact
end
detailed_list(options) click to toggle source
# File lib/octopress-ink/plugin.rb, line 346
def detailed_list(options)
  list = assets_list(options)
  return '' if list.empty?

  name = "Plugin: #{@name.bold}"
  name += " (theme)" if @type == 'theme'
  name += " - v#{@version}" if @version
  name  = name
  message = name
  message += "\nSlug: #{slug}"

  if @website && !@website.empty?
    message += "\n#{@website}"
  end

  if @description && !@description.empty?
    message += %Q{\n"#{@description}"}
  end

  lines = ''
  80.times { lines += '=' }

  message = "\n#{message}\n#{lines}\n"
  message += list
  message += "\n"
end
disable_assets() click to toggle source
# File lib/octopress-ink/plugin.rb, line 238
def disable_assets
  disabled = []
  config['disable'] ||= {}
  config['disable'].each do |key,val|
    next unless can_disable.include? key
    if !!val == val
      disabled << key if val
    elsif val.is_a? Array
      val.each { |v| disabled << File.join(key, v) }
    elsif val.is_a? String
      disabled << File.join(key, val)
    end
  end
  config['disable'] = disabled
end
find_assets(dir) click to toggle source
# File lib/octopress-ink/plugin.rb, line 506
def find_assets(dir)
  full_dir = File.join(@assets_path, dir)
  glob_assets(full_dir).map do |file|
    file.sub(File.join(full_dir, ''), '')
  end
end
find_template(file) click to toggle source
# File lib/octopress-ink/plugin.rb, line 470
def find_template(file)
  @templates.find { |t| t.filename == file }
end
get_paths(files) click to toggle source
# File lib/octopress-ink/plugin.rb, line 234
def get_paths(files)
  files.dup.map { |f| f.path }.compact
end
glob_assets(dir) click to toggle source
# File lib/octopress-ink/plugin.rb, line 513
def glob_assets(dir)
  return [] unless Dir.exist? dir
  Find.find(dir).to_a.reject do |file|
    # Don't match directories or
    # Files which begin or end with non-alpha characters
    # like: .hidden_file or emacs.backup~
    File.directory?(file) || !File.basename(file).match(/^\w.+?\w$/)
  end
end
js() click to toggle source
# File lib/octopress-ink/plugin.rb, line 548
def js
  @js.reject(&:disabled?).compact
end
minimal_list() click to toggle source
# File lib/octopress-ink/plugin.rb, line 336
def minimal_list
  message = "#{@name.bold}"
  message += ", v#{@version}" if @version
  message += " (slug: #{slug})"
  if @description && !@description.empty?
    message = %Q{\n  #{message.ljust(30)}\n    "#{@description}"}
  end
  message += "\n"
end
pad_line(line) click to toggle source
# File lib/octopress-ink/plugin.rb, line 373
def pad_line(line)
  line = "| #{line.ljust(76)} |"
end
sass() click to toggle source
# File lib/octopress-ink/plugin.rb, line 527
def sass
  @sass.reject(&:disabled?).compact
end
sass_without_partials() click to toggle source

Internal: Remove Sass partials from Sass assets. Partials can be in “stylesheets” or its sub-directories.

Examples

_partial.scss is rejected
dir/_partial.scss is rejected
dir/dir/_partial.scss is rejected
snake_case.scss is not rejected
dir/snake_case.scss is not rejected
dir/dir/snake_case.scss is not rejected

Returns Sass assets not including partials.

# File lib/octopress-ink/plugin.rb, line 544
def sass_without_partials
  sass.reject { |f| File.basename(f.file).start_with?('_') }
end
select_assets(asset_types) click to toggle source

Return selected assets

input: options (an array [‘type’,…], hash {‘type’=>true} or string of asset types)

Output a hash of assets instances {‘files’ => @files }

# File lib/octopress-ink/plugin.rb, line 384
def select_assets(asset_types)

  # Accept options from the CLI (as a hash of asset_name: true)
  # Or from Ink modules as an array of asset names
  #
  if asset_types.is_a? Hash

    # Show Sass and CSS when 'stylesheets' is chosen
    if asset_types['stylesheets']
      asset_types['css'] = true
      asset_types['sass'] = true
      asset_types.delete('stylesheets')
    end

    if asset_types['javascripts']
      asset_types['js'] = true
      asset_types['minjs'] = true
      asset_types['coffee'] = true
      asset_types.delete('javascripts')
    end

    asset_types = asset_types.keys
  end

  # Args should allow a single asset as a string too
  #
  if asset_types.is_a? String
    asset_types = [asset_types]
  end

  # Match asset_types against list of assets and
  # remove asset_types which don't belong
  #
  asset_types.select!{|asset| assets.include?(asset)}

  # If there are no asset_types, return all assets
  # This will happen if list command is used with
  # no filtering arguments
  #
  if asset_types.nil? || asset_types.empty?
    assets
  else
    assets.select{|k,v| asset_types.include?(k)}
  end
end
set_config(name, value) click to toggle source
# File lib/octopress-ink/plugin.rb, line 558
      def set_config(name, value)
        instance_variable_set("@#{name}", value)
        instance_eval(<<-EOS, __FILE__, __LINE__ + 1)
          def #{name}
            @#{name}
          end
        EOS
      end