From e558333cd1c2f59a8d310cdc47bfb1a4abcdbb6f Mon Sep 17 00:00:00 2001 From: Loic Bistuer <loic.bistuer@sixmedia.com> Date: Thu, 27 Sep 2012 00:36:08 +0700 Subject: [PATCH 1/2] Added a test case for relative urls and imports --- test-relative-paths/Makefile | 12 ++++++++ test-relative-paths/static/assets/logo.png | Bin 0 -> 13831 bytes test-relative-paths/static/assets/xecret.ttf | Bin 0 -> 22192 bytes test-relative-paths/static/css/background.css | 3 ++ .../static/less/imports/font.less | 8 ++++++ .../static/less/imports/logo.less | 5 ++++ test-relative-paths/static/less/main.less | 4 +++ test-relative-paths/test-clientside.html | 26 ++++++++++++++++++ test-relative-paths/test-serverside.html | 24 ++++++++++++++++ 9 files changed, 82 insertions(+) create mode 100644 test-relative-paths/Makefile create mode 100644 test-relative-paths/static/assets/logo.png create mode 100755 test-relative-paths/static/assets/xecret.ttf create mode 100644 test-relative-paths/static/css/background.css create mode 100644 test-relative-paths/static/less/imports/font.less create mode 100644 test-relative-paths/static/less/imports/logo.less create mode 100644 test-relative-paths/static/less/main.less create mode 100644 test-relative-paths/test-clientside.html create mode 100644 test-relative-paths/test-serverside.html diff --git a/test-relative-paths/Makefile b/test-relative-paths/Makefile new file mode 100644 index 000000000..f71c32339 --- /dev/null +++ b/test-relative-paths/Makefile @@ -0,0 +1,12 @@ +all: clean + @echo "Building less.js:" + make -C .. min + + @echo + + @echo "Building test-relative-paths:" + ../bin/lessc static/less/main.less static/css/main.css + +clean: + @echo "Cleaning up test-relative-paths:" + rm -f static/css/main.css diff --git a/test-relative-paths/static/assets/logo.png b/test-relative-paths/static/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1a739b3e9903d8c023ade58af038277b60719d5a GIT binary patch literal 13831 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 JPDHLkV1g`~`5XWM literal 0 HcmV?d00001 diff --git a/test-relative-paths/static/assets/xecret.ttf b/test-relative-paths/static/assets/xecret.ttf new file mode 100755 index 0000000000000000000000000000000000000000..2ae076fa2d243da873eab5ec0a5e7b1f81b61f41 GIT binary patch literal 22192 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 literal 0 HcmV?d00001 diff --git a/test-relative-paths/static/css/background.css b/test-relative-paths/static/css/background.css new file mode 100644 index 000000000..30a5da37f --- /dev/null +++ b/test-relative-paths/static/css/background.css @@ -0,0 +1,3 @@ +html { + background-color: #82e291; +} diff --git a/test-relative-paths/static/less/imports/font.less b/test-relative-paths/static/less/imports/font.less new file mode 100644 index 000000000..5abb7e769 --- /dev/null +++ b/test-relative-paths/static/less/imports/font.less @@ -0,0 +1,8 @@ +@font-face { + font-family: xecret; + src: url('../assets/xecret.ttf'); +} + +#secret { + font-family: xecret, sans-serif; +} diff --git a/test-relative-paths/static/less/imports/logo.less b/test-relative-paths/static/less/imports/logo.less new file mode 100644 index 000000000..322919d91 --- /dev/null +++ b/test-relative-paths/static/less/imports/logo.less @@ -0,0 +1,5 @@ +#logo { + width: 199px; + height: 81px; + background-image: url('../assets/logo.png'); +} diff --git a/test-relative-paths/static/less/main.less b/test-relative-paths/static/less/main.less new file mode 100644 index 000000000..ab0cc3902 --- /dev/null +++ b/test-relative-paths/static/less/main.less @@ -0,0 +1,4 @@ +@import "../css/background.css"; + +@import "imports/logo"; +@import "imports/font"; diff --git a/test-relative-paths/test-clientside.html b/test-relative-paths/test-clientside.html new file mode 100644 index 000000000..c98f588f6 --- /dev/null +++ b/test-relative-paths/test-clientside.html @@ -0,0 +1,26 @@ +<!DOCTYPE html> + +<html> + <head> + <meta charset="utf-8"> + <title>Test case for relative paths</title> + <link rel="stylesheet/less" href="static/less/main.less"> + <script>var less = { env: 'development' };</script> + <script src="../dist/less-1.3.0.js"></script> + </head> + + <body> + <h1>Client-side test case for relative paths</a></h1> + + <h2>Test 1: imports of .css</h2> + <p>Expected result: the background of the page should be green.</p> + + <h2>Test 2: background-image url</h2> + <div id="logo"></div> + <p>Expected result: the LESS logo should appear above.</p> + + <h2>Test 3: @font-face url</h2> + <div id="secret">abcdef</div> + <p>Expected result: the text above should be a series of "X".</p> + </body> +</html> diff --git a/test-relative-paths/test-serverside.html b/test-relative-paths/test-serverside.html new file mode 100644 index 000000000..9162c4db3 --- /dev/null +++ b/test-relative-paths/test-serverside.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> + +<html> + <head> + <meta charset="utf-8"> + <title>Test case for relative paths</title> + <link rel="stylesheet" href="static/css/main.css"> + </head> + + <body> + <h1>Server-side test case for relative paths</a></h1> + + <h2>Test 1: imports of .css</h2> + <p>Expected result: the background of the page should be green.</p> + + <h2>Test 2: background-image url</h2> + <div id="logo"></div> + <p>Expected result: the LESS logo should appear above.</p> + + <h2>Test 3: @font-face url</h2> + <div id="secret">abcdef</div> + <p>Expected result: the text above should be a series of "X".</p> + </body> +</html> From 7d8ad26549bd929a790b368ddbd1910f742796c0 Mon Sep 17 00:00:00 2001 From: Loic Bistuer <loic.bistuer@sixmedia.com> Date: Thu, 27 Sep 2012 00:42:12 +0700 Subject: [PATCH 2/2] Fix the differences between client-side and server-side handling of relative urls and imports --- lib/less/browser.js | 4 ++++ lib/less/parser.js | 7 ++++--- lib/less/tree/import.js | 7 ++++++- lib/less/tree/url.js | 10 +++++----- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/less/browser.js b/lib/less/browser.js index b7de8be8b..758142e40 100644 --- a/lib/less/browser.js +++ b/lib/less/browser.js @@ -133,6 +133,9 @@ function loadStyleSheet(sheet, callback, reload, remaining) { href = url.slice(0, url.lastIndexOf('/') + 1) + href; } } + + var rootpath = sheet.rootpath || href.replace(/[\w\.-]+$/, ''); + xhr(sheet.href, sheet.type, function (data, lastModified) { if (!reload && styles && lastModified && (new(Date)(lastModified).valueOf() === @@ -149,6 +152,7 @@ function loadStyleSheet(sheet, callback, reload, remaining) { paths: [href.replace(/[\w\.-]+$/, '')], mime: sheet.type, filename: href, + rootpath: rootpath, // Passing top importing sheet ref down. 'contents': contents // Passing top importing parser content cache ref down. }).parse(data, function (e, root) { if (e) { return error(e, href) } diff --git a/lib/less/parser.js b/lib/less/parser.js index 928696903..3a6a532e2 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -79,6 +79,7 @@ less.Parser = function Parser(env) { queue: [], // Files which haven't been imported yet files: {}, // Holds the imported parse trees contents: env.contents, // Holds the imported file contents + rootpath: env.rootpath, // Holds the path of the top importing sheet mime: env && env.mime, // MIME type of .less files error: null, // Error in parsing/evaluating an import push: function (path, callback) { @@ -647,7 +648,7 @@ less.Parser = function Parser(env) { expect(')'); return new(tree.URL)((value.value != null || value instanceof tree.Variable) - ? value : new(tree.Anonymous)(value), imports.paths); + ? value : new(tree.Anonymous)(value), env.rootpath); }, // @@ -1120,7 +1121,7 @@ less.Parser = function Parser(env) { if (dir && (path = $(this.entities.quoted) || $(this.entities.url))) { features = $(this.mediaFeatures); if ($(';')) { - return new(tree.Import)(path, imports, features, (dir[1] === 'once'), index); + return new(tree.Import)(path, imports, features, (dir[1] === 'once'), index, env.rootpath); } } @@ -1407,7 +1408,7 @@ if (less.mode === 'browser' || less.mode === 'rhino') { // This is so we can get the syntax tree as opposed to just the CSS output, // as we need this to evaluate the current stylesheet. // __ Now using the hack of passing a ref to top parser's content cache in the 1st arg. __ - loadStyleSheet({ href: path, title: path, type: env.mime, contents: env.contents }, function (e) { + loadStyleSheet({ href: path, title: path, type: env.mime, contents: env.contents, rootpath: env.rootpath }, function (e) { if (e && typeof(env.errback) === "function") { env.errback.call(null, path, paths, callback, env); } else { diff --git a/lib/less/tree/import.js b/lib/less/tree/import.js index 7a977def2..577e07104 100644 --- a/lib/less/tree/import.js +++ b/lib/less/tree/import.js @@ -11,13 +11,14 @@ // `import,push`, we also pass it a callback, which it'll call once // the file has been fetched, and parsed. // -tree.Import = function (path, imports, features, once, index) { +tree.Import = function (path, imports, features, once, index, rootpath) { var that = this; this.once = once; this.index = index; this._path = path; this.features = features && new(tree.Value)(features); + this.rootpath = rootpath // The '.less' extension is optional if (path instanceof tree.Quoted) { @@ -52,6 +53,10 @@ tree.Import.prototype = { var features = this.features ? ' ' + this.features.toCSS(env) : ''; if (this.css) { + // Add the base path if the import is relative and we are in the browser + if (typeof window !== 'undefined' && typeof this._path.value === "string" && !/^(?:[a-z-]+:|\/)/.test(this._path.value)) { + this._path.value = this.rootpath + this._path.value; + } return "@import " + this._path.toCSS() + features + ';\n'; } else { return ""; diff --git a/lib/less/tree/url.js b/lib/less/tree/url.js index 2bea3c323..7b9a3840a 100644 --- a/lib/less/tree/url.js +++ b/lib/less/tree/url.js @@ -1,8 +1,8 @@ (function (tree) { -tree.URL = function (val, paths) { +tree.URL = function (val, rootpath) { this.value = val; - this.paths = paths; + this.rootpath = rootpath }; tree.URL.prototype = { toCSS: function () { @@ -12,11 +12,11 @@ tree.URL.prototype = { var val = this.value.eval(ctx); // Add the base path if the URL is relative and we are in the browser - if (typeof window !== 'undefined' && typeof val.value === "string" && !/^(?:[a-z-]+:|\/)/.test(val.value) && this.paths.length > 0) { - val.value = this.paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value); + if (typeof window !== 'undefined' && typeof val.value === "string" && !/^(?:[a-z-]+:|\/)/.test(val.value)) { + val.value = this.rootpath + val.value; } - return new(tree.URL)(val, this.paths); + return new(tree.URL)(val, this.rootpath); } };