「フォルダツリーをポップアップ表示」の版間の差分

MSY-07 (トーク | 投稿記録)
空白の追加
MSY-07 (トーク | 投稿記録)
変数にvarの宣言を追加
 
(同じ利用者による、間の5版が非表示)
36行目: 36行目:


== 変更履歴 ==
== 変更履歴 ==
* r2 (2013-09-21): ディレクトリをまたぐと開けなかったバグ修正
* r2 (2013-09-21)
* r1 (2013-09-10): 初版
** ディレクトリをまたぐと開けなかったバグの修正
* r1 (2013-09-10)
** 初版


== ソースコード ==
== ソースコード ==
<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('.') == -? /./ : 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);
  {
choosed = choose(ls(dir));
    dir = FS.BuildPath(dir, choosed)
}
    choosed = choose(ls(dir))
 
  }
if (choosed) {
 
var path = FS.BuildPath(dir, choosed).replace(/\//g, '\\');
  if (choosed)
editor.OpenFile(path, 0, meOpenAllowNewWindow);
  {
}
    var path = FS.BuildPath(dir, choosed).replace(/\//g, '\\')
    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)) {
  {
folders.push(e.Name + "/");
    if (CONFIG.folder_pattern.test(e.Name))
}
    {
});
      folders.push(e.Name + "/")
folders.sort();
    }
 
  })
folders.unshift('../');
  folders.sort()
 
 
var files = [];
  folders.unshift('../')
each_item(folder.Files, function(e) {
 
if (CONFIG.file_pattern.test(e.Name) && !CONFIG.file_ignore_pattern.test(e.Name)) {
  var files = []
files.push(e.Name);
  each_item(folder.Files, function(e)
}
  {
});
    if (CONFIG.file_pattern.test(e.Name) && !CONFIG.file_ignore_pattern.test(e.Name))
 
    {
if (CONFIG.sort_by_time) {
      files.push(e.Name)
files.sort(function(a, b) {
    }
a = FS.GetFile(a).DateLastModified;
  })
b = FS.GetFile(b).DateLastModified;
 
return a < b ? 1 : a > b ? -1 : 0;
  if (CONFIG.sort_by_time)
});
  {
} else if (CONFIG.ignore_case) {
    files.sort(function(a, b)
files.sort(function(a, b) {
    {
a = a.toLocaleLowerCase();
      a = FS.GetFile(a).DateLastModified
b = b.toLocaleLowerCase();
      b = FS.GetFile(b).DateLastModified
return !a ? -1 : !b ? 1 : a < b ? -1 : a > b ? 1 : 0;
      return a < b ? 1 : a > b ? -1 : 0
});
    })
} else {
  }
files.sort();
  else if (CONFIG.ignore_case)
}
  {
 
    files.sort(function(a, b)
if (CONFIG.sort_by_extension) {
    {
// JScriptは安定ソートなのでこれでも大丈夫なはず
      a = a.toLocaleLowerCase()
files.sort(function(a, b) {
      b = b.toLocaleLowerCase()
var sa = get_extension(a);
      return !a ? -1 : !b ? 1 : a < b ? -1 : a > b ? 1 : 0
var sb = get_extension(b);
    })
return !sa ? 1 : !sb ? -1 : sa < sb ? -1 : sa > sb ? 1 : 0;
  }
});
  else
}
  {
 
    files.sort()
return folders.concat(files);
  }
 
  if (CONFIG.sort_by_extension)
  {
    // JScriptは安定ソートなのでこれでも大丈夫なはず
    files.sort(function(a, b)
    {
      var sa = get_extension(a)
      var sb = get_extension(b)
      return !sa ? 1 : !sb ? -1 : sa < sb ? -1 : sa > sb ? 1 : 0
    })
  }
 
  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());
  {
if (result) {
    result = callback(e.item())
return result;
    if (result)
}
    {
}
      return result
    }
  }
}
}


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) {
   
return menu;
    if (!words || words.length == 0) { return menu }
}
   
 
    var n = -1
var n = -1;
    function addHotkey(word)
 
    {
function addHotkey(word) {
      if (n > 34) { return word }
if (n > 34) {
      n++
return word;
      return "&" + n.toString(36) + ". " + word
}
    }
n++;
return "&" + n.toString(36) + ". " + word;
    for (var i = 0; i < words.length; i++)
}
    {
 
      menu.Add(addHotkey(words[i]), i + 1)
for (var i = 0; i < words.length; i++) {
    }
menu.Add(addHotkey(words[i]), i + 1);
   
}
    return menu
 
  }
return menu;
}
}
}


main()
main();
</syntaxhighlight>
</syntaxhighlight>
スポンサーリンク