| Index: utils/uri/uri.dart
 | 
| ===================================================================
 | 
| --- utils/uri/uri.dart	(revision 3949)
 | 
| +++ utils/uri/uri.dart	(working copy)
 | 
| @@ -1,215 +0,0 @@
 | 
| -// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 | 
| -// for details. All rights reserved. Use of this source code is governed by a
 | 
| -// BSD-style license that can be found in the LICENSE file.
 | 
| -
 | 
| -#library('uri');
 | 
| -
 | 
| -/**
 | 
| - * A parsed URI, inspired by:
 | 
| - * http://closure-library.googlecode.com/svn/docs/class_goog_Uri.html
 | 
| - */
 | 
| -class Uri {
 | 
| -  final String scheme;
 | 
| -  final String userInfo;
 | 
| -  final String domain;
 | 
| -  final int port;
 | 
| -  final String path;
 | 
| -  final String query;
 | 
| -  final String fragment;
 | 
| -
 | 
| -  Uri.fromString(String uri) : this._fromMatch(_splitRe.firstMatch(uri));
 | 
| -
 | 
| -  Uri._fromMatch(Match m) : this(_emptyIfNull(m[_COMPONENT_SCHEME]),
 | 
| -                                 _emptyIfNull(m[_COMPONENT_USER_INFO]),
 | 
| -                                 _emptyIfNull(m[_COMPONENT_DOMAIN]),
 | 
| -                                 _parseIntOrZero(m[_COMPONENT_PORT]),
 | 
| -                                 _emptyIfNull(m[_COMPONENT_PATH]),
 | 
| -                                 _emptyIfNull(m[_COMPONENT_QUERY_DATA]),
 | 
| -                                 _emptyIfNull(m[_COMPONENT_FRAGMENT]));
 | 
| -
 | 
| -  const Uri([String this.scheme = "", String this.userInfo ="",
 | 
| -             String this.domain = "", int this.port = 0,
 | 
| -             String this.path = "", String this.query = "",
 | 
| -             String this.fragment = ""]);
 | 
| -
 | 
| -  static String _emptyIfNull(String val) => val != null ? val : '';
 | 
| -
 | 
| -  static int _parseIntOrZero(String val) {
 | 
| -    if (val !== null && val != '') {
 | 
| -      return Math.parseInt(val);
 | 
| -    } else {
 | 
| -      return 0;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  // NOTE: This code was ported from: closure-library/closure/goog/uri/utils.js
 | 
| -  static final RegExp _splitRe = const RegExp(
 | 
| -      '^' +
 | 
| -      '(?:' +
 | 
| -        '([^:/?#.]+)' +                 // scheme - ignore special characters
 | 
| -                                        // used by other URL parts such as :,
 | 
| -                                        // ?, /, #, and .
 | 
| -      ':)?' +
 | 
| -      '(?://' +
 | 
| -        '(?:([^/?#]*)@)?' +             // userInfo
 | 
| -        '([\\w\\d\\-\\u0100-\\uffff.%]*)' +
 | 
| -                                        // domain - restrict to letters,
 | 
| -                                        // digits, dashes, dots, percent
 | 
| -                                        // escapes, and unicode characters.
 | 
| -        '(?::([0-9]+))?' +              // port
 | 
| -      ')?' +
 | 
| -      '([^?#]+)?' +                     // path
 | 
| -      '(?:\\?([^#]*))?' +               // query
 | 
| -      '(?:#(.*))?' +                    // fragment
 | 
| -      '\$');
 | 
| -
 | 
| -  static final _COMPONENT_SCHEME = 1;
 | 
| -  static final _COMPONENT_USER_INFO = 2;
 | 
| -  static final _COMPONENT_DOMAIN = 3;
 | 
| -  static final _COMPONENT_PORT = 4;
 | 
| -  static final _COMPONENT_PATH = 5;
 | 
| -  static final _COMPONENT_QUERY_DATA = 6;
 | 
| -  static final _COMPONENT_FRAGMENT = 7;
 | 
| -
 | 
| -  /**
 | 
| -   * Determines whether a URI is absolute.
 | 
| -   *
 | 
| -   * See: http://tools.ietf.org/html/rfc3986#section-4.3
 | 
| -   */
 | 
| -  bool isAbsolute() {
 | 
| -    if ("" == scheme) return false;
 | 
| -    if ("" != fragment) return false;
 | 
| -    return true;
 | 
| -
 | 
| -    /* absolute-URI  = scheme ":" hier-part [ "?" query ]
 | 
| -     * hier-part   = "//" authority path-abempty
 | 
| -     *             / path-absolute
 | 
| -     *             / path-rootless
 | 
| -     *             / path-empty
 | 
| -     *
 | 
| -     * path          = path-abempty    ; begins with "/" or is empty
 | 
| -     *               / path-absolute   ; begins with "/" but not "//"
 | 
| -     *               / path-noscheme   ; begins with a non-colon segment
 | 
| -     *               / path-rootless   ; begins with a segment
 | 
| -     *               / path-empty      ; zero characters
 | 
| -     *
 | 
| -     * path-abempty  = *( "/" segment )
 | 
| -     * path-absolute = "/" [ segment-nz *( "/" segment ) ]
 | 
| -     * path-noscheme = segment-nz-nc *( "/" segment )
 | 
| -     * path-rootless = segment-nz *( "/" segment )
 | 
| -     * path-empty    = 0<pchar>
 | 
| -     * segment       = *pchar
 | 
| -     * segment-nz    = 1*pchar
 | 
| -     * segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
 | 
| -     *               ; non-zero-length segment without any colon ":"
 | 
| -     *
 | 
| -     * pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
 | 
| -     */
 | 
| -  }
 | 
| -
 | 
| -  Uri resolve(String uri) {
 | 
| -    return resolveUri(new Uri.fromString(uri));
 | 
| -  }
 | 
| -
 | 
| -  Uri resolveUri(Uri reference) {
 | 
| -    // From RFC 3986.
 | 
| -    String targetScheme;
 | 
| -    String targetUserInfo;
 | 
| -    String targetDomain;
 | 
| -    int targetPort;
 | 
| -    String targetPath;
 | 
| -    String targetQuery;
 | 
| -    if (reference.scheme != "") {
 | 
| -      targetScheme = reference.scheme;
 | 
| -      targetUserInfo = reference.userInfo;
 | 
| -      targetDomain = reference.domain;
 | 
| -      targetPort = reference.port;
 | 
| -      targetPath = removeDotSegments(reference.path);
 | 
| -      targetQuery = reference.query;
 | 
| -    } else {
 | 
| -      if (reference.hasAuthority()) {
 | 
| -        targetUserInfo = reference.userInfo;
 | 
| -        targetDomain = reference.domain;
 | 
| -        targetPort = reference.port;
 | 
| -        targetPath = removeDotSegments(reference.path);
 | 
| -        targetQuery = reference.query;
 | 
| -      } else {
 | 
| -        if (reference.path == "") {
 | 
| -          targetPath = this.path;
 | 
| -          if (reference.query != "") {
 | 
| -            targetQuery = reference.query;
 | 
| -          } else {
 | 
| -            targetQuery = this.query;
 | 
| -          }
 | 
| -        } else {
 | 
| -          if (reference.path.startsWith("/")) {
 | 
| -            targetPath = removeDotSegments(reference.path);
 | 
| -          } else {
 | 
| -            targetPath = removeDotSegments(merge(this.path, reference.path));
 | 
| -          }
 | 
| -          targetQuery = reference.query;
 | 
| -        }
 | 
| -        targetUserInfo = this.userInfo;
 | 
| -        targetDomain = this.domain;
 | 
| -        targetPort = this.port;
 | 
| -      }
 | 
| -      targetScheme = this.scheme;
 | 
| -    }
 | 
| -    return new Uri(targetScheme, targetUserInfo, targetDomain, targetPort,
 | 
| -                   targetPath, targetQuery, reference.fragment);
 | 
| -  }
 | 
| -
 | 
| -  bool hasAuthority() {
 | 
| -    return (userInfo != "") || (domain != "") || (port != 0);
 | 
| -  }
 | 
| -
 | 
| -  String toString() {
 | 
| -    StringBuffer sb = new StringBuffer();
 | 
| -    _addIfNonEmpty(sb, scheme, scheme, ':');
 | 
| -    if (hasAuthority() || (scheme == "file")) {
 | 
| -      sb.add("//");
 | 
| -      _addIfNonEmpty(sb, userInfo, userInfo, "@");
 | 
| -      sb.add(domain === null ? "null" : domain);
 | 
| -      if (port != 0) {
 | 
| -        sb.add(":");
 | 
| -        sb.add(port.toString());
 | 
| -      }
 | 
| -    }
 | 
| -    sb.add(path === null ? "null" : path);
 | 
| -    _addIfNonEmpty(sb, query, "?", query);
 | 
| -    _addIfNonEmpty(sb, fragment, "#", fragment);
 | 
| -    return sb.toString();
 | 
| -  }
 | 
| -
 | 
| -  static void _addIfNonEmpty(StringBuffer sb, String test,
 | 
| -                             String first, String second) {
 | 
| -    if ("" != test) {
 | 
| -      sb.add(first === null ? "null" : first);
 | 
| -      sb.add(second === null ? "null" : second);
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -String merge(String base, String reference) {
 | 
| -  if (base == "") return "/$reference";
 | 
| -  return base.substring(0, base.lastIndexOf("/") + 1) + "$reference";
 | 
| -}
 | 
| -
 | 
| -String removeDotSegments(String path) {
 | 
| -  List<String> output = [];
 | 
| -  bool appendSlash = false;
 | 
| -  for (String segment in path.split("/")) {
 | 
| -    appendSlash = false;
 | 
| -    if (segment == "..") {
 | 
| -      if (!output.isEmpty() &&
 | 
| -          ((output.length != 1) || (output[0] != ""))) output.removeLast();
 | 
| -      appendSlash = true;
 | 
| -    } else if ("." == segment) {
 | 
| -      appendSlash = true;
 | 
| -    } else {
 | 
| -      output.add(segment);
 | 
| -    }
 | 
| -  }
 | 
| -  if (appendSlash) output.add("");
 | 
| -  return Strings.join(output, "/");
 | 
| -}
 | 
| 
 |