mirror of
https://github.com/gohugoio/hugo.git
synced 2026-08-24 15:28:54 +00: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:
@@ -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)
|
||||||
|
}
|
||||||
@@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user