ref: 9930011ea2732d75ed62fae53d03cc13ffd25b15
parent: 7b1f0960e3b7b31017dce5925e455bd43df86efb
author: Ross Lawley <[email protected]>
date: Wed Aug 21 06:37:14 EDT 2013
Wordpress summaries Allow full control of summaries which can be rendered as html rather than text. Using a `<!--more-->` html comment in your markdown / rst you can indiciate where the summary should end and have the summary converted to html. Signed-off-by: Noah Campbell <[email protected]> Conflicts: hugolib/page_test.go
--- a/hugolib/helpers.go
+++ b/hugolib/helpers.go
@@ -20,6 +20,7 @@
"github.com/kr/pretty"
"html/template"
"os"
+ "os/exec"
"reflect"
"regexp"
"strconv"
@@ -28,6 +29,8 @@
)
var sanitizeRegexp = regexp.MustCompile("[^a-zA-Z0-9./_-]")
+var summaryLength = 70
+var summaryDivider = []byte("<!--more-->")
// TODO: Make these wrappers private
// Wrapper around Fprintf taking verbose flag in account.
@@ -328,4 +331,33 @@
func MakePermalink(domain string, path string) string {
return strings.TrimRight(domain, "/") + "/" + strings.TrimLeft(path, "/")
+}
+
+func getSummaryString(content []byte) ([]byte, bool) {
+ if (bytes.Contains(content, summaryDivider)) {
+ return bytes.Split(content, summaryDivider)[0], false
+ } else {
+ plainContent := StripHTML(StripShortcodes(string(content)))
+ return []byte(TruncateWordsToWholeSentence(plainContent, summaryLength)), true
+ }
+}
+
+func getRstContent(content []byte) string {
+ cleanContent := bytes.Replace(content, summaryDivider, []byte(""), 1)
+
+ cmd := exec.Command("rst2html.py", "--leave-comments")
+ cmd.Stdin = bytes.NewReader(cleanContent)
+ var out bytes.Buffer
+ cmd.Stdout = &out
+ if err := cmd.Run(); err != nil {
+ fmt.Println(err)
+ }
+
+ rstLines := strings.Split(out.String(), "\n")
+ for i, line := range rstLines {
+ if strings.HasPrefix(line, "<body>") {
+ rstLines = (rstLines[i+1 : len(rstLines)-3])
+ }
+ }
+ return strings.Join(rstLines, "\n")
}
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -26,7 +26,6 @@
"io/ioutil"
"launchpad.net/goyaml"
"os"
- "os/exec"
"path/filepath"
"sort"
"strings"
@@ -55,8 +54,6 @@
Node
}
-const summaryLength = 70
-
type File struct {
FileName, OutFile, Extension string
}
@@ -476,27 +473,25 @@
func (page *Page) convertMarkdown(lines io.Reader) {
b := new(bytes.Buffer)
b.ReadFrom(lines)
- content := string(blackfriday.MarkdownCommon(b.Bytes()))
- page.Content = template.HTML(content)
- page.Summary = template.HTML(TruncateWordsToWholeSentence(StripHTML(StripShortcodes(content)), summaryLength))
+ content := b.Bytes()
+ page.Content = template.HTML(string(blackfriday.MarkdownCommon(content)))
+ summary, plain := getSummaryString(content)
+ if plain {
+ page.Summary = template.HTML(string(summary))
+ } else {
+ page.Summary = template.HTML(string(blackfriday.MarkdownCommon(summary)))
+ }
}
func (page *Page) convertRestructuredText(lines io.Reader) {
- cmd := exec.Command("rst2html.py")
- cmd.Stdin = lines
- var out bytes.Buffer
- cmd.Stdout = &out
- if err := cmd.Run(); err != nil {
- fmt.Println(err)
+ b := new(bytes.Buffer)
+ b.ReadFrom(lines)
+ content := b.Bytes()
+ page.Content = template.HTML(getRstContent(content))
+ summary, plain := getSummaryString(content)
+ if plain {
+ page.Summary = template.HTML(string(summary))
+ } else {
+ page.Summary = template.HTML(getRstContent(summary))
}
-
- rstLines := strings.Split(out.String(), "\n")
- for i, line := range rstLines {
- if strings.HasPrefix(line, "<body>") {
- rstLines = (rstLines[i+1 : len(rstLines)-3])
- }
- }
- content := strings.Join(rstLines, "\n")
- page.Content = template.HTML(content)
- page.Summary = template.HTML(TruncateWordsToWholeSentence(StripHTML(StripShortcodes(content)), summaryLength))
}
--- a/hugolib/page_test.go
+++ b/hugolib/page_test.go
@@ -91,6 +91,15 @@
---
type and layout set`
+var SIMPLE_PAGE_WITH_SUMMARY_DELIMITER = `---
+title: Simple
+---
+Simple Page
+
+<!--more-->
+Some more text
+`
+
func checkError(t *testing.T, err error, expected string) {
if err == nil {
t.Fatalf("err is nil")
@@ -130,6 +139,12 @@
}
}
+func checkPageSummary(t *testing.T, page *Page, summary string) {
+ if page.Summary != template.HTML(summary) {
+ t.Fatalf("Page summary is: `%s`. Expected `%s`", page.Summary, summary)
+ }
+}
+
func checkPageType(t *testing.T, page *Page, pageType string) {
if page.Type() != pageType {
t.Fatalf("Page type is: %s. Expected: %s", page.Type(), pageType)
@@ -149,6 +164,19 @@
}
checkPageTitle(t, p, "Simple")
checkPageContent(t, p, "<p>Simple Page</p>\n")
+ checkPageSummary(t, p, "Simple Page")
+ checkPageType(t, p, "page")
+ checkPageLayout(t, p, "page/single.html")
+}
+
+func TestPageWithDelimiter(t *testing.T) {
+ p, err := ReadFrom(strings.NewReader(SIMPLE_PAGE_WITH_SUMMARY_DELIMITER), "simple")
+ if err != nil {
+ t.Fatalf("Unable to create a page with frontmatter and body content: %s", err)
+ }
+ checkPageTitle(t, p, "Simple")
+ checkPageContent(t, p, "<p>Simple Page</p>\n\n<!--more-->\n\n<p>Some more text</p>\n")
+ checkPageSummary(t, p, "<p>Simple Page</p>\n")
checkPageType(t, p, "page")
checkPageLayout(t, p, "page/single.html")
}