Add the ability to set navbar li class to active
authorNoah Campbell <noahcampbell@gmail.com>
Sun, 29 Sep 2013 06:05:16 +0000 (23:05 -0700)
committerNoah Campbell <noahcampbell@gmail.com>
Sun, 29 Sep 2013 06:05:16 +0000 (23:05 -0700)
First cut at doing post html processing.  This utility can be used to
mark pages as active.

transform/nav.go [new file with mode: 0644]
transform/nav_test.go [new file with mode: 0644]

diff --git a/transform/nav.go b/transform/nav.go
new file mode 100644 (file)
index 0000000..c3dfe79
--- /dev/null
@@ -0,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)
+}
diff --git a/transform/nav_test.go b/transform/nav_test.go
new file mode 100644 (file)
index 0000000..997fe33
--- /dev/null
@@ -0,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())
+       }
+}