homeland 0.0.9 → 1.0.0.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/MIT-LICENSE +20 -0
- data/README.md +139 -43
- data/Rakefile +23 -0
- data/app/assets/javascripts/homeland/application.coffee +31 -0
- data/app/assets/javascripts/homeland/bootstrap.min.js +7 -0
- data/{lib/generators/homeland/install/templates/javascripts → app/assets/javascripts/homeland}/jquery.timeago.js +13 -13
- data/app/assets/javascripts/homeland/tether.min.js +1 -0
- data/app/assets/stylesheets/homeland/application.scss +114 -0
- data/app/assets/stylesheets/homeland/bootstrap-theme.scss +165 -0
- data/app/assets/stylesheets/homeland/bootstrap.min.css +5 -0
- data/app/assets/stylesheets/homeland/markdown.scss +13 -0
- data/app/assets/stylesheets/homeland/tether.min.css +1 -0
- data/app/controllers/homeland/application_controller.rb +37 -12
- data/app/controllers/homeland/replies_controller.rb +25 -11
- data/app/controllers/homeland/topics_controller.rb +50 -58
- data/app/helpers/homeland/application_helper.rb +45 -13
- data/app/models/homeland/concerns/markdown_body.rb +17 -0
- data/app/models/homeland/concerns/pagination.rb +14 -0
- data/app/models/homeland/concerns/soft_delete.rb +29 -0
- data/app/models/homeland/concerns/user_methods.rb +23 -0
- data/app/models/homeland/node.rb +10 -25
- data/app/models/homeland/reply.rb +16 -17
- data/app/models/homeland/topic.rb +19 -29
- data/app/views/homeland/replies/_reply.html.erb +35 -0
- data/app/views/homeland/replies/edit.html.erb +17 -27
- data/app/views/homeland/shared/_error_messages.html.erb +2 -4
- data/app/views/homeland/topics/_form.html.erb +21 -24
- data/app/views/homeland/topics/_node_info.html.erb +9 -0
- data/app/views/homeland/topics/_reply_form.html.erb +16 -0
- data/app/views/homeland/topics/_topic.html.erb +17 -26
- data/app/views/homeland/topics/edit.html.erb +6 -10
- data/app/views/homeland/topics/index.html.erb +28 -51
- data/app/views/homeland/topics/new.html.erb +5 -10
- data/app/views/homeland/topics/show.html.erb +16 -89
- data/app/views/layouts/homeland/application.html.erb +42 -0
- data/config/locales/homeland.en.yml +40 -0
- data/config/locales/homeland.zh-CN.yml +8 -0
- data/config/routes.rb +6 -8
- data/db/migrate/20160321125035_create_homeland_nodes.rb +15 -0
- data/db/migrate/20160321125610_create_homeland_topics.rb +25 -0
- data/db/migrate/20160321125920_create_homeland_replies.rb +16 -0
- data/db/migrate/20160322062228_add_reply_to_id_to_replies.rb +7 -0
- data/lib/generators/homeland/controllers_generator.rb +14 -0
- data/lib/generators/homeland/i18n_generator.rb +22 -0
- data/lib/generators/homeland/install_generator.rb +8 -54
- data/lib/generators/homeland/templates/config/initializers/homeland.rb +34 -0
- data/lib/generators/homeland/views_generator.rb +3 -10
- data/lib/homeland.rb +29 -3
- data/lib/homeland/action_view/will_paginate.rb +38 -0
- data/lib/homeland/configuration.rb +66 -0
- data/lib/homeland/engine.rb +4 -27
- data/lib/homeland/markup.rb +17 -0
- data/lib/homeland/markup/base.rb +11 -0
- data/lib/homeland/markup/html.rb +12 -0
- data/lib/homeland/markup/markdown.rb +17 -0
- data/lib/homeland/markup/simple.rb +14 -0
- data/lib/homeland/version.rb +3 -0
- data/lib/tasks/homeland_tasks.rake +4 -0
- metadata +119 -38
- data/Changelogs.md +0 -29
- data/app/assets/images/reply.png +0 -0
- data/app/assets/javascripts/homeland.coffee +0 -51
- data/app/assets/stylesheets/homeland.scss +0 -100
- data/app/helpers/homeland/topics_helper.rb +0 -14
- data/app/models/homeland/section.rb +0 -21
- data/app/views/homeland/topics/_base.html.erb +0 -4
- data/app/views/homeland/topics/_sidebar.html.erb +0 -49
- data/app/views/homeland/topics/feed.builder +0 -20
- data/lib/generators/homeland/install/templates/images/jquery.chosen.png +0 -0
- data/lib/generators/homeland/install/templates/initializer.rb +0 -8
- data/lib/generators/homeland/install/templates/javascripts/jquery.chosen.js +0 -898
- data/lib/generators/homeland/install/templates/javascripts/jquery.hotkeys.js +0 -99
- data/lib/generators/homeland/install/templates/locales/homeland.zh-CN.yml +0 -14
- data/lib/generators/homeland/install/templates/stylesheets/jquery.chosen.scss +0 -367
- data/lib/homeland/setting.rb +0 -37
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateHomelandReplies < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :homeland_replies do |t|
|
4
|
+
t.integer :user_id
|
5
|
+
t.integer :topic_id
|
6
|
+
t.text :body
|
7
|
+
t.text :body_html
|
8
|
+
t.datetime :deleted_at
|
9
|
+
|
10
|
+
t.timestamps null: false
|
11
|
+
end
|
12
|
+
|
13
|
+
add_index :homeland_replies, :user_id
|
14
|
+
add_index :homeland_replies, :topic_id
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require 'rails/generators'
|
3
|
+
module Homeland
|
4
|
+
module Generators
|
5
|
+
class ControllersGenerator < Rails::Generators::Base #:nodoc:
|
6
|
+
source_root File.expand_path("../../../../app/controllers", __FILE__)
|
7
|
+
desc "Used to copy Homeland's views to your application's views."
|
8
|
+
|
9
|
+
def copy_controllers
|
10
|
+
directory 'homeland', "app/controllers/homeland"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
module Homeland
|
3
|
+
module Generators
|
4
|
+
class I18nGenerator < Rails::Generators::Base
|
5
|
+
desc "Create Homeland's default I18n files"
|
6
|
+
source_root File.expand_path("../../../../", __FILE__)
|
7
|
+
|
8
|
+
def add_locales
|
9
|
+
%w(en.yml zh-CN.yml).each do |fname|
|
10
|
+
path = "#{Rails.root}/config/locales/homeland.#{fname}"
|
11
|
+
if File.exists?(path)
|
12
|
+
puts "Skipping config/locales/homeland.#{fname} creation, as file already exists!"
|
13
|
+
else
|
14
|
+
puts "Adding locale (config/locales/homeland.#{fname})..."
|
15
|
+
template "config/locales/homeland.#{fname}", path
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -2,68 +2,22 @@ require 'rails/generators'
|
|
2
2
|
module Homeland
|
3
3
|
module Generators
|
4
4
|
class InstallGenerator < Rails::Generators::Base
|
5
|
-
|
6
|
-
source_root File.expand_path("../
|
7
|
-
|
5
|
+
desc "Create Homeland's base files"
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
7
|
+
|
8
8
|
def add_initializer
|
9
9
|
path = "#{Rails.root}/config/initializers/homeland.rb"
|
10
10
|
if File.exists?(path)
|
11
11
|
puts "Skipping config/initializers/homeland.rb creation, as file already exists!"
|
12
12
|
else
|
13
13
|
puts "Adding Homeland initializer (config/initializers/homeland.rb)..."
|
14
|
-
template "
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def add_javascripts
|
19
|
-
%w(jquery.hotkeys.js jquery.timeago.js jquery.chosen.js).each do |fname|
|
20
|
-
path = "#{Rails.root}/vendor/assets/javascripts/#{fname}"
|
21
|
-
if File.exists?(path)
|
22
|
-
puts "Skipping vendor/assets/javascripts/#{fname} creation, as file already exists!"
|
23
|
-
else
|
24
|
-
puts "Adding assets (vendor/assets/javascripts/#{fname})..."
|
25
|
-
template "javascripts/#{fname}", path
|
26
|
-
end
|
14
|
+
template "config/initializers/homeland.rb", path
|
27
15
|
end
|
28
16
|
end
|
29
17
|
|
30
|
-
def
|
31
|
-
|
32
|
-
path = "#{Rails.root}/vendor/assets/stylesheets/#{fname}"
|
33
|
-
if File.exists?(path)
|
34
|
-
puts "Skipping vendor/assets/stylesheets/#{fname} creation, as file already exists!"
|
35
|
-
else
|
36
|
-
puts "Adding assets (vendor/assets/stylesheets/#{fname})..."
|
37
|
-
template "stylesheets/#{fname}", path
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def add_images
|
43
|
-
%w(jquery.chosen.png).each do |fname|
|
44
|
-
path = "#{Rails.root}/vendor/assets/images/#{fname}"
|
45
|
-
if File.exists?(path)
|
46
|
-
puts "Skipping vendor/assets/images/#{fname} creation, as file already exists!"
|
47
|
-
else
|
48
|
-
puts "Adding assets (vendor/assets/images/#{fname})..."
|
49
|
-
template "images/#{fname}", path
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def add_locales
|
55
|
-
%w(zh-CN.yml).each do |fname|
|
56
|
-
path = "#{Rails.root}/config/locales/homeland.#{fname}"
|
57
|
-
if File.exists?(path)
|
58
|
-
puts "Skipping config/locales/homeland.#{fname} creation, as file already exists!"
|
59
|
-
else
|
60
|
-
puts "Adding assets (config/locales/homeland.#{fname})..."
|
61
|
-
template "locales/homeland.#{fname}", path
|
62
|
-
end
|
63
|
-
end
|
18
|
+
def add_migrations
|
19
|
+
exec("rails homeland:install:migrations")
|
64
20
|
end
|
65
|
-
|
66
|
-
|
67
21
|
end
|
68
|
-
|
69
|
-
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Homeland Config
|
2
|
+
Homeland.configure do
|
3
|
+
# Markup type, [:markdown, :plain, :html], defualt: :markdown
|
4
|
+
# self.markup = :markdown
|
5
|
+
|
6
|
+
# App Name
|
7
|
+
# self.app_name = 'Homeland'
|
8
|
+
|
9
|
+
# Page Size
|
10
|
+
# self.per_page = 32
|
11
|
+
|
12
|
+
# Class name of you User model, default: 'User'
|
13
|
+
# self.user_class = 'User'
|
14
|
+
|
15
|
+
# Method of user name in User model, default: 'name'
|
16
|
+
# self.user_name_method = 'name'
|
17
|
+
|
18
|
+
# Method of user avatar in User model, default: nil
|
19
|
+
# self.user_avatar_url_method = nil
|
20
|
+
|
21
|
+
# Method of User model for check user do have permission manage Homeland.
|
22
|
+
# self.user_admin_method = 'admin?'
|
23
|
+
|
24
|
+
# Method name of user profile page path, in User model, default: 'profile_url'
|
25
|
+
# self.user_profile_url_method = 'profile_url'
|
26
|
+
|
27
|
+
# authenticate_user method in your Controller, default: 'authenticate_user!'
|
28
|
+
# If you use Devise, authenticate_user! is correct
|
29
|
+
# self.authenticate_user_method = 'authenticate_user!'
|
30
|
+
|
31
|
+
# current_user method name in your Controller, default: 'current_user'
|
32
|
+
# If you use Devise, current_user is correct
|
33
|
+
# self.current_user_method = 'current_user'
|
34
|
+
end
|
@@ -3,19 +3,12 @@ require 'rails/generators'
|
|
3
3
|
module Homeland
|
4
4
|
module Generators
|
5
5
|
class ViewsGenerator < Rails::Generators::Base #:nodoc:
|
6
|
-
source_root File.expand_path("../../../../app/views
|
6
|
+
source_root File.expand_path("../../../../app/views", __FILE__)
|
7
7
|
desc "Used to copy Homeland's views to your application's views."
|
8
8
|
|
9
9
|
def copy_views
|
10
|
-
|
11
|
-
|
12
|
-
view_directory :topics
|
13
|
-
end
|
14
|
-
|
15
|
-
protected
|
16
|
-
|
17
|
-
def view_directory(name)
|
18
|
-
directory name.to_s, "app/views/homeland/#{name}"
|
10
|
+
directory 'homeland', "app/views/homeland"
|
11
|
+
directory 'layouts/homeland', "app/views/layouts/homeland"
|
19
12
|
end
|
20
13
|
end
|
21
14
|
end
|
data/lib/homeland.rb
CHANGED
@@ -1,6 +1,32 @@
|
|
1
|
-
require "
|
2
|
-
require "homeland/setting"
|
1
|
+
require "homeland/version"
|
3
2
|
require "homeland/engine"
|
3
|
+
require 'homeland/configuration'
|
4
|
+
require 'homeland/markup'
|
5
|
+
require 'homeland/action_view/will_paginate'
|
6
|
+
require 'font-awesome-rails'
|
4
7
|
|
5
8
|
module Homeland
|
6
|
-
|
9
|
+
class << self
|
10
|
+
attr_accessor :markups
|
11
|
+
|
12
|
+
def config
|
13
|
+
return @config if defined?(@config)
|
14
|
+
@config = Configuration.new
|
15
|
+
@config.markup = :markdown
|
16
|
+
@config.app_name = 'Homeland'
|
17
|
+
@config.per_page = 32
|
18
|
+
@config.user_class = 'User'
|
19
|
+
@config.user_name_method = 'name'
|
20
|
+
@config.user_avatar_url_method = nil
|
21
|
+
@config.user_admin_method = 'admin?'
|
22
|
+
@config.user_profile_url_method = 'profile_url'
|
23
|
+
@config.authenticate_user_method = 'authenticate_user!'
|
24
|
+
@config.current_user_method = 'current_user'
|
25
|
+
@config
|
26
|
+
end
|
27
|
+
|
28
|
+
def configure(&block)
|
29
|
+
config.instance_exec(&block)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'will_paginate/view_helpers/action_view'
|
2
|
+
|
3
|
+
module Homeland
|
4
|
+
module ActionView
|
5
|
+
module WillPaginate
|
6
|
+
def homeland_paginate(collection = nil, options = {})
|
7
|
+
options, collection = collection, nil if collection.is_a? Hash
|
8
|
+
# Taken from original will_paginate code to handle if the helper is not passed a collection object.
|
9
|
+
collection ||= infer_collection_from_controller
|
10
|
+
options[:renderer] ||= BootstrapLinkRenderer
|
11
|
+
options[:inner_window] ||= 2
|
12
|
+
will_paginate(collection, options).try :html_safe
|
13
|
+
end
|
14
|
+
|
15
|
+
class BootstrapLinkRenderer < ::WillPaginate::ActionView::LinkRenderer
|
16
|
+
protected
|
17
|
+
|
18
|
+
def html_container(html)
|
19
|
+
container_attributes[:class] = 'pagination'
|
20
|
+
tag(:ul, html, container_attributes)
|
21
|
+
end
|
22
|
+
|
23
|
+
def page_number(page)
|
24
|
+
tag :li, link(page, page, rel: rel_value(page), class: 'page-link'), class: (page == current_page ? 'page-item active' : 'page-item')
|
25
|
+
end
|
26
|
+
|
27
|
+
def gap
|
28
|
+
tag :li, link('…'.html_safe, '#'), class: 'page-item disabled'
|
29
|
+
end
|
30
|
+
|
31
|
+
def previous_or_next_page(page, text, classname)
|
32
|
+
tag :li, link(text, page || '#', class: 'page-link'),
|
33
|
+
class: [(classname[0..3] if @options[:page_links]), ("page-item #{classname}" if @options[:page_links]), ('page-item disabled' unless page)].join(' ')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Homeland
|
2
|
+
class Configuration
|
3
|
+
# Markup type, [:markdown, :plain, :html], defualt: :markdown
|
4
|
+
attr_accessor :markup
|
5
|
+
# class name of you User model, default: 'User'
|
6
|
+
attr_accessor :user_class
|
7
|
+
|
8
|
+
# method of user name in User model, default: 'name'
|
9
|
+
attr_accessor :user_name_method
|
10
|
+
|
11
|
+
# method of user avatar in User model, default: nil
|
12
|
+
#
|
13
|
+
# We suggest you give Homeland image size more than 48x48 px.
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
#
|
17
|
+
# class User
|
18
|
+
# def homeland_avatar_url
|
19
|
+
# self.avatar.url('48x48')
|
20
|
+
# end
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# config.user_avatar_url_method = :homeland_avatar_url
|
24
|
+
#
|
25
|
+
attr_accessor :user_avatar_url_method
|
26
|
+
|
27
|
+
# method in User model for check user do have permission manage Homeland.
|
28
|
+
# default: 'admin?'
|
29
|
+
#
|
30
|
+
# Example:
|
31
|
+
#
|
32
|
+
# class User
|
33
|
+
# def admin?
|
34
|
+
# Setting.forum_admins.include?(self.email)
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
attr_accessor :user_admin_method
|
38
|
+
|
39
|
+
# method name of user profile page path, in User model, default: 'profile_url'
|
40
|
+
# Example:
|
41
|
+
#
|
42
|
+
# class User
|
43
|
+
# def profile_url
|
44
|
+
# "http://www.host.com/u/#{self.username}"
|
45
|
+
# end
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# config.user_profile_url_method = 'profile_url'
|
49
|
+
attr_accessor :user_profile_url_method
|
50
|
+
|
51
|
+
# current_user method name in your Controller, default: 'current_user'
|
52
|
+
attr_accessor :current_user_method
|
53
|
+
|
54
|
+
# authenticate_user method in your Controller, default: 'authenticate_user!'
|
55
|
+
attr_accessor :authenticate_user_method
|
56
|
+
|
57
|
+
# set Homeland Application Title, default: 'Homeland'
|
58
|
+
attr_accessor :app_name
|
59
|
+
|
60
|
+
# pagination size, default: 32
|
61
|
+
attr_accessor :per_page
|
62
|
+
|
63
|
+
# Content markup, allow: [:markdown, :html, :simple], default: :markdown
|
64
|
+
attr_accessor :markup
|
65
|
+
end
|
66
|
+
end
|
data/lib/homeland/engine.rb
CHANGED
@@ -1,32 +1,9 @@
|
|
1
|
-
|
2
|
-
module ::Homeland
|
1
|
+
module Homeland
|
3
2
|
class Engine < ::Rails::Engine
|
4
3
|
isolate_namespace Homeland
|
5
|
-
|
6
|
-
class << self
|
7
|
-
attr_accessor :root
|
8
|
-
def root
|
9
|
-
@root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
config.to_prepare do
|
14
|
-
if Homeland.user_class
|
15
|
-
Homeland.user_class.has_many :topics, :class_name => "Homeland::Topic", :foreign_key => "user_id"
|
16
|
-
Homeland.user_class.has_many :replies, :class_name => "Homeland::Reply", :foreign_key => "user_id"
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
4
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
begin
|
27
|
-
require 'will_paginate'
|
28
|
-
rescue LoadError
|
29
|
-
puts "Please add the kaminari or will_paginate gem to your application's Gemfile. The Forem engine needs either kaminari or will_paginate in order to paginate."
|
30
|
-
exit
|
5
|
+
initializer "homeland.i18n.load_path" do |app|
|
6
|
+
app.config.i18n.load_path += Dir["#{Rails.root}/config/locales/**/*.yml"]
|
7
|
+
end
|
31
8
|
end
|
32
9
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'homeland/markup/base'
|
2
|
+
require 'homeland/markup/html'
|
3
|
+
require 'homeland/markup/markdown'
|
4
|
+
require 'homeland/markup/simple'
|
5
|
+
|
6
|
+
module Homeland
|
7
|
+
module Markup
|
8
|
+
class << self
|
9
|
+
# Convert Topic, Reply content with custom format
|
10
|
+
def render(raw)
|
11
|
+
const_name = "Homeland::Markup::#{Homeland.config.markup.to_s.classify}"
|
12
|
+
klass = const_name.constantize
|
13
|
+
klass.render(raw)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Homeland
|
2
|
+
module Markup
|
3
|
+
# Markdown format (github-markup)
|
4
|
+
class Markdown < Base
|
5
|
+
class << self
|
6
|
+
def render(raw)
|
7
|
+
begin
|
8
|
+
require 'github/markup'
|
9
|
+
rescue
|
10
|
+
puts "Error: You need add `gem 'github-markup'` into you Gemfile."
|
11
|
+
end
|
12
|
+
GitHub::Markup.render('raw.md', raw)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Homeland
|
2
|
+
module Markup
|
3
|
+
# Simple format, like Rails simple_format helper
|
4
|
+
class Simple < Base
|
5
|
+
class << self
|
6
|
+
include ActionView::Helpers::TextHelper
|
7
|
+
|
8
|
+
def render(raw)
|
9
|
+
simple_format(raw, {}, sanitize: false)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|