diff --git a/transform/chain.go b/transform/chain.go new file mode 100644 index 000000000..e408b01d2 --- /dev/null +++ b/transform/chain.go @@ -0,0 +1,29 @@ +package transform + +import ( + "io" + "bytes" +) + +type chain struct { + transformers []Transformer +} + +func NewChain(trs ...Transformer) Transformer { + return &chain{transformers: trs} +} + +func (c *chain) Apply(r io.Reader, w io.Writer) (err error) { + in := r + for _, tr := range c.transformers { + out := new(bytes.Buffer) + err = tr.Apply(in, out) + if err != nil { + return + } + in = bytes.NewBuffer(out.Bytes()) + } + + _, err = io.Copy(w, in) + return +} diff --git a/transform/chain_test.go b/transform/chain_test.go new file mode 100644 index 000000000..d122c31f8 --- /dev/null +++ b/transform/chain_test.go @@ -0,0 +1,36 @@ +package transform + +import ( + "bytes" + "testing" +) + +func TestChainZeroTransformers(t *testing.T) { + tr := NewChain() + in := new(bytes.Buffer) + out := new(bytes.Buffer) + if err := tr.Apply(in, out); err != nil { + t.Errorf("A zero transformer chain returned an error.") + } +} + +func TestChainOneTransformer(t *testing.T) { + tr := NewChain(&AbsURL{BaseURL: "http://base"}) + apply(t, tr, abs_url_tests) +} + +const H5_JS_CONTENT_ABS_URL_WITH_NAV = "
content foobar. Follow up
" + +const CORRECT_OUTPUT_SRC_HREF_WITH_NAV = "
content foobar. Follow up
" + +var two_chain_tests = []test { + {H5_JS_CONTENT_ABS_URL_WITH_NAV, CORRECT_OUTPUT_SRC_HREF_WITH_NAV}, +} + +func TestChainTwoTransformer(t *testing.T) { + tr := NewChain( + &AbsURL{BaseURL: "http://two"}, + &NavActive{Section: "section_1"}, + ) + apply(t, tr, two_chain_tests) +} diff --git a/transform/nav.go b/transform/nav.go index b085c39a2..2111ae89a 100644 --- a/transform/nav.go +++ b/transform/nav.go @@ -2,12 +2,12 @@ package transform import ( htmltran "code.google.com/p/go-html-transform/html/transform" - "io" "fmt" + "io" ) type NavActive struct { - Section string + Section string AttrName string } @@ -27,7 +27,10 @@ func (n *NavActive) Apply(r io.Reader, w io.Writer) (err error) { n.AttrName = "hugo-nav" } - tr.Apply(htmltran.ModifyAttrib("class", "active"), fmt.Sprintf("li[%s=%s]", n.AttrName, n.Section)) + err = tr.Apply(htmltran.ModifyAttrib("class", "active"), fmt.Sprintf("li[%s=%s]", n.AttrName, n.Section)) + if err != nil { + return + } return tr.Render(w) } diff --git a/transform/posttrans_test.go b/transform/posttrans_test.go index d35847af3..3cac6e76b 100644 --- a/transform/posttrans_test.go +++ b/transform/posttrans_test.go @@ -16,19 +16,27 @@ const H5_JS_CONTENT_ABS_URL = "
content foobar. Follow up
" func TestAbsUrlify(t *testing.T) { - tests := []struct { - content string - expected string - }{ + + tr := &AbsURL{ + BaseURL: "http://base", + } + + apply(t, tr, abs_url_tests) +} + +type test struct { + content string + expected string +} + +var abs_url_tests = []test { {H5_JS_CONTENT_DOUBLE_QUOTE, CORRECT_OUTPUT_SRC_HREF}, {H5_JS_CONTENT_SINGLE_QUOTE, CORRECT_OUTPUT_SRC_HREF}, {H5_JS_CONTENT_ABS_URL, H5_JS_CONTENT_ABS_URL}, } +func apply(t *testing.T, tr Transformer, tests []test) { for _, test := range tests { - tr := &AbsURL{ - BaseURL: "http://base", - } out := new(bytes.Buffer) err := tr.Apply(strings.NewReader(test.content), out) if err != nil {