shithub: hugo

Download patch

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")
 }