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

Unified Diff: pkg/pathos/lib/path.dart

Issue 16848002: Add toUri and fromUri functions to pathos. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: pkg/pathos/lib/path.dart
diff --git a/pkg/pathos/lib/path.dart b/pkg/pathos/lib/path.dart
index 145953f3c8aa619d13f4fbcbaec0c9df65a184dd..a994f6e7cf373a078138d32ea295dd967ce3a2ae 100644
--- a/pkg/pathos/lib/path.dart
+++ b/pkg/pathos/lib/path.dart
@@ -275,6 +275,45 @@ String relative(String path, {String from}) =>
/// withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
String withoutExtension(String path) => _builder.withoutExtension(path);
+/// Returns the path represented by [uri].
+///
+/// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
+/// style, this will just convert [uri] to a string.
+///
+/// // POSIX
+/// path.fromUri(Uri.parse('file:///path/to/foo'))
+/// // -> '/path/to/foo'
+///
+/// // Windows
+/// path.fromUri(Uri.parse('file:///C:/path/to/foo'))
+/// // -> r'C:\path\to\foo'
+///
+/// // URL
+/// path.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+/// // -> 'http://dartlang.org/path/to/foo'
+String fromUri(Uri uri) => _builder.fromUri(uri);
+
+/// Returns the URI that represents [path].
+///
+/// For POSIX and Windows styles, this will return a `file:` URI. For the URL
+/// style, this will just convert [path] to a [Uri].
+///
+/// This will always convert relative paths to absolute ones before converting
+/// to a URI.
+///
+/// // POSIX
+/// path.toUri('/path/to/foo')
+/// // -> Uri.parse('file:///path/to/foo')
+///
+/// // Windows
+/// path.toUri(r'C:\path\to\foo')
+/// // -> Uri.parse('file:///C:/path/to/foo')
+///
+/// // URL
+/// path.toUri('http://dartlang.org/path/to/foo')
+/// // -> Uri.parse('http://dartlang.org/path/to/foo')
+Uri toUri(String path) => _builder.toUri(path);
+
/// Validates that there are no non-null arguments following a null one and
/// throws an appropriate [ArgumentError] on failure.
_validateArgList(String method, List<String> args) {
@@ -673,6 +712,48 @@ class Builder {
return parsed.toString();
}
+ /// Returns the path represented by [uri].
+ ///
+ /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
+ /// style, this will just convert [uri] to a string.
+ ///
+ /// // POSIX
+ /// builder.fromUri(Uri.parse('file:///path/to/foo'))
+ /// // -> '/path/to/foo'
+ ///
+ /// // Windows
+ /// builder.fromUri(Uri.parse('file:///C:/path/to/foo'))
+ /// // -> r'C:\path\to\foo'
+ ///
+ /// // URL
+ /// builder.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+ /// // -> 'http://dartlang.org/path/to/foo'
+ String fromUri(Uri uri) => style.pathFromUri(uri);
+
+ /// Returns the URI that represents [path].
+ ///
+ /// For POSIX and Windows styles, this will return a `file:` URI. For the URL
+ /// style, this will just convert [path] to a [Uri].
+ ///
+ /// // POSIX
+ /// builder.toUri('/path/to/foo')
+ /// // -> Uri.parse('file:///path/to/foo')
+ ///
+ /// // Windows
+ /// builder.toUri(r'C:\path\to\foo')
+ /// // -> Uri.parse('file:///C:/path/to/foo')
+ ///
+ /// // URL
+ /// builder.toUri('http://dartlang.org/path/to/foo')
+ /// // -> Uri.parse('http://dartlang.org/path/to/foo')
+ Uri toUri(String path) {
+ if (isRelative(path)) {
+ return Uri.parse(path.replaceAll(style.separatorPattern, '/'));
+ } else {
+ return style.pathToUri(join(root, path));
+ }
+ }
+
_ParsedPath _parse(String path) {
var before = path;
@@ -714,15 +795,14 @@ class Builder {
class Style {
/// POSIX-style paths use "/" (forward slash) as separators. Absolute paths
/// start with "/". Used by UNIX, Linux, Mac OS X, and others.
- static final posix = new Style._('posix', '/', '/', r'[^/]$', '/');
+ static final posix = new _PosixStyle();
/// Windows paths use "\" (backslash) as separators. Absolute paths start with
/// a drive letter followed by a colon (example, "C:") or two backslashes
/// ("\\") for UNC paths.
// TODO(rnystrom): The UNC root prefix should include the drive name too, not
// just the "\\".
- static final windows = new Style._('windows', '\\', r'[/\\]', r'[^/\\]$',
- r'\\\\|[a-zA-Z]:[/\\]');
+ static final windows = new _WindowsStyle();
/// URLs aren't filesystem paths, but they're supported by Pathos to make it
/// easier to manipulate URL paths in the browser.
@@ -730,9 +810,7 @@ class Style {
/// URLs use "/" (forward slash) as separators. Absolute paths either start
/// with a protocol and optional hostname (e.g. `http://dartlang.org`,
/// `file://`) or with "/".
- static final url = new Style._('url', '/', '/',
- r"(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$",
- r"[a-zA-Z][-+.a-zA-Z\d]*://[^/]*", r"/");
+ static final url = new _UrlStyle();
Style._(this.name, this.separator, String separatorPattern,
String needsSeparatorPattern, String rootPattern,
@@ -795,9 +873,78 @@ class Style {
return match[0];
}
+ /// Returns the path represented by [uri] in this style.
+ String pathFromUri(Uri uri);
+
+ /// Returns the URI that represents [path].
+ ///
+ /// [path] is guaranteed to be absolute. Relative paths are handled
Bob Nystrom 2013/06/13 00:21:18 "guaranteed" is confusing here. Is it required to
nweiz 2013/06/19 00:50:27 This documentation is intended for implementors of
Bob Nystrom 2013/06/19 18:02:18 Ah, that makes sense. It isn't strictly true that
+ /// automatically by [Builder].
+ Uri pathToUri(String path);
+
String toString() => name;
}
+/// The style for POSIX paths.
+class _PosixStyle extends Style {
+ _PosixStyle()
+ : super._('posix', '/', '/', r'[^/]$', '/');
Bob Nystrom 2013/06/13 00:21:18 Since you are subclassing the styles now, let's ma
nweiz 2013/06/19 00:50:27 Done.
+
+ String pathFromUri(Uri uri) {
+ if (uri.scheme == '' || uri.scheme == 'file') return uri.path;
Bob Nystrom 2013/06/13 00:21:18 What about URL decoding?
nweiz 2013/06/19 00:50:27 Done.
+ throw new ArgumentError("Uri $uri must have scheme 'file:'.");
+ }
+
+ Uri pathToUri(String path) => Uri.parse('file://$path');
Bob Nystrom 2013/06/13 00:21:18 new Uri(scheme: "file", path: path);
Søren Gjesse 2013/06/13 07:13:32 The path should also be encoded new Uri(scheme: "
nweiz 2013/06/19 00:50:27 Done.
+}
+
+/// The style for Windows paths.
+class _WindowsStyle extends Style {
+ _WindowsStyle()
+ : super._('windows', '\\', r'[/\\]', r'[^/\\]$', r'\\\\|[a-zA-Z]:[/\\]');
+
+ String pathFromUri(Uri uri) {
+ if (uri.scheme != '' && uri.scheme != 'file') {
+ throw new ArgumentError("Uri $uri must have scheme 'file:'.");
+ }
+
+ if (uri.host == '') {
+ if (uri.path.startsWith('/')) {
+ // Drive-letter paths look like "file:///C:/path/to/file". The
+ // replaceFirst removes the extra initial slash.
+ return uri.path.replaceFirst("/", "").replaceAll("/", "\\");
+ } else {
+ return uri.path.replaceAll("/", "\\");
Bob Nystrom 2013/06/13 00:21:18 Doing this replaceAll for both arms seems redundan
nweiz 2013/06/19 00:50:27 Done.
+ }
+ } else {
+ // Network paths look like "file://hostname/path/to/file".
+ return "\\\\${uri.host}${uri.path.replaceAll("/", "\\")}";
+ }
+ }
+
+ Uri pathToUri(String path) {
+ if (path.startsWith('\\\\')) {
+ // Network paths become "file://hostname/path/to/file".
+ return Uri.parse('file:${path.replaceAll("\\", "/")}');
Bob Nystrom 2013/06/13 00:21:18 Use the regular Uri constructor here instead of ma
nweiz 2013/06/19 00:50:27 Done.
+ } else {
+ // Drive-letter paths become "file:///C:/path/to/file".
+ return Uri.parse('file:///${path.replaceAll("\\", "/")}');
+ }
+ }
+}
+
+/// The style for URL paths.
+class _UrlStyle extends Style {
+ _UrlStyle()
+ : super._('url', '/', '/',
+ r"(^[a-zA-Z][-+.a-zA-Z\d]*://|[^/])$",
+ r"[a-zA-Z][-+.a-zA-Z\d]*://[^/]*", r"/");
+
+ String pathFromUri(Uri uri) => uri.toString();
+
+ Uri pathToUri(String path) => Uri.parse(path);
+}
+
// TODO(rnystrom): Make this public?
class _ParsedPath {
/// The [Style] that was used to parse this path.

Powered by Google App Engine
This is Rietveld 408576698