「拡張子の違うファイルを開く」の版間の差分
ナビゲーションに移動
検索に移動
ソースコードの整形 |
SyntaxHighlightにcopyの追加 |
||
| (同じ利用者による、間の1版が非表示) | |||
| 8行目: | 8行目: | ||
== ソースコード == | == ソースコード == | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript" copy> | ||
// 拡張子の違うファイルを開く.js r2 (2014-08-07) | // 拡張子の違うファイルを開く.js r2 (2014-08-07) | ||
// 同じフォルダにある拡張子以前が共通のファイルを順に開きます | // 同じフォルダにある拡張子以前が共通のファイルを順に開きます | ||
var FS = new ActiveXObject("Scripting.FileSystemObject") | var FS = new ActiveXObject("Scripting.FileSystemObject"); | ||
function main() { | function main() { | ||
var path = document.Path | var path = document.Path; | ||
var name = document.Name | var name = document.Name; | ||
var next = calc_next_file(path, name) | var next = calc_next_file(path, name); | ||
if (next) { | if (next) { | ||
editor.OpenFile(next, 0, meOpenAllowNewWindow) | editor.OpenFile(next, 0, meOpenAllowNewWindow); | ||
} | } | ||
} | } | ||
function calc_next_file(path, name) { | function calc_next_file(path, name) { | ||
name = name.toLocaleLowerCase() | name = name.toLocaleLowerCase(); | ||
var name_dot_ext = split_at_dot(name) | var name_dot_ext = split_at_dot(name); | ||
if (!name_dot_ext) { | if (!name_dot_ext) { | ||
return | return; | ||
} | } | ||
var name_dot = name_dot_ext[0] | var name_dot = name_dot_ext[0]; | ||
var ext = name_dot_ext[1] | var ext = name_dot_ext[1]; | ||
var files = [] | var files = []; | ||
each_file(path, function(filename) { | each_file(path, function(filename) { | ||
var lower = filename.toLocaleLowerCase() | var lower = filename.toLocaleLowerCase(); | ||
if (lower.length >= name_dot.length && lower.substr(0, name_dot.length) === name_dot) { | if (lower.length >= name_dot.length && lower.substr(0, name_dot.length) === name_dot) { | ||
files.push(lower) | files.push(lower); | ||
} | } | ||
}) | }); | ||
if (files.length < 2) { | if (files.length < 2) { | ||
return | return; | ||
} | } | ||
files.sort() | files.sort(); | ||
var curr = index_of(name, files) | var curr = index_of(name, files); | ||
if (curr < 0) { | if (curr < 0) { | ||
return files[0] | return files[0]; | ||
} | } | ||
return path + files[(curr + 1) % files.length] | return path + files[(curr + 1) % files.length]; | ||
} | } | ||
function split_at_dot(str) { | function split_at_dot(str) { | ||
var i = str.lastIndexOf('.') | var i = str.lastIndexOf('.'); | ||
return i >= 0 && [str.substr(0, i + 1), str.substr(i + 1)] | return i >= 0 && [str.substr(0, i + 1), str.substr(i + 1)]; | ||
} | } | ||
| 66行目: | 66行目: | ||
for (var i = 0; i < array.length; i++) { | for (var i = 0; i < array.length; i++) { | ||
if (array[i] === x) { | if (array[i] === x) { | ||
return i | return i; | ||
} | } | ||
} | } | ||
return -1 | return -1; | ||
} | } | ||
function each_file(path, callback) { | function each_file(path, callback) { | ||
return enumerate(FS.GetFolder(path).Files, function(e) { | return enumerate(FS.GetFolder(path).Files, function(e) { | ||
return callback(e.Name) | return callback(e.Name); | ||
}) | }); | ||
} | } | ||
function enumerate(collection, callback) { | function enumerate(collection, callback) { | ||
for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) { | for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) { | ||
var result = callback(e.item()) | var result = callback(e.item()); | ||
if (result) { | if (result) { | ||
return result | return result; | ||
} | } | ||
} | } | ||
} | } | ||
main() | main(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2025年6月30日 (月) 00:19時点における最新版
同じフォルダにある拡張子以前が共通のファイルを順ぐりに開きます。たとえば現在Cファイルを開いていれば同じフォルダにあるHファイルを、Hファイルを開いていればCファイルを開きます。
変更履歴[編集]
- r2 (2014-08-07)
- 拡張子を限定せず何でも開くように
- r1 (2012-06-22)
- 失念
ソースコード[編集]
// 拡張子の違うファイルを開く.js r2 (2014-08-07)
// 同じフォルダにある拡張子以前が共通のファイルを順に開きます
var FS = new ActiveXObject("Scripting.FileSystemObject");
function main() {
var path = document.Path;
var name = document.Name;
var next = calc_next_file(path, name);
if (next) {
editor.OpenFile(next, 0, meOpenAllowNewWindow);
}
}
function calc_next_file(path, name) {
name = name.toLocaleLowerCase();
var name_dot_ext = split_at_dot(name);
if (!name_dot_ext) {
return;
}
var name_dot = name_dot_ext[0];
var ext = name_dot_ext[1];
var files = [];
each_file(path, function(filename) {
var lower = filename.toLocaleLowerCase();
if (lower.length >= name_dot.length && lower.substr(0, name_dot.length) === name_dot) {
files.push(lower);
}
});
if (files.length < 2) {
return;
}
files.sort();
var curr = index_of(name, files);
if (curr < 0) {
return files[0];
}
return path + files[(curr + 1) % files.length];
}
function split_at_dot(str) {
var i = str.lastIndexOf('.');
return i >= 0 && [str.substr(0, i + 1), str.substr(i + 1)];
}
function index_of(x, array) {
for (var i = 0; i < array.length; i++) {
if (array[i] === x) {
return i;
}
}
return -1;
}
function each_file(path, callback) {
return enumerate(FS.GetFolder(path).Files, function(e) {
return callback(e.Name);
});
}
function enumerate(collection, callback) {
for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) {
var result = callback(e.item());
if (result) {
return result;
}
}
}
main();
スポンサーリンク