mirror of
https://github.com/gohugoio/hugo.git
synced 2024-12-01 18:33:08 -05:00
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:
parent
db50154e75
commit
f34ea6108d
2 changed files with 88 additions and 0 deletions
28
transform/nav.go
Normal file
28
transform/nav.go
Normal 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
60
transform/nav_test.go
Normal 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())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue