拡張子の違うファイルを開く

提供: MeryWiki
移動先: 案内検索

同じフォルダにある拡張子以前が共通のファイルを順ぐりに開きます。たとえば現在Cファイルを開いていれば同じフォルダにあるHファイルを、Hファイルを開いていればCファイルを開きます。

更新履歴[編集]

  • r1: 失念
  • r2 (2014-08-07): 拡張子を限定せず何でも開くように
// 拡張子の違うファイルを開く.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()