矩形ペースト

提供: MeryWiki
ナビゲーションに移動 検索に移動

概要[編集]

  • クリップボードの要素(データ)を矩形貼り付けします。
  • 矩形選択した範囲を右寄せや中央揃えに変更することもできます。

動作[編集]

固定長モード
貼り付け要素の長さを要素中の最長のものに揃えます。
要素を右寄せや中央揃えにすることもできます。
上書きモード
要素を上書きします。
全角文字の前半被りは上書きしません。後半被りは上書きします。
上書きモードでないときは、後半被り文字の前に挿入します。
末尾モード
要素を各行の末尾に流し込みます。
空白無視モード
要素の先頭と末尾にある空白を除去します。

※ポップアップメニューは選択する度に値が変化します。

注意事項[編集]

  • 貼り付け先の行のタブは空白に変換します。
  • カーソル位置を基点にして貼り付けます。

具体例[編集]

◆クリップボードに以下の三行をコピーしたとします。
 xx
 x
 xxxx
   
>非固定長・非上書き
 012345678      012xx345678    01234567xx8
 0123456789 ⇒  012x3456789    01234567x89
 01234567       012xxxx34567 , 01234567xxxx

>固定長・非上書き・左寄せ
 012345678      012xx  345678    01234567xx  8
 0123456789 ⇒  012x   3456789   01234567x   89
 01234567       012xxxx34567   , 01234567xxxx

>固定長・上書き・右寄せ
 012345678      012  xx78    0123456  xx
 0123456789 ⇒  012   x789   0123456   x
 01234567       012xxxx7   , 0123456xxxx

>非固定長・末尾
 012345678      012345678xx
 0123456789 ⇒  0123456789x
 01234567       01234567xxxx

◆中央部分を矩形選択の上、コピーしたとします。
>固定長・上書き・左寄せ・空白無視
 012  xx78     012xx  78
 012   x789 ⇒ 012x   789
 012xxxx7      012xxxx7

変数の説明[編集]

use_popup
trueのとき、ポップアップメニューを表示します。
bp_fix
trueのとき、固定長モードです。
bp_overwrite
trueのとき、上書きモードです。
bp_tail
trueのとき、末尾モードです。
bp_ignore_spc
trueのとき、空白無視モードです。
align
固定長モードのときの各要素のアラインメントです。
left=左寄せ、right=右寄せ、center=中央揃え、です。
spc
桁数調整時に埋め込む文字です。
leftmargin・rightmargin
貼り付け時の各要素の左マージン・右マージンの数値です。その数だけspcを埋め込みます。

動作環境(作成環境)[編集]

  • Mery: Ver 2.0.15.4235
  • OS: Windows 7 SP1 (64bit)

変更履歴[編集]

  • 1.0.0 (2013-01-30)
    • 初版

ソースコード[編集]

#title = "矩形ペースト"
// BlockPaste.js
// 2013/01/30

var use_popup = true;	  // true:ポップアップメニューを使う。

var bp_fix = true;        // true:貼り付け要素の長さを最長のものに揃える。
var bp_overwrite = false; // true:上書き。
var bp_tail = false;      // true:末尾に流し込み。
var bp_ignore_spc = true; // true:要素の先頭と末尾にある空白を無視する。
var spc = " ";			  // 桁数調整時に埋め込む文字。
var align = "left";       // left | right | center  貼り付け要素のアラインメント。
var aligned = "左寄せ";
var leftmargin = 1;       // 左マージン
var rightmargin = 1;      // 右マージン

var r = 10;

while (r > 9 && use_popup) {
	var menu = CreatePopupMenu();
	menu.Add("固定長:" + ((bp_fix) ? "はい(" + aligned + ")" : "いいえ"), 11, 0);
	menu.Add(((bp_tail) ? "末尾に流し込む" : ((bp_overwrite) ? "上書きする" : "挿入する")), 13, 0);
	menu.Add("空白を無視" + ((bp_ignore_spc) ? "する" : "しない"), 14, 0);
	menu.Add("-------", 0, meMenuSeparator);
	menu.Add("実行", 9, 0);
	r = menu.Track(0);

	switch (r) {
		case 0:
			Quit();
		case 9:
			break;
		case 11:
			if (!bp_fix) {
				bp_fix = true;
			} else {
				switch (align) {
					case "left":
						align = "right";
						aligned = "右寄せ";
						break;
					case "right":
						align = "center";
						aligned = "中央揃え";
						break;
					case "center":
						align = "left";
						aligned = "左寄せ";
						bp_fix = false;
						break;
					default:
						Quit();
				}
			}
			break;
		case 12:
			bp_overwrite = !bp_overwrite;
			break;
		case 13:
			if (bp_tail) {
				bp_tail = false;
			} else {
				if (bp_overwrite) {
					bp_overwrite = false;
					bp_tail = true;
				} else {
					bp_overwrite = true;
				}
			}
			break;
		case 14:
			bp_ignore_spc = !bp_ignore_spc;
			break;
		default:
			Quit();
	}
}


var clp = ClipboardData.GetData().replace(/\r\n/g, "\n");
if (clp.charCodeAt(clp.length - 1) == 0x0a) {
	clp = clp.slice(0, clp.length - 1);
}
var clpary = clp.split("\n");

var sele = document.selection;
var ax = sele.GetActivePointX(mePosLogical);
var ay = sele.GetActivePointY(mePosLogical);
var len_ax = blength(document.GetLine(ay, 0).slice(0, ax - 1));

// 貼り付ける行のタブを空白にする。
sele.SetActivePoint(mePosLogical, 1, ay, false);
sele.SetActivePoint(mePosLogical, 1, ay + clpary.length - 1, true);
sele.EndOfLine(true, mePosLogical);
sele.Untabify();

if (bp_ignore_spc) {
	for (var i = 0; i < clpary.length; i++) {
		clpary[i] = clpary[i].replace(/^\s+|\s+$/, "");
	}
}

var len_clp_max = 0;
if (bp_fix) {
	for (var i = 0; i < clpary.length; i++) {
		len_clp_max = (blength(clpary[i]) > len_clp_max) ? blength(clpary[i]) : len_clp_max;
	}
	for (var i = 0; i < clpary.length; i++) {
		clpary[i] = padding(clpary[i], len_clp_max, align, spc);
	}
}

var output = [];
for (var i = 0; i < clpary.length; i++) {
	var s = document.GetLine(ay + i, 0);
	if (bp_tail) {
		var ds = {
			front: s,
			tail: ""
		};
	} else {
		var ds = divide(padding(s, len_ax, "left", spc), len_ax);
	}
	if (bp_overwrite) {
		len_clp_max = (bp_fix) ? len_clp_max : blength(clpary[i]);
		ds.tail = ds.tail.slice(bindex2i(ds.tail, len_clp_max));
	}
	output.push(ds.front + repeat(spc, leftmargin) + clpary[i] + repeat(spc, rightmargin) + ds.tail);
}

sele.Text = output.join("\r\n");
sele.SetActivePoint(mePosLogical, ax, ay, false);


// 文字列を指定箇所で二分割する。
function divide(str, bi) {
	var i = bindex2i(str, bi);
	return {
		front: padding(str.substr(0, i), bi, "left", spc),
		tail: str.substr(i, str.length - 1)
	};
}

// 半角のインデックスに相当する標準のインデックスを返す。
function bindex2i(str, bi) {
	var n = 0;
	for (var i = 0; i < str.length; i++) {
		if (!isHan(str.charAt(i))) {
			n++;
		}
		if (i + n >= bi) {
			return i;
		}
	}
	return bi;
}

// 指定桁数(半角)になるように spc を埋め込む。
function padding(str, len, align, spc) {
	var x = len - blength(str);
	if (align == "right") {
		return repeat(spc, x) + str;
	} else if (align == "center") {
		return repeat(spc, Math.floor(x / 2)) + str + repeat(spc, x - Math.floor(x / 2));
	} else {
		return str + repeat(spc, x);
	}
}

// 文字列の繰り返し。
function repeat(str, n) {
	var s = "";
	for (var i = 0; i < n; i++) {
		s += str;
	}
	return s;
}

// 文字列の半角換算長さ。
function blength(str) {
	var blen = 0;
	for (var i = 0; i < str.length; i++) {
		(isHan(str.charAt(i))) ? blen += 1: blen += 2;
	}
	return blen;
}

// 文字が半角のとき true。
function isHan(s) {
	// Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff
	// Unicode	: 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3
	var c = s.charCodeAt(0);
	return ((c >= 0x0 && c < 0x81) || (c == 0xf8f0) || (c >= 0xff61 && c < 0xffa0) || (c >= 0xf8f1 && c < 0xf8f4));
}
スポンサーリンク