Skip to content

Commit

Permalink
Add RuneCount to Page
Browse files Browse the repository at this point in the history
  • Loading branch information
bep authored and tychoish committed Aug 13, 2017
1 parent 19fbcbe commit 3707a79
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 0 deletions.
1 change: 1 addition & 0 deletions docs/content/templates/variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ matter, content or derived from file location.
**.NextInSection** Pointer to the following content within the same section (based on pub date)<br>
**.FuzzyWordCount** The approximate number of words in the content.<br>
**.WordCount** The number of words in the content.<br>
**.RuneCount** The number of [runes](http://blog.golang.org/strings) in the content, excluding any whitespace. This may be a good alternative to `.WordCount` for Japanese and other CJK languages where a word-split by spaces makes no sense.
**.ReadingTime** The estimated time it takes to read the content in minutes.<br>
**.Weight** Assigned weight (in the front matter) to this content, used in sorting.<br>
**.RawContent** Raw Markdown content without the metadata header. Useful with [remarkjs.com](http://remarkjs.com)<br>
Expand Down
5 changes: 5 additions & 0 deletions helpers/general.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,11 @@ func Md5String(f string) string {
return hex.EncodeToString(h.Sum([]byte{}))
}

// IsWhitespace determines if the given rune is whitespace.
func IsWhitespace(r rune) bool {
return r == ' ' || r == '\t' || r == '\n' || r == '\r'
}

// Seq creates a sequence of integers.
// It's named and used as GNU's seq.
// Examples:
Expand Down
15 changes: 15 additions & 0 deletions hugolib/page.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ type Page struct {
contentShortCodes map[string]string
plain string // TODO should be []byte
plainWords []string
plainRuneCount int
plainInit sync.Once
renderingConfig *helpers.Blackfriday
renderingConfigInit sync.Once
Expand Down Expand Up @@ -108,10 +109,24 @@ func (p *Page) PlainWords() []string {
return p.plainWords
}

// RuneCount returns the rune count, excluding any whitespace, of the plain content.
func (p *Page) RuneCount() int {
p.initPlain()
return p.plainRuneCount
}

func (p *Page) initPlain() {
p.plainInit.Do(func() {
p.plain = helpers.StripHTML(string(p.Content))
p.plainWords = strings.Fields(p.plain)
runeCount := 0
for _, r := range p.plain {
if !helpers.IsWhitespace(r) {
runeCount++
}
}
p.plainRuneCount = runeCount
return
})
}

Expand Down
25 changes: 25 additions & 0 deletions hugolib/page_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,16 @@ title: Simple
Summary Same Line<!--more-->
Some more text
`

SIMPLE_PAGE_WITH_FIVE_MULTIBYTE_UFT8_RUNES = `---
title: Simple
---
€ € € € €
`

SIMPLE_PAGE_WITH_LONG_CONTENT = `---
Expand Down Expand Up @@ -470,6 +480,21 @@ func TestPageWithDate(t *testing.T) {
checkPageDate(t, p, d)
}

func TestRuneCount(t *testing.T) {
p, _ := NewPage("simple.md")
_, err := p.ReadFrom(strings.NewReader(SIMPLE_PAGE_WITH_FIVE_MULTIBYTE_UFT8_RUNES))
p.Convert()
p.analyzePage()
if err != nil {
t.Fatalf("Unable to create a page with frontmatter and body content: %s", err)
}

if p.RuneCount() != 5 {
t.Fatalf("incorrect rune count for content '%s'. expected %v, got %v", p.plain, 1, p.RuneCount())

}
}

func TestWordCount(t *testing.T) {
p, _ := NewPage("simple.md")
_, err := p.ReadFrom(strings.NewReader(SIMPLE_PAGE_WITH_LONG_CONTENT))
Expand Down

0 comments on commit 3707a79

Please sign in to comment.