diff --git a/lib/will_paginate.rb b/lib/will_paginate.rb index 9b033e044..889718e76 100644 --- a/lib/will_paginate.rb +++ b/lib/will_paginate.rb @@ -17,3 +17,7 @@ module WillPaginate end end end + +if defined?(Sinatra) and Sinatra.respond_to? :register + require 'will_paginate/view_helpers/sinatra' +end diff --git a/lib/will_paginate/view_helpers/sinatra.rb b/lib/will_paginate/view_helpers/sinatra.rb new file mode 100644 index 000000000..2ba17f89e --- /dev/null +++ b/lib/will_paginate/view_helpers/sinatra.rb @@ -0,0 +1,41 @@ +require 'sinatra/base' +require 'will_paginate/view_helpers' +require 'will_paginate/view_helpers/link_renderer' + +module WillPaginate + module Sinatra + module Helpers + include ViewHelpers + + def will_paginate(collection, options = {}) #:nodoc: + options = options.merge(:renderer => LinkRenderer) unless options[:renderer] + super(collection, options) + end + end + + class LinkRenderer < ViewHelpers::LinkRenderer + protected + + def url(page) + str = File.join(request.script_name.to_s, request.path_info) + params = request.GET.merge(param_name.to_s => page.to_s) + params.update @options[:params] if @options[:params] + str << '?' << build_query(params) + end + + def request + @template.request + end + + def build_query(params) + Rack::Utils.build_nested_query params + end + end + + def self.registered(app) + app.helpers Helpers + end + + ::Sinatra.register self + end +end