From edb797e191aa337ac185903aa260d26eb7efb352 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Mon, 23 Feb 2015 16:29:03 +0100 Subject: [PATCH] feat(StyleUrlResolver): rewrite url in styles --- .../src/core/compiler/style_url_resolver.js | 35 ++++++++++++++++ .../core/compiler/style_url_resolver_spec.js | 41 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 modules/angular2/src/core/compiler/style_url_resolver.js create mode 100644 modules/angular2/test/core/compiler/style_url_resolver_spec.js diff --git a/modules/angular2/src/core/compiler/style_url_resolver.js b/modules/angular2/src/core/compiler/style_url_resolver.js new file mode 100644 index 0000000000..f0c528f82c --- /dev/null +++ b/modules/angular2/src/core/compiler/style_url_resolver.js @@ -0,0 +1,35 @@ +// Some of the code comes from WebComponents.JS +// https://github.com/webcomponents/webcomponentsjs/blob/master/src/HTMLImports/path.js + +import {RegExp, RegExpWrapper, StringWrapper} from 'angular2/src/facade/lang'; +import {UrlResolver} from './url_resolver'; + +export class StyleUrlResolver { + _resolver: UrlResolver; + + constructor(resolver: UrlResolver) { + this._resolver = resolver; + } + + resolveUrls(cssText: string, baseUrl: string) { + cssText = this._replaceUrls(cssText, _cssUrlRe, baseUrl); + cssText = this._replaceUrls(cssText, _cssImportRe, baseUrl); + return cssText; + } + + _replaceUrls(cssText: string, re: RegExp, baseUrl: string) { + return StringWrapper.replaceAllMapped(cssText, re, (m) => { + var pre = m[1]; + var url = StringWrapper.replaceAll(m[2], _quoteRe, ''); + var post = m[3]; + + var resolvedUrl = this._resolver.resolve(baseUrl, url); + + return pre + "'" + resolvedUrl + "'" + post; + }); + } +} + +var _cssUrlRe = RegExpWrapper.create('(url\\()([^)]*)(\\))'); +var _cssImportRe = RegExpWrapper.create('(@import[\\s]+(?!url\\())([^;]*)(;)'); +var _quoteRe = RegExpWrapper.create('[\'"]'); diff --git a/modules/angular2/test/core/compiler/style_url_resolver_spec.js b/modules/angular2/test/core/compiler/style_url_resolver_spec.js new file mode 100644 index 0000000000..d22b87d9a5 --- /dev/null +++ b/modules/angular2/test/core/compiler/style_url_resolver_spec.js @@ -0,0 +1,41 @@ +import {describe, it, expect, beforeEach, ddescribe, iit, xit, el} from 'angular2/test_lib'; +import {StyleUrlResolver} from 'angular2/src/core/compiler/style_url_resolver'; + +import {UrlResolver} from 'angular2/src/core/compiler/url_resolver'; + +export function main() { + describe('StyleUrlResolver', () => { + it('should resolve urls', () => { + var styleUrlResolver = new StyleUrlResolver(new FakeUrlResolver()); + var css = ` + @import '1.css'; + @import "2.css"; + @import url('3.css'); + @import url("4.css"); + + .foo { + background-image: url("double.jpg"); + background-image: url('simple.jpg'); + }`; + var expectedCss = ` + @import 'base/1.css'; + @import 'base/2.css'; + @import url('base/3.css'); + @import url('base/4.css'); + + .foo { + background-image: url('base/double.jpg'); + background-image: url('base/simple.jpg'); + }`; + + var resolvedCss = styleUrlResolver.resolveUrls(css, 'base'); + expect(resolvedCss).toEqual(expectedCss); + }); + }); +} + +class FakeUrlResolver extends UrlResolver { + resolve(baseUrl: string, url: string): string { + return baseUrl + '/' + url; + } +}