Support for image paths relative to the page's directory (#466)
Merge pull request 466
This commit is contained in:
		
							parent
							
								
									7d1d478c0b
								
							
						
					
					
						commit
						1980476395
					
				| 
						 | 
				
			
			@ -61,13 +61,17 @@ module Jekyll
 | 
			
		|||
 | 
			
		||||
      def absolute_url
 | 
			
		||||
        return unless raw_path
 | 
			
		||||
        return @absolute_url if defined? @absolute_url
 | 
			
		||||
        @absolute_url ||= build_absolute_path
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
        @absolute_url = if raw_path.is_a?(String) && absolute_url?(raw_path) == false
 | 
			
		||||
                          filters.absolute_url raw_path
 | 
			
		||||
                        else
 | 
			
		||||
                          raw_path
 | 
			
		||||
                        end
 | 
			
		||||
      def build_absolute_path
 | 
			
		||||
        return raw_path unless raw_path.is_a?(String) && absolute_url?(raw_path) == false
 | 
			
		||||
        return filters.absolute_url(raw_path) if raw_path.start_with?("/")
 | 
			
		||||
 | 
			
		||||
        page_dir = @page["url"]
 | 
			
		||||
        page_dir = File.dirname(page_dir) unless page_dir.end_with?("/")
 | 
			
		||||
 | 
			
		||||
        filters.absolute_url File.join(page_dir, raw_path)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def filters
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -415,7 +415,7 @@ RSpec.describe Jekyll::SeoTag::Drop do
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  context "image" do
 | 
			
		||||
    let(:image) { "foo.png" }
 | 
			
		||||
    let(:image) { "/foo.png" }
 | 
			
		||||
    let(:page_meta) { { "image" => image } }
 | 
			
		||||
 | 
			
		||||
    it "returns a Drop" do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@
 | 
			
		|||
RSpec.describe Jekyll::SeoTag::ImageDrop do
 | 
			
		||||
  let(:config)    { { "title" => "site title" } }
 | 
			
		||||
  let(:image)     { nil }
 | 
			
		||||
  let(:page_meta) { { "image" => image } }
 | 
			
		||||
  let(:page_meta) { { "image" => image, "dir" => "foo" } }
 | 
			
		||||
  let(:page)      { make_page(page_meta) }
 | 
			
		||||
  let(:site)      { make_site(config) }
 | 
			
		||||
  let(:context)   { make_context(:page => page, :site => site) }
 | 
			
		||||
| 
						 | 
				
			
			@ -14,8 +14,34 @@ RSpec.describe Jekyll::SeoTag::ImageDrop do
 | 
			
		|||
    Jekyll.logger.log_level = :error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  context "with image as a string" do
 | 
			
		||||
  context "with a post object" do
 | 
			
		||||
    let(:image) { "image.png" }
 | 
			
		||||
    let(:page_meta) { { "image" => image, "date" => "2017-01-01" } }
 | 
			
		||||
    let(:page) { make_post(page_meta) }
 | 
			
		||||
 | 
			
		||||
    it "returns the image url relative to the post directory" do
 | 
			
		||||
      expect(subject["path"]).to eql("/2017/01/01/image.png")
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  context "with image as a relative path" do
 | 
			
		||||
    let(:image) { "image.png" }
 | 
			
		||||
 | 
			
		||||
    it "returns the image with the page dir prepended" do
 | 
			
		||||
      expect(subject["path"]).to eql("/foo/image.png")
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context "with site.url" do
 | 
			
		||||
      let(:config) { { "url" => "http://example.com" } }
 | 
			
		||||
 | 
			
		||||
      it "makes the path absolute" do
 | 
			
		||||
        expect(subject["path"]).to eql("http://example.com/foo/image.png")
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  context "with image as an absolute path" do
 | 
			
		||||
    let(:image) { "/image.png" }
 | 
			
		||||
 | 
			
		||||
    it "returns the image" do
 | 
			
		||||
      expect(subject["path"]).to eql("/image.png")
 | 
			
		||||
| 
						 | 
				
			
			@ -30,7 +56,7 @@ RSpec.describe Jekyll::SeoTag::ImageDrop do
 | 
			
		|||
    end
 | 
			
		||||
 | 
			
		||||
    context "with a URL-escaped path" do
 | 
			
		||||
      let(:image) { "some image.png" }
 | 
			
		||||
      let(:image) { "/some image.png" }
 | 
			
		||||
 | 
			
		||||
      it "URL-escapes the image" do
 | 
			
		||||
        expect(subject["path"]).to eql("/some%20image.png")
 | 
			
		||||
| 
						 | 
				
			
			@ -39,8 +65,8 @@ RSpec.describe Jekyll::SeoTag::ImageDrop do
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  context "with image as a hash" do
 | 
			
		||||
    context "with a path" do
 | 
			
		||||
      let(:image) { { "path" => "image.png" } }
 | 
			
		||||
    context "with an absolute path" do
 | 
			
		||||
      let(:image) { { "path" => "/image.png" } }
 | 
			
		||||
 | 
			
		||||
      it "returns the image" do
 | 
			
		||||
        expect(subject["path"]).to eql("/image.png")
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +74,7 @@ RSpec.describe Jekyll::SeoTag::ImageDrop do
 | 
			
		|||
    end
 | 
			
		||||
 | 
			
		||||
    context "with facebook" do
 | 
			
		||||
      let(:image) { { "facebook" => "image.png" } }
 | 
			
		||||
      let(:image) { { "facebook" => "/image.png" } }
 | 
			
		||||
 | 
			
		||||
      it "returns the image" do
 | 
			
		||||
        expect(subject["path"]).to eql("/image.png")
 | 
			
		||||
| 
						 | 
				
			
			@ -56,7 +82,7 @@ RSpec.describe Jekyll::SeoTag::ImageDrop do
 | 
			
		|||
    end
 | 
			
		||||
 | 
			
		||||
    context "with twitter" do
 | 
			
		||||
      let(:image) { { "twitter" => "image.png" } }
 | 
			
		||||
      let(:image) { { "twitter" => "/image.png" } }
 | 
			
		||||
 | 
			
		||||
      it "returns the image" do
 | 
			
		||||
        expect(subject["path"]).to eql("/image.png")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,8 +113,8 @@ RSpec.describe Jekyll::SeoTag::JSONLDDrop do
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  context "image" do
 | 
			
		||||
    context "with image as a string" do
 | 
			
		||||
      let(:image) { "image" }
 | 
			
		||||
    context "with image as an absolute path" do
 | 
			
		||||
      let(:image) { "/image" }
 | 
			
		||||
 | 
			
		||||
      it "returns the image as a string" do
 | 
			
		||||
        expect(subject).to have_key("image")
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +124,7 @@ RSpec.describe Jekyll::SeoTag::JSONLDDrop do
 | 
			
		|||
    end
 | 
			
		||||
 | 
			
		||||
    context "with image as a hash" do
 | 
			
		||||
      let(:image) { { "path" => "image", "height" => 5, "width" => 10 } }
 | 
			
		||||
      let(:image) { { "path" => "/image", "height" => 5, "width" => 10 } }
 | 
			
		||||
 | 
			
		||||
      it "returns the image as a hash" do
 | 
			
		||||
        expect(subject).to have_key("image")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ CONFIG_DEFAULTS = {
 | 
			
		|||
}.freeze
 | 
			
		||||
 | 
			
		||||
def make_page(options = {})
 | 
			
		||||
  page = Jekyll::Page.new site, CONFIG_DEFAULTS["source"], "", "page.md"
 | 
			
		||||
  page = Jekyll::Page.new site, CONFIG_DEFAULTS["source"], options.delete("dir") || "", "page.md"
 | 
			
		||||
  page.data = options
 | 
			
		||||
  page
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue