矩形ペースト
ナビゲーションに移動
検索に移動
概要[編集]
- クリップボードの要素(データ)を矩形貼り付けします。
- 矩形選択した範囲を右寄せや中央揃えに変更することもできます。
動作[編集]
- 固定長モード
- 貼り付け要素の長さを要素中の最長のものに揃えます。
- 要素を右寄せや中央揃えにすることもできます。
- 上書きモード
- 要素を上書きします。
- 全角文字の前半被りは上書きしません。後半被りは上書きします。
- 上書きモードでないときは、後半被り文字の前に挿入します。
- 末尾モード
- 要素を各行の末尾に流し込みます。
- 空白無視モード
- 要素の先頭と末尾にある空白を除去します。
※ポップアップメニューは選択する度に値が変化します。
注意事項[編集]
- 貼り付け先の行のタブは空白に変換します。
- カーソル位置を基点にして貼り付けます。
具体例[編集]
◆クリップボードに以下の三行をコピーしたとします。 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));
}
スポンサーリンク