diff --git a/lib/webby.rb b/lib/webby.rb index 61b4e1f..15edf3b 100644 --- a/lib/webby.rb +++ b/lib/webby.rb @@ -10,6 +10,7 @@ Logging::Logger['Webby'].add(Logging::Appender.stdout) Logging::Logger['Webby'].level = :info + module Webby VERSION = '0.5.0' # :nodoc: @@ -73,6 +74,17 @@ def self.exclude @exclude ||= Regexp.new(config['exclude'].join('|')) end + # call-seq: + # cairn => filename + # + # The Webby _cairn_ file is used to mark the last time the content was + # built into the output directory. It is an empty file; only the + # modification time of the file is important. + # + def self.cairn + @cairn ||= File.join(config['output_dir'], '.cairn') + end + end # module Webby diff --git a/lib/webby/builder.rb b/lib/webby/builder.rb index 95fd996..e0669f1 100644 --- a/lib/webby/builder.rb +++ b/lib/webby/builder.rb @@ -107,11 +107,10 @@ def run( opts = {} ) else Renderer.write(page) end end - # touch the output directory so we know when the - # website was last generated - FileUtils.touch output_dir + # touch the cairn so we know when the website was last generated + FileUtils.touch ::Webby.cairn - return nil + nil end diff --git a/lib/webby/renderer.rb b/lib/webby/renderer.rb index a02aee3..6833ccc 100644 --- a/lib/webby/renderer.rb +++ b/lib/webby/renderer.rb @@ -38,7 +38,7 @@ def self.write( page ) fd.write renderer.layout_page end break unless renderer.next_page - } + } end # call-seq: @@ -121,31 +121,26 @@ def render_page # number of items in the current page. # def paginate( items, count, &block ) - @pager ||= Paginator.new(items.length, count) do |offset, per_page| + @pager ||= Paginator.new(items.length, count, @page) do |offset, per_page| items[offset,per_page] end.first @pager.each &block - - rescue NameError - @log.error 'pagination failed (Paginator not installed?)' - exit end # call-seq: - # next_page + # next_page => true or false # def next_page return false unless defined? @pager and @pager # go to the next page; break out if there is no next page - @pager = @pager.next - return false if @pager.nil? - - # set filename based on pager number - fn = "%s%d" % [@page.filename, @pager.number] - @page.instance_variable_set :@filename, fn - @page.instance_variable_set :@dest, nil + if @pager.next? + @pager = @pager.next + else + @page.number = nil + return false + end true end diff --git a/lib/webby/resource.rb b/lib/webby/resource.rb index 647f906..05b0546 100644 --- a/lib/webby/resource.rb +++ b/lib/webby/resource.rb @@ -54,6 +54,9 @@ def clear # Resource file modification time attr_reader :mtime + # Resource page number (if needed) + attr_reader :number + # call-seq: # Resource.new( filename ) => resource # @@ -66,6 +69,7 @@ def initialize( fn ) @ext = ::File.extname(@path).sub(%r/\A\.?/o, '') @mtime = ::File.mtime @path + @number = nil @rendering = false # deal with the meta-data @@ -139,17 +143,30 @@ def extension # def destination return @dest if defined? @dest and @dest - return @dest = ::Webby.config['output_dir'] if is_layout? + return @dest = ::Webby.cairn if is_layout? @dest = if @mdata.has_key? 'destination' then @mdata['destination'] else File.join(dir, filename) end @dest = File.join(::Webby.config['output_dir'], @dest) + @dest << @number.to_s if @number @dest << '.' @dest << extension @dest end + # call-seq: + # resource.number = Integer + # + # Sets the page number for the current resource to the given integer. This + # number is used to modify the output destination for resources that + # require pagination. + # + def number=( num ) + @number = num + @dest = nil + end + # call-seq: # render => string # diff --git a/lib/webby/stelan/paginator.rb b/lib/webby/stelan/paginator.rb index e9b1acc..0a23f01 100644 --- a/lib/webby/stelan/paginator.rb +++ b/lib/webby/stelan/paginator.rb @@ -1,16 +1,24 @@ +# This code was originally written by Bruce Williams, and it is available +# as the Paginator gem. I've added a few helper methods and modifications so +# it plays a little more nicely with Webby. Specifically, a Webby::Resource +# can be given to the Page and used to generate links to the previous and +# next pages. +# +# Many thanks to Bruce Williams for letting me use his work. Drop him a note +# of praise scribbled on the back of a $100 bill. He'd appreciate it. + require 'forwardable' +module Webby class Paginator - VERSION = '1.1.0' - include Enumerable class ArgumentError < ::ArgumentError; end class MissingCountError < ArgumentError; end class MissingSelectError < ArgumentError; end - attr_reader :per_page, :count + attr_reader :per_page, :count, :resource # Instantiate a new Paginator object # @@ -21,8 +29,8 @@ class MissingSelectError < ArgumentError; end # * The block is passed the item offset # (and the number of items to show per page, for # convenience, if the arity is 2) - def initialize(count, per_page, &select) - @count, @per_page = count, per_page + def initialize(count, per_page, resource, &select) + @count, @per_page, @resource = count, per_page, resource unless select raise MissingSelectError, "Must provide block to select data for each page" end @@ -75,6 +83,8 @@ def initialize(pager, number, select) #:nodoc: @pager, @number = pager, number @offset = (number - 1) * pager.per_page @select = select + + @pager.resource.number = number end # Retrieve the items for this page @@ -132,7 +142,8 @@ def method_missing(meth, *args, &block) #:nodoc: super end end - + end -end \ No newline at end of file +end # class Paginator +end # module Webby diff --git a/website/layouts/default.rhtml b/website/layouts/default.rhtml index 451bcd5..75b9020 100644 --- a/website/layouts/default.rhtml +++ b/website/layouts/default.rhtml @@ -29,11 +29,11 @@ filter: erb

Webby ☯ <%= h(@page.title) %>