0
0
Fork 0

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:
Gibheer 2014-01-23 21:59:24 +01:00
parent 4ba39351ea
commit 11ac9461c2
6 changed files with 75 additions and 10 deletions

View File

@ -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 => {}
})

View File

@ -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

View File

@ -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?

View File

@ -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'

46
lib/render.rb Normal file
View File

@ -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

View File

@ -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