カッコをはずす

提供: MeryWiki
2019年3月14日 (木) 20:56時点におけるSukemaru (トーク | 投稿記録)による版 (ページを新規作成)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

選択範囲の "最初の1文字" と "最後の1文字" が「対になるカッコ」のとき、カッコ囲いをはずします。

  • 選択範囲の "外側 (前と後) の各1文字" が「対になるカッコ」のときも、カッコをはずせます。
  • カッコの種類はソースコード内で定義したもののみ
    (開き/閉じカッコはそれぞれ「1文字」ずつのセットで)。
  • カッコの種類
  • 各種のカッコ(全角/半角/縦書き)
  • 各種の引用符(全角/半角)
  • ダーシ、波ダーシ、チルダ (全角)
  • 半角空白も含んでいるので、選択単語の左右の半角空白も削除できます。
  • 1回の実行につき1組のカッコ囲いをはずします。
例. 以下の行で [ "hoge" ] を範囲選択して連続で実行した場合、次のように作用します。
( [ "hoge" ] )	// 元の文字列

(  "hoge"  )	// 1回 実行後: [  と  ] を削除しました。
( "hoge" )	// 2回 実行後: ␣ と ␣ を削除しました。
( hoge )	// 3回 実行後: "  と  " を削除しました。
(hoge)		// 4回 実行後: ␣ と ␣ を削除しました。
hoge		// 5回 実行後: (  と  ) を削除しました。


ソースコード

#title="カッコをはずす"
#tooltip="対になるカッコを除去する"

/**
 * 選択範囲の最初の1文字と最後の1文字が「対になるカッコ」のとき、カッコ囲いをはずします。
 * 選択範囲の外側 (前と後) の各1文字がカッコのときも、カッコをはずせます。
 */

// ▼「対になるカッコ」の種類を列挙する ▼ 
// (※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ)
var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〟‘’“”――~~〜〜  ";

// ■ 選択範囲の外側 (前と後) の各1文字がカッコのときも除去する? ■ 
// (※ 選択範囲の前後を1文字ずつ拡張してカッコを除去する)
var removeOuterBracketsEnable = true;	// true:する / false:しない


var d = document;
var s = d.selection;
var st = s.Text;	// 選択範囲の文字列
var act = s.GetActivePos();
var anc = s.GetAnchorPos();
var tPos = ( anc < act ) ? anc : act;	// 選択範囲の先頭位置
var bPos = ( anc < act ) ? act : anc;	// 選択範囲の末尾位置
var del = false;

// 選択範囲内の最初と最後の各1文字がカッコのとき
for ( var i = 0; i < brackets.length - 1; i ++ ) {
  var o = brackets[ i ];	// 開きカッコ
  var c = brackets[ i + 1 ]	// 閉じカッコ
  if ( st.length > 1 && i % 2 == 0
      && st.charAt( 0 ) == o
      && st.charAt( st.length - c.length ) == c ) {
    s.Text = st.slice( o.length, - c.length );	// 先頭と末尾の各1文字ずつを削除
    s.SetAnchorPos( tPos );	// 選択範囲を復帰する
    Status = " " + ( o == " " ? "␣" : o ) + "  と  "
           + ( c == " " ? "␣" : c ) + "  を削除しました。";
    del = true;
    break;
  }
}

// 選択範囲の外側 (前と後) の各1文字がカッコのとき
if ( removeOuterBracketsEnable && ! del ) {
  for ( var i = 0; i < brackets.length - 1; i ++ ) {
    var o = brackets[ i ];	// 開きカッコ
    var c = brackets[ i + 1 ]	// 閉じカッコ
    if ( i % 2 == 0
        && d.Text.charAt( tPos - o.length ) == o
        && d.Text.charAt( bPos ) == c ) {
      s.SetAnchorPos( tPos - o.length );	// 選択範囲の先頭を1文字拡張する
      s.SetActivePos( bPos + c.length, true );	// 選択範囲の末尾を1文字拡張する
      st = s.Text;
      s.Text = st.slice( o.length, - c.length );	// 先頭と末尾の各1文字ずつ削除
      s.SetAnchorPos( tPos - o.length );	// 選択範囲を復帰する
      Status = " " + ( o == " " ? "␣" : o ) + "  と  "
             + ( c == " " ? "␣" : c ) + "  を削除しました。";
      break;
    }
  }
}
スポンサーリンク