矩形ペースト

提供: MeryWiki
2025年1月9日 (木) 13:03時点におけるMSY-07 (トーク | 投稿記録)による版 (ソースコードの追加、ダウンロードの削除)
ナビゲーションに移動 検索に移動

概要

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

動作

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

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

注意事項

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

具体例

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