From 13aec48137b18e6007e43b5009c05e664c18aa83 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Fri, 16 Sep 2016 14:40:54 -0700 Subject: [PATCH] Add ThemeAssetsReader which reads assets from a theme If the theme includes the 'assets' directory, it will be walked and items will be added to the site based on the normal rules of Jekyll: if there is YAML front matter, it will be added as a (convertible) Page, otherwise it will be added as a StaticFile. --- lib/jekyll.rb | 1 + lib/jekyll/page.rb | 6 ++++- lib/jekyll/reader.rb | 1 + lib/jekyll/readers/theme_assets_reader.rb | 31 +++++++++++++++++++++++ lib/jekyll/theme.rb | 12 ++++++--- 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 lib/jekyll/readers/theme_assets_reader.rb diff --git a/lib/jekyll.rb b/lib/jekyll.rb index a9fe696f..3c4def1a 100644 --- a/lib/jekyll.rb +++ b/lib/jekyll.rb @@ -55,6 +55,7 @@ module Jekyll autoload :PostReader, "jekyll/readers/post_reader" autoload :PageReader, "jekyll/readers/page_reader" autoload :StaticFileReader, "jekyll/readers/static_file_reader" + autoload :ThemeAssetsReader, "jekyll/readers/theme_assets_reader" autoload :LogAdapter, "jekyll/log_adapter" autoload :Page, "jekyll/page" autoload :PluginManager, "jekyll/plugin_manager" diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 4e3efe3f..00fdec23 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -40,7 +40,11 @@ module Jekyll @base = base @dir = dir @name = name - @path = site.in_source_dir(base, dir, name) + if site.in_theme_dir(base) == base # we're in a theme + @path = site.in_theme_dir(base, dir, name) + else + @path = site.in_source_dir(base, dir, name) + end process(name) read_yaml(File.join(base, dir), name) diff --git a/lib/jekyll/reader.rb b/lib/jekyll/reader.rb index abbe923f..7bde499d 100644 --- a/lib/jekyll/reader.rb +++ b/lib/jekyll/reader.rb @@ -18,6 +18,7 @@ module Jekyll sort_files! @site.data = DataReader.new(site).read(site.config["data_dir"]) CollectionReader.new(site).read + ThemeAssetsReader.new(site).read end # Sorts posts, pages, and static files. diff --git a/lib/jekyll/readers/theme_assets_reader.rb b/lib/jekyll/readers/theme_assets_reader.rb new file mode 100644 index 00000000..85151d0f --- /dev/null +++ b/lib/jekyll/readers/theme_assets_reader.rb @@ -0,0 +1,31 @@ +module Jekyll + class ThemeAssetsReader + attr_reader :site + def initialize(site) + @site = site + end + + def read + return unless site.theme && site.theme.assets_path + + Find.find(site.theme.assets_path) do |path| + next if File.directory?(path) + if File.symlink?(path) + Jekyll.logger.warn "Theme reader:", "Ignored symlinked asset: #{path}" + else + base = site.theme.root + dir = File.dirname(path.sub("#{site.theme.root}/", "")) + name = File.basename(path) + relative_path = File.join(*[dir, name].compact) + if Utils.has_yaml_header?(path) + next if site.pages.any? { |file| file.relative_path == relative_path } + site.pages << Jekyll::Page.new(site, base, dir, name) + else + next if site.static_files.any? { |file| file.relative_path == relative_path } + site.static_files << Jekyll::StaticFile.new(site, base, dir, name) + end + end + end + end + end +end diff --git a/lib/jekyll/theme.rb b/lib/jekyll/theme.rb index 0dd73f78..4b0eb2db 100644 --- a/lib/jekyll/theme.rb +++ b/lib/jekyll/theme.rb @@ -18,15 +18,19 @@ module Jekyll end def includes_path - path_for :includes + path_for :_includes end def layouts_path - path_for :layouts + path_for :_layouts end def sass_path - path_for :sass + path_for :_sass + end + + def assets_path + path_for :assets end def configure_sass @@ -43,7 +47,7 @@ module Jekyll end def realpath_for(folder) - File.realpath(Jekyll.sanitized_path(root, "_#{folder}")) + File.realpath(Jekyll.sanitized_path(root, folder.to_s)) rescue Errno::ENOENT, Errno::EACCES, Errno::ELOOP nil end