diff --git a/lib/jekyll.rb b/lib/jekyll.rb index 02aa40b1..5beca7a5 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -55,6 +55,7 @@ module Jekyll autoload :PluginManager, 'jekyll/plugin_manager' autoload :Post, 'jekyll/post' autoload :Publisher, 'jekyll/publisher' + autoload :Reader, 'jekyll/reader' autoload :Regenerator, 'jekyll/regenerator' autoload :RelatedPosts, 'jekyll/related_posts' autoload :Renderer, 'jekyll/renderer' diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index b09a7ed9..4b07b2af 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -89,7 +89,7 @@ module Jekyll # Returns a String containing th directory name where the collection # is stored on the filesystem. def directory - @directory ||= site.in_source_dir(relative_directory) + @directory ||= site.reader.in_source_dir(relative_directory) end # The full path to the directory containing the collection, with @@ -102,7 +102,7 @@ module Jekyll # is stored on the filesystem. def collection_dir(*files) return directory if files.empty? - site.in_source_dir(relative_directory, *files) + site.reader.in_source_dir(relative_directory, *files) end # Checks whether the directory "exists" for this collection. diff --git a/lib/jekyll/convertible.rb b/lib/jekyll/convertible.rb index d587f8f3..becc78ed 100644 --- a/lib/jekyll/convertible.rb +++ b/lib/jekyll/convertible.rb @@ -43,7 +43,7 @@ module Jekyll # Returns nothing. def read_yaml(base, name, opts = {}) begin - self.content = File.read(site.in_source_dir(base, name), + self.content = File.read(site.reader.in_source_dir(base, name), merged_file_read_opts(opts)) if content =~ /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m self.content = $POSTMATCH @@ -209,8 +209,8 @@ module Jekyll # Add layout to dependency tree site.regenerator.add_dependency( - site.in_source_dir(path), - site.in_source_dir(layout.path) + site.reader.in_source_dir(path), + site.reader.in_source_dir(layout.path) ) if layout = layouts[layout.data["layout"]] diff --git a/lib/jekyll/draft.rb b/lib/jekyll/draft.rb index 16daefdf..4167f154 100644 --- a/lib/jekyll/draft.rb +++ b/lib/jekyll/draft.rb @@ -15,7 +15,7 @@ module Jekyll # Get the full path to the directory containing the draft files def containing_dir(dir) - site.in_source_dir(dir, '_drafts') + site.reader.in_source_dir(dir, '_drafts') end # The path to the draft source file, relative to the site source diff --git a/lib/jekyll/layout.rb b/lib/jekyll/layout.rb index c29f353f..81ba7f81 100644 --- a/lib/jekyll/layout.rb +++ b/lib/jekyll/layout.rb @@ -29,7 +29,7 @@ module Jekyll @site = site @base = base @name = name - @path = site.in_source_dir(base, name) + @path = site.reader.in_source_dir(base, name) self.data = {} diff --git a/lib/jekyll/layout_reader.rb b/lib/jekyll/layout_reader.rb index a8466beb..645d3cf8 100644 --- a/lib/jekyll/layout_reader.rb +++ b/lib/jekyll/layout_reader.rb @@ -38,7 +38,7 @@ module Jekyll end def layout_directory_inside_source - site.in_source_dir(site.config['layouts']) + site.reader.in_source_dir(site.config['layouts']) end def layout_directory_in_cwd diff --git a/lib/jekyll/plugin_manager.rb b/lib/jekyll/plugin_manager.rb index 64dea860..5abfd47c 100644 --- a/lib/jekyll/plugin_manager.rb +++ b/lib/jekyll/plugin_manager.rb @@ -82,7 +82,7 @@ module Jekyll # Returns an Array of plugin search paths def plugins_path if (site.config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins']) - [site.in_source_dir(site.config['plugins'])] + [site.reader.in_source_dir(site.config['plugins'])] else Array(site.config['plugins']).map { |d| File.expand_path(d) } end diff --git a/lib/jekyll/post.rb b/lib/jekyll/post.rb index 780f40f7..5d48d180 100644 --- a/lib/jekyll/post.rb +++ b/lib/jekyll/post.rb @@ -91,7 +91,7 @@ module Jekyll # Get the full path to the directory containing the post files def containing_dir(dir) - site.in_source_dir(dir, '_posts') + site.reader.in_source_dir(dir, '_posts') end # Read the YAML frontmatter. diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb new file mode 100644 index 00000000..10748b04 --- /dev/null +++ b/lib/jekyll/reader.rb @@ -0,0 +1,38 @@ +# encoding: UTF-8 +require 'csv' + +module Jekyll + class Reader + # Public: Initialize a new Reader. + + # @return [Object] + def initialize(source, dest) + @source = source + @dest = dest + end + + # Public: Prefix a given path with the source directory. + # + # paths - (optional) path elements to a file or directory within the + # source directory + # + # Returns a path which is prefixed with the source directory. + def in_source_dir(*paths) + paths.reduce(@source) do |base, path| + Jekyll.sanitized_path(base, path) + end + end + + # Public: Prefix a given path with the destination directory. + # + # paths - (optional) path elements to a file or directory within the + # destination directory + # + # Returns a path which is prefixed with the destination directory. + def in_dest_dir(*paths) + paths.reduce(@dest) do |base, path| + Jekyll.sanitized_path(base, path) + end + end + end +end \ No newline at end of file diff --git a/lib/jekyll/regenerator.rb b/lib/jekyll/regenerator.rb index 0616fdd9..07273db6 100644 --- a/lib/jekyll/regenerator.rb +++ b/lib/jekyll/regenerator.rb @@ -19,7 +19,7 @@ module Jekyll case document when Post, Page document.asset_file? || document.data['regenerate'] || - modified?(site.in_source_dir(document.relative_path)) + modified?(site.reader.in_source_dir(document.relative_path)) when Document !document.write? || document.data['regenerate'] || modified?(document.path) else @@ -113,7 +113,7 @@ module Jekyll # # Returns the String path of the file. def metadata_file - site.in_source_dir('.jekyll-metadata') + site.reader.in_source_dir('.jekyll-metadata') end # Check if metadata has been disabled diff --git a/lib/jekyll/renderer.rb b/lib/jekyll/renderer.rb index f25ca343..fd58bff9 100644 --- a/lib/jekyll/renderer.rb +++ b/lib/jekyll/renderer.rb @@ -141,8 +141,8 @@ module Jekyll # Add layout to dependency tree site.regenerator.add_dependency( - site.in_source_dir(document.path), - site.in_source_dir(layout.path) + site.reader.in_source_dir(document.path), + site.reader.in_source_dir(layout.path) ) if document.write? if layout = site.layouts[layout.data["layout"]] diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index aadfb8d0..d8a1d7bf 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -10,7 +10,7 @@ module Jekyll :show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems, :plugin_manager - attr_accessor :converters, :generators + attr_accessor :converters, :generators, :reader attr_reader :regenerator # Public: Initialize a new Site. @@ -28,6 +28,8 @@ module Jekyll @source = File.expand_path(config['source']).freeze @dest = File.expand_path(config['destination']).freeze + @reader = Reader.new(@source,@dest); + # Initialize incremental regenerator @regenerator = Regenerator.new(self) @@ -97,18 +99,6 @@ module Jekyll end end - # Public: Prefix a given path with the source directory. - # - # paths - (optional) path elements to a file or directory within the - # source directory - # - # Returns a path which is prefixed with the source directory. - def in_source_dir(*paths) - paths.reduce(source) do |base, path| - Jekyll.sanitized_path(base, path) - end - end - # Public: Prefix a given path with the destination directory. # # paths - (optional) path elements to a file or directory within the @@ -116,9 +106,7 @@ module Jekyll # # Returns a path which is prefixed with the destination directory. def in_dest_dir(*paths) - paths.reduce(dest) do |base, path| - Jekyll.sanitized_path(base, path) - end + reader.in_dest_dir(*paths) end # The list of collections and their corresponding Jekyll::Collection instances. @@ -165,7 +153,7 @@ module Jekyll # # Returns nothing. def read_directories(dir = '') - base = in_source_dir(dir) + base = reader.in_source_dir(dir) entries = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) } read_posts(dir) @@ -174,7 +162,7 @@ module Jekyll limit_posts! if limit_posts > 0 # limit the posts if :limit_posts option is set entries.each do |f| - f_abs = in_source_dir(base, f) + f_abs = reader.in_source_dir(base, f) if File.directory?(f_abs) f_rel = File.join(dir, f) read_directories(f_rel) unless dest.sub(/\/$/, '') == f_abs @@ -232,7 +220,7 @@ module Jekyll # # Returns nothing def read_data(dir) - base = in_source_dir(dir) + base = reader.in_source_dir(dir) read_data_to(base, self.data) end @@ -251,7 +239,7 @@ module Jekyll end entries.each do |entry| - path = in_source_dir(dir, entry) + path = reader.in_source_dir(dir, entry) next if File.symlink?(path) && safe key = sanitize_filename(File.basename(entry, '.*')) @@ -454,10 +442,10 @@ module Jekyll # # Returns the list of entries to process def get_entries(dir, subfolder) - base = in_source_dir(dir, subfolder) + base = reader.in_source_dir(dir, subfolder) return [] unless File.exist?(base) entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) } - entries.delete_if { |e| File.directory?(in_source_dir(base, e)) } + entries.delete_if { |e| File.directory?(reader.in_source_dir(base, e)) } end # Aggregate post information diff --git a/lib/jekyll/tags/include.rb b/lib/jekyll/tags/include.rb index b809ffe7..fcac41b2 100644 --- a/lib/jekyll/tags/include.rb +++ b/lib/jekyll/tags/include.rb @@ -117,7 +117,7 @@ eos # Add include to dependency tree if context.registers[:page] and context.registers[:page].has_key? "path" site.regenerator.add_dependency( - site.in_source_dir(context.registers[:page]["path"]), + site.reader.in_source_dir(context.registers[:page]["path"]), path ) end @@ -135,7 +135,7 @@ eos end def resolved_includes_dir(context) - context.registers[:site].in_source_dir(@includes_dir) + context.registers[:site].reader.in_source_dir(@includes_dir) end def validate_path(path, dir, safe) @@ -170,7 +170,7 @@ eos end def resolved_includes_dir(context) - context.registers[:site].in_source_dir(page_path(context)) + context.registers[:site].reader.in_source_dir(page_path(context)) end end end diff --git a/test/test_regenerator.rb b/test/test_regenerator.rb index 15819487..cc505e39 100644 --- a/test/test_regenerator.rb +++ b/test/test_regenerator.rb @@ -63,7 +63,7 @@ class TestRegenerator < JekyllUnitTest })) @site.process - @path = @site.in_source_dir(@site.pages.first.path) + @path = @site.reader.in_source_dir(@site.pages.first.path) @regenerator = @site.regenerator end