* サクラエディタ用のマクロ [#n277eb4d] #setlinebreak(on); #contents #html(<div style="padding-left:10px;">) ** 行末コメント位置揃え [#g24d290e] #mycode{{ // 行数を取得 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"); }} #html(</div>) #html(<div style="padding-left:10px;">) ** ソース中のSQLを取得 [#dd85069e] #mycode{{ 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); }} #html(</div>) #html(<div style="padding-left:10px;">) ** DB項目名に変換 [#rc371a6e] #mycode{{ 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); }} #html(</div>) #html(<div style="padding-left:10px;">) ** CamelCaseに変換 [#yc0c85f1] #mycode{{ 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); }} #html(</div>) #html(<div style="padding-left:10px;">) ** getterに変換 [#dcdbe36d] #mycode{{ 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); }} #html(</div>) #html(<div style="padding-left:10px;">) ** setterに変換 [#dd3dfb2e] #mycode{{ 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); }} #html(</div>) #html(<div style="padding-left:10px;">) ** JSON整形 [#lb2c0924] #mycode{{ // 行数を取得 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"); }} #html(</div>) #html(<div style="padding-left:10px;">) ** Javaソース整形 [#nad87f48] #mycode(){{ 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; console.log("find line comm"); console.log(line); } 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); }} #html(</div>)