//--------------------------------------------------------- // GrepSortUniq.jsee http://kokoromati.nobody.jp/ //--------------------------------------------------------- // 対象テキストに対して Grep, Sort, Uniq を実行。 //--------------------------------------------------------- var oSel = document.selection; // 処理タイプ。 // "" : popup で選択する // "Grep" : pattern とマッチする行のみを出力。 // "Grep -v" : pattern とマッチしない行のみを出力。 // "Sort" : 行を昇順に並べ替える。 // "Sort -r" : 行を降順に並べ替える。 // "Sort | Uniq" : 行を並べ替え、重複した行を消す。 // "Sort | Uniq -c" : 行を並べ替え、重複した行を消す。各行先頭に重複数を出す。 // "Pattern" : Grep に使用する正規表現の pattern を変更する。 var cActType = ""; // 出力タイプ。 // "" : popup で選択する // "Copy" : クリップボードにコピー // "Paste" : 直接書き換える var cOutType = "Paste"; // 選択範囲内のみを処理対象としたい場合は false。常に全範囲を対象にするなら true。 var flgSelectAll = true; // popup 位置。 // 0 : (キーボード)カーソル位置 // eePosMouse : マウスカーソル位置 var nPopupPosType = 0; //---------------------------------- // //---------------------------------- Main(""); //--------------------------------------------------------- // //--------------------------------------------------------- function Main(cRE) { var flgRetry = 0; var lRet; //---------------------------------- // パターン //---------------------------------- if (cRE == "") { cRE = GetcGrepPattern(); flgRetry = 1; } //---------------------------------- // action-type が固定でないなら選択 //---------------------------------- if (cActType == "") { cActType = GetcActType(cRE, flgRetry); if (cActType == "") { return; } } //---------------------------------- // パターン入力 //---------------------------------- if (cActType == "Pattern") { var cRE = prompt("正規表現 入力", cRE); if (cRE != "") { cActType = ""; Main(cRE); } return; } //---------------------------------- // output-type が固定でないなら選択 //---------------------------------- if (cOutType == "") { cOutType = GetcOutType(); if (cOutType == "") { return; } } //---------------------------------- // 範囲内テキスト取得。未選択なら全範囲 //---------------------------------- if (flgSelectAll || oSel.Mode & eeModeMask != eeModeSelected) { oSel.SelectAll(); } var nRowSel = oSel.GetTopPointY(eePosView); var lText = oSel.Text.split("\r\n"); //---------------------------------- // 変換処理 //---------------------------------- switch (cActType) { case "Grep": lRet = GetlGrep(lText, cRE, ""); break; case "Grep -v": lRet = GetlGrep(lText, cRE, "v"); break; case "Sort": lRet = lText.sort(); break; case "Sort -r": lRet = lText.sort(function(a, b){ return ((a < b)?1:((a > b)?-1:0)) }); break; case "Sort | Uniq": lRet = Uniq(lText, ""); break; case "Sort | Uniq -c": lRet = Uniq(lText, "c"); break; default: return; } var cRet = lRet.join("\r\n"); var nRet = lRet.length; //---------------------------------- // 出力 //---------------------------------- switch (cOutType) { case "Copy": clipboardData.setData("Text", cRet); oSel.Collapse(); break; case "Paste": oSel.Text = cRet; if (cActType == "Grep") { oSel.Find(cRE, eeFindReplaceRegExp); } oSel.Collapse(); oSel.SetActivePoint(eePosView, 1, nRowSel, false); // カーソル位置移動 break; default: return; } //---------------------------------- // ステータス表示 //---------------------------------- status = cActType + " : " + nRet + " lines " + cOutType + "."; } //--------------------------------------------------------- // Grep //--------------------------------------------------------- function GetlGrep(lText, cRE, cOption) { var reTime = new RegExp(cRE, "i"); var lRet = new Array(0); for (var i = 0; i < lText.length; i ++) { //----- -----// var flgHit = reTime.exec(lText[i]); if ((flgHit && cOption != "v") || (!flgHit && cOption == "v")) { lRet.push(lText[i]); } } return lRet; } //--------------------------------------------------------- // Uniq //--------------------------------------------------------- function Uniq(l, cType) { var lRet = new Array(0); var lCnt = new Array(0); var nCnt = -1; var nCntMax = 0; l = l.sort(); for(var i = 0; i < l.length; i ++) { if (i == 0 || l[i-1] != l[i]) { lRet.push(l[i]); lCnt.push(0); nCnt ++; } lCnt[nCnt] ++; if (lCnt[nCnt] > nCntMax) { nCntMax = lCnt[nCnt]; } } if (cType == "c") { var nPlace = (nCntMax+"").length; // 最大値の桁算出 for (var i = 0; i < lRet.length; i ++) { lRet[i] = GetcSpacePadding(lCnt[i], nPlace + 1) + " " + lRet[i]; } } return lRet; } //--------------------------------------------------------- // fool zero-padding... //--------------------------------------------------------- function GetcSpacePadding(nNum, nPlace) { var cNum = nNum + ""; var nP = cNum.length; while (nP < nPlace) { cNum = " " + cNum; nP ++; } return cNum; } //--------------------------------------------------------- // fool zero-padding... //--------------------------------------------------------- function GetcGrepPattern() { var cRE; if (oSel.Mode & eeModeMask != eeModeStream ) { // 線形選択なら cRE = oSel.Text; } else { cRE = clipboardData.getData("Text"); } return cRE; } //--------------------------------------------------------- // action-type select popup //--------------------------------------------------------- function GetcActType(cRE, flgRetry) { //----- -----// var cREOmit = cRE.substr(0,10) + ((cRE.length > 10)?"...":""); var cPattern = "Pattern [ " + cREOmit + " ]"; //----- -----// var oMenu = CreatePopupMenu(); //----- -----// oMenu.Add("Grep", 1); oMenu.Add("Grep -v", 2); if (flgRetry) { oMenu.Add(cPattern, 3); } else { oMenu.Add(cPattern, 92, eeMenuGrayed); } oMenu.Add("", 0, eeMenuSeparator); //----- -----// oMenu.Add("Sort", 4); oMenu.Add("Sort -r", 41); oMenu.Add("", 0, eeMenuSeparator); //----- -----// oMenu.Add("Sort | Uniq", 5); oMenu.Add("Sort | Uniq -c", 6); //----- -----// var nRet = oMenu.Track(nPopupPosType); var cRet = ""; if (nRet != 0) { cRet = oMenu.GetText(nRet); if (cRet == cPattern) { cRet = "Pattern"; } } return cRet; } //--------------------------------------------------------- // output-type select popup //--------------------------------------------------------- function GetcOutType() { //----- -----// var oMenu = CreatePopupMenu(); //----- -----// oMenu.Add("Copy", 1); oMenu.Add("Paste", 2); //----- -----// var nRet = oMenu.Track(nPopupPosType); var cRet = ""; if (nRet != 0) { cRet = oMenu.GetText(nRet); } return cRet; }