formol 0.0.4 → 0.0.5
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.
- data/README.md +72 -8
- data/app/assets/images/formol/default_avatar.png +0 -0
- data/app/controllers/formol/forums_controller.rb +8 -0
- data/app/controllers/formol/topics_controller.rb +32 -0
- data/app/helpers/formol/forums_helper.rb +4 -0
- data/app/helpers/formol/posts_helper.rb +23 -0
- data/app/helpers/formol/topics_helper.rb +28 -0
- data/app/models/formol/forum.rb +11 -0
- data/app/models/formol/post.rb +1 -6
- data/app/models/formol/topic.rb +24 -1
- data/app/views/formol/forums/show.html.erb +3 -0
- data/app/views/formol/posts/_post.html.erb +1 -1
- data/app/views/formol/topics/_form.html.erb +1 -4
- data/app/views/formol/topics/show.html.erb +15 -3
- data/config/locales/formol/views/forums/en.yml +2 -1
- data/config/locales/formol/views/posts/en.yml +2 -0
- data/config/locales/formol/views/topics/en.yml +4 -0
- data/config/routes.rb +12 -1
- data/lib/formol.rb +11 -1
- data/lib/formol/config.rb +6 -1
- data/lib/formol/generators/install/templates/initializer/formol.rb.erb +7 -0
- data/lib/formol/generators/install/templates/lib/permissions/special_rights.rb +2 -6
- data/lib/formol/version.rb +1 -1
- data/lib/formol/view_helpers/assets_helper.rb +6 -0
- metadata +13 -36
- data/lib/formol/formatters/redcarpet/formatter.rb +0 -36
- data/lib/formol/formatters/redcarpet/syntax_highlighter.rb +0 -23
data/README.md
CHANGED
@@ -58,14 +58,60 @@ When I would have read travis documentation, I'll test it on more platforms / db
|
|
58
58
|
|
59
59
|
## Installation
|
60
60
|
|
61
|
-
|
62
|
-
|
61
|
+
You can now install formol as a gem.
|
62
|
+
|
63
|
+
To install 0.0.4 (actual gem pushed)
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
#in your Gemfile
|
67
|
+
|
68
|
+
gem 'formol'
|
69
|
+
```
|
70
|
+
|
71
|
+
To install 0.0.5 (actual master revision)
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
#in your Gemfile
|
75
|
+
|
76
|
+
gem 'formol', :git => 'https://github.com/mulasse/formol'
|
77
|
+
```
|
78
|
+
|
79
|
+
then, execute `rails g formol:install`
|
80
|
+
|
81
|
+
You could have an issue saying that you're call method 'user class' on nil. That's because I load an observer in Formol::Engine.
|
82
|
+
I have no solution against this at the moment. Every tip is welcome.
|
83
|
+
|
84
|
+
Once `formol:install` has run, you should do the following things:
|
85
|
+
|
86
|
+
* run `rake db:migrate`
|
87
|
+
* add `<%= include_formol_javascripts %>` and `<%= include_formol_stylesheets %>` in the head section of your application layout
|
88
|
+
* add `include Formol::Integration::User` in your `User` model
|
89
|
+
* add one or more text-formatter gems into your gemfile (actually, only 'formol-markdown')
|
90
|
+
* edit initializer file and change `config.text_formatter` if you want something else than markdown
|
91
|
+
|
92
|
+
Formol expect your 'User' model to provide a method/property called `display_name`.
|
93
|
+
If your model hasn't it already, create this method and return whatever you want (nickname, firstname + lastname ...)
|
94
|
+
|
95
|
+
If you want to use syntax-highlighting, add a `stylesheet_link_tag` with `pygments/one_of_pyments_stylesheets` as param in your application layout.
|
96
|
+
You can find all pygments stylesheets in `app/assets/pygments`. This will be improved in the future.
|
97
|
+
|
98
|
+
Formol relies on jquery, jquery-ui and jquery_ujs.
|
99
|
+
You should have them in your application.css or application layout.
|
100
|
+
|
101
|
+
Without jquery-ui, sort categories / forums and change forum's categories won't be available in admin.
|
102
|
+
|
103
|
+
NOTICE:
|
104
|
+
|
105
|
+
0.0.4 & 0.0.5 are unstable. Almost all functionalities are tested BUT application is not complete.
|
106
|
+
You should not use Formol in production for now.
|
63
107
|
|
64
108
|
## Features
|
65
109
|
|
66
110
|
* Administration
|
67
111
|
* categories
|
68
112
|
* forums
|
113
|
+
* Forums
|
114
|
+
* mark all topics as read
|
69
115
|
* Topics
|
70
116
|
* locking topics
|
71
117
|
* viewing all topics for a forum
|
@@ -81,9 +127,10 @@ It should be installable as a rails plugin but I didn't try it.
|
|
81
127
|
* quoting
|
82
128
|
* display user's signature
|
83
129
|
* RTE
|
130
|
+
* gravatars (based on User#email with default avatar)
|
131
|
+
* avatars (bringed by your own)
|
84
132
|
* Text formatting
|
85
|
-
* markdown
|
86
|
-
* syntax highlighting
|
133
|
+
* markdown + syntax highlighting (gem 'formol-markdown')
|
87
134
|
* User preferences
|
88
135
|
* display signatures
|
89
136
|
* display avatars
|
@@ -93,7 +140,27 @@ It should be installable as a rails plugin but I didn't try it.
|
|
93
140
|
* Misc
|
94
141
|
* install generator
|
95
142
|
* gemspec
|
96
|
-
* basic
|
143
|
+
* basic style
|
144
|
+
|
145
|
+
## Help on avatars
|
146
|
+
|
147
|
+
If you provide your own system of avatar storage, you'll need to provide `avatar_url` in your User model.
|
148
|
+
|
149
|
+
An example, with paperclip:
|
150
|
+
|
151
|
+
```ruby
|
152
|
+
class User < ActiveRecord::Base
|
153
|
+
has_attached_file :avatar, :styles => { :thumb => '100x100>' }
|
154
|
+
|
155
|
+
def avatar_url
|
156
|
+
avatar.url(:thumb)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
```
|
160
|
+
|
161
|
+
Formol works well with 100x100 avatars (according to basic style)
|
162
|
+
|
163
|
+
NOTICE: formol will look first for `avatar_url`, then for `email` and then fallback to default avatar
|
97
164
|
|
98
165
|
## Preview
|
99
166
|
|
@@ -127,7 +194,6 @@ Others:
|
|
127
194
|
|
128
195
|
## Coming next
|
129
196
|
|
130
|
-
* Mark all topics as read (actually have no scaling solution)
|
131
197
|
* Soft delete topics (i'm not sure now since all tests failed because soft deletion doesn't trigger destroy callbacks)
|
132
198
|
* Theme support
|
133
199
|
* Generator (devise views)
|
@@ -135,8 +201,6 @@ Others:
|
|
135
201
|
* Selenium tests
|
136
202
|
* More translations (french of course and more)
|
137
203
|
* Permissions management (by admin)
|
138
|
-
* Gravatars
|
139
|
-
* Avatar uploading
|
140
204
|
|
141
205
|
## Boring legal stuff
|
142
206
|
|
Binary file
|
@@ -10,6 +10,14 @@ module Formol
|
|
10
10
|
respond_with(forum)
|
11
11
|
end
|
12
12
|
|
13
|
+
def mark_as_read
|
14
|
+
formol_authorize!(current_formol_user, :read_forum)
|
15
|
+
|
16
|
+
forum.mark_as_read(current_formol_user) if current_formol_user
|
17
|
+
|
18
|
+
respond_with(forum)
|
19
|
+
end
|
20
|
+
|
13
21
|
protected
|
14
22
|
|
15
23
|
def forum
|
@@ -72,6 +72,38 @@ module Formol
|
|
72
72
|
|
73
73
|
respond_with(topic, :location => forum)
|
74
74
|
end
|
75
|
+
|
76
|
+
def pin
|
77
|
+
formol_authorize!(current_formol_user, :pin_topic)
|
78
|
+
|
79
|
+
topic.pin_topic!
|
80
|
+
|
81
|
+
respond_with(topic, :location => [forum, topic])
|
82
|
+
end
|
83
|
+
|
84
|
+
def unpin
|
85
|
+
formol_authorize!(current_formol_user, :pin_topic)
|
86
|
+
|
87
|
+
topic.unpin_topic!
|
88
|
+
|
89
|
+
respond_with(topic, :location => [forum, topic])
|
90
|
+
end
|
91
|
+
|
92
|
+
def lock
|
93
|
+
formol_authorize!(current_formol_user, :lock_topic)
|
94
|
+
|
95
|
+
topic.lock_topic!
|
96
|
+
|
97
|
+
respond_with(topic, :location => [forum, topic])
|
98
|
+
end
|
99
|
+
|
100
|
+
def unlock
|
101
|
+
formol_authorize!(current_formol_user, :lock_topic)
|
102
|
+
|
103
|
+
topic.unlock_topic!
|
104
|
+
|
105
|
+
respond_with(topic, :location => [forum, topic])
|
106
|
+
end
|
75
107
|
|
76
108
|
protected
|
77
109
|
|
@@ -23,5 +23,28 @@ module Formol
|
|
23
23
|
|
24
24
|
(s && user ? user.preference.display_signatures? : s)
|
25
25
|
end
|
26
|
+
|
27
|
+
def avatar_for(user)
|
28
|
+
img = if user.respond_to?(:avatar_url) && user.avatar_url.present?
|
29
|
+
user.avatar_url
|
30
|
+
elsif user.respond_to?(:email) && user.email.present?
|
31
|
+
require 'digest/md5' unless defined?(Digest::MD5)
|
32
|
+
|
33
|
+
email_h = Digest::MD5.hexdigest(user.email.to_s.strip.downcase)
|
34
|
+
options = { :s => 100, :d => default_avatar }
|
35
|
+
|
36
|
+
"http://www.gravatar.com/avatar/#{email_h}?#{options.to_param}"
|
37
|
+
else
|
38
|
+
default_avatar
|
39
|
+
end
|
40
|
+
|
41
|
+
image_tag(img, :alt => user.display_name)
|
42
|
+
end
|
43
|
+
|
44
|
+
def default_avatar
|
45
|
+
img = Formol.config.default_avatar
|
46
|
+
|
47
|
+
img && URI(img).absolute? ? img : request.protocol + request.host_with_port + path_to_image(img)
|
48
|
+
end
|
26
49
|
end
|
27
50
|
end
|
@@ -23,5 +23,33 @@ module Formol
|
|
23
23
|
formol_authorized?(user, :vote_poll, topic) &&
|
24
24
|
!poll.voted?(user)
|
25
25
|
end
|
26
|
+
|
27
|
+
def display_edit_topic?(user, topic)
|
28
|
+
!topic.locked? && formol_authorized?(user, :edit_topic, topic)
|
29
|
+
end
|
30
|
+
|
31
|
+
def display_subscribe_topic?(user, topic)
|
32
|
+
!topic.locked? && formol_authorized?(user, :subscribe_topic, topic)
|
33
|
+
end
|
34
|
+
|
35
|
+
def display_reply_topic?(user, topic)
|
36
|
+
!topic.locked? && formol_authorized?(user, :create_post, topic)
|
37
|
+
end
|
38
|
+
|
39
|
+
def display_pin_topic?(user, topic)
|
40
|
+
!topic.locked? && !topic.pinned? && formol_authorized?(user, :pin_topic)
|
41
|
+
end
|
42
|
+
|
43
|
+
def display_unpin_topic?(user, topic)
|
44
|
+
!topic.locked? && topic.pinned? && formol_authorized?(user, :pin_topic)
|
45
|
+
end
|
46
|
+
|
47
|
+
def display_lock_topic?(user, topic)
|
48
|
+
!topic.locked? && formol_authorized?(user, :lock_topic)
|
49
|
+
end
|
50
|
+
|
51
|
+
def display_unlock_topic?(user, topic)
|
52
|
+
topic.locked? && formol_authorized?(user, :lock_topic)
|
53
|
+
end
|
26
54
|
end
|
27
55
|
end
|
data/app/models/formol/forum.rb
CHANGED
@@ -73,5 +73,16 @@ module Formol
|
|
73
73
|
def unregister_last_post
|
74
74
|
update_attributes!(:last_post => posts.order('formol_posts.id').last)
|
75
75
|
end
|
76
|
+
|
77
|
+
# Mark all unread topics as read for a given user
|
78
|
+
def mark_as_read(user)
|
79
|
+
topics.unread(user).each do |unread|
|
80
|
+
unread.track_for_user!(user)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def read?(user)
|
85
|
+
topics.unread(user).blank?
|
86
|
+
end
|
76
87
|
end
|
77
88
|
end
|
data/app/models/formol/post.rb
CHANGED
@@ -119,13 +119,8 @@ module Formol
|
|
119
119
|
return true if quote_id.blank?
|
120
120
|
|
121
121
|
q = topic.posts.find(quote_id)
|
122
|
-
formatter = Formol.config.formatter.new
|
123
|
-
|
124
|
-
# Extract and agnostize it
|
125
|
-
content_with_quote = "> **#{q.user.display_name} #{I18n.t('.wrote')}:**\n>\n"
|
126
|
-
content_with_quote << formatter.quote(q.content)
|
127
122
|
|
128
|
-
self.content =
|
123
|
+
self.content = Formol.config.formatter.new.quote(q.user.display_name, q.content)
|
129
124
|
self.content << "\n\n" #use '<<' to skip normalize_attribute
|
130
125
|
self.content
|
131
126
|
end
|
data/app/models/formol/topic.rb
CHANGED
@@ -5,7 +5,7 @@ module Formol
|
|
5
5
|
|
6
6
|
#Security
|
7
7
|
attr_protected :forum_id, :user_id, :first_post_id, :last_post_id,
|
8
|
-
:posts_count, :views_count
|
8
|
+
:posts_count, :views_count, :pinned, :locked
|
9
9
|
|
10
10
|
#Virtual attributes
|
11
11
|
attr_accessor :attach_poll
|
@@ -38,6 +38,8 @@ module Formol
|
|
38
38
|
validates :posts, :presence => true
|
39
39
|
validates :first_post, :presence => true
|
40
40
|
|
41
|
+
validate :validates_not_locked
|
42
|
+
|
41
43
|
#Normalization
|
42
44
|
normalize_attribute :title, :with => [:squish, :blank]
|
43
45
|
|
@@ -80,6 +82,22 @@ module Formol
|
|
80
82
|
|
81
83
|
#Business methods
|
82
84
|
|
85
|
+
def pin_topic!
|
86
|
+
update_attribute(:pinned, true)
|
87
|
+
end
|
88
|
+
|
89
|
+
def unpin_topic!
|
90
|
+
update_attribute(:pinned, false)
|
91
|
+
end
|
92
|
+
|
93
|
+
def lock_topic!
|
94
|
+
update_attribute(:locked, true)
|
95
|
+
end
|
96
|
+
|
97
|
+
def unlock_topic!
|
98
|
+
update_attribute(:locked, false)
|
99
|
+
end
|
100
|
+
|
83
101
|
# Increments views counter
|
84
102
|
def view!
|
85
103
|
# Use class method instead of instance to avoid concurrence problems
|
@@ -181,5 +199,10 @@ module Formol
|
|
181
199
|
def reject_poll_if_needed
|
182
200
|
self.poll = nil if poll && !attach_poll
|
183
201
|
end
|
202
|
+
|
203
|
+
# add an error on base if topic is locked
|
204
|
+
def validates_not_locked
|
205
|
+
errors[:base] << I18n.t(:'activerecord.attributes.topic.base.locked') if locked?
|
206
|
+
end
|
184
207
|
end
|
185
208
|
end
|
@@ -10,6 +10,9 @@
|
|
10
10
|
<% if formol_authorized?(current_formol_user, :create_topic) %>
|
11
11
|
<li class="new_topic"><%= link_to t('.new'), new_forum_topic_path(@forum) %></li>
|
12
12
|
<% end %>
|
13
|
+
<% if display_mark_as_read?(current_formol_user, @forum) %>
|
14
|
+
<li class="mark_as_read"><%= link_to t('.mark_as_read'), mark_as_read_forum_path(@forum), :method => :put %></li>
|
15
|
+
<% end %>
|
13
16
|
</ul>
|
14
17
|
|
15
18
|
<%= render 'formol/topics/list', :forum => @forum, :topics => @topics %>
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<span class="display_name"><%= post.user.display_name %></span>
|
13
13
|
<% if display_avatars?(current_formol_user) %>
|
14
14
|
<figure>
|
15
|
-
|
15
|
+
<%= avatar_for(post.user) %>
|
16
16
|
</figure>
|
17
17
|
<% end %>
|
18
18
|
<span class="posts_count"><%= t('.user_posts') %>: <%= post.user.formol_posts_count %></span>
|
@@ -1,4 +1,5 @@
|
|
1
1
|
<%= semantic_form_for [@forum, @topic] do |form| %>
|
2
|
+
<%= form.semantic_errors :base %>
|
2
3
|
<%= form.inputs do %>
|
3
4
|
<%= form.input :title %>
|
4
5
|
<% end %>
|
@@ -10,10 +11,6 @@
|
|
10
11
|
<%= render 'formol/polls/form', :form => poll_form, :topic => @topic %>
|
11
12
|
<% end %>
|
12
13
|
<% end %>
|
13
|
-
<%= form.inputs :name => t('.options') do %>
|
14
|
-
<%= form.input :pinned %>
|
15
|
-
<%= form.input :locked %>
|
16
|
-
<% end %>
|
17
14
|
<%= form.buttons do %>
|
18
15
|
<%= form.commit_button %>
|
19
16
|
<% end %>
|
@@ -4,15 +4,27 @@
|
|
4
4
|
<h2><%= t('.topic') %>: <%= @topic.title %></h2>
|
5
5
|
|
6
6
|
<ul class="topic_tools">
|
7
|
-
<% if
|
7
|
+
<% if display_edit_topic?(current_formol_user, @topic) %>
|
8
8
|
<li class="edit"><%= link_to t('.edit'), edit_forum_topic_path(@forum, @topic) %></li>
|
9
9
|
<% end %>
|
10
|
-
<% if
|
10
|
+
<% if display_subscribe_topic?(current_formol_user, @topic) %>
|
11
11
|
<li class="subscribe"><%= link_to_subscription(@topic, current_formol_user) %></li>
|
12
12
|
<% end %>
|
13
|
-
<% if
|
13
|
+
<% if display_reply_topic?(current_formol_user, @topic) %>
|
14
14
|
<li class="new_post"><%= link_to t('.new_post'), new_topic_post_path(@topic) %></li>
|
15
15
|
<% end %>
|
16
|
+
<% if display_pin_topic?(current_formol_user, @topic) %>
|
17
|
+
<li class="pin_topic"><%= link_to t('.pin_topic'), pin_forum_topic_path(@forum, @topic), :method => :put %></li>
|
18
|
+
<% end %>
|
19
|
+
<% if display_unpin_topic?(current_formol_user, @topic) %>
|
20
|
+
<li class="unpin_topic"><%= link_to t('.unpin_topic'), unpin_forum_topic_path(@forum, @topic), :method => :delete %></li>
|
21
|
+
<% end %>
|
22
|
+
<% if display_lock_topic?(current_formol_user, @topic) %>
|
23
|
+
<li class="lock_topic"><%= link_to t('.lock_topic'), lock_forum_topic_path(@forum, @topic), :method => :put %></li>
|
24
|
+
<% end %>
|
25
|
+
<% if display_unlock_topic?(current_formol_user, @topic) %>
|
26
|
+
<li class="unlock_topic"><%= link_to t('.unlock_topic'), unlock_forum_topic_path(@forum, @topic), :method => :delete %></li>
|
27
|
+
<% end %>
|
16
28
|
</ul>
|
17
29
|
|
18
30
|
<% if @topic.poll %>
|
data/config/routes.rb
CHANGED
@@ -2,7 +2,18 @@ Formol::Engine.routes.draw do
|
|
2
2
|
resources :categories, :only => [:index, :show]
|
3
3
|
|
4
4
|
resources :forums, :only => [:show] do
|
5
|
-
|
5
|
+
member do
|
6
|
+
put 'mark_as_read'
|
7
|
+
end
|
8
|
+
|
9
|
+
resources :topics, :except => [:index] do
|
10
|
+
member do
|
11
|
+
put 'lock'
|
12
|
+
put 'pin'
|
13
|
+
delete 'unlock'
|
14
|
+
delete 'unpin'
|
15
|
+
end
|
16
|
+
end
|
6
17
|
end
|
7
18
|
|
8
19
|
resources :topics do
|
data/lib/formol.rb
CHANGED
@@ -3,6 +3,9 @@ require 'formol_'
|
|
3
3
|
|
4
4
|
module Formol
|
5
5
|
mattr_reader :config
|
6
|
+
mattr_reader :formatters
|
7
|
+
|
8
|
+
@@formatters = {}
|
6
9
|
|
7
10
|
class << self
|
8
11
|
def configure(&block)
|
@@ -29,7 +32,14 @@ module Formol
|
|
29
32
|
|
30
33
|
# set formatter
|
31
34
|
def set_formatter
|
32
|
-
config.
|
35
|
+
unless formatters.has_key?(config.text_formatter)
|
36
|
+
raise <<STR
|
37
|
+
You have chosen an invalid text formatter (#{config.text_formatter}).
|
38
|
+
When setting a text_formatter, don't forget to add the corresponding gem to your Gemfile.
|
39
|
+
STR
|
40
|
+
end
|
41
|
+
|
42
|
+
config.formatter = formatters[config.text_formatter]
|
33
43
|
end
|
34
44
|
|
35
45
|
# load config.yml located inside main app
|
data/lib/formol/config.rb
CHANGED
@@ -3,10 +3,15 @@ module Formol
|
|
3
3
|
:current_user_helper_method,
|
4
4
|
:formatter,
|
5
5
|
:email_from,
|
6
|
-
:text_formatter
|
6
|
+
:text_formatter,
|
7
|
+
:default_avatar)
|
7
8
|
|
8
9
|
def user
|
9
10
|
@user ||= user_class.constantize
|
10
11
|
end
|
12
|
+
|
13
|
+
def default_avatar
|
14
|
+
@default_avatar || 'formol/default_avatar.png'
|
15
|
+
end
|
11
16
|
end
|
12
17
|
end
|
@@ -18,4 +18,11 @@ Formol.configure do
|
|
18
18
|
#
|
19
19
|
# actually, only subscriptions send emails
|
20
20
|
config.email_from = 'noreply@example.com'
|
21
|
+
|
22
|
+
# Formol relies on gravatar for avatars
|
23
|
+
# <%= user_class %> needs to respond to 'email' method for that
|
24
|
+
# Formol provides a default avatar but you could not like it
|
25
|
+
# If you wanna change it, uncomment the following line
|
26
|
+
# you can set a relative path as you used it in image_tag() or an absolute path
|
27
|
+
# config.default_avatar = 'formol/default_avatar.png'
|
21
28
|
end
|
@@ -8,16 +8,12 @@ module Formol
|
|
8
8
|
module SpecialRights
|
9
9
|
# a user can edit a topic if he wrotes it
|
10
10
|
def able_to_edit_topic?(topic)
|
11
|
-
has_right?(:edit_topic) ||
|
11
|
+
has_right?(:edit_topic) || topic.user_id == user.id
|
12
12
|
end
|
13
13
|
|
14
14
|
# a user can edit a post if he wrotes it
|
15
15
|
def able_to_edit_post?(post)
|
16
|
-
has_right?(:edit_post) ||
|
17
|
-
end
|
18
|
-
|
19
|
-
def able_to_create_post?(topic)
|
20
|
-
has_right?(:create_post) && !topic.locked?
|
16
|
+
has_right?(:edit_post) || post.user_id == user.id
|
21
17
|
end
|
22
18
|
end
|
23
19
|
end
|
data/lib/formol/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: formol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-17 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: formtastic
|
16
|
-
requirement: &
|
16
|
+
requirement: &79556670 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *79556670
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: attribute_normalizer
|
27
|
-
requirement: &
|
27
|
+
requirement: &79556380 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *79556380
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: will_paginate
|
38
|
-
requirement: &
|
38
|
+
requirement: &79555940 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '3.0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *79555940
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: ranked-model
|
49
|
-
requirement: &
|
49
|
+
requirement: &79555500 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *79555500
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: default_value_for
|
60
|
-
requirement: &
|
60
|
+
requirement: &79555040 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,29 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: pygments.rb
|
71
|
-
requirement: &84457100 !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
|
-
requirements:
|
74
|
-
- - ! '>='
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: '0'
|
77
|
-
type: :runtime
|
78
|
-
prerelease: false
|
79
|
-
version_requirements: *84457100
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: redcarpet
|
82
|
-
requirement: &84456660 !ruby/object:Gem::Requirement
|
83
|
-
none: false
|
84
|
-
requirements:
|
85
|
-
- - ! '>='
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: '0'
|
88
|
-
type: :runtime
|
89
|
-
prerelease: false
|
90
|
-
version_requirements: *84456660
|
68
|
+
version_requirements: *79555040
|
91
69
|
description: Formol is a forum engine for rails 3.1. It provides most of common features
|
92
70
|
you can wait from a forum.
|
93
71
|
email:
|
@@ -96,6 +74,7 @@ executables: []
|
|
96
74
|
extensions: []
|
97
75
|
extra_rdoc_files: []
|
98
76
|
files:
|
77
|
+
- app/assets/images/formol/default_avatar.png
|
99
78
|
- app/assets/images/formol/unread.png
|
100
79
|
- app/assets/images/formol/read.png
|
101
80
|
- app/assets/stylesheets/formol/topics.css.scss
|
@@ -310,8 +289,6 @@ files:
|
|
310
289
|
- lib/formol/controllers/auth.rb
|
311
290
|
- lib/formol/rails/engine.rb
|
312
291
|
- lib/formol/view_helpers.rb
|
313
|
-
- lib/formol/formatters/redcarpet/syntax_highlighter.rb
|
314
|
-
- lib/formol/formatters/redcarpet/formatter.rb
|
315
292
|
- lib/formol/version.rb
|
316
293
|
- lib/formol/integration/user.rb
|
317
294
|
- lib/formol/formatters.rb
|
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'redcarpet'
|
2
|
-
require 'pygments.rb'
|
3
|
-
|
4
|
-
module Formol
|
5
|
-
module Formatters
|
6
|
-
module Redcarpet
|
7
|
-
class Formatter
|
8
|
-
def initialize
|
9
|
-
@renderer = SyntaxHighlighter.new(:hard_wrap => true,
|
10
|
-
:filter_html => true)
|
11
|
-
@processor = ::Redcarpet::Markdown.new(@renderer, :fenced_code_blocks => true,
|
12
|
-
:no_intra_emphasis => true,
|
13
|
-
:autolink => true,
|
14
|
-
:space_after_headers => false,
|
15
|
-
:superscript => false)
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_html(text)
|
19
|
-
@processor.render(text).html_safe
|
20
|
-
end
|
21
|
-
|
22
|
-
def quote(text)
|
23
|
-
quoted_text = ""
|
24
|
-
|
25
|
-
text.split("\n").each_with_index do |l|
|
26
|
-
quoted_text << '> ' if (l.strip.blank? || l.start_with?('>'))
|
27
|
-
quoted_text << l
|
28
|
-
quoted_text << "\n"
|
29
|
-
end
|
30
|
-
|
31
|
-
quoted_text
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'redcarpet'
|
2
|
-
require 'pygments.rb'
|
3
|
-
|
4
|
-
module Formol
|
5
|
-
module Formatters
|
6
|
-
module Redcarpet
|
7
|
-
class SyntaxHighlighter < ::Redcarpet::Render::XHTML
|
8
|
-
def block_code(code, language)
|
9
|
-
title_block(language) + Pygments.highlight(code, :lexer => language,
|
10
|
-
:options => {
|
11
|
-
:linenos => 'inline'
|
12
|
-
})
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
def title_block(language)
|
18
|
-
%{<div class="highlight_title #{language.downcase}">#{language.downcase.capitalize}</div>}
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|