lib/jekyll/page.rb in jekyll-0.5.1 vs lib/jekyll/page.rb in jekyll-0.5.3
- old
+ new
@@ -2,11 +2,11 @@
class Page
include Convertible
attr_accessor :site
- attr_accessor :ext
+ attr_accessor :name, :ext, :basename
attr_accessor :data, :content, :output
# Initialize a new Page.
# +site+ is the Site
# +base+ is the String path to the <source>
@@ -15,26 +15,60 @@
#
# Returns <Page>
def initialize(site, base, dir, name)
@site = site
@base = base
- @dir = dir
+ @dir = dir
@name = name
- self.data = {}
-
self.process(name)
self.read_yaml(File.join(base, dir), name)
- #self.transform
end
+ # The generated directory into which the page will be placed
+ # upon generation. This is derived from the permalink or, if
+ # permalink is absent, set to '/'
+ #
+ # Returns <String>
+ def dir
+ url[-1, 1] == '/' ? url : File.dirname(url)
+ end
+
+ # The full path and filename of the post.
+ # Defined in the YAML of the post body
+ # (Optional)
+ #
+ # Returns <String>
+ def permalink
+ self.data && self.data['permalink']
+ end
+
+ def template
+ if self.site.permalink_style == :pretty && !index?
+ "/:name/"
+ else
+ "/:name.html"
+ end
+ end
+
+ # The generated relative url of this page
+ # e.g. /about.html
+ #
+ # Returns <String>
+ def url
+ return permalink if permalink
+
+ @url ||= (ext == '.html') ? template.gsub(':name', basename) : "/#{name}"
+ end
+
# Extract information from the page filename
# +name+ is the String filename of the page file
#
# Returns nothing
def process(name)
self.ext = File.extname(name)
+ self.basename = name.split('.')[0..-2].first
end
# Add any necessary layouts to this post
# +layouts+ is a Hash of {"name" => "layout"}
# +site_payload+ is the site payload hash
@@ -44,24 +78,35 @@
payload = {"page" => self.data}.deep_merge(site_payload)
do_layout(payload, layouts)
end
# Write the generated page file to the destination directory.
- # +dest+ is the String path to the destination dir
+ # +dest_prefix+ is the String path to the destination dir
+ # +dest_suffix+ is a suffix path to the destination dir
#
# Returns nothing
- def write(dest)
- FileUtils.mkdir_p(File.join(dest, @dir))
+ def write(dest_prefix, dest_suffix = nil)
+ dest = File.join(dest_prefix, @dir)
+ dest = File.join(dest, dest_suffix) if dest_suffix
+ FileUtils.mkdir_p(dest)
- name = @name
- if self.ext != ""
- name = @name.split(".")[0..-2].join('.') + self.ext
+ # The url needs to be unescaped in order to preserve the correct filename
+ path = File.join(dest, CGI.unescape(self.url))
+ if self.ext == '.html' && self.url[/\.html$/].nil?
+ FileUtils.mkdir_p(path)
+ path = File.join(path, "index.html")
end
- path = File.join(dest, @dir, name)
File.open(path, 'w') do |f|
f.write(self.output)
end
end
+
+ private
+
+ def index?
+ basename == 'index'
+ end
+
end
-end
\ No newline at end of file
+end