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..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 - + html = <<~END_HTML + END_HTML expect(truncate(html, length: 12)).to eq ' ' 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 = "“我现在使用的是中文的拼音。”
"
+ expect(truncate(html, omission: '', length: 50)).
+ to include '
“我现在使用的是中文的拼音。”
'
end
context 'when the break_token option is set as ' do
@@ -177,7 +173,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 +191,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 +209,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.