OLD | NEW |
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 part of dart.io; | 5 part of dart.io; |
6 | 6 |
7 class _Path implements Path { | 7 class _Path implements Path { |
8 final String _path; | 8 final String _path; |
9 final bool isWindowsShare; | 9 final bool isWindowsShare; |
10 | 10 |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 return further.canonicalize(); | 147 return further.canonicalize(); |
148 } | 148 } |
149 if (hasTrailingSeparator) { | 149 if (hasTrailingSeparator) { |
150 var joined = new _Path._internal('$_path${further}', isWindowsShare); | 150 var joined = new _Path._internal('$_path${further}', isWindowsShare); |
151 return joined.canonicalize(); | 151 return joined.canonicalize(); |
152 } | 152 } |
153 var joined = new _Path._internal('$_path/${further}', isWindowsShare); | 153 var joined = new _Path._internal('$_path/${further}', isWindowsShare); |
154 return joined.canonicalize(); | 154 return joined.canonicalize(); |
155 } | 155 } |
156 | 156 |
157 // Note: The URI RFC names for these operations are normalize, resolve, and | 157 // Note: The URI RFC names for canonicalize, join, and relativeTo |
158 // relativize. | 158 // are normalize, resolve, and relativize. But resolve and relativize |
| 159 // drop the last segment of the base path (the filename), on URIs. |
159 Path canonicalize() { | 160 Path canonicalize() { |
160 if (isCanonical) return this; | 161 if (isCanonical) return this; |
161 return makeCanonical(); | 162 return makeCanonical(); |
162 } | 163 } |
163 | 164 |
164 bool get isCanonical { | 165 bool get isCanonical { |
165 // Contains no consecutive path separators. | 166 // Contains no consecutive path separators. |
166 // Contains no segments that are '.'. | 167 // Contains no segments that are '.'. |
167 // Absolute paths have no segments that are '..'. | 168 // Absolute paths have no segments that are '..'. |
168 // All '..' segments of a relative path are at the beginning. | 169 // All '..' segments of a relative path are at the beginning. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 } else { | 239 } else { |
239 segmentsToJoin.addAll(newSegs); | 240 segmentsToJoin.addAll(newSegs); |
240 if (hasTrailingSeparator) { | 241 if (hasTrailingSeparator) { |
241 segmentsToJoin.add(''); | 242 segmentsToJoin.add(''); |
242 } | 243 } |
243 } | 244 } |
244 return new _Path._internal(segmentsToJoin.join('/'), isWindowsShare); | 245 return new _Path._internal(segmentsToJoin.join('/'), isWindowsShare); |
245 } | 246 } |
246 | 247 |
247 String toNativePath() { | 248 String toNativePath() { |
| 249 if (isEmpty) return '.'; |
248 if (Platform.operatingSystem == 'windows') { | 250 if (Platform.operatingSystem == 'windows') { |
249 String nativePath = _path; | 251 String nativePath = _path; |
250 // Drop '/' before a drive letter. | 252 // Drop '/' before a drive letter. |
251 if (nativePath.length >= 3 && | 253 if (nativePath.length >= 3 && |
252 nativePath.startsWith('/') && | 254 nativePath.startsWith('/') && |
253 nativePath[2] == ':') { | 255 nativePath[2] == ':') { |
254 nativePath = nativePath.substring(1); | 256 nativePath = nativePath.substring(1); |
255 } | 257 } |
256 nativePath = nativePath.replaceAll('/', '\\'); | 258 nativePath = nativePath.replaceAll('/', '\\'); |
257 if (isWindowsShare) { | 259 if (isWindowsShare) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 while (pos > 0 && _path[pos - 1] == '/') --pos; | 300 while (pos > 0 && _path[pos - 1] == '/') --pos; |
299 var dirPath = (pos > 0) ? _path.substring(0, pos) : '/'; | 301 var dirPath = (pos > 0) ? _path.substring(0, pos) : '/'; |
300 return new _Path._internal(dirPath, isWindowsShare); | 302 return new _Path._internal(dirPath, isWindowsShare); |
301 } | 303 } |
302 | 304 |
303 String get filename { | 305 String get filename { |
304 int pos = _path.lastIndexOf('/'); | 306 int pos = _path.lastIndexOf('/'); |
305 return _path.substring(pos + 1); | 307 return _path.substring(pos + 1); |
306 } | 308 } |
307 } | 309 } |
OLD | NEW |