effective_posts 0.2.4 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/app/helpers/effective_posts_helper.rb +18 -13
- data/app/helpers/effective_truncate_html_helper.rb +77 -0
- data/app/models/effective/post.rb +1 -1
- data/lib/effective_posts/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 579841290e09b748845c8ae7579e9804abb3eb98
|
4
|
+
data.tar.gz: 26f9819558a657cde932da4f0f9d3ae6b9089e99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25e40384bbddf29e3f04c7fff34bf0cb5f9bede594296bf98fe991a9eacd9f67a95f53bbcd28d0dc5c8213a1f2bdeaba54a37f6344bc81f561422746ebccf4f3
|
7
|
+
data.tar.gz: 1419866b4ac11195f7cfc493fc9f6feea94f382be9465c426280776cec90f38b70494254209fac175bb9273751a8ebd1066f329faebe6523046ce6cc67c815df
|
data/README.md
CHANGED
@@ -70,6 +70,8 @@ If disabled, all posts will be available at `/posts`, with posts for a specific
|
|
70
70
|
|
71
71
|
Use `link_to_post_category(:blog)` to display a link to the Blog page. The helper considers `config.use_category_routes` and puts in the correct url.
|
72
72
|
|
73
|
+
Use `post_excerpt(post)` to display the excerpt for a post. Or `post_excerpt(post, :length => 200)` to truncate it and add a Read more link where appropriate.
|
74
|
+
|
73
75
|
|
74
76
|
## Pagination
|
75
77
|
|
@@ -1,42 +1,47 @@
|
|
1
1
|
module EffectivePostsHelper
|
2
2
|
def render_post(post)
|
3
|
-
render(:
|
3
|
+
render(partial: 'effective/posts/post', locals: { post: post })
|
4
4
|
end
|
5
5
|
|
6
6
|
def post_meta(post)
|
7
7
|
[
|
8
|
-
|
9
|
-
"on #{post.published_at.strftime(
|
8
|
+
'Published',
|
9
|
+
"on #{post.published_at.strftime('%B %d, %Y at %l:%M %p')}",
|
10
10
|
("to #{link_to_post_category(post.category)}" if Array(EffectivePosts.categories).length > 1),
|
11
11
|
("by #{post.user.to_s.presence || 'Unknown'}" if EffectivePosts.post_meta_author)
|
12
12
|
].compact.join(' ').html_safe
|
13
13
|
end
|
14
14
|
|
15
15
|
def post_excerpt(post, options = {})
|
16
|
-
content = effective_region(post, :content) {
|
16
|
+
content = effective_region(post, :content) { '<p>Default content</p>'.html_safe }
|
17
17
|
|
18
|
-
|
18
|
+
divider = content.index(Effective::Snippets::ReadMoreDivider::TOKEN)
|
19
|
+
length = options.delete(:length)
|
19
20
|
|
20
|
-
if
|
21
|
-
content[0...
|
22
|
-
|
23
|
-
|
24
|
-
end
|
21
|
+
if divider.present?
|
22
|
+
content[0...divider] + readmore_link(post, options)
|
23
|
+
elsif length.present? && content.length > length
|
24
|
+
truncate_html(content, length, '...', readmore_link(post, options))
|
25
25
|
else
|
26
26
|
content
|
27
|
-
end
|
27
|
+
end.html_safe
|
28
28
|
end
|
29
29
|
|
30
30
|
def link_to_post_category(category, options = {})
|
31
31
|
category = category.to_s.downcase
|
32
32
|
|
33
|
-
href = EffectivePosts.use_category_routes ? "/#{category}" : effective_posts.posts_path(:
|
33
|
+
href = EffectivePosts.use_category_routes ? "/#{category}" : effective_posts.posts_path(category: category.to_s)
|
34
34
|
link_to(category.to_s.titleize, href, options)
|
35
35
|
end
|
36
36
|
|
37
37
|
def effective_post_path(post)
|
38
38
|
category = post.category.to_s.downcase
|
39
|
-
EffectivePosts.use_category_routes ? "/#{category}/#{post.to_param}" : effective_posts.post_path(post, :
|
39
|
+
EffectivePosts.use_category_routes ? "/#{category}/#{post.to_param}" : effective_posts.post_path(post, category: category.to_s)
|
40
40
|
end
|
41
41
|
|
42
|
+
def readmore_link(post, options)
|
43
|
+
content_tag(:p, class: 'post-read-more') do
|
44
|
+
link_to((options.delete(:label) || 'Read more'), effective_posts.post_path(post), options)
|
45
|
+
end
|
46
|
+
end
|
42
47
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# Modified from
|
2
|
+
# http://blog.madebydna.com/all/code/2010/06/04/ruby-helper-to-cleanly-truncate-html.html
|
3
|
+
|
4
|
+
module EffectiveTruncateHtmlHelper
|
5
|
+
def chunk_html(text, max_length = 2, _ellipsis = '...', read_more = nil)
|
6
|
+
doc = Nokogiri::HTML::DocumentFragment.parse text
|
7
|
+
|
8
|
+
if doc.children.length >= max_length
|
9
|
+
doc.children.last.remove while doc.children.length > max_length
|
10
|
+
doc.children.last.add_next_sibling Nokogiri::HTML::DocumentFragment.parse("<p>#{ read_more }</p>")
|
11
|
+
end
|
12
|
+
|
13
|
+
doc.inner_html.html_safe
|
14
|
+
end
|
15
|
+
|
16
|
+
def truncate_html(text, max_length = 200, ellipsis = '...', read_more = nil)
|
17
|
+
ellipsis_length = ellipsis.to_s.length
|
18
|
+
doc = Nokogiri::HTML::DocumentFragment.parse text
|
19
|
+
content_length = doc.inner_text.length
|
20
|
+
actual_length = max_length - ellipsis_length
|
21
|
+
|
22
|
+
if content_length > actual_length
|
23
|
+
truncated_node = doc.truncate_html(actual_length)
|
24
|
+
|
25
|
+
last_node = truncated_node
|
26
|
+
while last_node.respond_to?(:children) && last_node.children.present?
|
27
|
+
last_node = last_node.children.reverse.find { |node| node.try(:name) != 'a' } # Find the last non-A node
|
28
|
+
end
|
29
|
+
|
30
|
+
if read_more.present?
|
31
|
+
read_more_node = Nokogiri::HTML::DocumentFragment.parse(read_more.to_s)
|
32
|
+
last_node.add_next_sibling(read_more_node)
|
33
|
+
end
|
34
|
+
|
35
|
+
if ellipsis.present?
|
36
|
+
ellipsis_node = Nokogiri::XML::Text.new(ellipsis.to_s, doc)
|
37
|
+
last_node.add_next_sibling(ellipsis_node)
|
38
|
+
end
|
39
|
+
|
40
|
+
truncated_node.inner_html
|
41
|
+
else
|
42
|
+
text.to_s
|
43
|
+
end.html_safe
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module NokogiriTruncator
|
48
|
+
module NodeWithChildren
|
49
|
+
def truncate_html(max_length)
|
50
|
+
return self if inner_text.length <= max_length
|
51
|
+
truncated_node = dup
|
52
|
+
truncated_node.children.remove
|
53
|
+
|
54
|
+
children.each do |node|
|
55
|
+
remaining_length = max_length - truncated_node.inner_text.length
|
56
|
+
break if remaining_length <= 10
|
57
|
+
truncated_node.add_child node.truncate_html(remaining_length)
|
58
|
+
end
|
59
|
+
truncated_node
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
module TextNode
|
64
|
+
include ActionView::Helpers::TextHelper
|
65
|
+
|
66
|
+
def truncate_html(max_length)
|
67
|
+
truncated = truncate(content, length: max_length, separator: ' ', omission: '')
|
68
|
+
|
69
|
+
# Nokogiri::XML::Text.new(truncate(content.to_s, :length => (max_length-1)), parent)
|
70
|
+
Nokogiri::XML::Text.new(truncated, parent)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
Nokogiri::HTML::DocumentFragment.send(:include, NokogiriTruncator::NodeWithChildren)
|
76
|
+
Nokogiri::XML::Element.send(:include, NokogiriTruncator::NodeWithChildren)
|
77
|
+
Nokogiri::XML::Text.send(:include, NokogiriTruncator::TextNode)
|
@@ -8,7 +8,7 @@ module Effective
|
|
8
8
|
belongs_to :user
|
9
9
|
|
10
10
|
structure do
|
11
|
-
title :string, :validates => [:presence]
|
11
|
+
title :string, :validates => [:presence, :length => {:maximum => 255}]
|
12
12
|
category :string, :validates => [:presence]
|
13
13
|
|
14
14
|
published_at :datetime, :validates => [:presence]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_posts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: nokogiri
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: migrant
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,6 +168,7 @@ files:
|
|
154
168
|
- app/controllers/effective/posts_controller.rb
|
155
169
|
- app/helpers/effective_kaminari_helper.rb
|
156
170
|
- app/helpers/effective_posts_helper.rb
|
171
|
+
- app/helpers/effective_truncate_html_helper.rb
|
157
172
|
- app/models/effective/access_denied.rb
|
158
173
|
- app/models/effective/datatables/posts.rb
|
159
174
|
- app/models/effective/post.rb
|