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