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())
+ }
+}