diff --git a/transform/post.go b/transform/post.go new file mode 100644 index 000000000..f54688cb2 --- /dev/null +++ b/transform/post.go @@ -0,0 +1,46 @@ +package transform + +import ( + "io" + "net/url" + htmltran "code.google.com/p/go-html-transform/html/transform" +) + +type Transformer struct { + BaseURL string +} + +func (t *Transformer) Apply(r io.Reader, w io.Writer) (err error) { + var tr *htmltran.Transformer + + if tr, err = htmltran.NewFromReader(r); err != nil { + return + } + + if err = t.absUrlify(tr); err != nil { + return + } + + return tr.Render(w) +} + +func (t *Transformer) absUrlify(tr *htmltran.Transformer) (err error) { + var baseURL, inURL *url.URL + + if baseURL, err = url.Parse(t.BaseURL); err != nil { + return + } + + replace := func(in string) string { + if inURL, err = url.Parse(in); err != nil { + return in + "?" + } + return baseURL.ResolveReference(inURL).String() + } + + if err = tr.Apply(htmltran.TransformAttrib("src", replace), "script"); err != nil { + return + } + + return tr.Apply(htmltran.TransformAttrib("href", replace), "a") +} diff --git a/transform/posttrans_test.go b/transform/posttrans_test.go new file mode 100644 index 000000000..de2d2277c --- /dev/null +++ b/transform/posttrans_test.go @@ -0,0 +1,41 @@ +package transform + +import ( + "testing" + "strings" + "bytes" +) + +const H5_JS_CONTENT_DOUBLE_QUOTE = "
content foobar. Follow up
" +const H5_JS_CONTENT_SINGLE_QUOTE = "
content foobar. Follow up
" +const H5_JS_CONTENT_ABS_URL = "
content foobar. Follow up
" +// URL doesn't recognize authorities. BUG? +//const H5_JS_CONTENT_ABS_URL = "
content foobar. Follow up
" + +const CORRECT_OUTPUT_SRC_HREF = "
content foobar. Follow up
" + + +func TestAbsUrlify(t *testing.T) { + tests := []struct { + content string + expected string + }{ + {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}, + } + + for _, test := range tests { + tr := &Transformer{ + BaseURL: "http://base", + } + out := new(bytes.Buffer) + err := tr.Apply(strings.NewReader(test.content), out) + if err != nil { + t.Errorf("Unexpected error: %s", err) + } + if test.expected != string(out.Bytes()) { + t.Errorf("Expected:\n%s\nGot:\n%s", test.expected, string(out.Bytes())) + } +} +}