Getting there, prefixes work great

This commit is contained in:
Nick Quaranto 2009-04-25 00:58:28 -04:00
parent 288d5045d2
commit 9da140fcb2
4 changed files with 65 additions and 33 deletions

View File

@ -31,7 +31,7 @@ Feature: Fancy permalinks
And I have a configuration file with "permalink" set to "blog/:year/:month/:day/:title" And I have a configuration file with "permalink" set to "blog/:year/:month/:day/:title"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Totally custom." in "_site/posts/2009/03/27/custom-permalink-scheme/index.html" And I should see "Totally custom." in "_site/blog/2009/03/27/custom-permalink-schema/index.html"
Scenario: Use custom permalink schema with category Scenario: Use custom permalink schema with category
Given I have a _posts directory Given I have a _posts directory
@ -41,7 +41,7 @@ Feature: Fancy permalinks
And I have a configuration file with "permalink" set to ":category/:title.html" And I have a configuration file with "permalink" set to ":category/:title.html"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Totally custom." in "_site/stuff/custom-permalink-scheme.html" And I should see "Totally custom." in "_site/stuff/custom-permalink-schema.html"
Scenario: Use custom permalink schema with squished date Scenario: Use custom permalink schema with squished date
Given I have a _posts directory Given I have a _posts directory
@ -51,4 +51,4 @@ Feature: Fancy permalinks
And I have a configuration file with "permalink" set to ":month-:day-:year/:title.html" And I have a configuration file with "permalink" set to ":month-:day-:year/:title.html"
When I run jekyll When I run jekyll
Then the _site directory should exist Then the _site directory should exist
And I should see "Totally custom." in "_site/03-27-2009/custom-permalink-scheme.html" And I should see "Totally custom." in "_site/03-27-2009/custom-permalink-schema.html"

View File

@ -14,5 +14,5 @@ def run_jekyll(opts = {})
bg = '&' bg = '&'
end end
system "#{JEKYLL_PATH} >> /dev/null" system "#{JEKYLL_PATH}" #>> /dev/null"
end end

View File

@ -18,9 +18,12 @@ module Jekyll
name =~ MATCHER name =~ MATCHER
end end
attr_accessor :site attr_accessor :site, :date, :slug, :ext, :topics, :published, :data, :content, :output
attr_accessor :date, :slug, :ext, :categories, :topics, :published attr_writer :categories
attr_accessor :data, :content, :output
def categories
@categories ||= []
end
# Initialize this Post instance. # Initialize this Post instance.
# +site+ is the Site # +site+ is the Site
@ -88,16 +91,7 @@ module Jekyll
# #
# Returns <String> # Returns <String>
def dir def dir
if permalink File.dirname(url)
permalink.to_s.split("/")[0..-2].join("/") + '/'
else
prefix = self.categories.empty? ? '' : '/' + self.categories.join('/')
if [:date, :pretty].include?(self.site.permalink_style)
prefix + date.strftime("/%Y/%m/%d/")
else
prefix + '/'
end
end
end end
# The full path and filename of the post. # The full path and filename of the post.
@ -112,13 +106,13 @@ module Jekyll
def template def template
case self.site.permalink_style case self.site.permalink_style
when :pretty when :pretty
"/:year/:month/:day/:title" "/:categories/:year/:month/:day/:title"
when :none when :none
"/:title.html" "/:categories/:title.html"
when :date when :date
"/:year/:month/:day/:title.html" "/:categories/:year/:month/:day/:title.html"
else else
self.site.permalink_style self.site.permalink_style.to_s
end end
end end
@ -133,10 +127,11 @@ module Jekyll
"year" => date.strftime("%Y"), "year" => date.strftime("%Y"),
"month" => date.strftime("%m"), "month" => date.strftime("%m"),
"day" => date.strftime("%d"), "day" => date.strftime("%d"),
"title" => slug "title" => slug,
"categories" => categories.sort.join('/')
}.inject(template) { |result, token| }.inject(template) { |result, token|
result.gsub(/:#{token.first}/, token.last) result.gsub(/:#{token.first}/, token.last)
} }.gsub(/\/\//, "/")
end end
# The UID for this post (useful in feeds) # The UID for this post (useful in feeds)
@ -144,7 +139,7 @@ module Jekyll
# #
# Returns <String> # Returns <String>
def id def id
self.dir + self.slug File.join(self.dir, self.slug)
end end
# Calculate related posts. # Calculate related posts.
@ -195,7 +190,7 @@ module Jekyll
path = File.join(dest, self.url) path = File.join(dest, self.url)
if self.site.permalink_style == :pretty if template[/\.html$/].nil?
FileUtils.mkdir_p(path) FileUtils.mkdir_p(path)
path = File.join(path, "index.html") path = File.join(path, "index.html")
end end

View File

@ -25,6 +25,7 @@ class TestPost < Test::Unit::TestCase
assert !Post.valid?("blah") assert !Post.valid?("blah")
end end
context "processing posts" do context "processing posts" do
setup do setup do
@post = Post.allocate @post = Post.allocate
@ -41,6 +42,8 @@ class TestPost < Test::Unit::TestCase
assert_equal Time.parse("2008-10-19"), @post.date assert_equal Time.parse("2008-10-19"), @post.date
assert_equal "foo-bar", @post.slug assert_equal "foo-bar", @post.slug
assert_equal ".textile", @post.ext assert_equal ".textile", @post.ext
assert_equal "/2008/10/19", @post.dir
assert_equal "/2008/10/19/foo-bar", @post.id
end end
should "create url based on date and title" do should "create url based on date and title" do
@ -55,11 +58,10 @@ class TestPost < Test::Unit::TestCase
@post.read_yaml(@source, file) @post.read_yaml(@source, file)
assert_equal "my_category/permalinked-post", @post.permalink assert_equal "my_category/permalinked-post", @post.permalink
assert_equal "my_category/", @post.dir assert_equal "my_category", @post.dir
assert_equal "my_category/permalinked-post", @post.url assert_equal "my_category/permalinked-post", @post.url
end end
context "with site wide permalink" do context "with site wide permalink" do
setup do setup do
@post.categories = [] @post.categories = []
@ -71,11 +73,36 @@ class TestPost < Test::Unit::TestCase
end end
should "process the url correctly" do should "process the url correctly" do
assert_equal "/:year/:month/:day/:title.html", @post.template assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
assert_equal "/2008/10/19/foo-bar.html", @post.url assert_equal "/2008/10/19/foo-bar.html", @post.url
end end
end end
context "with unspecified (date) style and a category" do
setup do
@post.categories << "beer"
@post.process(@fake_file)
end
should "process the url correctly" do
assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
assert_equal "/beer/2008/10/19/foo-bar.html", @post.url
end
end
context "with unspecified (date) style and categories" do
setup do
@post.categories << "food"
@post.categories << "beer"
@post.process(@fake_file)
end
should "process the url correctly" do
assert_equal "/:categories/:year/:month/:day/:title.html", @post.template
assert_equal "/beer/food/2008/10/19/foo-bar.html", @post.url
end
end
context "with none style" do context "with none style" do
setup do setup do
@post.site.permalink_style = :none @post.site.permalink_style = :none
@ -83,7 +110,7 @@ class TestPost < Test::Unit::TestCase
end end
should "process the url correctly" do should "process the url correctly" do
assert_equal "/:title.html", @post.template assert_equal "/:categories/:title.html", @post.template
assert_equal "/foo-bar.html", @post.url assert_equal "/foo-bar.html", @post.url
end end
end end
@ -95,7 +122,7 @@ class TestPost < Test::Unit::TestCase
end end
should "process the url correctly" do should "process the url correctly" do
assert_equal "/:year/:month/:day/:title", @post.template assert_equal "/:categories/:year/:month/:day/:title", @post.template
assert_equal "/2008/10/19/foo-bar", @post.url assert_equal "/2008/10/19/foo-bar", @post.url
end end
end end
@ -198,6 +225,16 @@ class TestPost < Test::Unit::TestCase
assert File.exists?(File.join(dest_dir, '2008', '10', '18', 'foo-bar.html')) assert File.exists?(File.join(dest_dir, '2008', '10', '18', 'foo-bar.html'))
end end
should "write properly without html extension" do
post = setup_post("2008-10-18-foo-bar.textile")
post.site.permalink_style = ":title"
do_render(post)
post.write(dest_dir)
assert File.directory?(dest_dir)
assert File.exists?(File.join(dest_dir, 'foo-bar', 'index.html'))
end
should "insert data" do should "insert data" do
post = setup_post("2008-11-21-complex.textile") post = setup_post("2008-11-21-complex.textile")
do_render(post) do_render(post)