Created
October 31, 2008 12:10
-
-
Save lenary/21295 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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