Chromium Code Reviews| Index: pkg/path/lib/path.dart |
| diff --git a/pkg/path/lib/path.dart b/pkg/path/lib/path.dart |
| index 388c0841ae89f7d978ba30d4ffe486aa21784b38..4993b5d401f00c6f86b843e16df28c1c02c63e80 100644 |
| --- a/pkg/path/lib/path.dart |
| +++ b/pkg/path/lib/path.dart |
| @@ -28,12 +28,20 @@ String absolute(String path) => join(current, path); |
| /// |
| /// path.basename('path/to/foo.dart'); // -> 'foo.dart' |
| /// path.basename('path/to'); // -> 'to' |
| +/// |
| +/// Trailing separators are ignored. |
| +/// |
| +/// builder.dirname('path/to/'); // -> 'to' |
| String basename(String path) => _builder.basename(path); |
| /// Gets the part of [path] after the last separator, and without any trailing |
| /// file extension. |
| /// |
| /// path.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo' |
| +/// |
| +/// Trailing separators are ignored. |
| +/// |
| +/// builder.dirname('path/to/foo.dart/'); // -> 'foo' |
| String basenameWithoutExtension(String path) => |
| _builder.basenameWithoutExtension(path); |
| @@ -41,6 +49,10 @@ String basenameWithoutExtension(String path) => |
| /// |
| /// path.dirname('path/to/foo.dart'); // -> 'path/to' |
| /// path.dirname('path/to'); // -> 'to' |
| +/// |
| +/// Trailing separators are ignored. |
| +/// |
| +/// builder.dirname('path/to/'); // -> 'path' |
| String dirname(String path) => _builder.dirname(path); |
| /// Gets the file extension of [path]: the portion of [basename] from the last |
| @@ -190,30 +202,41 @@ class Builder { |
| /// |
| /// builder.basename('path/to/foo.dart'); // -> 'foo.dart' |
| /// builder.basename('path/to'); // -> 'to' |
| + /// |
| + /// Trailing separators are ignored. |
| + /// |
| + /// builder.dirname('path/to/'); // -> 'to' |
| String basename(String path) => _parse(path).basename; |
| /// Gets the part of [path] after the last separator on the builder's |
| /// platform, and without any trailing file extension. |
| /// |
| /// builder.basenameWithoutExtension('path/to/foo.dart'); // -> 'foo' |
| + /// |
| + /// Trailing separators are ignored. |
| + /// |
| + /// builder.dirname('path/to/foo.dart/'); // -> 'foo' |
| String basenameWithoutExtension(String path) => |
| - _parse(path).basenameWithoutExtension; |
| + _parse(path).basenameWithoutExtension; |
| /// Gets the part of [path] before the last separator. |
| /// |
| /// builder.dirname('path/to/foo.dart'); // -> 'path/to' |
| - /// builder.dirname('path/to'); // -> 'to' |
| + /// builder.dirname('path/to'); // -> 'path' |
| + /// |
| + /// Trailing separators are ignored. |
| + /// |
| + /// builder.dirname('path/to/'); // -> 'path' |
| String dirname(String path) { |
| var parsed = _parse(path); |
| + parsed.removeTrailingSeparators(); |
| if (parsed.parts.isEmpty) return parsed.root == null ? '.' : parsed.root; |
| - if (!parsed.hasTrailingSeparator) { |
| - if (parsed.parts.length == 1) { |
| - return parsed.root == null ? '.' : parsed.root; |
| - } |
| - parsed.parts.removeLast(); |
| - parsed.separators.removeLast(); |
| + if (parsed.parts.length == 1) { |
| + return parsed.root == null ? '.' : parsed.root; |
| } |
| - parsed.separators[parsed.separators.length - 1] = ''; |
| + parsed.parts.removeLast(); |
| + parsed.separators.removeLast(); |
| + parsed.removeTrailingSeparators(); |
|
Bob Nystrom
2012/12/20 02:27:28
Is this redundant with the above call to removeTra
nweiz
2012/12/20 20:54:49
No. The first call removes the separators at the e
|
| return parsed.toString(); |
| } |
| @@ -440,7 +463,7 @@ class Builder { |
| // Make it relative. |
| pathParsed.root = ''; |
| - pathParsed.removeTrailingSeparator(); |
| + pathParsed.removeTrailingSeparators(); |
| return pathParsed.toString(); |
| } |
| @@ -450,10 +473,12 @@ class Builder { |
| /// builder.withoutExtension('path/to/foo.dart'); // -> 'path/to/foo' |
| String withoutExtension(String path) { |
| var parsed = _parse(path); |
| - if (parsed.hasTrailingSeparator) return parsed.toString(); |
| - if (!parsed.parts.isEmpty) { |
| - parsed.parts[parsed.parts.length - 1] = parsed.basenameWithoutExtension; |
| + for (var i = parsed.parts.length - 1; i >= 0; i--) { |
|
Bob Nystrom
2012/12/20 02:27:28
This is pretty hairy. One option would to have _Pa
nweiz
2012/12/20 20:54:49
It's not just trailing slashes that cause empty co
Bob Nystrom
2012/12/20 21:32:57
Ah, right.
|
| + if (!parsed.parts[i].isEmpty) { |
| + parsed.parts[i] = parsed.basenameWithoutExtension; |
| + break; |
| + } |
| } |
| return parsed.toString(); |
| @@ -555,29 +580,31 @@ class _ParsedPath { |
| /// The file extension of the last part, or "" if it doesn't have one. |
| String get extension => _splitExtension()[1]; |
| - /// `true` if the path ends with a trailing separator. |
| - bool get hasTrailingSeparator { |
| - if (separators.length == 0) return false; |
| - return separators[separators.length - 1] != ''; |
| - } |
| - |
| /// `true` if this is an absolute path. |
| bool get isAbsolute => root != null; |
| _ParsedPath(this.style, this.root, this.parts, this.separators); |
| String get basename { |
| - if (parts.length == 0) return extension; |
| - if (hasTrailingSeparator) return ''; |
| - return parts.last; |
| + var copy = this.copy(); |
| + copy.removeTrailingSeparators(); |
| + if (copy.parts.isEmpty) return root == null ? '' : root; |
| + return copy.parts.last; |
| } |
| - String get basenameWithoutExtension => _splitExtension()[0]; |
| + String get basenameWithoutExtension { |
| + var copy = this.copy(); |
| + copy.removeTrailingSeparators(); |
| + if (copy.parts.isEmpty) return root == null ? '' : root; |
| + return copy._splitExtension()[0]; |
| + } |
| - void removeTrailingSeparator() { |
| - if (separators.length > 0) { |
| - separators[separators.length - 1] = ''; |
| + void removeTrailingSeparators() { |
| + while (!parts.isEmpty && parts.last == '') { |
| + parts.removeLast(); |
| + separators.removeLast(); |
| } |
| + if (separators.length > 0) separators[separators.length - 1] = ''; |
| } |
| void normalize() { |
| @@ -617,7 +644,7 @@ class _ParsedPath { |
| parts = newParts; |
| separators = newSeparators; |
| - removeTrailingSeparator(); |
| + removeTrailingSeparators(); |
| } |
| String toString() { |
| @@ -636,7 +663,6 @@ class _ParsedPath { |
| /// or "" if it has none. |
| List<String> _splitExtension() { |
| if (parts.isEmpty) return ['', '']; |
| - if (hasTrailingSeparator) return ['', '']; |
| var file = parts.last; |
| if (file == '..') return ['..', '']; |
| @@ -649,4 +675,7 @@ class _ParsedPath { |
| return [file.substring(0, lastDot), file.substring(lastDot)]; |
| } |
| + |
| + _ParsedPath copy() => new _ParsedPath( |
|
Bob Nystrom
2012/12/20 02:27:28
Nit, but I would prefer "clone" for this.
nweiz
2012/12/20 20:54:49
Done.
|
| + style, root, new List.from(parts), new List.from(separators)); |
| } |