Updated Branches: refs/heads/master 0dd2d2ae7 -> a32faa924
Handle multiple url()s on a single line Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/a32faa92 Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/a32faa92 Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/a32faa92 Branch: refs/heads/master Commit: a32faa924eb8b6f9a5fb7c43d7bf659e56743e26 Parents: 0dd2d2a Author: Howard M. Lewis Ship <[email protected]> Authored: Wed Jul 24 15:06:07 2013 -0700 Committer: Howard M. Lewis Ship <[email protected]> Committed: Wed Jul 24 15:06:07 2013 -0700 ---------------------------------------------------------------------- .../services/assets/CSSURLRewriter.java | 21 ++++++++--- .../services/assets/CSSURLRewriterTests.groovy | 39 +++++++++++++++++++- 2 files changed, 54 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/a32faa92/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/CSSURLRewriter.java ---------------------------------------------------------------------- diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/CSSURLRewriter.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/CSSURLRewriter.java index 3577dad..95ba2ba 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/CSSURLRewriter.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/assets/CSSURLRewriter.java @@ -33,8 +33,8 @@ import java.util.regex.Pattern; * CSS file will change (which would ordinarily break relative URLs), and for changing the relative directories of * the CSS file and the image assets it may refer to (useful for incorporating a hash of the resource's content into * the exposed URL). - * - * <p> + * <p/> + * <p/> * One potential problem with URL rewriting is the way that URLs for referenced resources are generated; we are * somewhat banking on the fact that referenced resources are non-compressable images. * @@ -45,7 +45,16 @@ public class CSSURLRewriter extends DelegatingSRS // Group 1 is the optional single or double quote (note the use of backtracking to match it) // Group 2 is the text inside the quotes, or inside the parens if no quotes // Group 3 is any query parmameters (see issue TAP5-2106) - private final Pattern urlPattern = Pattern.compile("url\\(\\s*(['\"]?)(.+?)(\\?.*)?\\1\\s*\\)", Pattern.MULTILINE); + private final Pattern urlPattern = Pattern.compile( + "url" + + "\\(" + // opening paren + "\\s*" + + "(['\"]?)" + // group 1: optional single or double quote + "(.+?)" + // group 2: the main part of the URL, up to the first '#' or '?' + "([\\#\\?].*?)?" + // group 3: Optional '#' or '?' to end of string + "\\1" + // optional closing single/double quote + "\\s*" + + "\\)"); // matching close paren // Does it start with a '/' or what looks like a scheme ("http:")? private final Pattern completeURLPattern = Pattern.compile("^[#/]|(\\p{Alpha}\\w*:)"); @@ -132,7 +141,8 @@ public class CSSURLRewriter extends DelegatingSRS { String queryParameters = matcher.group(3); - if (queryParameters != null) { + if (queryParameters != null) + { url = url + queryParameters; } @@ -147,7 +157,8 @@ public class CSSURLRewriter extends DelegatingSRS String assetURL = asset.toClientURL(); String queryParameters = matcher.group(3); - if (queryParameters != null) { + if (queryParameters != null) + { assetURL += queryParameters; } http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/a32faa92/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/assets/CSSURLRewriterTests.groovy ---------------------------------------------------------------------- diff --git a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/assets/CSSURLRewriterTests.groovy b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/assets/CSSURLRewriterTests.groovy index 31a58db..6286a83 100644 --- a/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/assets/CSSURLRewriterTests.groovy +++ b/tapestry-core/src/test/groovy/org/apache/tapestry5/internal/services/assets/CSSURLRewriterTests.groovy @@ -57,7 +57,6 @@ body { } - // See TAP5-2106 @Test void query_parameters_in_relative_url_are_maintained() { @@ -153,6 +152,44 @@ body { assertNull rewriter.replaceURLs(input, null) } + @Test + void multiple_urls_per_line() { + + def input = ''' +body { + src: url('font/fontawesome-webfont.eot?#iefix&v=3.1.0') format('embedded-opentype'), url('font/fontawesome-webfont.woff?v=3.1.0') format('woff'), url('font/fontawesome-webfont.ttf?v=3.1.0') format('truetype'), url('font/fontawesome-webfont.svg#fontawesomeregular?v=3.1.0') format('svg'); +} +''' + + def assetSource = newMock AssetSource + def resource = newMock Resource + + ["fontawesome-webfont.eot", "fontawesome-webfont.woff", "fontawesome-webfont.ttf", "fontawesome-webfont.svg"].each { name -> + + def asset = newMock Asset + + expect( + assetSource.getAsset(resource, "font/$name", null) + ).andReturn asset + + expect(asset.toClientURL()).andReturn "/ctx/font/$name".toString() + } + + replay() + + + def rewriter = new CSSURLRewriter(null, null, assetSource, null) + + def output = rewriter.replaceURLs input, resource + + assertEquals output, ''' +body { + src: url("/ctx/font/fontawesome-webfont.eot?#iefix&v=3.1.0") format('embedded-opentype'), url("/ctx/font/fontawesome-webfont.woff?v=3.1.0") format('woff'), url("/ctx/font/fontawesome-webfont.ttf?v=3.1.0") format('truetype'), url("/ctx/font/fontawesome-webfont.svg#fontawesomeregular?v=3.1.0") format('svg'); +} +''' + verify() + } + @Test void vml_urls_are_not_replaced() {
