From ef595aedfce66caf2e8560b3605d38e95872e1ca Mon Sep 17 00:00:00 2001 From: Noah Campbell Date: Sat, 9 Nov 2013 14:35:09 +0000 Subject: [PATCH] Handle schema-less urls when apply absurl Fixes #114 --- transform/absurl.go | 15 +++++++++++---- transform/posttrans_test.go | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/transform/absurl.go b/transform/absurl.go index 80716f1b7..8bdd36515 100644 --- a/transform/absurl.go +++ b/transform/absurl.go @@ -23,15 +23,22 @@ func AbsURL(absURL string) (trs []link, err error) { hrefsq = []byte(" href='" + base + "/") ) trs = append(trs, func(content []byte) []byte { - content = bytes.Replace(content, []byte(" src=\"/"), srcdq, -1) - content = bytes.Replace(content, []byte(" src='/"), srcsq, -1) - content = bytes.Replace(content, []byte(" href=\"/"), hrefdq, -1) - content = bytes.Replace(content, []byte(" href='/"), hrefsq, -1) + content = guardReplace(content, []byte(" src=\"//"), []byte(" src=\"/"), srcdq) + content = guardReplace(content, []byte(" src='//"), []byte(" src='/"), srcsq) + content = guardReplace(content, []byte(" href=\"//"), []byte(" href=\"/"), hrefdq) + content = guardReplace(content, []byte(" href='//"), []byte(" href='/"), hrefsq) return content }) return } +func guardReplace(content, guard, match, replace []byte) []byte { + if !bytes.Contains(content, guard) { + content = bytes.Replace(content, match, replace, -1) + } + return content +} + type elattr struct { tag, attr string } diff --git a/transform/posttrans_test.go b/transform/posttrans_test.go index d7d06fee7..297b4f66e 100644 --- a/transform/posttrans_test.go +++ b/transform/posttrans_test.go @@ -12,8 +12,7 @@ const H5_JS_CONTENT_SINGLE_QUOTE = "
content foobar. Follow up
" +const H5_JS_CONTENT_ABS_URL_SCHEMALESS = "
content foobar. Follow up
" @@ -34,6 +33,7 @@ var abs_url_tests = []test{ {H5_JS_CONTENT_DOUBLE_QUOTE, CORRECT_OUTPUT_SRC_HREF_DQ}, {H5_JS_CONTENT_SINGLE_QUOTE, CORRECT_OUTPUT_SRC_HREF_SQ}, {H5_JS_CONTENT_ABS_URL, H5_JS_CONTENT_ABS_URL}, + {H5_JS_CONTENT_ABS_URL_SCHEMALESS, H5_JS_CONTENT_ABS_URL_SCHEMALESS}, } type errorf func(string, ...interface{})