Browse Source

Change the behavior of path.extname

Make path.extname return an empty string also if:
- The last dot is not in the last path component
- The last dot starts the last path component
v0.7.4-release
Aapo Laitinen 15 years ago
committed by Ryan Dahl
parent
commit
c4876d01a1
  1. 5
      doc/api.markdown
  2. 8
      lib/path.js
  3. 21
      test/simple/test-path.js

5
doc/api.markdown

@ -2611,8 +2611,9 @@ Return the last portion of a path. Similar to the Unix `basename` command. Exa
### path.extname(p) ### path.extname(p)
Return the extension of the path. Everything after the last '.', if there Return the extension of the path. Everything after the last '.' in the last portion
is no '.' then it returns an empty string. Examples: of the path. If there is no '.' in the last portion of the path or the only '.' is
the first character, then it returns an empty string. Examples:
path.extname('index.html') path.extname('index.html')
// returns // returns

8
lib/path.js

@ -66,8 +66,12 @@ exports.basename = function (path, ext) {
}; };
exports.extname = function (path) { exports.extname = function (path) {
var index = path.lastIndexOf('.'); var dot = path.lastIndexOf('.'),
return index < 0 ? '' : path.substring(index); slash = path.lastIndexOf('/');
// The last dot must be in the last path component, and it (the last dot) must
// not start the last path component (i.e. be a dot that signifies a hidden
// file in UNIX).
return dot <= slash + 1 ? '' : path.substring(dot);
}; };
exports.exists = function (path, callback) { exports.exists = function (path, callback) {

21
test/simple/test-path.js

@ -12,6 +12,27 @@ assert.equal(path.dirname("/a"), "/");
assert.equal(path.dirname("/"), "/"); assert.equal(path.dirname("/"), "/");
path.exists(f, function (y) { assert.equal(y, true) }); path.exists(f, function (y) { assert.equal(y, true) });
assert.equal(path.extname(""), "");
assert.equal(path.extname("/path/to/file"), "");
assert.equal(path.extname("/path/to/file.ext"), ".ext");
assert.equal(path.extname("/path.to/file.ext"), ".ext");
assert.equal(path.extname("/path.to/file"), "");
assert.equal(path.extname("/path.to/.file"), "");
assert.equal(path.extname("/path.to/.file.ext"), ".ext");
assert.equal(path.extname("/path/to/f.ext"), ".ext");
assert.equal(path.extname("/path/to/..ext"), ".ext");
assert.equal(path.extname("file"), "");
assert.equal(path.extname("file.ext"), ".ext");
assert.equal(path.extname(".file"), "");
assert.equal(path.extname(".file.ext"), ".ext");
assert.equal(path.extname("/file"), "");
assert.equal(path.extname("/file.ext"), ".ext");
assert.equal(path.extname("/.file"), "");
assert.equal(path.extname("/.file.ext"), ".ext");
assert.equal(path.extname(".path/file.ext"), ".ext");
assert.equal(path.extname("file.ext.ext"), ".ext");
assert.equal(path.extname("file."), ".");
assert.equal(path.join(".", "fixtures/b", "..", "/b/c.js"), "fixtures/b/c.js"); assert.equal(path.join(".", "fixtures/b", "..", "/b/c.js"), "fixtures/b/c.js");
assert.equal(path.normalize("./fixtures///b/../b/c.js"), "fixtures/b/c.js"); assert.equal(path.normalize("./fixtures///b/../b/c.js"), "fixtures/b/c.js");

Loading…
Cancel
Save