mirror of
https://github.com/jekyll/jekyll.git
synced 2026-01-29 16:58:01 -05:00
This updates the default permalink style for pages and collections to match the site-wide 'permalink' setting. If the permalink setting contains a trailing slash, either explicitly or by being set to ':pretty', then pages and collections permalinks will contain trailing slashes by default as well. Similarly, if the permalink setting contains a trailing ':output_ext', so will pages and collections. If the permalink setting contains neither a trailing slash or extension, neither will pages or collections. This impacts only the default permalink structure for pages and collections. Permalinks set in the frontmatter of an individual page take precedence, as does the permalink setting for a specific collection. Fixes #2691
318 lines
9.4 KiB
Ruby
318 lines
9.4 KiB
Ruby
require 'helper'
|
|
|
|
class TestPage < JekyllUnitTest
|
|
def setup_page(*args)
|
|
dir, file = args
|
|
dir, file = ['', dir] if file.nil?
|
|
@page = Page.new(@site, source_dir, dir, file)
|
|
end
|
|
|
|
def do_render(page)
|
|
layouts = { "default" => Layout.new(@site, source_dir('_layouts'), "simple.html")}
|
|
page.render(layouts, {"site" => {"posts" => []}})
|
|
end
|
|
|
|
context "A Page" do
|
|
setup do
|
|
clear_dest
|
|
@site = Site.new(Jekyll.configuration({
|
|
"source" => source_dir,
|
|
"destination" => dest_dir,
|
|
"skip_config_files" => true
|
|
}))
|
|
end
|
|
|
|
context "processing pages" do
|
|
should "create url based on filename" do
|
|
@page = setup_page('contacts.html')
|
|
assert_equal "/contacts.html", @page.url
|
|
end
|
|
|
|
should "not published when published yaml is false" do
|
|
@page = setup_page("unpublished.html")
|
|
assert_equal false, @page.published?
|
|
end
|
|
|
|
should "create url with non-alphabetic characters" do
|
|
@page = setup_page('+', '%# +.md')
|
|
assert_equal "/+/%25%23%20+.html", @page.url
|
|
end
|
|
|
|
context "in a directory hierarchy" do
|
|
should "create url based on filename" do
|
|
@page = setup_page('/contacts', 'bar.html')
|
|
assert_equal "/contacts/bar.html", @page.url
|
|
end
|
|
|
|
should "create index url based on filename" do
|
|
@page = setup_page('/contacts', 'index.html')
|
|
assert_equal "/contacts/", @page.url
|
|
end
|
|
end
|
|
|
|
should "deal properly with extensions" do
|
|
@page = setup_page('deal.with.dots.html')
|
|
assert_equal ".html", @page.ext
|
|
end
|
|
|
|
should "deal properly with dots" do
|
|
@page = setup_page('deal.with.dots.html')
|
|
@dest_file = dest_dir("deal.with.dots.html")
|
|
|
|
assert_equal "deal.with.dots", @page.basename
|
|
assert_equal "/deal.with.dots", @page.url
|
|
assert_equal @dest_file, @page.destination(dest_dir)
|
|
end
|
|
|
|
should "make properties accessible through #[]" do
|
|
page = setup_page('properties.html')
|
|
attrs = {
|
|
content: "All the properties.\n",
|
|
dir: "/properties/",
|
|
excerpt: nil,
|
|
foo: 'bar',
|
|
layout: 'default',
|
|
name: "properties.html",
|
|
path: "properties.html",
|
|
permalink: '/properties/',
|
|
published: nil,
|
|
title: 'Properties Page',
|
|
url: "/properties/"
|
|
}
|
|
|
|
attrs.each do |attr, val|
|
|
attr_str = attr.to_s
|
|
result = page[attr_str]
|
|
assert_equal val, result, "For <page[\"#{attr_str}\"]>:"
|
|
end
|
|
end
|
|
|
|
context "with pretty permalink style" do
|
|
setup do
|
|
@site.permalink_style = :pretty
|
|
end
|
|
|
|
should "return dir, url, and destination correctly" do
|
|
@page = setup_page('contacts.html')
|
|
@dest_file = dest_dir("contacts/index.html")
|
|
|
|
assert_equal '/contacts/', @page.dir
|
|
assert_equal '/contacts/', @page.url
|
|
assert_equal @dest_file, @page.destination(dest_dir)
|
|
end
|
|
|
|
should "return dir correctly for index page" do
|
|
@page = setup_page('index.html')
|
|
assert_equal '/', @page.dir
|
|
end
|
|
|
|
context "in a directory hierarchy" do
|
|
should "create url based on filename" do
|
|
@page = setup_page('/contacts', 'bar.html')
|
|
assert_equal "/contacts/bar/", @page.url
|
|
end
|
|
|
|
should "create index url based on filename" do
|
|
@page = setup_page('/contacts', 'index.html')
|
|
assert_equal "/contacts/", @page.url
|
|
end
|
|
|
|
should "return dir correctly" do
|
|
@page = setup_page('/contacts', 'bar.html')
|
|
assert_equal '/contacts/bar/', @page.dir
|
|
end
|
|
|
|
should "return dir correctly for index page" do
|
|
@page = setup_page('/contacts', 'index.html')
|
|
assert_equal '/contacts/', @page.dir
|
|
end
|
|
end
|
|
end
|
|
|
|
context "with date permalink style" do
|
|
setup do
|
|
@site.permalink_style = :date
|
|
end
|
|
|
|
should "return url and destination correctly" do
|
|
@page = setup_page('contacts.html')
|
|
@dest_file = dest_dir("contacts.html")
|
|
assert_equal '/contacts.html', @page.url
|
|
assert_equal @dest_file, @page.destination(dest_dir)
|
|
end
|
|
end
|
|
|
|
context "with custom permalink style with trailing slash" do
|
|
setup do
|
|
@site.permalink_style = "/:title/"
|
|
end
|
|
|
|
should "return url and destination correctly" do
|
|
@page = setup_page('contacts.html')
|
|
@dest_file = dest_dir("contacts/index.html")
|
|
assert_equal '/contacts/', @page.url
|
|
assert_equal @dest_file, @page.destination(dest_dir)
|
|
end
|
|
end
|
|
|
|
context "with custom permalink style with file extension" do
|
|
setup do
|
|
@site.permalink_style = "/:title:output_ext"
|
|
end
|
|
|
|
should "return url and destination correctly" do
|
|
@page = setup_page('contacts.html')
|
|
@dest_file = dest_dir("contacts.html")
|
|
assert_equal '/contacts.html', @page.url
|
|
assert_equal @dest_file, @page.destination(dest_dir)
|
|
end
|
|
end
|
|
|
|
context "with custom permalink style with no extension" do
|
|
setup do
|
|
@site.permalink_style = "/:title"
|
|
end
|
|
|
|
should "return url and destination correctly" do
|
|
@page = setup_page('contacts.html')
|
|
@dest_file = dest_dir("contacts.html")
|
|
assert_equal '/contacts', @page.url
|
|
assert_equal @dest_file, @page.destination(dest_dir)
|
|
end
|
|
end
|
|
|
|
context "with any other permalink style" do
|
|
should "return dir correctly" do
|
|
@site.permalink_style = nil
|
|
@page = setup_page('contacts.html')
|
|
assert_equal '/', @page.dir
|
|
end
|
|
end
|
|
|
|
should "respect permalink in yaml front matter" do
|
|
file = "about.html"
|
|
@page = setup_page(file)
|
|
|
|
assert_equal "/about/", @page.permalink
|
|
assert_equal @page.permalink, @page.url
|
|
assert_equal "/about/", @page.dir
|
|
end
|
|
|
|
should "not be writable outside of destination" do
|
|
unexpected = File.expand_path("../../../baddie.html", dest_dir)
|
|
File.delete unexpected if File.exist?(unexpected)
|
|
page = setup_page("exploit.md")
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert !File.exist?(unexpected)
|
|
end
|
|
end
|
|
|
|
context "with specified layout of nil" do
|
|
setup do
|
|
@page = setup_page('sitemap.xml')
|
|
end
|
|
|
|
should "layout of nil is respected" do
|
|
assert_equal "nil", @page.data["layout"]
|
|
end
|
|
end
|
|
|
|
context "rendering" do
|
|
setup do
|
|
clear_dest
|
|
end
|
|
|
|
should "write properly" do
|
|
page = setup_page('contacts.html')
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir, 'contacts.html'))
|
|
end
|
|
|
|
should "write even when the folder name is plus and permalink has +" do
|
|
page = setup_page('+', 'foo.md')
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir, '+', 'plus+in+url.html'))
|
|
end
|
|
|
|
should "write even when permalink has '%# +'" do
|
|
page = setup_page('+', '%# +.md')
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir, '+', '%# +.html'))
|
|
end
|
|
|
|
should "write properly without html extension" do
|
|
page = setup_page('contacts.html')
|
|
page.site.permalink_style = :pretty
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir, 'contacts', 'index.html'))
|
|
end
|
|
|
|
should "write properly with extension different from html" do
|
|
page = setup_page("sitemap.xml")
|
|
page.site.permalink_style = :pretty
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert_equal("/sitemap.xml", page.url)
|
|
assert_nil(page.url[/\.html$/])
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir,'sitemap.xml'))
|
|
end
|
|
|
|
should "write dotfiles properly" do
|
|
page = setup_page('.htaccess')
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir, '.htaccess'))
|
|
end
|
|
|
|
context "in a directory hierarchy" do
|
|
should "write properly the index" do
|
|
page = setup_page('/contacts', 'index.html')
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir, 'contacts', 'index.html'))
|
|
end
|
|
|
|
should "write properly" do
|
|
page = setup_page('/contacts', 'bar.html')
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir, 'contacts', 'bar.html'))
|
|
end
|
|
|
|
should "write properly without html extension" do
|
|
page = setup_page('/contacts', 'bar.html')
|
|
page.site.permalink_style = :pretty
|
|
do_render(page)
|
|
page.write(dest_dir)
|
|
|
|
assert File.directory?(dest_dir)
|
|
assert File.exist?(File.join(dest_dir, 'contacts', 'bar', 'index.html'))
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|