diff --git a/helpers/content.go b/helpers/content.go index fe5f26e54..78b4f8e91 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -271,10 +271,11 @@ func TruncateWords(s string, max int) string { } // TruncateWordsToWholeSentence takes content and an int -// and returns entire sentences from content, delimited by the int. -func TruncateWordsToWholeSentence(words []string, max int) string { - if max > len(words) { - return strings.Join(words, " ") +// and returns entire sentences from content, delimited by the int +// and whether it's truncated or not. +func TruncateWordsToWholeSentence(words []string, max int) (string, bool) { + if max >= len(words) { + return strings.Join(words, " "), false } for counter, word := range words[max:] { @@ -282,11 +283,12 @@ func TruncateWordsToWholeSentence(words []string, max int) string { strings.HasSuffix(word, "?") || strings.HasSuffix(word, ".\"") || strings.HasSuffix(word, "!") { - return strings.Join(words[:max+counter+1], " ") + upper := max + counter + 1 + return strings.Join(words[:upper], " "), (upper < len(words)) } } - return strings.Join(words[:max], " ") + return strings.Join(words[:max], " "), true } // GetRstContent calls the Python script rst2html as an external helper diff --git a/helpers/content_test.go b/helpers/content_test.go index 6191eb158..44cee2f50 100644 --- a/helpers/content_test.go +++ b/helpers/content_test.go @@ -3,6 +3,7 @@ package helpers import ( "github.com/stretchr/testify/assert" "html/template" + "strings" "testing" ) @@ -33,3 +34,30 @@ func TestStripEmptyNav(t *testing.T) { func TestBytesToHTML(t *testing.T) { assert.Equal(t, template.HTML("dobedobedo"), BytesToHTML([]byte("dobedobedo"))) } + +func TestTruncateWordsToWholeSentence(t *testing.T) { + type test struct { + input, expected string + max int + truncated bool + } + data := []test{ + {"a b c", "a b c", 12, false}, + {"a b c", "a b c", 3, false}, + {"a", "a", 1, false}, + {"This is a sentence.", "This is a sentence.", 5, false}, + {"This is also a sentence!", "This is also a sentence!", 1, false}, + {"To be. Or not to be. That's the question.", "To be.", 1, true}, + {" \nThis is not a sentence\n ", "This is not a", 4, true}, + } + for i, d := range data { + output, truncated := TruncateWordsToWholeSentence(strings.Fields(d.input), d.max) + if d.expected != output { + t.Errorf("Test %d failed. Expected %q got %q", i, d.expected, output) + } + + if d.truncated != truncated { + t.Errorf("Test %d failed. Expected truncated=%t got %t", i, d.truncated, truncated) + } + } +} diff --git a/hugolib/page.go b/hugolib/page.go index ddb1bfb2c..7b3e67a69 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -190,10 +190,9 @@ func (p *Page) setSummary() { } else { // If hugo defines split: // render, strip html, then split - p.Summary = helpers.BytesToHTML([]byte(helpers.TruncateWordsToWholeSentence(p.PlainWords(), helpers.SummaryLength))) - - // todo bep - check if the Plain() can be trimmed earlier - p.Truncated = len(p.Summary) != len(strings.Trim(p.Plain(), "\n\r ")) + summary, truncated := helpers.TruncateWordsToWholeSentence(p.PlainWords(), helpers.SummaryLength) + p.Summary = helpers.BytesToHTML([]byte(summary)) + p.Truncated = truncated } }