「矩形ペースト」の版間の差分
ナビゲーションに移動
検索に移動
SyntaxHighlightにcopyの追加 |
セミコロンの追加 |
||
| (同じ利用者による、間の1版が非表示) | |||
| 83行目: | 83行目: | ||
== ソースコード == | == ソースコード == | ||
<syntaxhighlight lang="javascript" copy> | <syntaxhighlight lang="javascript" copy> | ||
#title="矩形ペースト" | #title = "矩形ペースト" | ||
// BlockPaste.js | // BlockPaste.js | ||
// 2013/01/30 | // 2013/01/30 | ||
| 95行目: | 95行目: | ||
var spc = " "; // 桁数調整時に埋め込む文字。 | var spc = " "; // 桁数調整時に埋め込む文字。 | ||
var align = "left"; // left | right | center 貼り付け要素のアラインメント。 | var align = "left"; // left | right | center 貼り付け要素のアラインメント。 | ||
var aligned = "左寄せ" | var aligned = "左寄せ"; | ||
var leftmargin | var leftmargin = 1; // 左マージン | ||
var rightmargin = 1; // 右マージン | var rightmargin = 1; // 右マージン | ||
var r = 10; | var r = 10; | ||
while ( r > 9 && use_popup ) { | while (r > 9 && use_popup) { | ||
var menu = CreatePopupMenu(); | 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" ); | var clp = ClipboardData.GetData().replace(/\r\n/g, "\n"); | ||
if ( clp.charCodeAt( clp.length - 1 ) == 0x0a ) { clp = clp.slice( 0, clp.length - 1 ) } | if (clp.charCodeAt(clp.length - 1) == 0x0a) { | ||
var clpary = clp.split( "\n" ); | clp = clp.slice(0, clp.length - 1); | ||
} | |||
var clpary = clp.split("\n"); | |||
var sele = document.selection; | var sele = document.selection; | ||
var ax = sele.GetActivePointX( mePosLogical ); | var ax = sele.GetActivePointX(mePosLogical); | ||
var ay = sele.GetActivePointY( mePosLogical ); | var ay = sele.GetActivePointY(mePosLogical); | ||
var len_ax = blength( document.GetLine( ay, 0 ).slice( 0, ax - 1 ) ); | var len_ax = blength(document.GetLine(ay, 0).slice(0, ax - 1)); | ||
// 貼り付ける行のタブを空白にする。 | // 貼り付ける行のタブを空白にする。 | ||
sele.SetActivePoint( mePosLogical, 1, ay, false ); | sele.SetActivePoint(mePosLogical, 1, ay, false); | ||
sele.SetActivePoint( mePosLogical, 1, ay + clpary.length - 1, true ); | sele.SetActivePoint(mePosLogical, 1, ay + clpary.length - 1, true); | ||
sele.EndOfLine( true, mePosLogical ); | sele.EndOfLine(true, mePosLogical); | ||
sele.Untabify(); | sele.Untabify(); | ||
if ( bp_ignore_spc ){ | if (bp_ignore_spc) { | ||
for ( var i = 0; i < clpary.length; i++ ) { | for (var i = 0; i < clpary.length; i++) { | ||
clpary[ i ] = clpary[ i ].replace( /^\s+|\s+$/, "" ); | clpary[i] = clpary[i].replace(/^\s+|\s+$/, ""); | ||
} | } | ||
} | } | ||
var len_clp_max = 0; | var len_clp_max = 0; | ||
if ( bp_fix ) { | if (bp_fix) { | ||
for ( var i = 0; i < clpary.length; i++ ) { | for (var i = 0; i < clpary.length; i++) { | ||
len_clp_max = ( blength( clpary[ i ] ) > len_clp_max ) ? blength( clpary[ i ] ) : len_clp_max ; | len_clp_max = (blength(clpary[i]) > len_clp_max) ? blength(clpary[i]) : len_clp_max; | ||
} | } | ||
for ( var i = 0; i < clpary.length; i++ ) { | for (var i = 0; i < clpary.length; i++) { | ||
clpary[ i ] = padding( clpary[ i ], len_clp_max, align, spc ); | clpary[i] = padding(clpary[i], len_clp_max, align, spc); | ||
} | } | ||
} | } | ||
var output = []; | var output = []; | ||
for ( var i = 0; i < clpary.length; i++ ) { | for (var i = 0; i < clpary.length; i++) { | ||
var s = document.GetLine( ay + i, 0 ); | var s = document.GetLine(ay + i, 0); | ||
if ( bp_tail ) { | if (bp_tail) { | ||
var ds = { front : s, tail : "" }; | var ds = { | ||
front: s, | |||
tail: "" | |||
}; | |||
} else { | } else { | ||
var ds = divide( padding( s, len_ax, "left", spc ), len_ax ); | var ds = divide(padding(s, len_ax, "left", spc), len_ax); | ||
} | } | ||
if ( bp_overwrite ) { | if (bp_overwrite) { | ||
len_clp_max = ( bp_fix ) ? len_clp_max : blength( clpary[ i ] ); | len_clp_max = (bp_fix) ? len_clp_max : blength(clpary[i]); | ||
ds.tail = | 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 ); | output.push(ds.front + repeat(spc, leftmargin) + clpary[i] + repeat(spc, rightmargin) + ds.tail); | ||
} | } | ||
sele.Text = output.join( "\r\n" ); | sele.Text = output.join("\r\n"); | ||
sele.SetActivePoint( mePosLogical, ax, ay, false ); | sele.SetActivePoint(mePosLogical, ax, ay, false); | ||
// 文字列を指定箇所で二分割する。 | // 文字列を指定箇所で二分割する。 | ||
function divide( str, bi ) { | function divide(str, bi) { | ||
var i = bindex2i( str, bi ); | var i = bindex2i(str, bi); | ||
return { | return { | ||
front : padding( str.substr( 0, i ), bi, "left", spc ), | front: padding(str.substr(0, i), bi, "left", spc), | ||
tail | tail: str.substr(i, str.length - 1) | ||
} | }; | ||
} | } | ||
// 半角のインデックスに相当する標準のインデックスを返す。 | // 半角のインデックスに相当する標準のインデックスを返す。 | ||
function bindex2i( str, bi ) { | function bindex2i(str, bi) { | ||
var n = 0; | var n = 0; | ||
for ( var i = 0; i < str.length; i++ ) { | for (var i = 0; i < str.length; i++) { | ||
if ( !isHan( str.charAt( i ) ) ) { n++ } | if (!isHan(str.charAt(i))) { | ||
if ( i + n >= bi ) { return i } | n++; | ||
} | |||
if (i + n >= bi) { | |||
return i; | |||
} | |||
} | } | ||
return bi | return bi; | ||
} | } | ||
// 指定桁数(半角)になるように spc を埋め込む。 | // 指定桁数(半角)になるように spc を埋め込む。 | ||
function padding( str, len, align, spc ){ | function padding(str, len, align, spc) { | ||
var x = len - blength( str ); | var x = len - blength(str); | ||
if ( align == "right" ) { | if (align == "right") { | ||
return repeat( spc, x ) + str; | return repeat(spc, x) + str; | ||
} else if ( align == "center" ) { | } else if (align == "center") { | ||
return repeat( spc, Math.floor( x / 2 ) ) + str + repeat( spc, x - Math.floor( x / 2 ) ); | return repeat(spc, Math.floor(x / 2)) + str + repeat(spc, x - Math.floor(x / 2)); | ||
} else { | } else { | ||
return str + repeat( spc, x ); | return str + repeat(spc, x); | ||
} | } | ||
} | } | ||
// 文字列の繰り返し。 | // 文字列の繰り返し。 | ||
function repeat( str, n ) { | function repeat(str, n) { | ||
var s = ""; | var s = ""; | ||
for ( var i = 0; i < n; i++ ){ s += str } | for (var i = 0; i < n; i++) { | ||
s += str; | |||
} | |||
return s; | return s; | ||
} | } | ||
// 文字列の半角換算長さ。 | // 文字列の半角換算長さ。 | ||
function blength( str ) { | function blength(str) { | ||
var blen = 0; | var blen = 0; | ||
for ( var i = 0; i < str.length; i++ ) { | for (var i = 0; i < str.length; i++) { | ||
( isHan( str.charAt( i ) ) ) ? blen += 1 : blen += 2; | (isHan(str.charAt(i))) ? blen += 1: blen += 2; | ||
} | } | ||
return blen; | return blen; | ||
| 259行目: | 271行目: | ||
// 文字が半角のとき true。 | // 文字が半角のとき true。 | ||
function isHan( s ) { | function isHan(s) { | ||
// Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff | // Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff | ||
// Unicode : 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3 | // Unicode : 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3 | ||
var c = s.charCodeAt( 0 ); | var c = s.charCodeAt(0); | ||
return (( c >= 0x0 && c < 0x81 ) || ( c == 0xf8f0 ) || ( c >= 0xff61 && c < 0xffa0 ) || ( c >= 0xf8f1 && c < 0xf8f4 )); | return ((c >= 0x0 && c < 0x81) || (c == 0xf8f0) || (c >= 0xff61 && c < 0xffa0) || (c >= 0xf8f1 && c < 0xf8f4)); | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
2026年3月11日 (水) 02:14時点における最新版
概要[編集]
- クリップボードの要素(データ)を矩形貼り付けします。
- 矩形選択した範囲を右寄せや中央揃えに変更することもできます。
動作[編集]
- 固定長モード
- 貼り付け要素の長さを要素中の最長のものに揃えます。
- 要素を右寄せや中央揃えにすることもできます。
- 上書きモード
- 要素を上書きします。
- 全角文字の前半被りは上書きしません。後半被りは上書きします。
- 上書きモードでないときは、後半被り文字の前に挿入します。
- 末尾モード
- 要素を各行の末尾に流し込みます。
- 空白無視モード
- 要素の先頭と末尾にある空白を除去します。
※ポップアップメニューは選択する度に値が変化します。
注意事項[編集]
- 貼り付け先の行のタブは空白に変換します。
- カーソル位置を基点にして貼り付けます。
具体例[編集]
◆クリップボードに以下の三行をコピーしたとします。 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));
}
スポンサーリンク