From cead592517618e3cdb9047670374c1cd7cf40d4b Mon Sep 17 00:00:00 2001
From: Xenofon Deligiannis
Date: Thu, 18 Apr 2019 11:01:15 +0300
Subject: [PATCH 1/2] Fix missing omission when break_token exists
When using break_token, omissions was not added in the truncated html.
Fix based on https://github.com/hgmnz/truncate_html/pull/57.
Issue described here https://github.com/hgmnz/truncate_html/issues/52
---
lib/truncate_html/html_truncator.rb | 15 +++++++++------
spec/truncate_html/html_truncator_spec.rb | 18 ++++++++++++++----
2 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/lib/truncate_html/html_truncator.rb b/lib/truncate_html/html_truncator.rb
index 50f2cb1..2e5dd9b 100644
--- a/lib/truncate_html/html_truncator.rb
+++ b/lib/truncate_html/html_truncator.rb
@@ -16,7 +16,7 @@ def truncate
return @omission if @chars_remaining < 0
@original_html.html_tokens.each do |token|
- if @chars_remaining <= 0 || truncate_token?(token)
+ if @chars_remaining <= 0
close_open_tags
break
else
@@ -49,8 +49,10 @@ def build_output
end
def process_token(token)
- append_to_result(token)
- if token.html_tag?
+ append_to_result(token) if !truncate_token?(token)
+ if truncate_token?(token)
+ @chars_remaining = 0
+ elsif token.html_tag?
if token.open_tag?
@open_tags << token
else
@@ -58,9 +60,10 @@ def process_token(token)
end
elsif !token.html_comment?
@chars_remaining -= (@word_boundary ? token.length : token[0, @chars_remaining].length)
- if @chars_remaining <= 0
- @truncated_html[-1] = @truncated_html[-1].rstrip + @omission
- end
+ end
+
+ if @chars_remaining <= 0
+ @truncated_html[-1] = @truncated_html[-1].rstrip + @omission
end
end
diff --git a/spec/truncate_html/html_truncator_spec.rb b/spec/truncate_html/html_truncator_spec.rb
index d745d2b..2daffe9 100644
--- a/spec/truncate_html/html_truncator_spec.rb
+++ b/spec/truncate_html/html_truncator_spec.rb
@@ -177,7 +177,7 @@ def truncate(html, opts = {})
it 'truncates before the length param if the break_token is before the token at "length"' do
expect(truncate('This is line one. This is line two.',
length: 30, break_token: '')).
- to eq 'This is line one.'
+ to eq 'This is line one....'
end
end
@@ -195,7 +195,7 @@ def truncate(html, opts = {})
it 'truncates before the length param if the break_token is before the token at "length"' do
expect(truncate('This is line one. This is line two.',
length: 30, break_token: '')).
- to eq 'This is line one.'
+ to eq 'This is line one....'
end
end
@@ -213,7 +213,7 @@ def truncate(html, opts = {})
it 'truncates before the length param if the break_token is before the token at "length"' do
expect(truncate('This is line one. This is line two.',
length: 30, break_token: '')).
- to eq 'This is line one.'
+ to eq 'This is line one....'
end
end
@@ -231,7 +231,7 @@ def truncate(html, opts = {})
it 'truncates before the length param if the break_token is before the token at "length"' do
expect(truncate('This is line one. foobar This is line two.',
length: 30, break_token: 'foobar')).
- to eq 'This is line one.'
+ to eq 'This is line one....'
end
end
@@ -242,4 +242,14 @@ def truncate(html, opts = {})
to eq 'hello and ...
'
end
end
+
+ context 'when the break_token and a custom omission options are used' do
+ it 'includes the custom omission after the truncation' do
+ expect(truncate('This is the time to truncate this. Do it properly!',
+ length: 50,
+ break_token: 'truncate',
+ omission: ' MORE')).
+ to eq 'This is the time to MORE'
+ end
+ end
end
From 3aa6448448da29d3d9c75c785ed719d5eb4bbf00 Mon Sep 17 00:00:00 2001
From: Xenofon Deligiannis
Date: Mon, 22 Apr 2019 11:34:53 +0300
Subject: [PATCH 2/2] Fix rubucop warnings for html_truncator_spec
---
spec/truncate_html/html_truncator_spec.rb | 38 ++++++++++-------------
1 file changed, 17 insertions(+), 21 deletions(-)
diff --git a/spec/truncate_html/html_truncator_spec.rb b/spec/truncate_html/html_truncator_spec.rb
index 2daffe9..0dedbf1 100644
--- a/spec/truncate_html/html_truncator_spec.rb
+++ b/spec/truncate_html/html_truncator_spec.rb
@@ -1,8 +1,6 @@
-# Encoding: UTF-8
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
describe TruncateHtml::HtmlTruncator do
-
def truncate(html, opts = {})
html_string = TruncateHtml::HtmlString.new(html)
TruncateHtml::HtmlTruncator.new(html_string, opts).truncate
@@ -24,13 +22,13 @@ def truncate(html, opts = {})
context 'and a custom omission value is passed' do
it 'retains the omission text' do
expect(
- truncate("testtest", length: 10, omission: '..', word_boundary: false)
+ truncate('testtest', length: 10, omission: '..', word_boundary: false)
).to eq 'testtest..'
end
it 'handles multibyte characters' do
expect(
- truncate("prüfenprüfen", length: 8, omission: '..', word_boundary: false)
+ truncate('prüfenprüfen', length: 8, omission: '..', word_boundary: false)
).to eq 'prüfen..'
end
end
@@ -54,7 +52,7 @@ def truncate(html, opts = {})
it 'is respectful of closing tags' do
expect(truncate('hmmm this should be okay. I think...
',
length: 28, omission: '', word_boundary: /\S[\.\?\!]/)).
- to eq "hmmm this should be okay.
"
+ to eq 'hmmm this should be okay.
'
end
end
@@ -62,17 +60,17 @@ def truncate(html, opts = {})
expect(truncate('a b c', length: 4, omission: '...')).to eq 'a...'
end
- it "includes omission even on the edge (issue #18)" do
+ it 'includes omission even on the edge (issue #18)' do
opts = { word_boundary: false, length: 12 }
expect(truncate('One two three', opts)).to eq 'One two t...'
end
- it "never returns a string longer than :length" do
- expect(truncate("test this shit", length: 10)).to eq 'test...'
+ it 'never returns a string longer than :length' do
+ expect(truncate('test this shit', length: 10)).to eq 'test...'
end
it 'supports omissions longer than the maximum length' do
- expect{ truncate('', length: 1, omission: '...') }.to_not raise_error
+ expect { truncate('', length: 1, omission: '...') }.to_not raise_error
end
it 'returns the omission when the specified length is smaller than the omission' do
@@ -110,24 +108,23 @@ def truncate(html, opts = {})
end
it 'handles multibyte characters and leaves them in the result' do
- html = 'Look at our multibyte characters ā ž this link for randomness ā ž
'
+ html = 'Look at our multibyte characters ā ž this link for randomness ā ž
'
expect(truncate(html, length: html.length)).to eq html
end
- #unusual, but just covering my ass
+ # unusual, but just covering my ass
it 'recognizes the multiline html properly' do
- html = <<-END_HTML
-
-This is ugly html.
-
+ html = <<~END_HTML
+
+ This is ugly html.
+
END_HTML
expect(truncate(html, length: 12)).to eq ' This is...
'
end
- %w(br hr img).each do |unpaired_tag|
+ %w[br hr img].each do |unpaired_tag|
context "when the html contains a #{unpaired_tag} tag" do
-
context "and the #{unpaired_tag} does not have the closing slash" do
it "does not close the #{unpaired_tag} tag" do
html = "Some before. <#{unpaired_tag}>and some after
"
@@ -145,7 +142,6 @@ def truncate(html, opts = {})
expect(truncate(html_caps, length: 19)).to eq "Some before. <#{unpaired_tag.capitalize} />and...
"
end
end
-
end
end
@@ -159,8 +155,8 @@ def truncate(html, opts = {})
“我现在使用的是中文的拼音。”
测试一下具体的truncatehtml功能。
"
- expect(truncate(html, omission: "", length: 50)).
- to include "“我现在使用的是中文的拼音。”
"
+ expect(truncate(html, omission: '', length: 50)).
+ to include '
“我现在使用的是中文的拼音。”
'
end
context 'when the break_token option is set as ' do