サクラエディタ用のマクロ

行末コメント位置揃え

// 行数を取得
var cnt = GetLineCount(0);

// コメントを除いた行の長さを取得する
var maxLen = 0;
for (var i = 1; i <= cnt; i++) {
	var str = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"").replace(/\/\/.+/,"").replace(/[ ]*$/,"").replace(/[\t]*$/,"");
	var len = str.length;
	if (len > maxLen) {
		maxLen = len;
	}
}
maxLen = maxLen + 0;

var textAll = "";
for (var i = 1; i <= cnt; i++) {

	// 改行を除いた行文字列を取得
	var str = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"");

	// パディングするスペース文字列を取得
	var spaces = "";
	var padLen = maxLen - str.replace(/\/\/.+/,"").length;
	for (var j = 0; j < padLen; j++) spaces += " ";

	// コメントの位置揃え
	var comment = str.replace(/.+\/\/[ ]*/, "");
	str = str.replace(/\/\/.+/, spaces + "// " + comment);

	// 位置揃え後の行文字列を追加
	textAll += str + "\n";
}

SelectAll(0);
InsText(textAll + "\n");

ソース中のSQLを取得

var cnt = GetLineCount(0);

var textAll = "";
for (var i = 1; i <= cnt; i++) {
	// 行の文字列を取得
	var str = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"");

	// コード削除
	str = str.replace(/.+?\"/,"");             // 行頭から最初のダブルクォーテーションを削除
	str = str.replace(/\"[^\"]*$/,"");         // 行末から最後のダブルクォーテーションを削除
	str = str.replace(/[ ]*\+[ ]*/g," || ");   // + を || に変換削除
	str = str.replace(/\.append\(/g,"");       // appendの前部分を削除
	str = str.replace(/\"\)/g,"");             // appendの後部分を削除
	str = str.replace(/\"/g,"");               // ダブルクォーテーションを削除

	textAll += str + "\n";
}

SelectAll(0);
InsText(textAll);

DB項目名に変換

var cnt = GetLineCount(0);

var textAll = "";
for (var i = 1; i <= cnt; i++) {

	// 行の文字列を取得
	var str = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"");

	// setter、getterをいったんCamelCaseに変換
	if (str.match(/.*\(.*/)) {
		str = str.replace(/\(.+/,"");
		str = str.replace(/.+\.get([a-zA-Z])/, function(str,p1){ return p1.toLowerCase()});
		str = str.replace(/.+\.set([a-zA-Z])/, function(str,p1){ return p1.toLowerCase()});
	}

	// CamelCaseをDB項目名に変換
	str = str.replace(/([A-Z])/g, function(str, p1){ return "_" + p1; });
	str = str.replace(/([a-zA-Z0-9_])/g, function(str, p1){ return p1.toUpperCase()});

	textAll += str + "\n";
}

SelectAll(0);
InsText(textAll);

CamelCaseに変換

var cnt = GetLineCount(0);

var textAll = "";
for (var i = 1; i <= cnt; i++) {

	// 行の文字列を取得
	var str = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"");

	if (str.match(/.*\(.*/)) {
		// setter、getterをCamelCaseに変換
		str = str.replace(/\(.+/,"");
		str = str.replace(/.+\.set/, "");
		str = str.replace(/.+\.get/, "");
		str = str.replace(/^([A-Z])/, function(str,p1){ return p1.toLowerCase()});
	} else {
		// DB項目をCamelCaseに変換
		str = str.toLowerCase();
		str = str.replace(/_([a-zA-Z0-9])/g, function(str, p1){ return p1.toUpperCase()});
	}

	textAll += str + "\n";
}

SelectAll(0);
InsText(textAll);

getterに変換

var cnt = GetLineCount(0);

var textAll = "";
for (var i = 1; i <= cnt; i++) {

	// 行の文字列を取得
	var str = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"");

	// setterをいったんCamelcaseに変換
	str = str.replace(/\(.+/,"");
	str = str.replace(/.+\.set/, "");
	str = str.replace(/.+\.get/, "");
	str = str.replace(/^([A-Z])/, function(str,p1){ return p1.toLowerCase()});

	// 変換
	if (str.match(/.*_.*/)) {
		// DB項目名をいったんCamelCaseに
		str = str.toLowerCase();
		str = str.replace(/_([a-zA-Z])/g, function(str, p1){ return p1.toUpperCase(); });
	}
	str = "bean.get" + str.replace(/([ |\t]*)([a-zA-Z0-9])([a-zA-Z0-9]+)/g, function(str, p1, p2, p3){ return p2.toUpperCase()+p3; }) + "();";

	textAll += str + "\n";
}

SelectAll(0);
InsText(textAll);

setterに変換

var cnt = GetLineCount(0);

var textAll = "";
for (var i = 1; i <= cnt; i++) {

	// 行の文字列を取得
	var str = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"");

	// getterをいったんCamelcaseに変換
	str = str.replace(/\(.+/,"");
	str = str.replace(/.+\.set/, "");
	str = str.replace(/.+\.get/, "");
	str = str.replace(/^([A-Z])/, function(str,p1){ return p1.toLowerCase()});

	// 変換
	if (str.match(/.*_.*/)) {
		// DB項目名をいったんCamelCaseに
		str = str.toLowerCase();
		str = str.replace(/_([a-zA-Z])/g, function(str, p1){ return p1.toUpperCase(); });
	}
	str = "bean.set" + str.replace(/([ |\t]*)([a-zA-Z0-9])([a-zA-Z0-9]+)/g, function(str, p1, p2, p3){ return p2.toUpperCase()+p3; }) + "(\"XXX\");";

	textAll += str + "\n";
}

SelectAll(0);
InsText(textAll);

JSON整形

// 行数を取得
var cnt = GetLineCount(0);

// 改行を除いた行文字列を取得
var textAll = "";
for (var i = 1; i <= cnt; i++) {
	var str = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"");
	textAll += str;
}

var editJson = "";
var innerFlg = false;
var intentLv = 0;
var quoteType = [];
var blockType = [];
var preChr = "";
for (var i = 0; i < textAll.length; i++) {
	var prefix = "";
	var suffix = "";
	var c = textAll.substring(i, i + 1);
	if (!innerFlg) {
		if (c == " ") {
			continue;
		}
		if (c == "\"" || c == "'"){
			innerFlg = true;
			quoteType[quoteType.length] = c;

			// JSON または 配列の1つ目の要素の時はスペース1個を追加
			var chkText = editJson.replace(/( |\t|\r\n|\n)/g, "");
			if (chkText.length > 0) {
				var preChar = chkText.substring(chkText.length - 1, chkText.length);
				if (preChar == "[" || preChar == "{") {
					c = " " + c;
				}
			}
		} else {
			if (c == "{" || c == "[") {
				suffix = "\n";
				intentLv = intentLv + 1;
				blockType[blockType.length] = c;
				for (var j = 0; j < intentLv; j++) {
					suffix = suffix + "\t";
				}
			}
			if (c == "}" || c == "]") {
				prefix = "\n";
				suffix = "\n";
				intentLv = intentLv - 1;
				blockType.pop(1);
			}
			if (c == ",") {
				prefix = "\n";
			}
		}
	} else {
		if (quoteType.length > 0 && c == quoteType[quoteType.length - 1]){
			innerFlg = false;
		}
	}
	if (prefix != "") {
		for (var j = 0; j < intentLv; j++) {
			prefix = prefix + "\t";
		}
	}
	var line = "" + prefix + c + suffix;
	if (preChr == "\n" && line.substring(0, 1) == "\n") {
		line = line.substring(1);
	}
	editJson = editJson + "" + line;
	preChr = line.substring(line.length - 1, line.length);
}

SelectAll(0);
InsText(editJson + "\n");

Javaソース整形

var cnt = GetLineCount(0);

// インテント文字
var intent = "  ";

// 改行文字
var crlf = "\n";

// JavaDocコメントかどうか
var isJavaDoc = false;

// 継続行の開始位置
var cntPos = -1;

// インテントレベル
var intentLv = 0;

var formatLines = [];
for (var i = 1; i <= cnt; i++) {

	var line = GetLineStr(i).replace(/\r\n/,"").replace(/\n/,"");

	// コメント行かどうかをチェック
	var isComment = false;
	if (line.match(/^[\t ]*\/\/.*/)) {
		isComment = true;
	}

	// ------------------------------------------
	// インテント揃え
	// ------------------------------------------

	// 末尾の余分な空白を削除
	line = line.replace(/^([^\t| ]+)([\t| ]+$)/, function(str, p1, p2){
		return p1;
	});

	// 先頭が}の時はインテントレベルをマイナス
	var intentAdjustLv = 0;
	if (!isComment && line.replace(/^[\t ]+/,"").match(/^\}/)){
		intentLv -= 1;
		intentAdjustLv = 1;
	}

	// 先頭インテント揃え
	line = line.replace(/^([\t ]*)([^\t ]+.*$)/, function(str, p1, p2){
		var text = "";
		for (var j = 0; j < intentLv; j++) {
			text = text + intent;
		}
		if (isJavaDoc) {
			text += " ";
		}
		return text + p2;
	});

	// 継続行のインテント揃え
	var chkLine = line.replace(/\/\/.*$/,"").replace(/\/[\*]+.*\*\/$/,"").replace(/[\t ]+$/,"");
	if (chkLine.match(/^[\t ]*[\.\+]/)) {
		var tmpLine = line.replace(/^[\t ]+/, "");
		for (var j = 0; j < cntPos; j++) {
			tmpLine = " " + tmpLine;
		}
		line = tmpLine;
	} else if (chkLine.match(/[^;\{\}]$/)) {
		cntPos = line.indexOf("=");
		if (cntPos < 0){
			cntPos = line.indexOf(".");
		}
	}

	// コメント行の時はインテント整形のみ
	if (isComment) {
		formatLines[formatLines.length] = line;
		continue;
	}


	// ------------------------------------------
	// コード整形
	// ------------------------------------------

	// TODO: ここに整形ルールを記述していく

	// if とカッコの間にスペースを空ける
	line = line.replace(/([\t ])(if)(\()/, function(str, p1, p2, p3){
		return p1 + p2 + " " + p3;
	});


	// ------------------------------------------
	// 次行以降の処理に必要な情報の設定
	// ------------------------------------------

	// 末尾が"{"の場合は次行のインテントレベルをプラス
	var matches1 = line.match(/\{/g);
	if (matches1) {
		intentLv += matches1.length;
	}

	// 末尾が"}"の場合は次行のインテントレベルをマイナス
	var matches2 = line.match(/\}/g);
	if (matches2) {
		intentLv -= matches2.length;
		intentLv += intentAdjustLv;
	}

	// 次行がJavaDocコメントかどうかをチェック
	if (isJavaDoc) {
		//if (line.match(/.*\*\//)) {
		if (line.match(/.*\*\//)) {
			isJavaDoc = false;
		}
	} else if (line.match(/^[\t ]*\/[\*]+[\t ]*$/)) {
		isJavaDoc = true;
	}

	// 整形済みの行を退避
	formatLines[formatLines.length] = line;
}

// ---------------------------------------
// 行末コメント位置揃え
// ---------------------------------------

var commGroup = {};
var commGroupNo = 0;
var findCommPre = false;

// 行末コメント位置を揃えるグループを取得
for (var i in formatLines) {

	var line = formatLines[i];

	// 行末コメントがある行かどうかをチェック
	var findComm = false;
	//if (line.match(/^([\t ]*[^\t ]+)([\t ]*)(\/\/.*)$/)) {
	if (line.match(/[^\t ]+.*\/\/.*$/)) {
		findComm = true;
	}

	if (findComm) {
		if (!findCommPre) {
			commGroupNo += 1;
		}
		var lineNoAll = commGroup[commGroupNo] || [];
		lineNoAll[lineNoAll.length] = i;
		commGroup[commGroupNo] = lineNoAll;
	}

	findCommPre = findComm;
}

// グループ毎に行末コメントを揃える
for (var i in commGroup) {

	var lineNoAll = commGroup[i];
	var maxLen = 0;

	// グループ内で最も右側にあるコメントの位置を判定
	for (var j in lineNoAll) {
		var lineNo = lineNoAll[j];
		var line = formatLines[lineNo];
		var dummy = line.replace(/^(.+)([\t ]*)(\/\/.*)$/, function(str, p1, p2, p3){
			if (p1.length > maxLen){
				maxLen = p1.length;
			}
		});
	}

	// 最も右側にあるコメントに位置を合わせる
	for (var j in lineNoAll) {
		var lineNo = lineNoAll[j];
		var line = formatLines[lineNo];
		line = line.replace(/^(.+?)([\t ]*)(\/\/.*)$/, function(str, p1, p2, p3){
			var addLen = maxLen - p1.length;
			var spaces = "";
			for (var k = 0; k < addLen; k++) {
				spaces = spaces + " ";
			}
			return p1 + spaces + p3;
		});
		formatLines[lineNo] = line;
	}
}

var textAll = formatLines.join(crlf) + crlf;

SelectAll(0);
InsText(textAll);

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-04-10 (水) 23:03:58 (2076d)