thredded 0.0.1 → 0.1.0
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
- metadata +303 -193
- data/MIT-LICENSE +0 -20
- data/README.mkdn +0 -46
- data/Rakefile +0 -31
- data/app/assets/javascripts/thredded/application.js +0 -15
- data/app/assets/stylesheets/thredded/application.css +0 -13
- data/app/controllers/thredded/application_controller.rb +0 -50
- data/app/controllers/thredded/messageboards_controller.rb +0 -9
- data/app/controllers/thredded/posts_controller.rb +0 -86
- data/app/controllers/thredded/preferences_controller.rb +0 -20
- data/app/controllers/thredded/private_topics_controller.rb +0 -25
- data/app/controllers/thredded/setups_controller.rb +0 -39
- data/app/controllers/thredded/topics_controller.rb +0 -121
- data/app/decorators/thredded/post_decorator.rb +0 -52
- data/app/decorators/thredded/topic_decorator.rb +0 -96
- data/app/helpers/thredded/application_helper.rb +0 -9
- data/app/helpers/thredded/messageboard_helper.rb +0 -52
- data/app/helpers/thredded/posts_helper.rb +0 -7
- data/app/helpers/thredded/topics_helper.rb +0 -21
- data/app/mailers/thredded/post_mailer.rb +0 -28
- data/app/mailers/thredded/topic_mailer.rb +0 -29
- data/app/models/thredded/ability.rb +0 -50
- data/app/models/thredded/attachment.rb +0 -24
- data/app/models/thredded/category.rb +0 -10
- data/app/models/thredded/image.rb +0 -27
- data/app/models/thredded/messageboard.rb +0 -92
- data/app/models/thredded/messageboard_decorator.rb +0 -18
- data/app/models/thredded/messageboard_preference.rb +0 -15
- data/app/models/thredded/null_preference.rb +0 -9
- data/app/models/thredded/null_topic_read.rb +0 -13
- data/app/models/thredded/null_user.rb +0 -27
- data/app/models/thredded/post.rb +0 -75
- data/app/models/thredded/post_notification.rb +0 -6
- data/app/models/thredded/private_topic.rb +0 -33
- data/app/models/thredded/private_user.rb +0 -7
- data/app/models/thredded/role.rb +0 -18
- data/app/models/thredded/topic.rb +0 -145
- data/app/models/thredded/topic_category.rb +0 -7
- data/app/models/thredded/user_detail.rb +0 -6
- data/app/models/thredded/user_extender.rb +0 -27
- data/app/models/thredded/user_preference.rb +0 -6
- data/app/models/thredded/user_topic_read.rb +0 -67
- data/app/uploaders/thredded/attachment_uploader.rb +0 -30
- data/app/uploaders/thredded/image_uploader.rb +0 -17
- data/app/views/thredded/messageboards/_messageboard.html.erb +0 -17
- data/app/views/thredded/messageboards/index.html.erb +0 -15
- data/app/views/thredded/post_mailer/at_notification.html.erb +0 -17
- data/app/views/thredded/post_mailer/at_notification.text.erb +0 -13
- data/app/views/thredded/posts/_form.html.erb +0 -25
- data/app/views/thredded/posts/_null_user.html.erb +0 -0
- data/app/views/thredded/posts/_post.html.erb +0 -25
- data/app/views/thredded/posts/_user.html.erb +0 -7
- data/app/views/thredded/posts/edit.html.erb +0 -28
- data/app/views/thredded/posts/index.html.erb +0 -74
- data/app/views/thredded/preferences/edit.html.erb +0 -23
- data/app/views/thredded/search/_form.html.erb +0 -9
- data/app/views/thredded/setups/_form.html.erb +0 -35
- data/app/views/thredded/setups/new.html.erb +0 -5
- data/app/views/thredded/shared/_currently_online.html.erb +0 -10
- data/app/views/thredded/shared/_error_msgs.html.erb +0 -7
- data/app/views/thredded/shared/_google_analytics.html.erb +0 -10
- data/app/views/thredded/shared/_topic_nav.html.erb +0 -18
- data/app/views/thredded/topic_mailer/message_notification.html.erb +0 -17
- data/app/views/thredded/topic_mailer/message_notification.text.erb +0 -13
- data/app/views/thredded/topics/_form.html.erb +0 -6
- data/app/views/thredded/topics/_topic_condensed.html.erb +0 -20
- data/app/views/thredded/topics/_topic_form.html.erb +0 -27
- data/app/views/thredded/topics/by_category.html.erb +0 -51
- data/app/views/thredded/topics/edit.html.erb +0 -25
- data/app/views/thredded/topics/index.html.erb +0 -52
- data/app/views/thredded/topics/menu/_new_topic.html.erb +0 -3
- data/app/views/thredded/topics/new.html.erb +0 -18
- data/app/views/thredded/topics/search.html.erb +0 -45
- data/config/routes.rb +0 -26
- data/db/migrate/20130425230852_create_thredded_tables.rb +0 -143
- data/lib/tasks/thredded_tasks.rake +0 -4
- data/lib/thredded/at_notification_extractor.rb +0 -15
- data/lib/thredded/at_notifier.rb +0 -65
- data/lib/thredded/at_users.rb +0 -17
- data/lib/thredded/email_processor.rb +0 -74
- data/lib/thredded/engine.rb +0 -17
- data/lib/thredded/filter/at_notification.rb +0 -11
- data/lib/thredded/filter/attachment.rb +0 -51
- data/lib/thredded/filter/base.rb +0 -13
- data/lib/thredded/filter/bbcode.rb +0 -75
- data/lib/thredded/filter/emoji.rb +0 -11
- data/lib/thredded/filter/markdown.rb +0 -25
- data/lib/thredded/filter/syntax.rb +0 -28
- data/lib/thredded/filter/textile.rb +0 -21
- data/lib/thredded/filter.rb +0 -4
- data/lib/thredded/messageboard_user_permissions.rb +0 -27
- data/lib/thredded/post_sql_builder.rb +0 -34
- data/lib/thredded/post_user_permissions.rb +0 -37
- data/lib/thredded/private_topic_notifier.rb +0 -56
- data/lib/thredded/private_topic_user_permissions.rb +0 -32
- data/lib/thredded/search_parser.rb +0 -45
- data/lib/thredded/search_sql_builder.rb +0 -25
- data/lib/thredded/setup_thredded.rb +0 -7
- data/lib/thredded/table_sql_builder.rb +0 -105
- data/lib/thredded/topic_sql_builder.rb +0 -32
- data/lib/thredded/topic_user_permissions.rb +0 -51
- data/lib/thredded/version.rb +0 -3
- data/lib/thredded.rb +0 -38
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<header>
|
|
2
|
-
<nav>
|
|
3
|
-
<ul class="breadcrumbs">
|
|
4
|
-
<li><%= link_to 'Forums', thredded.root_path %></li>
|
|
5
|
-
<li><%= link_to messageboard.name, messageboard_topics_path(messageboard, topic) %></li>
|
|
6
|
-
<li>
|
|
7
|
-
<span>
|
|
8
|
-
Editing Topic <em><%= link_to topic.title, [messageboard, topic] %></em>
|
|
9
|
-
</span>
|
|
10
|
-
</li>
|
|
11
|
-
</ul>
|
|
12
|
-
</nav>
|
|
13
|
-
</header>
|
|
14
|
-
|
|
15
|
-
<div class="forms">
|
|
16
|
-
<ul>
|
|
17
|
-
<%= nested_form_for [@messageboard, @topic], html: { class: :topic_form, multipart: true } do |form| %>
|
|
18
|
-
<%= render 'form', form: form, messageboard: messageboard.decorate %>
|
|
19
|
-
|
|
20
|
-
<li class="submit">
|
|
21
|
-
<%= form.submit 'Update Topic' %>
|
|
22
|
-
</li>
|
|
23
|
-
<% end %>
|
|
24
|
-
</ul>
|
|
25
|
-
</div>
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
<% content_for :breadcrumbs do %>
|
|
2
|
-
<ul class="breadcrumbs">
|
|
3
|
-
<li><%= link_to 'Forums', thredded.root_path %></li>
|
|
4
|
-
<li><span><%= messageboard.name %></span></li>
|
|
5
|
-
</ul>
|
|
6
|
-
<% end %>
|
|
7
|
-
|
|
8
|
-
<% content_for :actions do %>
|
|
9
|
-
<ul class="actions">
|
|
10
|
-
<%= render 'thredded/search/form' %>
|
|
11
|
-
|
|
12
|
-
<% if can? :create, Thredded::Topic %>
|
|
13
|
-
<li class='new_topic'>
|
|
14
|
-
<%= link_to 'new topic', new_messageboard_topic_path(messageboard) %>
|
|
15
|
-
</li>
|
|
16
|
-
<li class='new_private_topic'>
|
|
17
|
-
<%= link_to 'private topic', new_messageboard_private_topic_path(messageboard) %>
|
|
18
|
-
</li>
|
|
19
|
-
<% end %>
|
|
20
|
-
</ul>
|
|
21
|
-
<% end %>
|
|
22
|
-
|
|
23
|
-
<header>
|
|
24
|
-
<nav>
|
|
25
|
-
<%= yield :breadcrumbs %>
|
|
26
|
-
<%= yield :actions %>
|
|
27
|
-
</nav>
|
|
28
|
-
|
|
29
|
-
<%= render 'thredded/shared/currently_online' %>
|
|
30
|
-
</header>
|
|
31
|
-
|
|
32
|
-
<section class="topics">
|
|
33
|
-
<% if @sticky.any? %>
|
|
34
|
-
<div class="stuck">
|
|
35
|
-
<%= render partial: 'thredded/topics/topic_condensed',
|
|
36
|
-
collection: @sticky.decorate, as: :topic %>
|
|
37
|
-
</div>
|
|
38
|
-
<% end %>
|
|
39
|
-
|
|
40
|
-
<div class="currently">
|
|
41
|
-
<%= render partial: 'thredded/topics/topic_condensed',
|
|
42
|
-
collection: @topics.decorate, as: :topic %>
|
|
43
|
-
</div>
|
|
44
|
-
</section>
|
|
45
|
-
|
|
46
|
-
<footer>
|
|
47
|
-
<%= paginate @topics %>
|
|
48
|
-
<nav>
|
|
49
|
-
<%= yield :actions %>
|
|
50
|
-
<%= yield :breadcrumbs %>
|
|
51
|
-
</nav>
|
|
52
|
-
</footer>
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<header>
|
|
2
|
-
<nav>
|
|
3
|
-
<ul class="breadcrumbs">
|
|
4
|
-
<li><%= link_to 'Forums', thredded.root_path %></li>
|
|
5
|
-
<li><%= link_to messageboard.name, [messageboard, @topic] %></li>
|
|
6
|
-
<li><span>Create New Topic</span></li>
|
|
7
|
-
</ul>
|
|
8
|
-
</nav>
|
|
9
|
-
</header>
|
|
10
|
-
|
|
11
|
-
<div class="topic form">
|
|
12
|
-
<%= nested_form_for [messageboard, @topic], html: { multipart: true } do |form| %>
|
|
13
|
-
<ul>
|
|
14
|
-
<%= render 'form', form: form, messageboard: messageboard.decorate %>
|
|
15
|
-
<li class="submit"><%= form.submit 'Create New Topic' %></li>
|
|
16
|
-
</ul>
|
|
17
|
-
<% end %>
|
|
18
|
-
</div>
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
<% content_for :breadcrumbs do %>
|
|
2
|
-
<ul class="breadcrumbs">
|
|
3
|
-
<li><%= link_to 'Forums', thredded.root_path %></li>
|
|
4
|
-
<li><%= link_to messageboard.title,
|
|
5
|
-
messageboard_topics_path(messageboard) %></li>
|
|
6
|
-
<li><span>Results for "<%= params[:q]%>"</span></li>
|
|
7
|
-
</ul>
|
|
8
|
-
<% end %>
|
|
9
|
-
|
|
10
|
-
<% content_for :actions do %>
|
|
11
|
-
<ul class="actions">
|
|
12
|
-
<%= render 'thredded/search/form' %>
|
|
13
|
-
|
|
14
|
-
<% if can? :create, Thredded::Topic %>
|
|
15
|
-
<li class='new_topic'>
|
|
16
|
-
<%= link_to 'new topic', new_messageboard_topic_path(messageboard) %>
|
|
17
|
-
</li>
|
|
18
|
-
<li class='new_private_topic'>
|
|
19
|
-
<%= link_to 'private topic', new_messageboard_private_topic_path(messageboard) %>
|
|
20
|
-
</li>
|
|
21
|
-
<% end %>
|
|
22
|
-
</ul>
|
|
23
|
-
<% end %>
|
|
24
|
-
|
|
25
|
-
<header>
|
|
26
|
-
<nav>
|
|
27
|
-
<%= yield :breadcrumbs %>
|
|
28
|
-
<%= yield :actions %>
|
|
29
|
-
</nav>
|
|
30
|
-
|
|
31
|
-
<%= render partial: 'shared/currently_online' %>
|
|
32
|
-
</header>
|
|
33
|
-
|
|
34
|
-
<section class="topics">
|
|
35
|
-
<div class="currently">
|
|
36
|
-
<%= render partial: 'topics/topic_condensed', collection: @topics, as: :t %>
|
|
37
|
-
</div>
|
|
38
|
-
</section>
|
|
39
|
-
|
|
40
|
-
<footer>
|
|
41
|
-
<nav>
|
|
42
|
-
<%= yield :actions %>
|
|
43
|
-
<%= yield :breadcrumbs %>
|
|
44
|
-
</nav>
|
|
45
|
-
</footer>
|
data/config/routes.rb
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
require 'thredded/setup_thredded'
|
|
2
|
-
|
|
3
|
-
Thredded::Engine.routes.draw do
|
|
4
|
-
constraints(Thredded::SetupThredded.new) do
|
|
5
|
-
resources :setups, path: '', only: [:new, :create]
|
|
6
|
-
root to: 'setups#new'
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
constraints(lambda{|req| req.env['QUERY_STRING'].include? 'q=' }) do
|
|
10
|
-
get '/:messageboard_id(.:format)' => 'topics#search', as: :messageboard_search
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
get '/:messageboard_id/new(.:format)' => 'topics#new', as: :new_messageboard_topic
|
|
14
|
-
get '/:messageboard_id/:id/edit.(:format)' => 'topics#edit', as: :edit_messageboard_topic
|
|
15
|
-
|
|
16
|
-
resources :messageboards, only: [:index], path: '' do
|
|
17
|
-
resource :preferences
|
|
18
|
-
resources :private_topics, only: [:new, :create]
|
|
19
|
-
|
|
20
|
-
resources :topics, except: [:show], path: '' do
|
|
21
|
-
resources :posts, path: ''
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
root to: 'messageboards#index'
|
|
26
|
-
end
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
class CreateThreddedTables < ActiveRecord::Migration
|
|
2
|
-
def change
|
|
3
|
-
create_table :thredded_attachments do |t|
|
|
4
|
-
t.string :attachment
|
|
5
|
-
t.string :content_type
|
|
6
|
-
t.integer :file_size
|
|
7
|
-
t.integer :post_id
|
|
8
|
-
t.timestamps
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
create_table :thredded_categories do |t|
|
|
12
|
-
t.integer :messageboard_id, null: false
|
|
13
|
-
t.string :name, null: false
|
|
14
|
-
t.string :description
|
|
15
|
-
t.timestamps
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
create_table :thredded_images do |t|
|
|
19
|
-
t.integer :post_id
|
|
20
|
-
t.integer :width
|
|
21
|
-
t.integer :height
|
|
22
|
-
t.string :orientation
|
|
23
|
-
t.timestamps
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
create_table :thredded_messageboards do |t|
|
|
27
|
-
t.string :name, null: false
|
|
28
|
-
t.string :slug
|
|
29
|
-
t.text :description
|
|
30
|
-
t.string :security, default: 'public'
|
|
31
|
-
t.string :posting_permission, default: 'anonymous'
|
|
32
|
-
t.integer :topics_count, default: 0
|
|
33
|
-
t.integer :posts_count, default: 0
|
|
34
|
-
t.boolean :closed, default: false, null: false
|
|
35
|
-
t.timestamps
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
add_index :thredded_messageboards, :closed
|
|
39
|
-
|
|
40
|
-
create_table :thredded_post_notifications do |t|
|
|
41
|
-
t.string :email, null: false
|
|
42
|
-
t.integer :post_id, null: false
|
|
43
|
-
t.timestamps
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
create_table :thredded_posts do |t|
|
|
47
|
-
t.integer :user_id
|
|
48
|
-
t.string :user_email
|
|
49
|
-
t.text :content
|
|
50
|
-
t.string :ip
|
|
51
|
-
t.string :filter, default: 'markdown'
|
|
52
|
-
t.string :source, default: 'web'
|
|
53
|
-
t.integer :topic_id, null: false
|
|
54
|
-
t.integer :messageboard_id, null: false
|
|
55
|
-
t.timestamps
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
create_table :thredded_private_users do |t|
|
|
59
|
-
t.integer :private_topic_id
|
|
60
|
-
t.integer :user_id
|
|
61
|
-
t.timestamps
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
create_table :thredded_messageboard_preferences do |t|
|
|
65
|
-
t.boolean :notify_on_mention, default: true
|
|
66
|
-
t.boolean :notify_on_message, default: true
|
|
67
|
-
t.string :filter, default: 'markdown', null: false
|
|
68
|
-
t.integer :user_id, null: false
|
|
69
|
-
t.integer :messageboard_id, null: false
|
|
70
|
-
t.timestamps
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
add_index :thredded_messageboard_preferences, :user_id
|
|
74
|
-
add_index :thredded_messageboard_preferences, :messageboard_id
|
|
75
|
-
|
|
76
|
-
create_table :thredded_roles do |t|
|
|
77
|
-
t.string :level
|
|
78
|
-
t.integer :user_id
|
|
79
|
-
t.integer :messageboard_id
|
|
80
|
-
t.datetime :last_seen
|
|
81
|
-
t.timestamps
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
add_index :thredded_roles, :user_id
|
|
85
|
-
add_index :thredded_roles, :messageboard_id
|
|
86
|
-
|
|
87
|
-
create_table :thredded_topic_categories do |t|
|
|
88
|
-
t.integer :topic_id, null: false
|
|
89
|
-
t.integer :category_id, null: false
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
create_table :thredded_topics do |t|
|
|
93
|
-
t.integer :user_id, null: false
|
|
94
|
-
t.integer :last_user_id, null: false
|
|
95
|
-
t.string :title, null: false
|
|
96
|
-
t.string :slug, null: false
|
|
97
|
-
t.integer :messageboard_id, null: false
|
|
98
|
-
t.integer :posts_count, default: 0
|
|
99
|
-
t.string :attribs, default: '[]'
|
|
100
|
-
t.boolean :sticky, default: false
|
|
101
|
-
t.boolean :locked, default: false
|
|
102
|
-
t.string :hash_id, null: false
|
|
103
|
-
t.string :state, default: 'approved', null: false
|
|
104
|
-
t.string :type
|
|
105
|
-
t.timestamps
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
create_table :thredded_user_details do |t|
|
|
109
|
-
t.integer :user_id, null: false
|
|
110
|
-
t.datetime :latest_activity_at
|
|
111
|
-
t.integer :posts_count, default: 0
|
|
112
|
-
t.integer :topics_count, default: 0
|
|
113
|
-
t.boolean :superadmin, default: false
|
|
114
|
-
t.timestamps
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
add_index :thredded_user_details, :user_id
|
|
118
|
-
add_index :thredded_user_details, :latest_activity_at
|
|
119
|
-
|
|
120
|
-
create_table :thredded_user_preferences do |t|
|
|
121
|
-
t.integer :user_id, null: false
|
|
122
|
-
t.string :time_zone, default: 'Eastern Time (US & Canada)'
|
|
123
|
-
t.timestamps
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
add_index :thredded_user_preferences, :user_id
|
|
127
|
-
|
|
128
|
-
create_table :thredded_user_topic_reads do |t|
|
|
129
|
-
t.integer :user_id, null: false
|
|
130
|
-
t.integer :topic_id, null: false
|
|
131
|
-
t.integer :post_id, null: false
|
|
132
|
-
t.integer :posts_count, default: 0, null: false
|
|
133
|
-
t.integer :page, default: 1, null: false
|
|
134
|
-
t.timestamps
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
add_index :thredded_user_topic_reads, :user_id
|
|
138
|
-
add_index :thredded_user_topic_reads, :topic_id
|
|
139
|
-
add_index :thredded_user_topic_reads, :post_id
|
|
140
|
-
add_index :thredded_user_topic_reads, :page
|
|
141
|
-
add_index :thredded_user_topic_reads, :posts_count
|
|
142
|
-
end
|
|
143
|
-
end
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
module Thredded
|
|
2
|
-
class AtNotificationExtractor
|
|
3
|
-
def initialize(content)
|
|
4
|
-
@content = content
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def extract
|
|
8
|
-
scanned_names = @content.scan(/@([\w]+)(\W)?/)
|
|
9
|
-
scanned_names += @content.scan(/@"([\w\ ]+)"(\W)?/)
|
|
10
|
-
scanned_names
|
|
11
|
-
.map(&:first)
|
|
12
|
-
.uniq
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
data/lib/thredded/at_notifier.rb
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
require 'thredded/at_notification_extractor'
|
|
2
|
-
|
|
3
|
-
module Thredded
|
|
4
|
-
class AtNotifier
|
|
5
|
-
def initialize(post)
|
|
6
|
-
@post = post
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def notifications_for_at_users
|
|
10
|
-
members = at_notifiable_members
|
|
11
|
-
|
|
12
|
-
if members.present?
|
|
13
|
-
user_emails = members.map(&:email)
|
|
14
|
-
Thredded::PostMailer.at_notification(post.id, user_emails).deliver
|
|
15
|
-
mark_notified(members)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def at_notifiable_members
|
|
20
|
-
at_names = Thredded::AtNotificationExtractor.new(post.content).extract
|
|
21
|
-
members = post.messageboard.members_from_list(at_names).all
|
|
22
|
-
|
|
23
|
-
members.delete post.user
|
|
24
|
-
members = exclude_previously_notified(members)
|
|
25
|
-
members = exclude_those_that_are_not_private(members)
|
|
26
|
-
members = exclude_those_opting_out_of_at_notifications(members)
|
|
27
|
-
|
|
28
|
-
members
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
attr_reader :post
|
|
34
|
-
|
|
35
|
-
def exclude_those_opting_out_of_at_notifications(members)
|
|
36
|
-
members.reject do |member|
|
|
37
|
-
!Thredded::MessageboardPreference
|
|
38
|
-
.for(member)
|
|
39
|
-
.in(post.messageboard)
|
|
40
|
-
.first
|
|
41
|
-
.try(:notify_on_mention?)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def exclude_those_that_are_not_private(members)
|
|
46
|
-
members.reject do |member|
|
|
47
|
-
post.topic.private? && post.topic.users.exclude?(member)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def exclude_previously_notified(members)
|
|
52
|
-
emails_notified = post.post_notifications.map(&:email)
|
|
53
|
-
|
|
54
|
-
members.reject do |member|
|
|
55
|
-
emails_notified.include? member.email
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def mark_notified(members)
|
|
60
|
-
members.each do |member|
|
|
61
|
-
post.post_notifications.create(email: member.email)
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
data/lib/thredded/at_users.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
require 'thredded/at_notification_extractor'
|
|
2
|
-
|
|
3
|
-
module Thredded
|
|
4
|
-
class AtUsers
|
|
5
|
-
def self.render(content, messageboard)
|
|
6
|
-
at_names = AtNotificationExtractor.new(content).extract
|
|
7
|
-
members = messageboard.members_from_list(at_names)
|
|
8
|
-
|
|
9
|
-
members.each do |member|
|
|
10
|
-
content.gsub!(/@#{member.name}/i,
|
|
11
|
-
%Q{<a href="/users/#{member.name}">@#{member.name}</a>})
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
content
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
class EmailProcessor
|
|
2
|
-
attr_accessor :email, :messageboard, :user
|
|
3
|
-
|
|
4
|
-
def initialize(email)
|
|
5
|
-
@email = email
|
|
6
|
-
@user = find_user
|
|
7
|
-
@messageboard = find_messageboard
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def self.process(email)
|
|
11
|
-
processor = self.new(email)
|
|
12
|
-
processor.create_or_update_topic
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def create_or_update_topic
|
|
16
|
-
if can_post_to_topic?
|
|
17
|
-
topic = find_or_build_topic
|
|
18
|
-
post = topic.posts.build(
|
|
19
|
-
user: user,
|
|
20
|
-
content: email.body,
|
|
21
|
-
source: 'email',
|
|
22
|
-
messageboard: messageboard,
|
|
23
|
-
attachments_attributes: attachment_params,
|
|
24
|
-
)
|
|
25
|
-
post.user_email = user.email
|
|
26
|
-
|
|
27
|
-
topic.save
|
|
28
|
-
else
|
|
29
|
-
return false
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
private
|
|
34
|
-
|
|
35
|
-
def attachment_params
|
|
36
|
-
@attachment_params = {}
|
|
37
|
-
|
|
38
|
-
email.attachments.each_with_index do |attachment, i|
|
|
39
|
-
@attachment_params[i.to_s] = { 'attachment' => attachment }
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
@attachment_params
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def can_post_to_topic?
|
|
46
|
-
user && messageboard &&
|
|
47
|
-
Ability.new(user).can?(:create, messageboard.topics.new)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def find_or_build_topic
|
|
51
|
-
topic = find_topic
|
|
52
|
-
|
|
53
|
-
if topic.nil?
|
|
54
|
-
topic = messageboard.topics.build(title: email.subject)
|
|
55
|
-
topic.user = user
|
|
56
|
-
topic.state = 'pending'
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
topic.last_user = user
|
|
60
|
-
topic
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def find_topic
|
|
64
|
-
Topic.where(hash_id: email.to).first
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def find_messageboard
|
|
68
|
-
Messageboard.where(name: email.to).first || find_topic.try(:messageboard)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def find_user
|
|
72
|
-
User.where(email: email.from).first
|
|
73
|
-
end
|
|
74
|
-
end
|
data/lib/thredded/engine.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
module Thredded
|
|
2
|
-
class Engine < ::Rails::Engine
|
|
3
|
-
isolate_namespace Thredded
|
|
4
|
-
|
|
5
|
-
config.autoload_paths << File.expand_path('../../../app/decorators', __FILE__)
|
|
6
|
-
|
|
7
|
-
config.generators do |g|
|
|
8
|
-
g.test_framework :rspec, fixture: true
|
|
9
|
-
g.fixture_replacement :factory_girl, dir: 'spec/factories'
|
|
10
|
-
g.helper false
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
config.after_initialize do
|
|
14
|
-
Thredded.user_class.send(:include, Thredded::UserExtender)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
module Thredded
|
|
2
|
-
module Filter
|
|
3
|
-
module Attachment
|
|
4
|
-
def filtered_content
|
|
5
|
-
content = super
|
|
6
|
-
matches = content.scan(/(?<full>\[t:(?<tag>\w+)=?(?<img_nmb>\d+)? ?(?<attribs>[^\]]+)?\])/)
|
|
7
|
-
|
|
8
|
-
matches.each do |match|
|
|
9
|
-
str_buff = ''
|
|
10
|
-
full = match[0]
|
|
11
|
-
tag = match[1]
|
|
12
|
-
img_number = match[2] ? match[2].to_i - 1 : 0 # default to first attachment
|
|
13
|
-
attribs = match[3]
|
|
14
|
-
|
|
15
|
-
if(tag != 'img' || !self.attachments[img_number])
|
|
16
|
-
next
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# start with img tag
|
|
20
|
-
str_buff += '<img '
|
|
21
|
-
|
|
22
|
-
# get attachment object at spot img_number - 1
|
|
23
|
-
attachment = self.attachments[img_number]
|
|
24
|
-
str_buff += 'src="' + attachment.attachment.to_s + '" '
|
|
25
|
-
|
|
26
|
-
# do attribute stuff, left right first
|
|
27
|
-
if !attribs.nil?
|
|
28
|
-
if align = attribs.match(/(left|right)/)
|
|
29
|
-
str_buff += 'class="align_' + align[0] + '" '
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# attributes, width x height
|
|
33
|
-
if wxh = attribs.match(/(\d+)x?(\d+)?/)
|
|
34
|
-
str_buff += 'width="' + wxh[1] + '" '
|
|
35
|
-
height = wxh[2].nil? ? wxh[1] : wxh[2]
|
|
36
|
-
str_buff += 'height="' + height + '" '
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# end img tag
|
|
41
|
-
str_buff += '/>'
|
|
42
|
-
|
|
43
|
-
# replace in post content
|
|
44
|
-
content = content.sub(full, str_buff)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
content.html_safe
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
data/lib/thredded/filter/base.rb
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
module Thredded
|
|
2
|
-
module Filter
|
|
3
|
-
module Bbcode
|
|
4
|
-
require 'bb-ruby'
|
|
5
|
-
|
|
6
|
-
BB = {
|
|
7
|
-
'Spoilers' => [
|
|
8
|
-
/\[spoiler\](.*?)\[\/spoiler\1?\]/mi,
|
|
9
|
-
'<blockquote class="spoiler">\1</blockquote>',
|
|
10
|
-
'Spoiler Text',
|
|
11
|
-
'[spoiler]Dumbledore dies[/spoiler]',
|
|
12
|
-
:spoiler],
|
|
13
|
-
'YouTube' => [
|
|
14
|
-
/\[youtube\]https?\:\/\/(www\.)?youtube.com\/((watch)?\?vi?=|embed\/)(.*?)\[\/youtube\1?\]/i,
|
|
15
|
-
'<iframe class="youtube" width="560" height="315" src="//www.youtube.com/embed/\4?&rel=0&theme=light&showinfo=0&hd=1&autohide=1&color=white" frameborder="0" allowfullscreen="allowfullscreen"></iframe>',
|
|
16
|
-
'Youtube Video',
|
|
17
|
-
:video],
|
|
18
|
-
'Link (Legacy)' => [
|
|
19
|
-
/\[link=(?:")?(.*?)(?:")?\](.*?)\[\/link\]/mi,
|
|
20
|
-
'<a href="\1">\2</a>',
|
|
21
|
-
'Hyperlink to somewhere else',
|
|
22
|
-
'Maybe try looking on [link=http://google.com]Google[/link]?',
|
|
23
|
-
:link],
|
|
24
|
-
'Link (Legacy Implied)' => [
|
|
25
|
-
/\[link\](.*?)\[\/link\]/mi,
|
|
26
|
-
'<a href="\1">\1</a>',
|
|
27
|
-
'Hyperlink (legacy implied)',
|
|
28
|
-
"Maybe try looking on [link]http://google.com[/link]",
|
|
29
|
-
:link],
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
def self.included(base)
|
|
33
|
-
base.class_eval do
|
|
34
|
-
Thredded::Post::Filters << :bbcode
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def filtered_content
|
|
39
|
-
if filter.to_sym == :bbcode
|
|
40
|
-
content = super
|
|
41
|
-
content = replace_code_tags(content)
|
|
42
|
-
content = replace_quote_tags(content)
|
|
43
|
-
content = content.bbcode_to_html(BB)
|
|
44
|
-
content = remove_empty_p_tags(content)
|
|
45
|
-
content = CGI.unescapeHTML(content)
|
|
46
|
-
|
|
47
|
-
content.html_safe
|
|
48
|
-
else
|
|
49
|
-
super
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def replace_code_tags(content)
|
|
54
|
-
content.gsub!(/\[code\]/, '<pre><code>')
|
|
55
|
-
content.gsub!(/\[code:(\D+?)\]/, '<pre><code class="language-\1" lang="\1">')
|
|
56
|
-
content.gsub!(/\[\/code\]/, '</code></pre>')
|
|
57
|
-
content.html_safe
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def replace_quote_tags(content)
|
|
61
|
-
content.gsub!(/\[quote(:.*)?=(?:")?(.*?)(?:")?\]/,
|
|
62
|
-
'</p><fieldset><legend>\2</legend><blockquote><p>')
|
|
63
|
-
content.gsub!(/\[quote(:.*?)?\]/,
|
|
64
|
-
'</p><fieldset><blockquote><p>')
|
|
65
|
-
content.gsub!(/\[\/quote\]/,
|
|
66
|
-
'</p></blockquote></fieldset><p>')
|
|
67
|
-
content.html_safe
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def remove_empty_p_tags(content)
|
|
71
|
-
content.gsub(/<p>\s*?<\/p>/, '')
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|