add new helper and implement search
This adds fulltext search for blog posts. Together with the render object this creates a new possibility to extend the blog.
This commit is contained in:
parent
4ba39351ea
commit
11ac9461c2
|
@ -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 => {}
|
||||
})
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue