Skip to content

Commit

Permalink
Fix Truncate
Browse files Browse the repository at this point in the history
TruncateWordsToWholeSentence knows if the summary is truncated, so let "him" decide.

Fixes #880
  • Loading branch information
bep authored and anthonyfok committed Feb 5, 2015
1 parent 2bee4a1 commit 48b6777
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 10 deletions.
14 changes: 8 additions & 6 deletions helpers/content.go
Original file line number Diff line number Diff line change
Expand Up @@ -271,22 +271,24 @@ 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:] {
if strings.HasSuffix(word, ".") ||
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
Expand Down
28 changes: 28 additions & 0 deletions helpers/content_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package helpers
import (
"github.com/stretchr/testify/assert"
"html/template"
"strings"
"testing"
)

Expand Down Expand Up @@ -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)
}
}
}
7 changes: 3 additions & 4 deletions hugolib/page.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

}
}
Expand Down

0 comments on commit 48b6777

Please sign in to comment.