lib/octopress-ink/plugin.rb in octopress-ink-1.0.0.alpha.33 vs lib/octopress-ink/plugin.rb in octopress-ink-1.0.0.alpha.34
- old
+ new
@@ -1,235 +1,340 @@
require 'find'
module Octopress
module Ink
class Plugin
- attr_accessor :name, :type, :asset_override, :assets_path,
- :layouts_dir, :stylesheets_dir, :javascripts_dir, :files_dir, :includes_dir, :images_dir,
- :layouts, :includes, :stylesheets, :javascripts, :images, :sass, :fonts, :files, :pages,
- :website, :description, :version
+ attr_accessor :name, :type, :assets_path,
+ :layouts_dir, :css_dir, :javascripts_dir, :files_dir, :includes_dir, :images_dir,
+ :layouts, :includes, :images, :fonts, :files, :pages, :docs,
+ :website, :description, :version, :config
def initialize(name, type)
@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'
- @plugins_dir = 'plugins'
+ @css_dir = 'stylesheets'
+ @sass_dir = 'stylesheets'
@config_file = 'config.yml'
@name = name
@type = type
@layouts = []
- @includes = {}
- @stylesheets = []
+ @includes = []
+ @css = []
@javascripts = []
@images = []
@sass = []
+ @docs = []
@fonts = []
@files = []
@pages = []
@version ||= false
@description ||= false
@website ||= false
- add_assets
- add_layouts
- add_pages
- add_includes
- add_config
- require_plugins
end
+ def register
+ unless @assets_path.nil?
+ add_config
+ disable_assets
+ add_assets
+ add_layouts
+ add_includes
+ add_javascripts
+ add_fonts
+ add_images
+ add_docs
+ add_files
+ add_pages
+ end
+ end
+
def add_assets; end
+ def stylesheets
+ css.clone.concat sass
+ end
+
def add_config
- @config_file = Assets::Config.new(self, @config_file)
+ @config = Assets::Config.new(self, @config_file).read
end
- def slug
- if @type == 'local_plugin'
- ''
- else
- @type == 'theme' ? @type : @name
+ 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
+ def disabled?(dir, file)
+ @config['disable'].include?(dir) || @config['disable'].include?(File.join(dir, file))
+ end
+
+ def slug
+ @type == 'theme' ? @type : @name
+ end
+
+ def docs_base_path
+ type = @type == 'plugin' ? 'plugins' : @type
+ File.join('docs', type, @name)
+ end
+
+ def can_disable
+ [
+ 'pages',
+ 'sass',
+ 'css',
+ 'stylesheets',
+ 'javascripts',
+ 'images',
+ 'fonts',
+ 'files'
+ ]
+ end
+
def assets
{
+ 'docs' => @docs,
'layouts' => @layouts,
- 'includes' => @includes.values,
+ 'includes' => @includes,
'pages' => @pages,
'sass' => @sass,
- 'stylesheets' => @stylesheets,
+ 'css' => @css,
'javascripts' => @javascripts,
'images' => @images,
'fonts' => @fonts,
'files' => @files
}
end
def info(options={})
- message = @name
- message += " (theme)" if @type == 'theme'
- message += " - v#{@version}" if @version
- message += " - #{@description}" if @description
- message += "\n"
- if options == {}
- asset_types = assets
+ if options['minimal']
+ message = " #{@name}"
+ message += " (theme)" if @type == 'theme'
+ message += " - v#{@version}" if @version
+ if @description
+ message = "#{message.ljust(30)} #{@description}"
+ end
+ message += "\n"
else
- asset_types = assets.select{|k,v| options.keys.include?(k)}
+ asset_info = assets_info(options)
+ return '' if asset_info.empty?
+
+ name = "Plugin: #{@name}"
+ name += " (theme)" if @type == 'theme'
+ name += " - v#{@version}" if @version
+ name = name
+ message = name
+
+ if @description
+ message += "\n#{@description}"
+ end
+
+ lines = ''
+ 80.times { lines += '=' }
+
+ message = "\n#{message}\n#{lines}\n"
+ message += asset_info
+ message += "\n"
end
- asset_types.each do |name, assets|
- if assets.size > 0
- message += "#{name.capitalize}:\n"
- assets.each do |t|
- message += " - #{t.info}\n"
+ end
+
+ def pad_line(line)
+ line = "| #{line.ljust(76)} |"
+ end
+
+ # Return information about each asset
+ def assets_info(options)
+ message = ''
+ no_assets = []
+
+ select_assets(options).each do |name, assets|
+ next if assets.size == 0
+ if name == 'docs'
+ message += " documentation: /#{docs_base_path}/\n"
+ if assets.size > 1
+ assets.each do |asset|
+ message += " - #{asset.info}\n"
+ end
end
- elsif options != {}
- message += "#{name.capitalize}: none\n"
+ else
+ message += " #{name}:\n"
+ assets.each do |asset|
+ message += " - #{asset.info}\n"
+ end
end
+ message += "\n"
end
+
message
end
- def add_stylesheet(file, media=nil)
- @stylesheets << Assets::Stylesheet.new(self, @stylesheets_dir, file, media)
+ # Return selected assets
+ #
+ # input: options (an array ['type',...], hash {'type'=>true}
+ # or string of asset types)
+ #
+ # Output a hash of assets instances {'files' => @files }
+ #
+ def select_assets(asset_types)
+ # Accept options from the CLI (as a hash of asset: true)
+ # Or from Ink modules as an array of asset names
+ #
+ if asset_types.is_a? Hash
+ asset_types = asset_types.keys
+ end
+
+ asset_types = [asset_types] if asset_types.is_a? String
+
+ # Remove options which don't belong
+ #
+ asset_types.select!{|asset| assets.include?(asset)}
+
+ if asset_types.nil? || asset_types.empty?
+ assets
+ else
+ assets.select{|k,v| asset_types.include?(k)}
+ end
end
- def add_sass(file, media=nil)
- @sass << Assets::Sass.new(self, @stylesheets_dir, file, media)
+ def add_layouts
+ @layouts = find_assets(@layouts_dir, Assets::Layout)
end
- def add_javascript(file)
- @javascripts << Assets::Javascript.new(self, @javascripts_dir, file)
+ def add_includes
+ @includes = find_assets(@includes_dir, Assets::Asset)
end
def add_pages
- if @assets_path
- find_assets(File.join(@assets_path, @pages_dir)).each do |file|
- @pages << Assets::PageAsset.new(self, @pages_dir, file)
- end
- end
+ @pages = find_assets(@pages_dir, Assets::PageAsset)
end
- def require_plugins
- if @assets_path
- find_assets(File.join(@assets_path, @plugins_dir)).each do |file|
- require File.join base, file
- end
- end
+ def add_docs
+ @docs = find_assets(@docs_dir, Assets::DocPageAsset)
end
- def find_assets(dir)
- found = []
- if Dir.exist? dir
- Find.find(dir) do |file|
- found << file.sub(dir+'/', '') unless File.directory? file
- end
- end
- found
+ def add_files
+ @files = find_assets(@files_dir, Assets::FileAsset)
end
- def add_layouts
- if @assets_path
- find_assets(File.join(@assets_path, @layouts_dir)).each do |layout|
- @layouts << Assets::Layout.new(self, @layouts_dir, layout)
- end
- end
+ def add_javascripts
+ @javascripts = find_assets(@javascripts_dir, Assets::Javascript)
end
- def remove_jekyll_assets(files)
- files.each {|f| f.remove_jekyll_asset }
+ def add_fonts
+ @fonts = find_assets(@fonts_dir, Assets::Asset)
end
- def add_includes
- if @assets_path
- find_assets(File.join(@assets_path, @includes_dir)).each do |include_file|
- @includes[include_file] = Assets::Asset.new(self, @includes_dir, include_file)
- end
- end
+ def add_images
+ @images = find_assets(@images_dir, Assets::Asset)
end
- def add_image(file)
- @images << Assets::Asset.new(self, @images_dir, file)
+ def find_assets(dir, asset_type)
+ found = []
+ full_dir = File.join(@assets_path, dir)
+ glob_assets(full_dir).each do |file|
+ asset = file.sub(full_dir+'/', '')
+ found << asset_type.new(self, dir, asset)
+ end
+ found
end
- def add_root_files(files)
- files.each { |f| add_root_file(f) }
+ def glob_assets(dir)
+ return [] unless Dir.exist? dir
+ Find.find(dir).to_a.reject {|f| File.directory? f }
end
- def add_root_file(file)
- @files << Assets::RootAsset.new(self, @files_dir, file)
+ def add_css(file, media=nil)
+ @css << Assets::Stylesheet.new(self, @css_dir, file, media)
end
- def add_font(file)
- @fonts << Assets::Asset.new(self, @fonts_dir, file)
+ def add_sass(file, media=nil)
+ @sass << Assets::Sass.new(self, @sass_dir, file, media)
end
- def add_file(file)
- @files << Assets::Asset.new(self, @files_dir, file)
+ def add_css_files(files, media=nil)
+ files.each { |f| add_css(f, media) }
end
- def add_stylesheets(files, media=nil)
- files.each { |f| add_stylesheet(f, media) }
- end
-
def add_sass_files(files, media=nil)
files.each { |f| add_sass(f, media) }
end
- def add_javascripts(files)
- files.each { |f| add_javascript(f) }
+ def remove_jekyll_assets(files)
+ files.each {|f| f.remove_jekyll_asset }
end
- def add_images(files)
- files.each { |f| add_image(f) }
+ def add_asset_files(options)
+ select_assets(options).each do |name, assets|
+ assets.each {|file| file.add unless file.disabled? }
+ end
end
- def add_fonts(files)
- files.each { |f| add_font(f) }
+ def copy_asset_files(path, options)
+ copied = []
+ select_assets(options).each do |name, assets|
+ next if name == 'docs'
+ assets.each { |a| copied << a.copy(path) }
+ end
+ copied
end
- def add_files(files)
- files.each { |f| add_file(f) }
- end
-
def stylesheet_paths
- get_paths @stylesheets
+ get_paths @css.reject{|f| f.disabled? }
end
def javascript_paths
- get_paths @javascripts
+ get_paths @javascripts.reject{|f| f.disabled? }
end
def stylesheet_tags
- get_tags @stylesheets
+ get_tags @css.reject{|f| f.disabled? }
end
+ def css
+ @css.reject{|f| f.disabled? }
+ end
+
+ def sass
+ @sass.reject{|f| f.disabled? }
+ end
+
+ def javascripts
+ @javascripts.reject{|f| f.disabled? }
+ end
+
def sass_tags
get_tags @sass
end
def javascript_tags
get_tags @javascripts
end
def get_paths(files)
- files.dup.map { |f| f.path }
+ files.dup.map { |f| f.path }.compact
end
def get_tags(files)
files.dup.map { |f| f.tag }
end
def include(file)
- @includes[file].path
- end
-
- def config
- @config ||= @config_file.read
+ @includes.find{|i| i.filename == file }.path
end
end
end
end