diff --git a/lib/jekyll/page.rb b/lib/jekyll/page.rb index 68d4b213..0de5e254 100644 --- a/lib/jekyll/page.rb +++ b/lib/jekyll/page.rb @@ -56,10 +56,16 @@ module Jekyll # # Returns the template String. def template - if self.site.permalink_style == :pretty && !index? && html? - "/:basename/" + if self.site.permalink_style == :pretty + if index? && html? + "/:path/" + elsif html? + "/:path/:basename/" + else + "/:path/:basename:output_ext" + end else - "/:basename:output_ext" + "/:path/:basename:output_ext" end end @@ -73,6 +79,7 @@ module Jekyll permalink else { + "path" => @dir, "basename" => self.basename, "output_ext" => self.output_ext, }.inject(template) { |result, token| @@ -116,7 +123,7 @@ module Jekyll # Returns the Hash representation of this Page. def to_liquid self.data.deep_merge({ - "url" => File.join(@dir, self.url), + "url" => self.url, "content" => self.content }) end @@ -128,7 +135,7 @@ module Jekyll def destination(dest) # The url needs to be unescaped in order to preserve the correct # filename. - path = File.join(dest, @dir, CGI.unescape(self.url)) + path = File.join(dest, CGI.unescape(self.url)) path = File.join(path, "index.html") if self.url =~ /\/$/ path end diff --git a/test/source/contacts/bar.html b/test/source/contacts/bar.html new file mode 100644 index 00000000..1615afe2 --- /dev/null +++ b/test/source/contacts/bar.html @@ -0,0 +1,5 @@ +--- +title: Contact Information +--- + +Contact Information diff --git a/test/source/contacts/index.html b/test/source/contacts/index.html new file mode 100644 index 00000000..1615afe2 --- /dev/null +++ b/test/source/contacts/index.html @@ -0,0 +1,5 @@ +--- +title: Contact Information +--- + +Contact Information diff --git a/test/test_page.rb b/test/test_page.rb index 3c7c9fed..fda7cd9c 100644 --- a/test/test_page.rb +++ b/test/test_page.rb @@ -1,8 +1,10 @@ require 'helper' class TestPage < Test::Unit::TestCase - def setup_page(file) - @page = Page.new(@site, source_dir, '', file) + 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) @@ -23,6 +25,18 @@ class TestPage < Test::Unit::TestCase assert_equal "/contacts.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/index.html", @page.url + end + end + should "deal properly with extensions" do @page = setup_page('deal.with.dots.html') assert_equal ".html", @page.ext @@ -47,6 +61,28 @@ class TestPage < Test::Unit::TestCase @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 any other url style" do @@ -131,6 +167,36 @@ class TestPage < Test::Unit::TestCase assert File.directory?(dest_dir) assert File.exists?(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.exists?(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.exists?(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.exists?(File.join(dest_dir, 'contacts', 'bar', 'index.html')) + end + end end end