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