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.
This commit is contained in:
Noah Campbell 2013-09-28 23:05:16 -07:00
parent db50154e75
commit f34ea6108d
2 changed files with 88 additions and 0 deletions

28
transform/nav.go Normal file
View file

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

60
transform/nav_test.go Normal file
View file

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