123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- /**
- * Module dependencies.
- */
- var sep = require('path').sep || '/';
- /**
- * Module exports.
- */
- module.exports = fileUriToPath;
- /**
- * File URI to Path function.
- *
- * @param {String} uri
- * @return {String} path
- * @api public
- */
- function fileUriToPath (uri) {
- if ('string' != typeof uri ||
- uri.length <= 7 ||
- 'file://' != uri.substring(0, 7)) {
- throw new TypeError('must pass in a file:// URI to convert to a file path');
- }
- var rest = decodeURI(uri.substring(7));
- var firstSlash = rest.indexOf('/');
- var host = rest.substring(0, firstSlash);
- var path = rest.substring(firstSlash + 1);
- // 2. Scheme Definition
- // As a special case, <host> can be the string "localhost" or the empty
- // string; this is interpreted as "the machine from which the URL is
- // being interpreted".
- if ('localhost' == host) host = '';
- if (host) {
- host = sep + sep + host;
- }
- // 3.2 Drives, drive letters, mount points, file system root
- // Drive letters are mapped into the top of a file URI in various ways,
- // depending on the implementation; some applications substitute
- // vertical bar ("|") for the colon after the drive letter, yielding
- // "file:///c|/tmp/test.txt". In some cases, the colon is left
- // unchanged, as in "file:///c:/tmp/test.txt". In other cases, the
- // colon is simply omitted, as in "file:///c/tmp/test.txt".
- path = path.replace(/^(.+)\|/, '$1:');
- // for Windows, we need to invert the path separators from what a URI uses
- if (sep == '\\') {
- path = path.replace(/\//g, '\\');
- }
- if (/^.+\:/.test(path)) {
- // has Windows drive at beginning of path
- } else {
- // unix path…
- path = sep + path;
- }
- return host + path;
- }
|