diff --git a/config.ru b/config.ru index e051366..0ae6374 100644 --- a/config.ru +++ b/config.ru @@ -2,4 +2,7 @@ require File.expand_path('../lib/boot.rb', __FILE__) Renderer.find_templates('templates') -run Application.new(Router, {:renderer => Renderer}) +run Application.new(Router, { + :renderer => Renderer, + :query => {} +}) diff --git a/controller/post.rb b/controller/post.rb index bf6e42f..7d1750e 100644 --- a/controller/post.rb +++ b/controller/post.rb @@ -21,29 +21,42 @@ SQL join(:accounts, :id___account_id => :account_id). reverse_order(:written, :posts__id) + posts = load_fulltextsearch(session, posts) if session.request.params['search'] + # return when a single posts has to be shown return load_previous_and_next_post(session, posts) if session.options[:id] load_page_information(session, posts) end + # load posts depending on the pagination def self.load_page_information(session, posts) # compute pages page = session.request.params['page'].to_i session.options[:page] = page if page per_page = session.request.params['per_page'].to_i per_page = 10 if per_page < 1 - session.options[:per_page] = per_page if per_page - session.options[:pages] = DB[:posts].filter(:released => true).count / per_page + session.options[:query][:per_page] = per_page if per_page + session.options[:pages] = posts.count / per_page # fetch the posts to show session.options[:posts] = posts.limit(per_page, page * per_page) end + # load a single posts and the ids of the next and previous posts def self.load_previous_and_next_post(session, posts) posts = posts.filter(:posts__id => session.options[:id].to_i) session.options[:posts] = posts written = posts.first[:written] session.options[:post_ids_pn] = DB[PREV_AND_NEXT_QUERY, written, written].first end + + # adjust query to use fulltext search + def self.load_fulltextsearch(session, posts) + session.options[:query][:search] = session.request.params['search'] + posts.filter( + 'posts.search_field @@ to_tsquery(\'english\', ?)', + session.request.params['search'].tr(' ', '&') + ) + end end end diff --git a/lib/application.rb b/lib/application.rb index e5972c4..563df7f 100644 --- a/lib/application.rb +++ b/lib/application.rb @@ -8,7 +8,7 @@ class Application session = Session.new( ::Zero::Request.new(env), ::Zero::Response.new, - @defaults.clone + Render.new(@defaults.clone) ) worker = @start while not worker.nil? diff --git a/lib/libraries.rb b/lib/libraries.rb index b9a5e75..35cee50 100644 --- a/lib/libraries.rb +++ b/lib/libraries.rb @@ -1,7 +1,9 @@ require 'bundler/setup' require 'yaml' +require 'sass' +require 'tilt' +require 'tilt/sass' require 'sequel' require 'zero' -require 'sass' require 'slim' require 'kramdown' diff --git a/lib/render.rb b/lib/render.rb new file mode 100644 index 0000000..5acaa46 --- /dev/null +++ b/lib/render.rb @@ -0,0 +1,46 @@ +# defines a render container with some helper functions to keep the templates +# small +class Render + SLASH = '/' + + def initialize(options) + @options = options + end + + def [](key) + fetch(key) + end + + def []=(key, value) + @options[key] = value + end + + def fetch(key) + @options[key] + end + + def has_key?(key) + @options.has_key?(key) + end + + def options + @options + end + + def link_to(*params) + query = [] + while params.last.kind_of? Hash + query.push params.pop + end + return path(params) if query.empty? + path(params) + '?' + query_string(query) + end + + def path(params) + SLASH + params.join(SLASH) + end + + def query_string(query) + URI.encode_www_form(query.inject(:merge)) + end +end diff --git a/templates/posts/index.html.slim b/templates/posts/index.html.slim index ad36839..5073cec 100644 --- a/templates/posts/index.html.slim +++ b/templates/posts/index.html.slim @@ -1,17 +1,18 @@ - if has_key?(:page) && 0 < fetch(:page) a.page.up( - href="/post?page=#{fetch(:page) - 1}&per_page=#{fetch(:per_page)}" + href=link_to(:post, fetch(:query), :page => fetch(:page) - 1) ) show newer - if has_key?(:post_ids_pn) && fetch(:post_ids_pn)[:younger] a.page.up( - href="/post/#{fetch(:post_ids_pn)[:younger]}" + href=link_to(:post, fetch(:post_ids_pn)[:younger], fetch(:query)) ) show newer - for post in fetch(:posts) article header h1 - a href="/post/#{post[:post_id]}"= post[:title] + //a(href=link_to(:post, post[:post_id], fetch(:query))) post[:title] + a(href=link_to(:post, post[:post_id]))=post[:title] footer .author=post[:username] .date= post[:written].strftime('%Y-%m-%d') @@ -20,9 +21,9 @@ - if has_key?(:page) && fetch(:page) < fetch(:pages) a.page.down( - href="/post?page=#{fetch(:page) + 1}&per_page=#{fetch(:per_page)}" + href=link_to(:post, fetch(:query), :page => fetch(:page) + 1) ) show older - if has_key?(:post_ids_pn) && fetch(:post_ids_pn)[:older] a.page.down( - href="/post/#{fetch(:post_ids_pn)[:older]}" + href=link_to(:post, fetch(:post_ids_pn)[:older]) ) show older