nokogiri_truncate_html 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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad6a7de52fb5b441032153acfaf0651a695e0d64
|
4
|
+
data.tar.gz: 958fe6a59782c75791dc2af20a89c34e20056739
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d49c7a295c0f314e9288c09f10d06fc820fa9b849a89b0c3acffa61a9d57ca2f07f6adeb9eb56d6d801c13b9c1f86477ed864e137df2e7d895b5d6868b55245d
|
7
|
+
data.tar.gz: ffac697365c2b1d14c3e95a795817836f2a151ef8a66c754602a551a6e1f15279fc01f5563b1d063d7579bd9625cbf498f6aa9349e356222321639d30dff9b8f
|
@@ -1,27 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'nokogiri'
|
2
4
|
require 'cgi'
|
3
5
|
|
4
6
|
module NokogiriTruncateHtml
|
5
|
-
class TruncateFinished < Exception
|
6
|
-
end
|
7
|
-
|
8
7
|
class TruncateDocument < Nokogiri::XML::SAX::Document
|
9
|
-
|
10
8
|
def initialize
|
11
|
-
# We use the xhtml "flavour" so that we can decode
|
12
|
-
# apostrophes. That is the only difference between
|
13
|
-
# xhtml1 and html4.
|
14
|
-
@encoder = HTMLEntities.new('xhtml1')
|
15
9
|
@discard_first_element = false
|
16
10
|
end
|
17
11
|
|
18
|
-
|
19
|
-
@length = length
|
20
|
-
end
|
21
|
-
|
22
|
-
def omission=(omission)
|
23
|
-
@omission = omission
|
24
|
-
end
|
12
|
+
attr_writer :length, :omission
|
25
13
|
|
26
14
|
def output
|
27
15
|
while @tags.size > 0
|
@@ -31,12 +19,11 @@ module NokogiriTruncateHtml
|
|
31
19
|
end
|
32
20
|
|
33
21
|
def start_document
|
34
|
-
@output, @chars_remaining, @tags =
|
22
|
+
@output, @chars_remaining, @tags = String.new, @length, []
|
35
23
|
@discard_first_element = false
|
36
24
|
end
|
37
25
|
|
38
|
-
def characters(
|
39
|
-
text = @encoder.decode(string)
|
26
|
+
def characters(text)
|
40
27
|
@output << CGI.escapeHTML(text[0, @chars_remaining])
|
41
28
|
@chars_remaining -= text.length
|
42
29
|
if @chars_remaining < 0
|
@@ -45,16 +32,33 @@ module NokogiriTruncateHtml
|
|
45
32
|
end
|
46
33
|
end
|
47
34
|
|
35
|
+
HTML_TAG = 'html'.freeze
|
36
|
+
BODY_TAG = 'body'.freeze
|
37
|
+
BR_TAG = 'br'.freeze
|
38
|
+
EMBED_TAG = 'embed'.freeze
|
39
|
+
HR_TAG = 'hr'.freeze
|
40
|
+
IMG_TAG = 'img'.freeze
|
41
|
+
INPUT_TAG = 'input'.freeze
|
42
|
+
PARAM_TAG = 'param'.freeze
|
43
|
+
|
48
44
|
def start_element(name, attrs = [])
|
49
45
|
unless @discard_first_element
|
50
|
-
return if
|
46
|
+
return if name == HTML_TAG || name == BODY_TAG
|
51
47
|
return @discard_first_element = true
|
52
48
|
end
|
53
49
|
|
54
|
-
|
55
|
-
|
50
|
+
@output << "<#{name}"
|
51
|
+
unless attrs.empty?
|
52
|
+
attrs.each do |attr, val|
|
53
|
+
@output << " #{attr}=\"#{val}\""
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if name == BR_TAG || name == EMBED_TAG || name == HR_TAG ||
|
58
|
+
name == IMG_TAG || name == INPUT_TAG || name == PARAM_TAG
|
59
|
+
@output << ' />'
|
56
60
|
else
|
57
|
-
@output <<
|
61
|
+
@output << '>'
|
58
62
|
@tags.push name
|
59
63
|
end
|
60
64
|
end
|
@@ -4,9 +4,6 @@ require 'nokogiri_truncate_html/truncate_document'
|
|
4
4
|
|
5
5
|
module NokogiriTruncateHtml
|
6
6
|
module TruncateHtmlHelper
|
7
|
-
mattr_accessor :parser
|
8
|
-
mattr_accessor :document
|
9
|
-
|
10
7
|
# Truncates html respecting tags and html entities.
|
11
8
|
#
|
12
9
|
# The API is the same as ActionView::Helpers::TextHelper#truncate. It uses Nokogiri and HtmlEntities for entity awareness.
|
@@ -15,8 +12,8 @@ module NokogiriTruncateHtml
|
|
15
12
|
# truncate_html '<p>Hello <strong>World</strong></p>', :length => 7 # => '<p>Hello <strong>W…</strong></p>'
|
16
13
|
# truncate_html '<p>Hello & Goodbye</p>', :length => 7 # => '<p>Hello &…</p>'
|
17
14
|
def truncate_html(input, *args)
|
18
|
-
|
19
|
-
|
15
|
+
document = truncate_html_document
|
16
|
+
parser = truncate_html_parser
|
20
17
|
|
21
18
|
# support both 2.2 & earlier APIs
|
22
19
|
options = args.extract_options!
|
@@ -25,12 +22,22 @@ module NokogiriTruncateHtml
|
|
25
22
|
|
26
23
|
# Adding div around the input is a hack. It gets removed in TruncateDocument.
|
27
24
|
input = "<div>#{input}</div>"
|
28
|
-
|
29
|
-
|
25
|
+
document.length = length
|
26
|
+
document.omission = omission
|
30
27
|
catch(:truncate_finished) do
|
31
|
-
|
28
|
+
parser.parse_memory(input)
|
32
29
|
end
|
33
|
-
|
30
|
+
document.output.html_safe
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def truncate_html_document
|
36
|
+
Thread.current[:truncate_html_document] ||= TruncateDocument.new
|
37
|
+
end
|
38
|
+
|
39
|
+
def truncate_html_parser
|
40
|
+
Thread.current[:truncate_html_parser] ||= Nokogiri::HTML::SAX::Parser.new(truncate_html_document)
|
34
41
|
end
|
35
42
|
end
|
36
43
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nokogiri_truncate_html
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian White
|
@@ -9,62 +9,48 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-01-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 1.5.8
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 1.5.8
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: activesupport
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 3.2.13
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: 3.2.13
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: htmlentities
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - '>='
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: 4.3.1
|
49
|
-
type: :runtime
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - '>='
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 4.3.1
|
56
42
|
- !ruby/object:Gem::Dependency
|
57
43
|
name: rspec
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
59
45
|
requirements:
|
60
|
-
- -
|
46
|
+
- - ">"
|
61
47
|
- !ruby/object:Gem::Version
|
62
48
|
version: '2'
|
63
49
|
type: :development
|
64
50
|
prerelease: false
|
65
51
|
version_requirements: !ruby/object:Gem::Requirement
|
66
52
|
requirements:
|
67
|
-
- -
|
53
|
+
- - ">"
|
68
54
|
- !ruby/object:Gem::Version
|
69
55
|
version: '2'
|
70
56
|
description: truncate_html helper that is html and html entities friendly
|
@@ -86,17 +72,17 @@ require_paths:
|
|
86
72
|
- lib
|
87
73
|
required_ruby_version: !ruby/object:Gem::Requirement
|
88
74
|
requirements:
|
89
|
-
- -
|
75
|
+
- - ">="
|
90
76
|
- !ruby/object:Gem::Version
|
91
77
|
version: '0'
|
92
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
|
-
- -
|
80
|
+
- - ">="
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '0'
|
97
83
|
requirements: []
|
98
84
|
rubyforge_project:
|
99
|
-
rubygems_version: 2.
|
85
|
+
rubygems_version: 2.5.2
|
100
86
|
signing_key:
|
101
87
|
specification_version: 4
|
102
88
|
summary: truncate_html helper that is html and html entities friendly
|