このマクロは、アンカータグを作成する 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;
}