From 530e049d2dfa1cad05d828cfa71bbec74a1a8e27 Mon Sep 17 00:00:00 2001 From: Parker Moore Date: Tue, 12 Aug 2014 15:59:45 -0400 Subject: [PATCH] Read in static files info `collection.files` as `StaticFile`s. --- lib/jekyll/collection.rb | 21 ++++++++++++++++++--- lib/jekyll/document.rb | 14 +++----------- lib/jekyll/site.rb | 8 ++------ lib/jekyll/static_file.rb | 24 ++++++++++++++++++++---- test/source/_slides/example-slide-1.html | 2 ++ test/source/_with.dots/file.with.dots.md | 4 ++++ test/test_document.rb | 18 +++++++++++------- test/test_site.rb | 4 ++-- 8 files changed, 62 insertions(+), 33 deletions(-) diff --git a/lib/jekyll/collection.rb b/lib/jekyll/collection.rb index 8db6c54c..5edfeef6 100644 --- a/lib/jekyll/collection.rb +++ b/lib/jekyll/collection.rb @@ -22,14 +22,28 @@ module Jekyll @docs ||= [] end + # Fetch the static files in this collection. + # Defaults to an empty array if no static files have been read in. + # + # Returns an array of Jekyll::StaticFile objects. + def files + @files ||= [] + end + # Read the allowed documents into the collection's array of docs. # # Returns the sorted array of docs. def read filtered_entries.each do |file_path| - doc = Jekyll::Document.new(Jekyll.sanitized_path(directory, file_path), { site: site, collection: self }) - doc.read - docs << doc + full_path = Jekyll.sanitized_path(directory, file_path) + if Utils.has_yaml_header? full_path + doc = Jekyll::Document.new(full_path, { site: site, collection: self }) + doc.read + docs << doc + else + relative_dir = File.join(relative_directory, File.dirname(file_path)).chomp("/.") + files << StaticFile.new(site, site.source, relative_dir, File.basename(full_path), self) + end end docs.sort! end @@ -118,6 +132,7 @@ module Jekyll metadata.merge({ "label" => label, "docs" => docs, + "files" => files, "directory" => directory, "output" => write?, "relative_directory" => relative_directory diff --git a/lib/jekyll/document.rb b/lib/jekyll/document.rb index dc2fdb13..891610fa 100644 --- a/lib/jekyll/document.rb +++ b/lib/jekyll/document.rb @@ -97,20 +97,12 @@ module Jekyll '.coffee'.eql?(extname) end - # Determine whether the document has a YAML header. - # - # Returns true if the file starts with three dashes - def has_yaml_header? - @has_yaml_header unless @has_yaml_header.nil? - @has_yaml_header = !!(File.open(path, 'rb') { |f| f.read(5) } =~ /\A---\r?\n/) - end - # Determine whether the file should be rendered with Liquid. # # Returns false if the document is either an asset file or a yaml file, # true otherwise. def render_with_liquid? - !(coffeescript_file? || yaml_file?) && has_yaml_header? + !(coffeescript_file? || yaml_file?) end # Determine whether the file should be placed into layouts. @@ -118,7 +110,7 @@ module Jekyll # Returns false if the document is either an asset file or a yaml file, # true otherwise. def place_in_layout? - !(asset_file? || yaml_file?) && has_yaml_header? + !(asset_file? || yaml_file?) end # The URL template where the document would be accessible. @@ -214,7 +206,7 @@ module Jekyll unless defaults.empty? @data = defaults end - @content = File.open(path, "rb", merged_file_read_opts(opts)) { |f| f.read } + @content = File.read(path, merged_file_read_opts(opts)) if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m @content = $POSTMATCH data_file = SafeYAML.load($1) diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index a656b088..5aee3e72 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -144,7 +144,7 @@ module Jekyll if File.directory?(f_abs) f_rel = File.join(dir, f) read_directories(f_rel) unless dest.sub(/\/$/, '') == f_abs - elsif has_yaml_header?(f_abs) + elsif Utils.has_yaml_header?(f_abs) page = Page.new(self, source, dir, f) pages << page if publisher.publish?(page) else @@ -432,7 +432,7 @@ module Jekyll def documents collections.reduce(Set.new) do |docs, (_, collection)| - docs.merge(collection.docs) + docs + collection.docs + collection.files end.to_a end @@ -454,10 +454,6 @@ module Jekyll pages.any? { |page| page.uses_relative_permalinks } end - def has_yaml_header?(file) - !!(File.open(file, 'rb') { |f| f.read(5) } =~ /\A---\r?\n/) - end - def limit_posts! limit = posts.length < limit_posts ? posts.length : limit_posts self.posts = posts[-limit, limit] diff --git a/lib/jekyll/static_file.rb b/lib/jekyll/static_file.rb index 2382d03c..0a1702fa 100644 --- a/lib/jekyll/static_file.rb +++ b/lib/jekyll/static_file.rb @@ -9,11 +9,12 @@ module Jekyll # base - The String path to the . # dir - The String path between and the file. # name - The String filename of the file. - def initialize(site, base, dir, name) + def initialize(site, base, dir, name, collection = nil) @site = site @base = base @dir = dir @name = name + @collection = collection end # Returns source file path. @@ -23,7 +24,11 @@ module Jekyll # Returns the source file path relative to the site source def relative_path - @relative_path ||= path.sub(/\A#{@site.source}/, '') + @relative_path ||= File.join(*[@dir, @name].compact) + end + + def extname + File.extname(path) end # Obtain destination path. @@ -32,7 +37,11 @@ module Jekyll # # Returns destination file path. def destination(dest) - File.join(*[dest, @dir, @name].compact) + if @collection + File.join(*[dest, @dir.gsub(/\A_/, ''), @name].compact) + else + File.join(*[dest, @dir, @name].compact) + end end # Returns last modification time for this file. @@ -47,6 +56,13 @@ module Jekyll @@mtimes[path] != mtime end + # Whether to write the file to the filesystem + # + # Returns true. + def write? + true + end + # Write the static file to the destination directory (if modified). # # dest - The String path to the destination dir. @@ -75,7 +91,7 @@ module Jekyll def to_liquid { - "path" => relative_path, + "path" => File.join("", relative_path), "modified_time" => mtime.to_s, "extname" => File.extname(relative_path) } diff --git a/test/source/_slides/example-slide-1.html b/test/source/_slides/example-slide-1.html index fcd89b3c..52dd1ab4 100644 --- a/test/source/_slides/example-slide-1.html +++ b/test/source/_slides/example-slide-1.html @@ -2,3 +2,5 @@ title: Example slide layout: slide --- + +Wooot diff --git a/test/source/_with.dots/file.with.dots.md b/test/source/_with.dots/file.with.dots.md index e69de29b..211dfb5b 100644 --- a/test/source/_with.dots/file.with.dots.md +++ b/test/source/_with.dots/file.with.dots.md @@ -0,0 +1,4 @@ +--- +--- + +I'm a file with dots. diff --git a/test/test_document.rb b/test/test_document.rb index 3e3397c6..b352a050 100644 --- a/test/test_document.rb +++ b/test/test_document.rb @@ -62,7 +62,7 @@ class TestDocument < Test::Unit::TestCase }] })) @site.process - @document = @site.collections["slides"].docs.first + @document = @site.collections["slides"].docs.select{|d| d.is_a?(Document) }.first end should "know the frontmatter defaults" do @@ -199,20 +199,24 @@ class TestDocument < Test::Unit::TestCase "destination" => dest_dir })) @site.process - @document = @site.collections["slides"].docs.find { |doc| doc.relative_path == "_slides/octojekyll.png" } + @document = @site.collections["slides"].files.find { |doc| doc.relative_path == "_slides/octojekyll.png" } @dest_file = dest_dir("slides/octojekyll.png") end - should "be a document" do - assert !@document.nil? + should "be a static file" do + assert_equal true, @document.is_a?(StaticFile) end - should "not be rendered with Liquid" do - assert !@document.render_with_liquid? + should "be set to write" do + assert @document.write? + end + + should "be in the list of docs_to_write" do + assert @site.docs_to_write.include?(@document) end should "be output in the correct place" do - assert File.file? @dest_file + assert_equal true, File.file?(@dest_file) end end diff --git a/test/test_site.rb b/test/test_site.rb index a343b1c9..97111971 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -190,12 +190,12 @@ class TestSite < Test::Unit::TestCase should "read pages with yaml front matter" do abs_path = File.expand_path("about.html", @site.source) - assert_equal true, @site.send(:has_yaml_header?, abs_path) + assert_equal true, Utils.has_yaml_header?(abs_path) end should "enforce a strict 3-dash limit on the start of the YAML front-matter" do abs_path = File.expand_path("pgp.key", @site.source) - assert_equal false, @site.send(:has_yaml_header?, abs_path) + assert_equal false, Utils.has_yaml_header?(abs_path) end should "expose jekyll version to site payload" do