rails_blog_engine 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/BOOTSTRAP-LICENSE.txt +13 -0
- data/MIT-LICENSE +20 -0
- data/PYGMENTS-LICENSE.txt +28 -0
- data/RAILS-LICENSE.txt +22 -0
- data/README.md +165 -0
- data/Rakefile +79 -0
- data/app/assets/javascripts/rails_blog_engine/comments.js +2 -0
- data/app/assets/javascripts/rails_blog_engine/posts.js +3 -0
- data/app/assets/javascripts/rails_blog_engine.js +3 -0
- data/app/assets/stylesheets/rails_blog_engine/bootstrap_extracts.css.scss +252 -0
- data/app/assets/stylesheets/rails_blog_engine/code.css.scss +71 -0
- data/app/assets/stylesheets/rails_blog_engine/comments.css.scss +29 -0
- data/app/assets/stylesheets/rails_blog_engine/posts.css.scss +46 -0
- data/app/assets/stylesheets/rails_blog_engine/simple_form.css.scss +70 -0
- data/app/assets/stylesheets/rails_blog_engine.css +6 -0
- data/app/controllers/rails_blog_engine/application_controller.rb +26 -0
- data/app/controllers/rails_blog_engine/comments_controller.rb +47 -0
- data/app/controllers/rails_blog_engine/posts_controller.rb +67 -0
- data/app/helpers/rails_blog_engine/application_helper.rb +52 -0
- data/app/helpers/rails_blog_engine/comments_helper.rb +4 -0
- data/app/helpers/rails_blog_engine/posts_helper.rb +13 -0
- data/app/models/rails_blog_engine/comment.rb +74 -0
- data/app/models/rails_blog_engine/post.rb +73 -0
- data/app/views/rails_blog_engine/comments/_comment.html.haml +10 -0
- data/app/views/rails_blog_engine/comments/_form.html.haml +6 -0
- data/app/views/rails_blog_engine/comments/_tools.html.haml +10 -0
- data/app/views/rails_blog_engine/comments/new.html.haml +6 -0
- data/app/views/rails_blog_engine/posts/_comments_section.html.haml +11 -0
- data/app/views/rails_blog_engine/posts/_form.html.haml +7 -0
- data/app/views/rails_blog_engine/posts/_post.html.haml +20 -0
- data/app/views/rails_blog_engine/posts/_tools.html.haml +2 -0
- data/app/views/rails_blog_engine/posts/edit.html.haml +5 -0
- data/app/views/rails_blog_engine/posts/index.atom.builder +14 -0
- data/app/views/rails_blog_engine/posts/index.html.haml +15 -0
- data/app/views/rails_blog_engine/posts/new.html.haml +5 -0
- data/app/views/rails_blog_engine/posts/show.html.haml +8 -0
- data/config/locales/rails_blog_engine.en.yml +15 -0
- data/config/locales/simple_form.en.yml +24 -0
- data/config/routes.rb +24 -0
- data/db/migrate/20110912153527_create_rails_blog_engine_posts.rb +10 -0
- data/db/migrate/20110913190319_add_fields_to_rails_blog_engine_post.rb +12 -0
- data/db/migrate/20111125111958_create_rails_blog_engine_comments.rb +21 -0
- data/lib/generators/rails_blog_engine/install/USAGE +11 -0
- data/lib/generators/rails_blog_engine/install/install_generator.rb +51 -0
- data/lib/generators/rails_blog_engine/install/templates/rails_blog_engine.rb +13 -0
- data/lib/rails_blog_engine/ability.rb +16 -0
- data/lib/rails_blog_engine/engine.rb +5 -0
- data/lib/rails_blog_engine/filters/base.rb +17 -0
- data/lib/rails_blog_engine/filters/code.rb +21 -0
- data/lib/rails_blog_engine/filters.rb +53 -0
- data/lib/rails_blog_engine/version.rb +3 -0
- data/lib/rails_blog_engine.rb +18 -0
- data/lib/tasks/rails_blog_engine_tasks.rake +4 -0
- metadata +384 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
en:
|
2
|
+
simple_form:
|
3
|
+
"yes": 'Yes'
|
4
|
+
"no": 'No'
|
5
|
+
required:
|
6
|
+
text: 'required'
|
7
|
+
mark: '*'
|
8
|
+
# You can uncomment the line below if you need to overwrite the whole required html.
|
9
|
+
# When using html, text and mark won't be used.
|
10
|
+
# html: '<abbr title="required">*</abbr>'
|
11
|
+
error_notification:
|
12
|
+
default_message: "Some errors were found, please take a look:"
|
13
|
+
# Labels and hints examples
|
14
|
+
# labels:
|
15
|
+
# password: 'Password'
|
16
|
+
# user:
|
17
|
+
# new:
|
18
|
+
# email: 'E-mail para efetuar o sign in.'
|
19
|
+
# edit:
|
20
|
+
# email: 'E-mail.'
|
21
|
+
# hints:
|
22
|
+
# username: 'User name to sign in.'
|
23
|
+
# password: 'No special characters, please.'
|
24
|
+
|
data/config/routes.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
RailsBlogEngine::Engine.routes.draw do
|
2
|
+
# Atom feed.
|
3
|
+
get 'posts.:format' => 'posts#index', :constraints => { :format => 'atom' }
|
4
|
+
|
5
|
+
# Extra pages.
|
6
|
+
get 'page/:page' => 'posts#index', :constraints => { :page => /\d+/ }
|
7
|
+
|
8
|
+
# Home page.
|
9
|
+
root :to => 'posts#index'
|
10
|
+
|
11
|
+
# Public article pages.
|
12
|
+
get(':year/:month/:day/:permalink' => 'posts#show',
|
13
|
+
:constraints => { :year => /\d{4,}/, :month => /\d\d/, :day => /\d\d/ })
|
14
|
+
|
15
|
+
# A regular resource interface for everything else.
|
16
|
+
resources :posts, :except => [:index, :show, :delete] do
|
17
|
+
resources :comments, :only => [:create] do
|
18
|
+
member do
|
19
|
+
post :mark_as_ham
|
20
|
+
post :mark_as_spam
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class AddFieldsToRailsBlogEnginePost < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :rails_blog_engine_posts, :state, :string
|
4
|
+
add_column :rails_blog_engine_posts, :published_at, :datetime
|
5
|
+
add_column :rails_blog_engine_posts, :permalink, :string
|
6
|
+
add_column :rails_blog_engine_posts, :author_id, :integer
|
7
|
+
add_column :rails_blog_engine_posts, :author_type, :string
|
8
|
+
add_column :rails_blog_engine_posts, :author_byline, :string
|
9
|
+
|
10
|
+
add_index :rails_blog_engine_posts, :permalink
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class CreateRailsBlogEngineComments < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :rails_blog_engine_comments do |t|
|
4
|
+
t.references :post
|
5
|
+
t.string :author_byline
|
6
|
+
t.string :author_email
|
7
|
+
t.string :author_url
|
8
|
+
t.string :author_ip
|
9
|
+
t.string :author_user_agent
|
10
|
+
t.boolean :author_can_post
|
11
|
+
t.string :referrer
|
12
|
+
t.string :state
|
13
|
+
t.text :body
|
14
|
+
|
15
|
+
t.timestamps
|
16
|
+
end
|
17
|
+
|
18
|
+
add_index :rails_blog_engine_comments, :post_id
|
19
|
+
add_index :rails_blog_engine_comments, :author_email
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Description:
|
2
|
+
Install rails_blog_engine
|
3
|
+
|
4
|
+
Example:
|
5
|
+
rails generate rails_blog_engine:install
|
6
|
+
|
7
|
+
This will create:
|
8
|
+
config/initializers/rails_blog_engine.rb
|
9
|
+
config/locales/rails_blog_engine.*.yml
|
10
|
+
config/routes.rb (A new route for "/blog")
|
11
|
+
db/migrate/*.rb
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class RailsBlogEngine::InstallGenerator < Rails::Generators::Base
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
3
|
+
|
4
|
+
def copy_initializer_file
|
5
|
+
copy_file "rails_blog_engine.rb", "config/initializers/rails_blog_engine.rb"
|
6
|
+
end
|
7
|
+
|
8
|
+
def add_route
|
9
|
+
route 'mount RailsBlogEngine::Engine => "/blog"'
|
10
|
+
end
|
11
|
+
|
12
|
+
def copy_migrations
|
13
|
+
# Normally, we'd just call 'rake
|
14
|
+
# "rails_blog_engine:install:migrations"' to do this for us, but it's
|
15
|
+
# much more difficult to test. So we roll our own version.
|
16
|
+
copy_matching_files_from_gem('db/migrate/*.rb')
|
17
|
+
end
|
18
|
+
|
19
|
+
def copy_locales
|
20
|
+
copy_matching_files_from_gem('config/locales/rails_blog_engine.*.yml')
|
21
|
+
end
|
22
|
+
|
23
|
+
def register_javascripts
|
24
|
+
in_root do
|
25
|
+
append_file("app/assets/javascripts/application.js",
|
26
|
+
"//= require rails_blog_engine\n",
|
27
|
+
:before => /^\/\/= require/)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def register_stylesheets
|
32
|
+
in_root do
|
33
|
+
inject_into_file("app/assets/stylesheets/application.css",
|
34
|
+
" *= require rails_blog_engine\n",
|
35
|
+
:before => /^\*\//)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def gem_path(path)
|
42
|
+
File.expand_path("../../../../../#{path}", __FILE__)
|
43
|
+
end
|
44
|
+
|
45
|
+
def copy_matching_files_from_gem(pattern)
|
46
|
+
matches = gem_path(pattern)
|
47
|
+
Dir[matches].each do |path|
|
48
|
+
copy_file path, "#{File.dirname(pattern)}/#{File.basename(path)}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# Configure RailsBlogEngine here.
|
2
|
+
|
3
|
+
# If you want to activate the built-in spam filter, visit http://akismet.com/
|
4
|
+
# and sign up for an API key.
|
5
|
+
Rails.application.config.rakismet.key = ENV['RAKISMET_KEY']
|
6
|
+
|
7
|
+
# The URL of your blog, for use by Akismet's spam filter.
|
8
|
+
Rails.application.config.rakismet.url = ENV['RAKISMET_URL']
|
9
|
+
|
10
|
+
# Disable the Akismet middleware, because it isn't needed by
|
11
|
+
# rails_blog_engine. If you use Akismet elsewhere in your application, you
|
12
|
+
# may to set this back to true.
|
13
|
+
Rails.application.config.rakismet.use_middleware = false
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module RailsBlogEngine
|
2
|
+
module Ability
|
3
|
+
def can_read_blog
|
4
|
+
can :read, RailsBlogEngine::Post
|
5
|
+
can [:read, :create], RailsBlogEngine::Comment
|
6
|
+
end
|
7
|
+
|
8
|
+
def can_manage_blog
|
9
|
+
alias_action :mark_as_spam, :to => :update
|
10
|
+
alias_action :mark_as_ham, :to => :update
|
11
|
+
|
12
|
+
can :manage, RailsBlogEngine::Post
|
13
|
+
can :update, RailsBlogEngine::Comment
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module RailsBlogEngine::Filters
|
2
|
+
# A modular text filter that is applied to blog text before markdown
|
3
|
+
# processing.
|
4
|
+
class Base
|
5
|
+
# Override this method to transform +text+, using any supplied
|
6
|
+
# +arguments+.
|
7
|
+
def process(text, arguments)
|
8
|
+
raise "Please override #{self.class.name}#process"
|
9
|
+
end
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def register_filter(name)
|
13
|
+
RailsBlogEngine::Filters.register_filter(name, self)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This is a strictly optional dependency.
|
2
|
+
begin
|
3
|
+
require "pygments"
|
4
|
+
rescue LoadError => e
|
5
|
+
# Optional dependency.
|
6
|
+
end
|
7
|
+
|
8
|
+
module RailsBlogEngine::Filters
|
9
|
+
# Syntax highlighting for code blocks.
|
10
|
+
class Code < Base
|
11
|
+
register_filter :code
|
12
|
+
|
13
|
+
def process(text, options)
|
14
|
+
if defined?(Pygments)
|
15
|
+
Pygments.new(text, options[:lang] || 'ruby').colorize
|
16
|
+
else
|
17
|
+
raise "Install pygments-gem to enable syntax highlighting"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module RailsBlogEngine::Filters
|
2
|
+
|
3
|
+
# :nodoc: All registered filters.
|
4
|
+
FILTERS = {}
|
5
|
+
|
6
|
+
# Register a filter class to be used by #apply_all_to.
|
7
|
+
def self.register_filter(name, filter_class)
|
8
|
+
FILTERS[name] = filter_class.new
|
9
|
+
end
|
10
|
+
|
11
|
+
# Look up a registered filter class. Raises an error if the filter
|
12
|
+
# can't be found.
|
13
|
+
def self.find(name)
|
14
|
+
FILTERS[name] or raise "Text filter not installed: #{name}"
|
15
|
+
end
|
16
|
+
|
17
|
+
# Apply all registered filters to the specified text.
|
18
|
+
def self.apply_all_to(text)
|
19
|
+
text.gsub(/<(filter|macro|typo):([_a-zA-z0-9]+)([^>]*)\/>/m) do
|
20
|
+
trap_filter_errors do
|
21
|
+
find($2.to_sym).process(nil, parse_arguments($3))
|
22
|
+
end
|
23
|
+
end.gsub(/<(filter|macro|typo):([_a-zA-z0-9]+)([^>]*)>(.*?)<\/\1:\2>/m) do
|
24
|
+
trap_filter_errors do
|
25
|
+
find($2.to_sym).process($4, parse_arguments($3))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
# :nodoc: Trap a filter's errors and return an error message.
|
33
|
+
def self.trap_filter_errors
|
34
|
+
yield rescue "<p><strong>#{$!.to_s}</strong></p>"
|
35
|
+
end
|
36
|
+
|
37
|
+
# :nodoc: Parse a filter arugment string.
|
38
|
+
def self.parse_arguments(arg_string)
|
39
|
+
unparsed = arg_string.strip
|
40
|
+
pattern = /\A([_a-zA-z0-9]+)\s*=\s*("([^"]*)"|'([^']*)')\s*(.*)\z/m
|
41
|
+
args = {}
|
42
|
+
until unparsed == ''
|
43
|
+
m = unparsed.match(pattern)
|
44
|
+
m or raise "Can't parse filter arguments: {{#{arg_string}}}"
|
45
|
+
args[m[1].to_sym] = m[3] || m[4]
|
46
|
+
unparsed = m[5]
|
47
|
+
end
|
48
|
+
args
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
require 'rails_blog_engine/filters/base'
|
53
|
+
require 'rails_blog_engine/filters/code'
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Manually require gems, because Bundler won't auto-require them when we're
|
2
|
+
# running inside a gem.
|
3
|
+
require "state_machine"
|
4
|
+
require "cancan"
|
5
|
+
require "jquery-rails"
|
6
|
+
require "haml"
|
7
|
+
require "rdiscount"
|
8
|
+
require "sanitize"
|
9
|
+
require "simple_form"
|
10
|
+
require "kaminari"
|
11
|
+
require "rakismet"
|
12
|
+
|
13
|
+
require "rails_blog_engine/engine"
|
14
|
+
require "rails_blog_engine/ability"
|
15
|
+
require "rails_blog_engine/filters"
|
16
|
+
|
17
|
+
module RailsBlogEngine
|
18
|
+
end
|