Skip to content

Instantly share code, notes, and snippets.

@lenary
Created October 31, 2008 12:10
Show Gist options
  • Save lenary/21295 to your computer and use it in GitHub Desktop.
Save lenary/21295 to your computer and use it in GitHub Desktop.
module Inflector
## Stolen From Rails. Thanks Guys!
def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
if first_letter_in_uppercase
lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
else
lower_case_and_underscored_word.first + camelize(lower_case_and_underscored_word)[1..-1]
end
end
def underscore(camel_cased_word)
camel_cased_word.to_s.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
def titleize(word)
humanize(underscore(word)).gsub(/\b('?[a-z])/) { $1.capitalize }
end
def humanize(lower_case_and_underscored_word)
lower_case_and_underscored_word.to_s.gsub(/_id$/, "").gsub(/_/, " ").capitalize
end
def capitalize(str)
upcase(slice(str, 0..0)) + downcase(slice(str, 1..-1) || '')
end
end
# Basically, I want this to be an extension of a parsing library for wikilinks.
# I'm not sure how exactly i want them done, but something like $RedCloth$ links the page to /page/RedCloth
# The text itself would also be de-camel'd, so that it appeared more normal.
# The next step is to integrate revision ids. something like $RedCloth{1}$
# would link to the revision with id 1 of the page Redcloth
# The whole parser would then be put into a HAML Engine, so that it can be rendered by the other pages.
require "rubygems"
require "RedCloth"
class PurpleColth
def to_html(text)
text.gsub!(/^\$[A-Za-z0-9]*\{[0-9]*\}\$$/){ |pagename, id|
"<a href='/page/#{pagename}/#{id}'>#{titleize(pagename)}: #{id}</a>"
}
text.gsub!(/^\$[A-Za-z0-9]*\$$/){ |pagename|
"<a href='/page/#{pagename}'>#{titleize(pagename)}</a>"
}
RedCloth.new(text).to_html
end
end
require "rubygems"
require "sinatra"
require "dm-core"
require "dm-validations"
require "dm-timestamps"
require "extra-classes"
require "inflector"
require "purplecloth"
include Inflector
class Page
include DataMapper::Resource
property :id, Integer, :serial => true
property :name, String, :nullable => false
property :current_rev, Integer, :nullable => false
property :created_at, DateTime
property :updated_at, DateTime
has n, :revisions
def title=(str)
str.downcase!.gsub!(/ */, "_")
attribute_set(:name, camelize(str))
end
def title
titleize name
end
def revision_h=(hash = {})
rew_rev = revisions.build(hash)
new_rev.save
end
def body
self.revisions.get(:id => self.current_rev).body
end
def author
self.revisions.get(:id => self.current_rev).author
end
def to_s
title
end
def to_link
"/page/#{name}"
end
end
class Revision
include DataMapper::Resource
property :id, Integer, :serial => true
property :body, Text, :nullable => false
property :author, String
property :page_id, Integer, :nullable => false
property :created_at, DateTime
belongs_to :page
def to_s
"#{page.title}: #{id}"
end
def to_link
"/page/#{page.name}/#{id}"
end
after :create do |rev|
rev.page.attribute_set(:current_rev, rev.id)
rev.page.save
end
end
Datamapper.auto_migrate!
# Index
get '/' do
@page = Page.get(:name => "MainPage")
end
# Page Index
get '/pages' do
@pages = Page.all(:order => [:name.desc])
end
# Page History
get '/page/:page/history' do
@page = Page.get(:name => params[:page])
@revisions = @page.revisions
end
# Page Revision
get '/page/:page/:rev' do
@page = Page.get(:name => params[:page])
@revision = @page.revision(:id => params[:rev])
end
# Revert Page
put '/page/:page/:rev' do
@page = Page.get(:name => params[:page])
if @page.update_attributes(:current_rev => params[:rev])
redirect "/p/#{params[:page]}"
else
redirect "/p/#{params[:page]}/#{params[:rev]}"
end
end
# Page
get '/page/:page' do
@page = Page.get(:name => params[:page])
end
# Edit Page
get '/edit/:page' do
@page = Page.get(:name => params[:page])
end
# Update Page
post '/edit/:page' do
@page = Page.get(:name => params[:page])
@page.attributes = params[:page]
if @page.save
redirect "/p/#{@page.name}"
else
redirect "/e/#{params[:page]}"
end
end
# New Page
get '/new' do
@page = Page.new
end
# Create Page
post '/new' do
@page = Page.new(params[:page])
@page.attributes = params[:page]
if @page.save
redirect "/p/#{@page.name}"
else
redirect "/n"
end
end
# Search
get '/search' do
q = params[:q]
@pages = Page.all(:body.like => '%q%' )
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment