WSHがなにやら面白げなのでEmEditorで編集したファイルをすかさずFTPでアップロードするスクリプトを組んでみた。かなり便利かも。
ちなみに、エディタは
wscript.exe "スクリプトのファイル名" "編集中のファイルパス"
という形式でコマンドを打つことが出来れば何でもかまいません。EmEditorならば「ツール->外部ツール->外部ツールの設定->新規制作」で外部ツールの設定画面を出して、「コマンド」に「wscript.exe」、引数に
"スクリプトのファイル名" $(Path)
と入力すればOK。タイトルは適当で良いです。Ctrl+Alt+sにでもバインドしておけば、Ctrl+sで保存した後すぐに押せて良い感じです。
FTP部分は外部コンポーネントを使ったのでBASP21 DLLをダウンロードしてきて適当にインストールしてください。
ではスクリプト部分を
// QuickFTP
/* Settings ============================================================ */
// "Local Folder" : ["FTP Server", "Account", "Password", "Remote Root Directory"]
var DirMap = {"D:\\SERVERS\\HTTP\\ishikawa" : ["s91.xrea.com", "arielworks", "******", "/public_html/ishikawa.arielworks.com"],
"D:\\SERVERS\\HTTP\\web" : ["s91.xrea.com", "arielworks", "******", "/public_html/www.arielworks.net"]};
/* ===================================================================== */
var CurrentPath = WScript.Arguments.Item(0);
// sort PathMap (transform into 2D(3D) array)
var DirMap = sortObjectByKeyLength(DirMap);
// select connection setting
var pos;
var ifExist = false;
for (pos in DirMap) {
var CurrentPathRE = new RegExp("^" + DirMap[pos]["Key"].replace(/\\/g, "\\\\") + "\\\\"); // escape \ (\ -> \\)
if (CurrentPathRE.test(CurrentPath)) {
var Server = DirMap[pos]["Value"][0];
var User = DirMap[pos]["Value"][1];
var Pass = DirMap[pos]["Value"][2];
var lRoot = DirMap[pos]["Key"];
var rRoot = DirMap[pos]["Value"][3];
ifExist = true;
break;
}
}
if (!ifExist) {
WScript.Echo("Error: Invalid File Path");
WScript.Quit();
}
// Put File
var FTP = new ActiveXObject("basp21.FTP");
if (!FTP.Connect(Server, User, Pass)) {
// C:\HTTP\LocalDocRoot\hoge\index.html -> C:\HTTP\LocalDocRoot\hoge -> \hoge -> /hoge
var lRootStripEX = new RegExp("^" + lRoot.replace(/\\/g, "\\\\")); // escape \ (\ -> \\)
var SC = FTP.PutFile(CurrentPath, rRoot + CurrentPath.replace(/\\[^\\]*?$/, "").replace(lRootStripEX, "").replace(/\\/g, "/"));
if (SC != 1) {
WScript.Echo("Error: FTP Transfer Error \"" + FTP.GetReply() + "\"");
FTP.Close();
WScript.Quit();
}
} else {
WScript.Echo("Error: FTP Connection Error \"" + FTP.GetReply() + "\"");
WScript.Quit();
}
FTP.Close();
WScript.Echo("SUCCESS");
WScript.Quit();
function sortObjectByKeyLength(obj)
{
var result /*: obj*/ = new Array();
var key /*: String*/;
for (key in obj) {
var Unit /*: obj*/ = new Array();
Unit["Key"] = key;
Unit["Value"] = obj[key];
result.push(Unit);
}
result.sort(_sortObjectByKeyLengthCompare);
return result;
}
function _sortObjectByKeyLengthCompare(a, b)
{
return b["Key"].length - a["Key"].length;
}
ファイル名は「qftp.js」あたりが適当かと思われます。エディタ以外でも、例えばアップロードするファイルが決まっているなら、デスクトップに専用のショートカットを作っておけばダブルクリックするだけでアップロードすることもできます。
「SUCCESS」とダイアログが表示されれば正常にアップロードが完了しているはずです。
ルートディレクトリ(ローカルなら「C:\」、サーバなら「/」)に直にファイルを置いてあるとエラーになります(この部分の対応は面倒なので放置)。
2004年バッドデザイン賞はグッドデザイン賞ウェブサイトに送られます。
勝手にウィンドウリサイズすんじゃねぇ。それと、なんかページ構成が直感的じゃない。
/.j経由だが、同じような感想がちらほら。
temp_h様から許可を頂けたので、「ブラウザで表示中の自分のサイトをすかさずエディタで編集する」の改造版を公開してみます。
主な変更点は、
以上です。
MultiViewsの処理に関する不具合を修正。ご指摘とともに修正方法まで教えてくださったtemp_h様に感謝します。
// +----------------------------------------------------------------------+
// | edit_html.js 改造版 2004-10-07T13:34:03Z |
// +----------------------------------------------------------------------+
// | Portions of this script are Copyright (c) 2004 by temp_h |
// | (http://www.pandora.nu/tempo-depot/) |
// +----------------------------------------------------------------------+
// | Distributed at http://www.arielworks.net/ |
// +----------------------------------------------------------------------+
/* CONFIGURATIONS ====================================================== */
var Editor = "C:\\Program Files\\EmEditor\\emeditor.exe";
var PathMap = {"http://www.arielworks.net/" : "D:\\SERVERS\\HTTP\\web",
"http://localhost/" : "D:\\SERVERS\\HTTP\\web",
"http://ishikawa.arielworks.com/" : "D:\\SERVERS\\HTTP\\ishikawa",
"http://localhost:3024/" : "D:\\SERVERS\\HTTP\\ishikawa"};
var DirIndex = "index.php index.cgi index.html index.xml index.htm index.xhtm index.shtml index.shtm index.xcg index.hdml";
var SchemeSkip = false;
/* ===================================================================== */
// at least one argument required
if (WScript.Arguments.Count() == 0) {
WScript.Echo("Error: Required At Least One Argument (URI)");
WScript.Quit();
}
// strip scheme/fragmentID/query
// EditHTML://http://example.com/foo/bar/baz/ -> http://example.com/foo/bar/baz
var URI = WScript.Arguments.Item(0).replace(/\/$/, "");
if (!SchemeSkip){
URI = URI.replace(/^EditHTML:\/\//i, "");
}
URI = URI.replace(/(#|\?).*$/, "")
// sort PathMap (transform into 2D array)
PathMap = sortPathMap(PathMap);
// refer PathMap
// http://example.com/foo/bar/baz -> \bar\baz
var PathFromRoot;
var ifMatch = false;
var Hit;
for (Hit in PathMap) {
if (Check(URI, "^" + PathMap[Hit]["Server"])) {
PathFromRoot = Strip(URI, "^" + PathMap[Hit]["Server"]).replace(/\//g, "\\");
ifMatch = true;
break;
}
}
if (!ifMatch) {
WScript.Echo("Error: Undefined URI\n\"" + URI + "\"");
WScript.Quit();
}
// set file path
// \bar\baz -> C:\htdocs\bar\baz\index.html
var FilePath = PathMap[Hit]["Local"] + PathFromRoot;
// append file name if it's folder
var FSO = new ActiveXObject("Scripting.FileSystemObject");
if (FSO.FolderExists(FilePath)){
var ifExist = false;
for (Entity in DirIndex.split(/\s+/)) {
if (FSO.FileExists(FilePath + "\\" +DirIndex.split(/\s+/)[Entity])) {
FilePath = FilePath + "\\" + DirIndex.split(/\s+/)[Entity];
ifExist = true;
break;
}
}
if (!ifExist) {
WScript.Echo("Error: Local File Not Found\n\"" + FilePath + "\\(DirIndex)\"");
WScript.Quit();
}
// MultiViews
} else if (!FSO.FileExists(FilePath)) {
var MVExList = DirIndex.split(/(\s+|\S+?\.)/); // extension list
var MVFiles = new Enumerator(FSO.GetFolder(FSO.GetParentFolderName(FilePath)).Files);
var ifExist = false;
var MVEx;
for (MVEx in MVExList) {
for (MVFiles.moveFirst(); !MVFiles.atEnd(); MVFiles.moveNext()) {
if (Check(MVFiles.item().Path, "^" + FilePath.replace(/\\/g, "\\\\") + "\\..*" + MVExList[MVEx])) {
FilePath = MVFiles.item().Path;
ifExist = true;
break;
}
}
if (ifExist) {
break;
}
}
if (!ifExist) {
WScript.Echo("Error: Local File Not Found\n\"" + FilePath + "\"");
WScript.Quit();
}
}
// run
var WshShell = new ActiveXObject("WScript.Shell");
WshShell.Run("\"" + Editor + "\" \"" + FilePath + "\"", 1, false);
WScript.Quit();
/* ===================================================================== */
function Check(s, re)
{
var objRe = new RegExp(re);
return objRe.test(s);
}
function Strip(s, re)
{
var objRe = new RegExp(re);
return s.replace(objRe, "");
}
function sortPathMap(obj)
{
var result = new Array();
var key ;
for (key in obj) {
var Unit = new Array();
Unit["Server"] = key.replace(/\/$/, "");
Unit["Local"] = obj[key].replace(/\\$/, "");
result.push(Unit);
}
result.sort(sortByLength);
return result;
}
function sortByLength(a, b)
{
return b["Server"].length - a["Server"].length;
}
妙に長くなってしまった。
ActiveXを呼び出してる関係で、アンチウィルスソフトが反応するようですが、特に問題がなければ許可してください。
スクリプト部分以外の設定はオリジナル版を参照のこと。
最後になりますが、改造版の公開許可を頂いたtemp_h様に感謝致します。