サクラエディタ用のマクロ †
行末コメント位置揃え †
// 行数を取得
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);
|