shithub: hugo

Download patch

ref: f34ea6108d259caec04b4f7b325c91db071e78f8
parent: db50154e75cfb1100651b7521370f54a0695872e
author: Noah Campbell <[email protected]>
date: Sat Sep 28 19:05:16 EDT 2013

Add the ability to set navbar li class to active

First cut at doing post html processing.  This utility can be used to
mark pages as active.

--- /dev/null
+++ b/transform/nav.go
@@ -1,0 +1,28 @@
+package transform
+
+import (
+	htmltran "code.google.com/p/go-html-transform/html/transform"
+	"io"
+	"fmt"
+)
+
+type NavActive struct {
+	Section string
+}
+
+func (n *NavActive) Apply(r io.Reader, w io.Writer) (err error) {
+	var tr *htmltran.Transformer
+
+	if n.Section == "" {
+		_, err = io.Copy(w, r)
+		return
+	}
+
+	if tr, err = htmltran.NewFromReader(r); err != nil {
+		return
+	}
+
+	tr.Apply(htmltran.ModifyAttrib("class", "active"), fmt.Sprintf("li[data-nav=%s]", n.Section))
+
+	return tr.Render(w)
+}
--- /dev/null
+++ b/transform/nav_test.go
@@ -1,0 +1,60 @@
+package transform
+
+import (
+	"bytes"
+	"strings"
+	"testing"
+)
+
+const HTML_WITH_NAV = `<!DOCTYPE html>
+<html>
+<head></head>
+<body>
+<nav>
+	<ul class="nav navbar-nav">
+		<li data-nav="section_1"><a href="#">Section 1</a></li>
+		<li data-nav="section_2"><a href="#">Section 2</a></li>
+	</ul>
+</nav>
+</body>
+</html>
+`
+const EXPECTED_HTML_WITH_NAV_1 = `<!DOCTYPE html><html><head></head>
+<body>
+<nav>
+	<ul class="nav navbar-nav">
+		<li data-nav="section_1"><a href="#">Section 1</a></li>
+		<li data-nav="section_2" class="active"><a href="#">Section 2</a></li>
+	</ul>
+</nav>
+
+
+</body></html>`
+
+func TestDegenerateNoSectionSet(t *testing.T) {
+	var (
+		tr  = new(NavActive)
+		out = new(bytes.Buffer)
+	)
+
+	if err := tr.Apply(strings.NewReader(HTML_WITH_NAV), out); err != nil {
+		t.Errorf("Unexpected error in NavActive.Apply: %s", err)
+	}
+
+	if out.String() != HTML_WITH_NAV {
+		t.Errorf("NavActive.Apply should simply pass along the buffer unmodified.")
+	}
+}
+
+func TestSetNav(t *testing.T) {
+	tr := &NavActive{Section: "section_2"}
+	out := new(bytes.Buffer)
+	if err := tr.Apply(strings.NewReader(HTML_WITH_NAV), out); err != nil {
+		t.Errorf("Unexpected error in Apply() for NavActive: %s", err)
+	}
+
+	expected := EXPECTED_HTML_WITH_NAV_1
+	if out.String() != expected {
+		t.Errorf("NavActive.Apply output expected and got:\n%q\n%q", expected, out.String())
+	}
+}