mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-24 21:56:05 +02:00
Add Page.Contents with scope support
Note that this also adds a new `.ContentWithoutSummary` method, and to do that we had to unify the different summary types: Both `auto` and `manual` now returns HTML. Before this commit, `auto` would return plain text. This could be considered to be a slightly breaking change, but for the better: Now you can treat the `.Summary` the same without thinking about where it comes from, and if you want plain text, pipe it into `{{ .Summary | plainify }}`. Fixes #8680 Fixes #12761 Fixes #12778 Fixes #716
This commit is contained in:
@@ -22,7 +22,6 @@ import (
|
||||
"html/template"
|
||||
"strings"
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/gohugoio/hugo/common/hexec"
|
||||
"github.com/gohugoio/hugo/common/loggers"
|
||||
@@ -165,75 +164,6 @@ func TotalWords(s string) int {
|
||||
return n
|
||||
}
|
||||
|
||||
// TruncateWordsByRune truncates words by runes.
|
||||
func (c *ContentSpec) TruncateWordsByRune(in []string) (string, bool) {
|
||||
words := make([]string, len(in))
|
||||
copy(words, in)
|
||||
|
||||
count := 0
|
||||
for index, word := range words {
|
||||
if count >= c.Cfg.SummaryLength() {
|
||||
return strings.Join(words[:index], " "), true
|
||||
}
|
||||
runeCount := utf8.RuneCountInString(word)
|
||||
if len(word) == runeCount {
|
||||
count++
|
||||
} else if count+runeCount < c.Cfg.SummaryLength() {
|
||||
count += runeCount
|
||||
} else {
|
||||
for ri := range word {
|
||||
if count >= c.Cfg.SummaryLength() {
|
||||
truncatedWords := append(words[:index], word[:ri])
|
||||
return strings.Join(truncatedWords, " "), true
|
||||
}
|
||||
count++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return strings.Join(words, " "), false
|
||||
}
|
||||
|
||||
// TruncateWordsToWholeSentence takes content and truncates to whole sentence
|
||||
// limited by max number of words. It also returns whether it is truncated.
|
||||
func (c *ContentSpec) TruncateWordsToWholeSentence(s string) (string, bool) {
|
||||
var (
|
||||
wordCount = 0
|
||||
lastWordIndex = -1
|
||||
)
|
||||
|
||||
for i, r := range s {
|
||||
if unicode.IsSpace(r) {
|
||||
wordCount++
|
||||
lastWordIndex = i
|
||||
|
||||
if wordCount >= c.Cfg.SummaryLength() {
|
||||
break
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if lastWordIndex == -1 {
|
||||
return s, false
|
||||
}
|
||||
|
||||
endIndex := -1
|
||||
|
||||
for j, r := range s[lastWordIndex:] {
|
||||
if isEndOfSentence(r) {
|
||||
endIndex = j + lastWordIndex + utf8.RuneLen(r)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if endIndex == -1 {
|
||||
return s, false
|
||||
}
|
||||
|
||||
return strings.TrimSpace(s[:endIndex]), endIndex < len(s)
|
||||
}
|
||||
|
||||
// TrimShortHTML removes the outer tags from HTML input where (a) the opening
|
||||
// tag is present only once with the input, and (b) the opening and closing
|
||||
// tags wrap the input after white space removal.
|
||||
@@ -256,7 +186,3 @@ func (c *ContentSpec) TrimShortHTML(input []byte, markup string) []byte {
|
||||
}
|
||||
return input
|
||||
}
|
||||
|
||||
func isEndOfSentence(r rune) bool {
|
||||
return r == '.' || r == '?' || r == '!' || r == '"' || r == '\n'
|
||||
}
|
||||
|
Reference in New Issue
Block a user