「フォルダツリーをポップアップ表示」の版間の差分
ソースコードの整形 |
変数にvarの宣言を追加 |
||
| (同じ利用者による、間の2版が非表示) | |||
| 42行目: | 42行目: | ||
== ソースコード == | == ソースコード == | ||
<syntaxhighlight lang="javascript"> | <syntaxhighlight lang="javascript" copy> | ||
// 同じフォルダにあるファイルを開く.js r2 | // 同じフォルダにあるファイルを開く.js r2 | ||
// もしくは 簡易フォルダツリー | // もしくは 簡易フォルダツリー | ||
CONFIG = {} | var CONFIG = {}; | ||
/** 設定 **/ | /** 設定 **/ | ||
// 一覧に含めるフォルダ名の正規表現 | // 一覧に含めるフォルダ名の正規表現 | ||
CONFIG.folder_pattern = /^[^\.]/ | CONFIG.folder_pattern = /^[^\.]/; | ||
// 一覧に含めるファイル名の正規表現 | // 一覧に含めるファイル名の正規表現 | ||
CONFIG.file_pattern = /^[^\.]/ | CONFIG.file_pattern = /^[^\.]/; | ||
// 別例: 現在のファイルと同じ拡張子だけ表示 | // 別例: 現在のファイルと同じ拡張子だけ表示 | ||
// CONFIG.file_pattern = document.Name.indexOf('.') == -1 ? /./ : RegExp(document.Name.substr(document.Name.indexOf('.')), "i") | // CONFIG.file_pattern = document.Name.indexOf('.') == -1 ? /./ : RegExp(document.Name.substr(document.Name.indexOf('.')), "i"); | ||
// 一覧から除外するファイル名の正規表現 | // 一覧から除外するファイル名の正規表現 | ||
CONFIG.file_ignore_pattern = /\.(?:png|jpg|gif|db|exe|dll|obj|tmp)$/i | CONFIG.file_ignore_pattern = /\.(?:png|jpg|gif|db|exe|dll|obj|tmp)$/i; | ||
// 大文字小文字を無視するならtrue、そうでなければfalse | // 大文字小文字を無視するならtrue、そうでなければfalse | ||
CONFIG.ignore_case = true | CONFIG.ignore_case = true; | ||
// 拡張子ごとにまとめるならtrue、そうでなければfalse | // 拡張子ごとにまとめるならtrue、そうでなければfalse | ||
CONFIG.sort_by_extension = true | CONFIG.sort_by_extension = true; | ||
// 時間でソートするならtrue、そうでなければfalse | // 時間でソートするならtrue、そうでなければfalse | ||
CONFIG.sort_by_modified_time = false | CONFIG.sort_by_modified_time = false; | ||
/** 以下本体 **/ | /** 以下本体 **/ | ||
var FS = new ActiveXObject("Scripting.FileSystemObject") | var FS = new ActiveXObject("Scripting.FileSystemObject"); | ||
function main() { | function main() { | ||
var dir = document.Path | var dir = document.Path; | ||
var choosed = choose(ls(dir)) | var choosed = choose(ls(dir)); | ||
while (choosed && /\/$/.test(choosed)) { | while (choosed && /\/$/.test(choosed)) { | ||
dir = FS.BuildPath(dir, choosed) | dir = FS.BuildPath(dir, choosed); | ||
choosed = choose(ls(dir)) | choosed = choose(ls(dir)); | ||
} | } | ||
if (choosed) { | if (choosed) { | ||
var path = FS.BuildPath(dir, choosed).replace(/\//g, '\\') | var path = FS.BuildPath(dir, choosed).replace(/\//g, '\\'); | ||
editor.OpenFile(path, 0, meOpenAllowNewWindow) | editor.OpenFile(path, 0, meOpenAllowNewWindow); | ||
} | } | ||
} | } | ||
function ls(path) { | function ls(path) { | ||
var folder = FS.GetFolder(path) | var folder = FS.GetFolder(path); | ||
var folders = [] | var folders = []; | ||
each_item(folder.SubFolders, function(e) { | each_item(folder.SubFolders, function(e) { | ||
if (CONFIG.folder_pattern.test(e.Name)) { | if (CONFIG.folder_pattern.test(e.Name)) { | ||
folders.push(e.Name + "/") | folders.push(e.Name + "/"); | ||
} | } | ||
}) | }); | ||
folders.sort() | folders.sort(); | ||
folders.unshift('../') | folders.unshift('../'); | ||
var files = [] | var files = []; | ||
each_item(folder.Files, function(e) { | each_item(folder.Files, function(e) { | ||
if (CONFIG.file_pattern.test(e.Name) && !CONFIG.file_ignore_pattern.test(e.Name)) { | if (CONFIG.file_pattern.test(e.Name) && !CONFIG.file_ignore_pattern.test(e.Name)) { | ||
files.push(e.Name) | files.push(e.Name); | ||
} | } | ||
}) | }); | ||
if (CONFIG.sort_by_time) { | if (CONFIG.sort_by_time) { | ||
files.sort(function(a, b) { | files.sort(function(a, b) { | ||
a = FS.GetFile(a).DateLastModified | a = FS.GetFile(a).DateLastModified; | ||
b = FS.GetFile(b).DateLastModified | b = FS.GetFile(b).DateLastModified; | ||
return a < b ? 1 : a > b ? -1 : 0 | return a < b ? 1 : a > b ? -1 : 0; | ||
}) | }); | ||
} else if (CONFIG.ignore_case) { | } else if (CONFIG.ignore_case) { | ||
files.sort(function(a, b) { | files.sort(function(a, b) { | ||
a = a.toLocaleLowerCase() | a = a.toLocaleLowerCase(); | ||
b = b.toLocaleLowerCase() | b = b.toLocaleLowerCase(); | ||
return !a ? -1 : !b ? 1 : a < b ? -1 : a > b ? 1 : 0 | return !a ? -1 : !b ? 1 : a < b ? -1 : a > b ? 1 : 0; | ||
}) | }); | ||
} else { | } else { | ||
files.sort() | files.sort(); | ||
} | } | ||
| 129行目: | 129行目: | ||
// JScriptは安定ソートなのでこれでも大丈夫なはず | // JScriptは安定ソートなのでこれでも大丈夫なはず | ||
files.sort(function(a, b) { | files.sort(function(a, b) { | ||
var sa = get_extension(a) | var sa = get_extension(a); | ||
var sb = get_extension(b) | var sb = get_extension(b); | ||
return !sa ? 1 : !sb ? -1 : sa < sb ? -1 : sa > sb ? 1 : 0 | return !sa ? 1 : !sb ? -1 : sa < sb ? -1 : sa > sb ? 1 : 0; | ||
}) | }); | ||
} | } | ||
return folders.concat(files) | return folders.concat(files); | ||
} | } | ||
function get_extension(str) { | function get_extension(str) { | ||
var i = str.lastIndexOf('.') | var i = str.lastIndexOf('.'); | ||
return i >= 0 && str.substr(i + 1) | return i >= 0 && str.substr(i + 1); | ||
} | } | ||
function each_item(collection, callback) { | function each_item(collection, callback) { | ||
var result | var result; | ||
for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) { | for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) { | ||
result = callback(e.item()) | result = callback(e.item()); | ||
if (result) { | if (result) { | ||
return result | return result; | ||
} | } | ||
} | } | ||
| 155行目: | 155行目: | ||
function choose(words) { | function choose(words) { | ||
var menu = makeMenu() | var menu = makeMenu(); | ||
var i = menu.Track(0) | var i = menu.Track(0); | ||
return i && words[i - 1] | return i && words[i - 1]; | ||
function makeMenu() { | function makeMenu() { | ||
var menu = window.CreatePopupMenu() | var menu = window.CreatePopupMenu(); | ||
if (!words || words.length == 0) { | if (!words || words.length == 0) { | ||
return menu | return menu; | ||
} | } | ||
var n = -1 | var n = -1; | ||
function addHotkey(word) { | function addHotkey(word) { | ||
if (n > 34) { | if (n > 34) { | ||
return word | return word; | ||
} | } | ||
n++ | n++; | ||
return "&" + n.toString(36) + ". " + word | return "&" + n.toString(36) + ". " + word; | ||
} | } | ||
for (var i = 0; i < words.length; i++) { | for (var i = 0; i < words.length; i++) { | ||
menu.Add(addHotkey(words[i]), i + 1) | menu.Add(addHotkey(words[i]), i + 1); | ||
} | } | ||
return menu | return menu; | ||
} | } | ||
} | } | ||
main() | main(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
スポンサーリンク