「矩形ペースト」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
MSY-07 (トーク | 投稿記録)
SyntaxHighlightにcopyの追加
MSY-07 (トーク | 投稿記録)
ソースコードの整形
83行目: 83行目:
== ソースコード ==
== ソースコード ==
<syntaxhighlight lang="javascript" copy>
<syntaxhighlight lang="javascript" copy>
#title="矩形ペースト"
#title = "矩形ペースト"
// BlockPaste.js
// BlockPaste.js
// 2013/01/30
// 2013/01/30
96行目: 96行目:
var align = "left";      // left | right | center  貼り付け要素のアラインメント。
var align = "left";      // left | right | center  貼り付け要素のアラインメント。
var aligned = "左寄せ"
var aligned = "左寄せ"
var leftmargin = 1;     // 左マージン
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_fix) ? "はい(" + aligned + ")" : "いいえ"), 11, 0);
    menu.Add( ( ( bp_tail ) ? "末尾に流し込む" : ( ( bp_overwrite ) ? "上書きする" : "挿入する" ) ), 13, 0 );
menu.Add(((bp_tail) ? "末尾に流し込む" : ((bp_overwrite) ? "上書きする" : "挿入する")), 13, 0);
    menu.Add( "空白を無視" + ( ( bp_ignore_spc ) ? "する" : "しない" ), 14, 0 );
menu.Add("空白を無視" + ((bp_ignore_spc) ? "する" : "しない"), 14, 0);
    menu.Add( "-------", 0, meMenuSeparator )
menu.Add("-------", 0, meMenuSeparator)
    menu.Add( "実行", 9, 0 );
menu.Add("実行", 9, 0);
    r = menu.Track( 0 );
r = menu.Track(0);
   
 
    switch ( r ){
switch (r) {
    case 0 :
case 0:
        Quit();
Quit();
    case 9 :
case 9:
        break;
break;
    case 11 :
case 11:
        if ( !bp_fix ) {
if (!bp_fix) {
            bp_fix = true;
bp_fix = true;
        } else {
} else {
switch( align ){
switch (align) {
case "left"   :
case "left":
align = "right";
align = "right";
aligned = "右寄せ";
aligned = "右寄せ";
break;
break;
        case "right" :
case "right":
align = "center";
align = "center";
aligned = "中央揃え";
aligned = "中央揃え";
        break;
break;
case "center" :
case "center":
        align = "left";
align = "left";
        aligned = "左寄せ";
aligned = "左寄せ";
        bp_fix = false;
bp_fix = false;
break;
break;
default: Quit();
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;
break;
case 14:
case 12 :
bp_ignore_spc = !bp_ignore_spc;
bp_overwrite = !bp_overwrite;
break;
break;
default:
case 13 :
Quit();
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.slice( bindex2i( ds.tail, len_clp_max ) );
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 : str.substr( i, str.length - 1 )
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
231行目: 241行目:


// 指定桁数(半角)になるように 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:06時点における版

概要

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

動作

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

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

注意事項

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

具体例

◆クリップボードに以下の三行をコピーしたとします。
 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));
}
スポンサーリンク