リンクタグ作成マクロ

説明

このマクロは、アンカータグを作成する jsee マクロです。このマクロの実行には、SeraphyScriptTools をインストールする必要があります。

まず、マクロを実行すると「相対パス?」という「はい・いいえ・キャンセル」で答えるダイアログが立ち上がります。

「はい」を選ぶとコモンダイアログが立ち上がり、選んだファイルへの相対パスを書き込みます。マクロを実行した時に文字列を選択していると、その文字がアンカー文字になります。何も選択してない場合は、そのファイルが HTML ファイルの場合、ファイルから正規表現で title タグを抜き出し、それをアンカー文字にします。この正規表現の部分は、ご自分の環境に合わせて下さい。このタイトルをアンカーにする機能がいらない場合などは、「//タイトル抜き出しここから」から「//タイトル抜き出しここまで」を削除し、63 行目を var linktag = "<a href=\"" + relpath + "\"></a>"; に変えて下さい。

デフォルトでは、選んだファイルが index.html の場合は、パスから index.html を削除し、スラッシュで終わるアドレスになります。

「いいえ」を選ぶと、単にアンカータグが書き込まれ、キャレットが URL を入れる部分に移動します。マクロを実行した時に文字列を選択していると、その文字がアンカー文字になります。

一応きちんと動いてますが、文法的におかしい所などがありましたら、指摘していただけるとありがたいです。

マクロ

// パスがindexで終わる場合に、パスをスラッシュで終わらせるかどうか
// スラッシュで終わらせるなら0、indexのままで良いなら1。
var slashend = 0;
// 上記が0の場合、indexファイルの名前を入れる
var indexname = "index.html";

// ======設定終わり======


var WshShell = new ActiveXObject( "WScript.Shell" );
var BtnCode = WshShell.Popup("相対パス?", 0, "", 3 + 32);

function GetRelativePath(path1,path2){//path1に対するpath2の相対パスを求める関数
  path1 = path1.split("\\");
  path2 = path2.split("\\");
  while ((1 < path1.length) && (1 < path2.length) && (path1[0]==path2[0])){
    path1 = path1.slice(1,path1.length);
    path2 = path2.slice(1,path2.length);
  }
  var pat = "";
  for (var i=0;i==path1.length-1;i++) pat += "./";//同じ階層なら./を付ける
  for (var i=0;i<path1.length-1;i++) pat += "../";//上の階層なら../を付ける
  return(pat + path2.join("/"));
}

switch(BtnCode) {
  case 6://はいが押された場合
    var Instance = new ActiveXObject( "SeraphyScriptTools.CommDialog");
    CurrentPath = document.FullName;

    //コモンダイアログ
    var path2 = Instance.OpenFileDialog (CurrentPath , "すべてのファイル|*.*");

    if(path2 != null){//キャンセルした時用にifで。
//タイトル抜き出しここから
      var re = /\.html/g;
      var idfind = path2.match(re);//IDがあるか検索
      if (idfind != null){
        var ForReading = 1;
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var f = fso.OpenTextFile(path2, ForReading);
        do{
          var r =  f.ReadLine();//選んだファイルから一行抜き出し
          var re = /<title>(.*?)<\/title>/g;//titleに挟まれてるのを↓
          var titlefind = r.match(re);//検索
          if (titlefind != null){
            var title = RegExp.$1;//あったらタイトル部分を抜き出す
          }
        }while (titlefind == null);//なかったらdoまで戻る
  //タイトル抜き出しここまで
      }

      var pathloot = document.Path;//開いてるファイルのディレクトリパス取得
      var path1 = pathloot + "\\";//ケツに\を足す

      var relpath = GetRelativePath(path1,path2);
      
      if (slashend == 0){
        var findindex = relpath.indexOf(indexname);//indexnameを探す
        if (findindex != -1){
          relpath = relpath.replace(indexname, "");//indexnameを消す
        }
      }
      
      bEmpty = document.selection.IsEmpty;
      if(bEmpty != 0){
        if (idfind != null){
          var linktag = "<a href=\"" + relpath + "\">" + title + "</a>";
          document.write(linktag);
        }else{
          var linktag = "<a href=\"" + relpath + "\"></a>";
          document.write(linktag);
          document.selection.CharLeft(false,4);
        }
      }else{
        var str = document.selection.Text;
        var linktag = "<a href=\"" + relpath + "\">" + str + "</a>";
        document.write(linktag);
      }
    }
    break;
  case 7://いいえが押された場合
    bEmpty = document.selection.IsEmpty;
    if(bEmpty == 0){
      var str = document.selection.Text;
      var url = prompt("URL","");
      var p = "<a href=\"" + url + "\">" + str + "</a>";
      var strlength = str.length;
      var leftmove = strlength + 6;
      document.write(p);
      document.selection.CharLeft(false,leftmove);
    }else{
      var url = prompt("URL","");
      document.write("<a href=\"" + url + "\"></a>");
      document.selection.CharLeft(false,4);
    }
    break;
  case 2://キャンセルが押された場合
    break;
}