Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Side by Side Diff: dart/lib/compiler/implementation/util/uri_extras.dart

Issue 10914094: Improve [relativize] for Windows. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #library('uri_extras'); 5 #library('uri_extras');
6 6
7 #import('dart:math'); 7 #import('dart:math');
8 #import('dart:uri'); 8 #import('dart:uri');
9 9
10 String relativize(Uri base, Uri uri) { 10 String relativize(Uri base, Uri uri, bool isWindows) {
11 if (base.scheme == 'file' && 11 if (!base.path.startsWith('/')) {
12 base.scheme == uri.scheme && 12 // Also throw an exception if [base] or base.path is null.
13 throw new IllegalArgumentException('Expected absolute path: ${base.path}');
14 }
15 if (!uri.path.startsWith('/')) {
16 // Also throw an exception if [uri] or uri.path is null.
17 throw new IllegalArgumentException('Expected absolute path: ${uri.path}');
18 }
19 bool equalsNCS(String a, String b) {
20 return a.toLowerCase() == b.toLowerCase();
21 }
22
23 String normalize(String path) {
24 if (isWindows) {
25 return path.toLowerCase();
26 } else {
27 return path;
28 }
29 }
30
31 if (equalsNCS(base.scheme, 'file') &&
32 equalsNCS(base.scheme, uri.scheme) &&
13 base.userInfo == uri.userInfo && 33 base.userInfo == uri.userInfo &&
14 base.domain == uri.domain && 34 equalsNCS(base.domain, uri.domain) &&
15 base.port == uri.port && 35 base.port == uri.port &&
16 uri.query == "" && uri.fragment == "") { 36 uri.query == "" && uri.fragment == "") {
17 if (uri.path.startsWith(base.path)) { 37 if (normalize(uri.path).startsWith(normalize(base.path))) {
18 return uri.path.substring(base.path.length); 38 return uri.path.substring(base.path.length);
19 } 39 }
20 List<String> uriParts = uri.path.split('/'); 40 List<String> uriParts = uri.path.split('/');
21 List<String> baseParts = base.path.split('/'); 41 List<String> baseParts = base.path.split('/');
22 int common = 0; 42 int common = 0;
23 int length = min(uriParts.length, baseParts.length); 43 int length = min(uriParts.length, baseParts.length);
24 while (common < length && uriParts[common] == baseParts[common]) { 44 while (common < length &&
45 normalize(uriParts[common]) == normalize(baseParts[common])) {
25 common++; 46 common++;
26 } 47 }
48 if (common == 1 || (isWindows && common == 2)) {
49 // The first part will always be an empty string because the
50 // paths are absolute. On Windows, we must also consider drive
51 // letters or hostnames.
52 return uri.path;
53 }
27 StringBuffer sb = new StringBuffer(); 54 StringBuffer sb = new StringBuffer();
28 for (int i = common + 1; i < baseParts.length; i++) { 55 for (int i = common + 1; i < baseParts.length; i++) {
29 sb.add('../'); 56 sb.add('../');
30 } 57 }
31 for (int i = common; i < uriParts.length - 1; i++) { 58 for (int i = common; i < uriParts.length - 1; i++) {
32 sb.add('${uriParts[i]}/'); 59 sb.add('${uriParts[i]}/');
33 } 60 }
34 sb.add('${uriParts.last()}'); 61 sb.add('${uriParts.last()}');
35 return sb.toString(); 62 return sb.toString();
36 } 63 }
37 return uri.toString(); 64 return uri.toString();
38 } 65 }
OLDNEW
« no previous file with comments | « dart/lib/compiler/implementation/dart2js.dart ('k') | dart/pkg/dartdoc/mirrors/dart2js_mirror.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698