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__)
|
require File.expand_path('../lib/boot.rb', __FILE__)
|
||||||
|
|
||||||
Renderer.find_templates('templates')
|
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).
|
join(:accounts, :id___account_id => :account_id).
|
||||||
reverse_order(:written, :posts__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 when a single posts has to be shown
|
||||||
return load_previous_and_next_post(session, posts) if session.options[:id]
|
return load_previous_and_next_post(session, posts) if session.options[:id]
|
||||||
load_page_information(session, posts)
|
load_page_information(session, posts)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# load posts depending on the pagination
|
||||||
def self.load_page_information(session, posts)
|
def self.load_page_information(session, posts)
|
||||||
# compute pages
|
# compute pages
|
||||||
page = session.request.params['page'].to_i
|
page = session.request.params['page'].to_i
|
||||||
session.options[:page] = page if page
|
session.options[:page] = page if page
|
||||||
per_page = session.request.params['per_page'].to_i
|
per_page = session.request.params['per_page'].to_i
|
||||||
per_page = 10 if per_page < 1
|
per_page = 10 if per_page < 1
|
||||||
session.options[:per_page] = per_page if per_page
|
session.options[:query][:per_page] = per_page if per_page
|
||||||
session.options[:pages] = DB[:posts].filter(:released => true).count / per_page
|
session.options[:pages] = posts.count / per_page
|
||||||
|
|
||||||
# fetch the posts to show
|
# fetch the posts to show
|
||||||
session.options[:posts] = posts.limit(per_page, page * per_page)
|
session.options[:posts] = posts.limit(per_page, page * per_page)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# load a single posts and the ids of the next and previous posts
|
||||||
def self.load_previous_and_next_post(session, posts)
|
def self.load_previous_and_next_post(session, posts)
|
||||||
posts = posts.filter(:posts__id => session.options[:id].to_i)
|
posts = posts.filter(:posts__id => session.options[:id].to_i)
|
||||||
session.options[:posts] = posts
|
session.options[:posts] = posts
|
||||||
written = posts.first[:written]
|
written = posts.first[:written]
|
||||||
session.options[:post_ids_pn] = DB[PREV_AND_NEXT_QUERY, written, written].first
|
session.options[:post_ids_pn] = DB[PREV_AND_NEXT_QUERY, written, written].first
|
||||||
end
|
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
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,7 @@ class Application
|
||||||
session = Session.new(
|
session = Session.new(
|
||||||
::Zero::Request.new(env),
|
::Zero::Request.new(env),
|
||||||
::Zero::Response.new,
|
::Zero::Response.new,
|
||||||
@defaults.clone
|
Render.new(@defaults.clone)
|
||||||
)
|
)
|
||||||
worker = @start
|
worker = @start
|
||||||
while not worker.nil?
|
while not worker.nil?
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
require 'bundler/setup'
|
require 'bundler/setup'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
|
require 'sass'
|
||||||
|
require 'tilt'
|
||||||
|
require 'tilt/sass'
|
||||||
require 'sequel'
|
require 'sequel'
|
||||||
require 'zero'
|
require 'zero'
|
||||||
require 'sass'
|
|
||||||
require 'slim'
|
require 'slim'
|
||||||
require 'kramdown'
|
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)
|
- if has_key?(:page) && 0 < fetch(:page)
|
||||||
a.page.up(
|
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
|
) show newer
|
||||||
- if has_key?(:post_ids_pn) && fetch(:post_ids_pn)[:younger]
|
- if has_key?(:post_ids_pn) && fetch(:post_ids_pn)[:younger]
|
||||||
a.page.up(
|
a.page.up(
|
||||||
href="/post/#{fetch(:post_ids_pn)[:younger]}"
|
href=link_to(:post, fetch(:post_ids_pn)[:younger], fetch(:query))
|
||||||
) show newer
|
) show newer
|
||||||
|
|
||||||
- for post in fetch(:posts)
|
- for post in fetch(:posts)
|
||||||
article
|
article
|
||||||
header
|
header
|
||||||
h1
|
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
|
footer
|
||||||
.author=post[:username]
|
.author=post[:username]
|
||||||
.date= post[:written].strftime('%Y-%m-%d')
|
.date= post[:written].strftime('%Y-%m-%d')
|
||||||
|
@ -20,9 +21,9 @@
|
||||||
|
|
||||||
- if has_key?(:page) && fetch(:page) < fetch(:pages)
|
- if has_key?(:page) && fetch(:page) < fetch(:pages)
|
||||||
a.page.down(
|
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
|
) show older
|
||||||
- if has_key?(:post_ids_pn) && fetch(:post_ids_pn)[:older]
|
- if has_key?(:post_ids_pn) && fetch(:post_ids_pn)[:older]
|
||||||
a.page.down(
|
a.page.down(
|
||||||
href="/post/#{fetch(:post_ids_pn)[:older]}"
|
href=link_to(:post, fetch(:post_ids_pn)[:older])
|
||||||
) show older
|
) show older
|
||||||
|
|
Loading…
Reference in New Issue