「カッコで囲う」の版間の差分

提供:MeryWiki
ナビゲーションに移動 検索に移動
(修正)
(組みこみ用コード「wiki用 文字列装飾」と「挿入型コメントアウト」を追加 他)
1行目: 1行目:
ポップアップメニューから任意の'''カッコ'''や'''ダッシュ'''などの種類を選択して、選択範囲を囲います。<br>
= カッコで囲う (ポップアップメニューあり) =
ポップアップメニューから任意の'''カッコ'''や'''ダッシュ'''などの種類を選択して、選択範囲を'''カッコ'''やいろいろな文字列で囲います。<br>
選択範囲がないばあい、基本的にはカーソル位置に (), <>, [], {}, 「」, … などを挿入します。
選択範囲がないばあい、基本的にはカーソル位置に (), <>, [], {}, 「」, … などを挿入します。


ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択などで末尾改行が含まれているばあい、さいごの改行を無視します。  
ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択などで末尾改行が含まれているばあい、さいごの改行を無視します。  


作成にあたり、「[[引用の追加]]」マクロと[[キーアサイン集]]の「[[%E3%82%AD%E3%83%BC%E3%82%A2%E3%82%B5%E3%82%A4%E3%83%B3%E9%9B%86#.E6.8B.AC.E5.BC.A7.E3.81.A7.E6.8C.9F.E3.82.80|括弧で挟む]]」マクロのコードを参考にしました。
作成にあたり、「[[引用の追加]]」マクロと[[キーアサイン集]]の「[[キーアサイン集#括弧で挟む|括弧で挟む]]」マクロのコードを参考にしました。


* ソースコード<div id="ソースコード"> </div>
<source lang="javascript">
<source lang="javascript">
#title = "カッコ..."
#title = "カッコ..."
26行目: 28行目:
// ポップアップメニュー項目の定義
// ポップアップメニュー項目の定義
var m = CreatePopupMenu();
var m = CreatePopupMenu();
// m.Add( "カッコの種類・表示名 (&アクセラレータキー)", ID ) ※インデックス ID は 0番 スタートで p1, p2 の並び順に対応
// m.Add( "カッコの種類・表示名 (&アクセラレータキー)", ID )
m.Add( " ( 半角 丸カッコ )  (&P)", 1 ); // Parenthesis
// m.Add( … ); の各行は、任意に上下移動(並べ替え)してもよい。
m.Add( "< 半角 山カッコ > (&A)", 2 ); // Angle brackets ※半角不等号 < / > (キーボードの[ね]/[る]
// インデックス ID は 0番 スタートで、配列 p1, p2 の並び順と
m.Add( " [ 半角 角カッコ ]  (&B)", 3 ); // square Brackets
// テキスト変換処理の case ID: に対応しているので変更しないこと!
m.Add( " { 半角 波カッコ }  (&C)", 4 ); // Curly brackets
m.Add( " ( 半角 丸カッコ )  (&P)", 1 ); // Parenthesis
m.Add( "< 半角 山カッコ > (&A)", 2 ); // Angle brackets ※半角不等号 < / > (キーボードの[ね]/[る]
m.Add( " [ 半角 角カッコ ]  (&B)", 3 ); // square Brackets
m.Add( " { 半角 波カッコ }  (&C)", 4 ); // Curly brackets
m.Add( "", 0, meMenuSeparator );
m.Add( "", 0, meMenuSeparator );
m.Add( "( 全角 丸カッコ ) (&R)", 5 ); // Round brackets
m.Add( "( 全角 丸カッコ ) (&R)", 5 ); // Round brackets
m.Add( "", 0, meMenuSeparator );
m.Add( "", 0, meMenuSeparator );
m.Add( "「 全角 かぎカッコ 」 (&K)", 6 ); // Kakko
m.Add( "「 全角 かぎカッコ 」 (&K)", 6 ); // Kakko
49行目: 54行目:
m.Add( "1文字ずつ前後を削除 (&1)", 16 );
m.Add( "1文字ずつ前後を削除 (&1)", 16 );
m.Add( "2文字ずつ前後を削除 (&2)", 17 );
m.Add( "2文字ずつ前後を削除 (&2)", 17 );
m.Add( "3文字ずつ前後を削除 (&3)", 18 );
// m.Add( "", 0, meMenuSeparator );
// m.Add( "", 0, meMenuSeparator );
// m.Add( "キャンセル", 0 ); // Escキーでキャンセルできるのでアクセラレータなし
// m.Add( "キャンセル", 0 ); // Escキーでキャンセルできるのでアクセラレータなし
55行目: 61行目:
// m.Track(0); ならキャレット位置、Track(1); ならカーソル位置にサブメニューがポップアップ
// m.Track(0); ならキャレット位置、Track(1); ならカーソル位置にサブメニューがポップアップ
var r = m.Track( mePosMouse = 1 ); // 選択されたメニュー項目のIDを r に格納する
var r = m.Track( mePosMouse = 1 ); // 選択されたメニュー項目のIDを r に格納する


if ( r > 0 ) {
if ( r > 0 ) {
72行目: 79行目:
   }
   }
   var st = s.Text;
   var st = s.Text;


   // IDごとのテキスト変換処理
   // IDごとのテキスト変換処理
   switch (r) {
   switch (r) {


     case 1:  case 2:  case 3:  case 4:  case 5:  case 6:  case 7:  case 8: // カッコ(スペースなし)
 
    // カッコ(スペースなし)
     case 1:  case 2:  case 3:  case 4:  case 5:  case 6:  case 7:  case 8:
       if ( s.IsEmpty ) { // 選択範囲がなければ
       if ( s.IsEmpty ) { // 選択範囲がなければ
         document.Write( p1[r] + p2[r] ); // カッコ p1 & p2 だけをカーソル位置に挿入
         document.Write( p1[r] + p2[r] ); // カッコ p1 & p2 だけをカーソル位置に挿入
87行目: 97行目:
       break;
       break;


     case 9:  case 10:  case 11:  case 12: // カッコ(スペースつき)
 
    // カッコ(スペースつき)
     case 9:  case 10:  case 11:  case 12:
       if ( ! s.IsEmpty ) { // 選択範囲があれば
       if ( ! s.IsEmpty ) { // 選択範囲があれば
         s.Text = p1[r] + st + p2[r]; // 選択範囲 st をカッコ p1 & p2 で囲う
         s.Text = p1[r] + st + p2[r]; // 選択範囲 st をカッコ p1 & p2 で囲う
94行目: 106行目:
       break;
       break;


     case 13:  case 14:  case 15: // ハイフン、ダッシュ、チルダ
 
    // ハイフン、ダッシュ、チルダ
     case 13:  case 14:  case 15:
       if ( s.IsEmpty ) { // 選択範囲がなければ
       if ( s.IsEmpty ) { // 選択範囲がなければ
         document.Write( p1[r] ); // 片側 p1 だけをカーソル位置に挿入
         document.Write( p1[r] ); // 片側 p1 だけをカーソル位置に挿入
104行目: 118行目:
       break;
       break;


     case 16:  case 17: // n文字ずつ前後を削除
 
       if ( ! s.IsEmpty ) { // 選択範囲があれば
    // n文字ずつ前後を削除
         if ( r == 16 )
     case 16:  case 17: case 18:
          var n = 1;
       if ( ! s.IsEmpty ) { // 選択範囲があれば
         else
        var n;
          var n = 2;
         if ( r == 16 ) n = 1; // 1文字ずつ
         s.Text = st.slice( n, st.length - n ); // 選択範囲の前後から 1文字 or 2文字 消す
         else if ( r == 17 ) n = 2; // 2文字ずつ
        else if ( r == 18 ) n = 3; // 3文字ずつ
         s.Text = st.slice( n, st.length - n ); // 選択範囲の両端から n文字ずつ 消す
         s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
         s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
       }
       }
122行目: 138行目:


<!-- 記
<!-- 記
case1~8 の "s.CharLeft( false, p2[r].length );" を  
* case1~8 の "s.CharLeft( false, p2[r].length );" を "s.SetActivePos( s.GetActivePos() - p2[r].length );" に変更 (2018/08/27 sukemaru)
"s.SetActivePos( s.GetActivePos() - p2[r].length );" に変更 (2018/08/27 sukemaru)
* 「3文字ずつ前後を削除」を追加 (2018/10/12 sukemaru)
-->
 
= 組み込み用コード =
追加コードです。<br>
全部入りのソースをダウンロード → 「[[ファイル:カッコで囲う.zip]](アイコン入り)」 (2018/10/12)
 
== wiki用 文字列装飾 ==
5種類の '''wiki用 文字列装飾''' を「[[#カッコで囲う (ポップアップメニューあり)|カッコで囲う]]」マクロのポップアップメニュー項目として組みこむことができます。
* '''太字'''
: 選択範囲の両端を '''<nowiki>'''</nowiki>'''(シングルクオート×3) で囲います。
* ''斜体(Italic)''
: 選択範囲の両端を '''<nowiki>''</nowiki>'''(シングルクオート×2) で囲います。
* <u>下線</u>
: 選択範囲の両端を '''<nowiki><u></nowiki>''' と '''<nowiki></u></nowiki>''' で囲います。
* <nowiki>[[内部リンク]]</nowiki>
: 選択範囲の両端を '''<nowiki>[[</nowiki>''' と '''<nowiki>]]</nowiki>''' で囲い、<nowiki>[[リンク|ラベル]]</nowiki> 型のハイパーリンクにします。
* <​nowiki>文字列<​/nowiki>
: 選択範囲の両端を '''<​nowiki>''' と '''<​/nowiki>''' で囲います。
※「[[#カッコで囲う (ポップアップメニューあり)|カッコで囲う]]」マクロの既存の項目を減らしたいばあいは、 <u>''"m.Add( … );"''</u> の行を // でコメントアウトするとその項目をメニューから隠せます。
 
 
* 「[[#ソースコード|カッコで囲う]]」マクロのコードに以下のブロックを追加します。
<u>1. ''"p1", "p2"''  の配列を上書き</u>
<source lang="javascript">
// 開きカッコ p1 を配列で定義
var p1 = new Array( "",  "(",  "<",  "[",  "{",  "(",  "「",  "『",  "【",  " (",  " (",  " \"",  " ",  " - ",  "――",  "~",  "'''",  "''",  "<u>",  "[[", "<nowiki>" );
// 閉じカッコ p2 を配列で定義
var p2 = new Array( "",  ")",  ">",  "]",  "}",  ")",  "」",  "』",  "】",  ") ",  ") ",  "\" ",  " ",  " - ",  "――",  "~",  "'''",  "''",  "</u>",  "]]", "</nowiki>" );
// メニュー項目のID("0", "1",  "2",  "3",  "4",  "5",  "6",  "7",  "8",  "9",    "10",  "11",  "12", "13",  "14",    "15",  "16",  "17",  "18",  19",  "20" )
</source>
 
<u>2. ''"m.Add( … );"''  のグループに追加(位置・並び順は任意)</u>
<source lang="javascript">
m.Add( "", 0, meMenuSeparator ); // アクセラレータは任意で割りあててください
m.Add( "'''  wiki 太字  '''", 16 );
m.Add( "''   wiki 斜体   ''", 17 );
m.Add( "<u> wiki 下線 </u>", 18 );
m.Add( "[[  wiki リンク  ]]", 19 );
m.Add( "<nowiki> </nowiki>", 20 );
</source>
 
<u>3. ''"␣␣␣␣default:"''  のうえに挿入</u>
<source lang="javascript">
    // wiki 文字装飾 ※ 太字/斜体/下線
    case 16:  case 17:  case 18: case 20:
      if ( s.IsEmpty ) { // 選択範囲がなければ
        document.Write( p1[r] + " " + p2[r] ); // p1 & p2 と全角スペースを挿入
        s.SetActivePos( s.GetActivePos() - p2[r].length ); // カーソルをカッコのなかに移動
        s.SetAnchorPos( s.GetActivePos() - 1 ); //カッコの中の全角スペースを範囲選択状態にする
      }
      else { // 選択範囲があれば
        s.Text = AddBrackets( st, p1[r], p2[r] ); // 選択範囲 st を p1 & p2 で囲う
        s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
      }
      break;
 
 
    // wiki 文字装飾 ※ [[リンク|ラベル]]
    case 19:
      if ( s.IsEmpty ) { // 選択範囲がなければ
        document.Write( p1[r] + " | " + p2[r] ); // p1 & p2 と " | " を挿入
        s.SetActivePos( s.GetActivePos() - p2[r].length ); // カーソルをカッコのなかに移動
        s.SetAnchorPos( s.GetActivePos() - 3 ); //カッコの中の半角スペースを範囲選択状態にする
      }
      else { // 選択範囲があれば
        s.Text =  p1[r] + st + "|" + st + p2[r]; // 選択範囲 st を [[st|st]] に置換
        s.SetActivePoint( mePosLogical, ax + p1[r].length, ay ); // p1 の後ろにカーソルを移動する
      }
      break;
</source>
*ポップアップメニュー項目とカッコの定義配列 ''"var px = new Array( … )"''  に16コ以上詰めこんでいるばあいは、追加コードのID '''16~20''' を適当な数字に変更し、配列を適宜修正してください。
※ wiki の編集をする人はメッタにいないとおもいますので、適当にアレンジしてご活用ください。
(sukemaru 自身も、ふだんはコメントアウトしています)
 
<!-- 記
「wiki用 文字列装飾」の項目を追加 (2018/10/12 sukemaru)
-->
 
== 挿入型コメントアウト ==
3種類の '''挿入型コメントアウト''' を「[[#カッコで囲う (ポップアップメニューあり)|カッコで囲う]]」または「[[引用の追加]]」マクロのポップアップメニュー項目として組みこむことができます。
* /* JavaScript 挿入型コメントアウト1 */
: 選択範囲の両端を '''/* ''' と ''' */''' で囲います。
* /* *JavaScript コメントアウト2(複数行) */
: 選択範囲の両端を "'''/* \n'''" と "'''\n */'''" で囲い、範囲内の各行の行頭に "''' * '''" を付けます。
* <nowiki><!-- XML 挿入型コメントアウト --></nowiki>
: 選択範囲の両端を '''<nowiki><!-- </nowiki>''' と '''<nowiki> --></nowiki>''' で囲います。
※「[[#カッコで囲う (ポップアップメニューあり)|カッコで囲う]]」および「[[引用の追加]]」マクロの既存の項目を減らしたいばあいは、 <u>''"m.Add( … );"''</u> の行を // でコメントアウトするとその項目をメニューから隠せます。
 
 
* 「[[#ソースコード|カッコで囲う]]」または「[[引用の追加]]」マクロのコードに以下のブロックを追加します。<br>
: ※ 配列の定義 <u>''"var XX = new Array( … )"''</u> の行には手を入れないので、「[[引用の追加]]」マクロのポップアップメニュー項目「1つ削除」や「すべて削除」からはアンコメントされません。
 
<u>1. ''"m.Add( … );"''  のグループに追加(位置・並び順は任意)</u>
<source lang="javascript">
m.Add( "", 0, meMenuSeparator ); // 重複しているアクセラレータは任意で再割りあてしてください
m.Add( "/*␣ コメントアウト1  ␣*/ (&J)", 21 ); // JavaScript comment-out
m.Add( "/* *␣ コメントアウト2  ␣*/ (&J)", 22 ); // JavaScript comment-out (multiple lines)
m.Add( "JS アンコメント (&U)", 23 ); // Uncomment
m.Add( "", 0, meMenuSeparator );
m.Add( "<!--␣ コメントアウト ␣--> (&X)", 24 ); // XML comment-out
m.Add( "XML アンコメント (&X)", 25 );
</source>
 
 
<u>2. ''"␣␣␣␣default:"''  のうえに挿入</u>
<source lang="javascript">
    /* JavaScript コメントアウト1 */
    case 21:
      var p1 = "/* ", p2 = " */";
      if ( s.IsEmpty ){ // 選択範囲がなければ
        document.Write( p1 + p2 ); // コメントマーク /* & */ だけ挿入
        s.SetActivePos( s.GetActivePos() - p2.length ); // カーソルをコメント枠のなかに移動
      }
      else { // 選択範囲があれば
        s.Text = p1 + st + p2; // 選択範囲 st を /* コメントアウト */
        s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
      }
      break;
 
 
    /* * JavaScript コメントアウト2 */
    case 22:
      var p1 = "/* \n", p2 = "\n */", ast = " * ";
      if ( s.IsEmpty ){ // 選択範囲がなければ
        document.Write( p1 + ast + p2 ); // コメントマーク /* \n * & * & \n */ だけ挿入
        s.SetActivePos( s.GetActivePos() - p2.length ); // カーソルをコメント枠のなかに移動
      }
      else { // 選択範囲があれば
        s.Text = CommentOutJS( st, p1, p2, ast ); // 選択範囲全体を /* *コメントアウト */
        s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
      }
      break;
 
 
    // JSアンコメント ※選択範囲内の各行頭のコメントマークにのみマッチ
    case 23: // case 21 & 22 の /*␣ JavaScript コメント ␣*/ をアンコメントする
/*
* このタイプの複数行のコメントにたいしてもアンコメント処理します。
* 行頭のアスタリスクの前後のスペースは削除されます。
*/
      if ( ! s.IsEmpty ) { // 選択範囲があれば
        s.Text = UnCommentJS( st ); // コメントアウトを解除
        s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
      }
      break;
 
 
    // <!-- XML コメントアウト -->
    case 24:
      var p1 = "<!-- ", p2 = " -->";
      if ( s.IsEmpty ) { // 選択範囲がなければ
        document.Write( p1 + p2 ); // コメントマーク <!-- & --> だけ挿入
        s.SetActivePos( s.GetActivePos() - p2.length ); // カーソルをカッコのなかに移動
      }
      else { // 選択範囲があれば
        s.Text = p1 + st + p2; // 選択範囲 st を <!-- コメントアウト -->
        s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
      }
      break;
 
 
    // XML アンコメント ※選択範囲の先頭と末尾のコメントマーク "<!-- " " -->" にマッチ
    case 25: // case 38 の <!--␣ XMLコメント ␣--> をアンコメントする
      if ( ! s.IsEmpty ) { // 選択範囲があれば
        s.Text = st.replace( /^\s*<!-- ?/ , "" ).replace( / ?-->\s*$/ , "" ); // 先頭と末尾のコメントマークを削除
        s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
      }
      break;
</source>
 
 
<u>3. ソースコードの末尾 ( "'''}'''" の下) に追加</u>
<source lang="javascript">
function CommentOutJS( arg1, arg2, arg3, arg4 ) { // CommentOutJS( st, p1, p2, ast )
  var a = arg1.split( "\n" ); // 選択範囲 st を "\n" で区切って配列 a に格納する
  for ( var i = 0; i < a.length; i++ ) // 「1行め」から「st の行数」回分だけ繰りかえし処理
    a[i] = arg4 + a[i]; // 各行の先頭に ast = " * " を追加する
  return arg2 + a.join( "\n" ) + arg3; // 各行を "\n" で区切って連結し、先頭に p1 = "/*\n"、末尾に p2 = "\n */" を付け足す
}
 
function UnCommentJS( arg1 ) { // UnCommentJS( st )
  var re1 = /^\/\*+\s*([^\n]*?\n?)/; // 先頭行の正規表現
  var re2 = /(\n?[^\n]*?)\s*\*?\/$/; // 末行の正規表現
  var re3 = /^\s*\*\s*/; // 中間行の行頭の正規表現
  var a = arg1.split( "\n" ); // 選択範囲 st を "\n" で区切って配列 a に格納する
  for ( var i = 0; i < a.length - 1; i++ ) // 「1行め」から「st の行数 -1」回分だけ繰りかえし処理
    a[i] = a[i].replace( re3 ,"" ); // 各行頭のアスタリスクを削除
  return a.join( "\n" ).replace( re1 , "$1" ).replace( re2 , "$1" ); // 各行を "\n" で区切って連結し、先頭行と末行のコメントマークを削除
}
</source>
*ポップアップメニュー項目とカッコ/引用符の定義配列 ''"var XX = new Array( … )"''  に20コ以上詰めこんでいるばあいは、追加コードのID '''21~26''' を適当な数字に変更してください。
「[[引用の追加]]」マクロへの組みこみ用コードには、別途「[[行の先頭に貼り付け#「引用の追加」マクロへの組みこみ用コード|行の先頭に貼り付け]]」もあります。
 
<!-- 記
「挿入型コメントアウト」の項目を追加 (2018/10/12 sukemaru)
  -->
  -->


155行目: 366行目:
   s.SetAnchorPoint( mePosLogical, ax, ay ); // カッコを含めて範囲選択
   s.SetAnchorPoint( mePosLogical, ax, ay ); // カッコを含めて範囲選択
</source>
</source>
= メモ =
* 2018/08/24 (sukemaru)
: ページを新規作成
* 2018/08/26 (sukemaru)
: 「カッコで囲う (ポップアップメニューなし)」の節を追加
* 2018/08/27 (sukemaru)
: 「カッコで囲う (ポップアップメニューあり)」のソースコードを修正
: case1~8 の "<u>s.CharLeft( false, p2[r].length );</u>" を "<u>s.SetActivePos( s.GetActivePos() - p2[r].length );</u>" に変更
* 2018/10/12 (sukemaru)
: 「カッコで囲う (ポップアップメニューあり)」のソースコードに "3文字ずつ前後を削除" を追加
: 組みこみ用コード「wiki用 文字列装飾」と「挿入型コメントアウト」の節を追加
: 「カッコで囲う.zip」のダウンロードリンクを追加

2018年10月12日 (金) 13:12時点における版

カッコで囲う (ポップアップメニューあり)

ポップアップメニューから任意のカッコダッシュなどの種類を選択して、選択範囲をカッコやいろいろな文字列で囲います。
選択範囲がないばあい、基本的にはカーソル位置に (), <>, [], {}, 「」, … などを挿入します。

ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択などで末尾改行が含まれているばあい、さいごの改行を無視します。

作成にあたり、「引用の追加」マクロとキーアサイン集の「括弧で挟む」マクロのコードを参考にしました。

  • ソースコード
#title = "カッコ..."
#tooltip = "カッコで囲う"
/**
 * ポップアップメニューからカッコの種類を選択して、選択範囲をカッコで囲う
 * 複数行の選択範囲で末尾が改行 \n のとき、さいごの改行は除外する
 * 非選択時には、それぞれことなる動作をする
 * 
 * 項目(カッコの種類)の追加や変更も自由にでき、
 * 項目を減らしたいばあいは m.Add(); の行を // でコメントアウトするだけでよい
 */

// 開きカッコ p1 を配列で定義
var p1 = new Array( "",  "(",  "<",  "[",  "{",  "(",  "「",  "『",  "【",  " (",  " (",  " \"",  " ",  " - ",  "――",  "~",  "" );
// 閉じカッコ p2 を配列で定義
var p2 = new Array( "",  ")",  ">",  "]",  "}",  ")",  "」",  "』",  "】",  ") ",  ") ",  "\" ",  " ",  " - ",  "――",  "~",  "" );
// メニュー項目のID("0", "1",  "2",  "3",  "4",  "5",   "6",   "7",   "8",   "9",    "10",  "11",   "12", "13",   "14",    "15",  "" )

// ポップアップメニュー項目の定義
var m = CreatePopupMenu();
// m.Add( "カッコの種類・表示名 (&アクセラレータキー)", ID )
// m.Add( … ); の各行は、任意に上下移動(並べ替え)してもよい。
// インデックス ID は 0番 スタートで、配列 p1, p2 の並び順と
// テキスト変換処理の case ID: に対応しているので変更しないこと!
m.Add( " ( 半角 丸カッコ )  (&P)", 1 );		// Parenthesis
m.Add( "< 半角 山カッコ > (&A)", 2 );		// Angle brackets	※半角不等号 < / > (キーボードの[ね]/[る]
m.Add( " [ 半角 角カッコ ]  (&B)", 3 );		// square Brackets
m.Add( " { 半角 波カッコ }  (&C)", 4 );		// Curly brackets
m.Add( "", 0, meMenuSeparator );
m.Add( "( 全角 丸カッコ ) (&R)", 5 );		// Round brackets
m.Add( "", 0, meMenuSeparator );
m.Add( "「 全角 かぎカッコ 」 (&K)", 6 );	// Kakko
m.Add( "『 全角 二重かぎカッコ 』 (&W)", 7 );	// White corner brackets
m.Add( "【 全角 スミ付きカッコ 】 (&L)", 8 );	// Lenticular brackets
m.Add( "", 0, meMenuSeparator );
m.Add( "␣( 全角 丸カッコ )␣ (&Z)", 9 );	// Zenkaku (full-width)
m.Add( "␣ ( 半角 丸カッコ ) ␣ (&H)", 10 );	// Hankaku (half-width)
m.Add( "␣ \" 半角 引用符 \" ␣ (&Q)", 11 );	// double Quotation mark	キーボードの[ふ]キー
m.Add( "␣ 半角 スペース ␣ (&S)", 12 );	// Space
m.Add( "", 0, meMenuSeparator );
m.Add( "␣-␣ 半角 ハイフン ␣-␣ (&M)", 13 );	// hyphen-Minus	キーボードの[ほ]キー
m.Add( "―― 全角 ダッシュ ―― (&D)", 14 );	// Dash
m.Add( "~  全角 チルダ  ~ (&T)", 15 );	// Tilde	キーボードの[へ]キー
m.Add( "", 0, meMenuSeparator );
m.Add( "1文字ずつ前後を削除 (&1)", 16 );
m.Add( "2文字ずつ前後を削除 (&2)", 17 );
m.Add( "3文字ずつ前後を削除 (&3)", 18 );
// m.Add( "", 0, meMenuSeparator );
// m.Add( "キャンセル", 0 );	//	Escキーでキャンセルできるのでアクセラレータなし

// ポップアップメニューを表示
// m.Track(0); ならキャレット位置、Track(1); ならカーソル位置にサブメニューがポップアップ
var r = m.Track( mePosMouse = 1 );	// 選択されたメニュー項目のIDを r に格納する


if ( r > 0 ) {
  var s = document.selection

  // 選択範囲の各座標を取得
  var ax = s.GetTopPointX( mePosLogical );
  var ay = s.GetTopPointY( mePosLogical );
  var bx = s.GetBottomPointX( mePosLogical );
  var by = s.GetBottomPointY( mePosLogical );

  // 選択範囲の文字列を取得(さいごの改行を含めない)
  if ( ! s.IsEmpty && bx == 1 ) {
    s.SetActivePoint( mePosLogical, 1, by - 1 );
    s.EndOfLine( false, mePosLogical );
    s.SetAnchorPoint( mePosLogical, ax, ay );
  }
  var st = s.Text;


  // IDごとのテキスト変換処理
  switch (r) {


    // カッコ(スペースなし)
    case 1:  case 2:  case 3:  case 4:  case 5:  case 6:  case 7:  case 8:
      if ( s.IsEmpty ) {	// 選択範囲がなければ
        document.Write( p1[r] + p2[r] );	// カッコ p1 & p2 だけをカーソル位置に挿入
        s.SetActivePos( s.GetActivePos() - p2[r].length );	// カーソルをカッコのなかに移動
      }
      else {	// 選択範囲があれば
        s.Text = p1[r] + st + p2[r];	// 選択範囲 st をカッコ p1 & p2 で囲う
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;


    // カッコ(スペースつき)
    case 9:  case 10:  case 11:  case 12:
      if ( ! s.IsEmpty ) {	// 選択範囲があれば
        s.Text = p1[r] + st + p2[r];	// 選択範囲 st をカッコ p1 & p2 で囲う
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;


    // ハイフン、ダッシュ、チルダ
    case 13:  case 14:  case 15:
      if ( s.IsEmpty ) {	// 選択範囲がなければ
        document.Write( p1[r] );	// 片側 p1 だけをカーソル位置に挿入
      }
      else {	// 選択範囲があれば
        s.Text = p1[r] + st + p2[r];	// 選択範囲 st をカッコ p1 & p2 で囲う
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;


    // n文字ずつ前後を削除
    case 16:  case 17:  case 18:
      if ( ! s.IsEmpty ) {		// 選択範囲があれば
        var n;
        if ( r == 16 ) n = 1;		// 1文字ずつ
        else if ( r == 17 ) n = 2;	// 2文字ずつ
        else if ( r == 18 ) n = 3;	// 3文字ずつ
        s.Text = st.slice( n, st.length - n );		// 選択範囲の両端から n文字ずつ 消す
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;

    default:
      break;
  }
}


組み込み用コード

追加コードです。
全部入りのソースをダウンロード → 「ファイル:カッコで囲う.zip(アイコン入り)」 (2018/10/12)

wiki用 文字列装飾

5種類の wiki用 文字列装飾 を「カッコで囲う」マクロのポップアップメニュー項目として組みこむことができます。

  • 太字
選択範囲の両端を '''(シングルクオート×3) で囲います。
  • 斜体(Italic)
選択範囲の両端を ''(シングルクオート×2) で囲います。
  • 下線
選択範囲の両端を <u></u> で囲います。
  • [[内部リンク]]
選択範囲の両端を [[]] で囲い、[[リンク|ラベル]] 型のハイパーリンクにします。
  • <​nowiki>文字列<​/nowiki>
選択範囲の両端を <​nowiki><​/nowiki> で囲います。

※「カッコで囲う」マクロの既存の項目を減らしたいばあいは、 "m.Add( … );" の行を // でコメントアウトするとその項目をメニューから隠せます。


  • カッコで囲う」マクロのコードに以下のブロックを追加します。

1. "p1", "p2" の配列を上書き

// 開きカッコ p1 を配列で定義
var p1 = new Array( "",  "(",  "<",  "[",  "{",  "(",  "「",  "『",  "【",  " (",  " (",  " \"",  " ",  " - ",  "――",  "~",  "'''",  "''",  "<u>",  "[[", "<nowiki>" );
// 閉じカッコ p2 を配列で定義
var p2 = new Array( "",  ")",  ">",  "]",  "}",  ")",  "」",  "』",  "】",  ") ",  ") ",  "\" ",  " ",  " - ",  "――",  "~",  "'''",  "''",  "</u>",  "]]", "</nowiki>" );
// メニュー項目のID("0", "1",  "2",  "3",  "4",  "5",   "6",   "7",   "8",   "9",    "10",  "11",   "12", "13",   "14",    "15",  "16",   "17",  "18",   19",   "20" )

2. "m.Add( … );" のグループに追加(位置・並び順は任意)

m.Add( "", 0, meMenuSeparator );	// アクセラレータは任意で割りあててください
m.Add( "'''  wiki 太字  '''", 16 );
m.Add( "''   wiki 斜体   ''", 17 );
m.Add( "<u> wiki 下線 </u>", 18 );
m.Add( "[[  wiki リンク  ]]", 19 );
m.Add( "<nowiki> </nowiki>", 20 );

3. "␣␣␣␣default:" のうえに挿入

    // wiki 文字装飾	※ 太字/斜体/下線
    case 16:  case 17:  case 18: case 20:
      if ( s.IsEmpty ) {					// 選択範囲がなければ
        document.Write( p1[r] + " " + p2[r] );			// p1 & p2 と全角スペースを挿入
        s.SetActivePos( s.GetActivePos() - p2[r].length );	// カーソルをカッコのなかに移動
        s.SetAnchorPos( s.GetActivePos() - 1 );			//カッコの中の全角スペースを範囲選択状態にする
      }
      else {							// 選択範囲があれば
        s.Text = AddBrackets( st, p1[r], p2[r] );		// 選択範囲 st を p1 & p2 で囲う
        s.SetAnchorPoint( mePosLogical, ax, ay );		// 選択範囲を復元
      }
      break;


    // wiki 文字装飾	※ [[リンク|ラベル]]
    case 19:
      if ( s.IsEmpty ) {					// 選択範囲がなければ
        document.Write( p1[r] + " | " + p2[r] );		// p1 & p2 と " | " を挿入
        s.SetActivePos( s.GetActivePos() - p2[r].length );	// カーソルをカッコのなかに移動
        s.SetAnchorPos( s.GetActivePos() - 3 );			//カッコの中の半角スペースを範囲選択状態にする
      }
      else {							// 選択範囲があれば
        s.Text =  p1[r] + st + "|" + st + p2[r];		// 選択範囲 st を [[st|st]] に置換
        s.SetActivePoint( mePosLogical, ax + p1[r].length, ay );	// p1 の後ろにカーソルを移動する
      }
      break;
  • ポップアップメニュー項目とカッコの定義配列 "var px = new Array( … )" に16コ以上詰めこんでいるばあいは、追加コードのID 16~20 を適当な数字に変更し、配列を適宜修正してください。

※ wiki の編集をする人はメッタにいないとおもいますので、適当にアレンジしてご活用ください。 (sukemaru 自身も、ふだんはコメントアウトしています)


挿入型コメントアウト

3種類の 挿入型コメントアウト を「カッコで囲う」または「引用の追加」マクロのポップアップメニュー項目として組みこむことができます。

  • /* JavaScript 挿入型コメントアウト1 */
選択範囲の両端を /* */ で囲います。
  • /* *JavaScript コメントアウト2(複数行) */
選択範囲の両端を "/* \n" と "\n */" で囲い、範囲内の各行の行頭に " * " を付けます。
  • <!-- XML 挿入型コメントアウト -->
選択範囲の両端を <!-- --> で囲います。

※「カッコで囲う」および「引用の追加」マクロの既存の項目を減らしたいばあいは、 "m.Add( … );" の行を // でコメントアウトするとその項目をメニューから隠せます。


※ 配列の定義 "var XX = new Array( … )" の行には手を入れないので、「引用の追加」マクロのポップアップメニュー項目「1つ削除」や「すべて削除」からはアンコメントされません。

1. "m.Add( … );" のグループに追加(位置・並び順は任意)

m.Add( "", 0, meMenuSeparator );			// 重複しているアクセラレータは任意で再割りあてしてください
m.Add( "/*␣ コメントアウト1  ␣*/ (&J)", 21 );	// JavaScript comment-out
m.Add( "/* *␣ コメントアウト2  ␣*/ (&J)", 22 );	// JavaScript comment-out (multiple lines)
m.Add( "JS アンコメント (&U)", 23 );			// Uncomment
m.Add( "", 0, meMenuSeparator );
m.Add( "<!--␣ コメントアウト ␣--> (&X)", 24 );	// XML comment-out
m.Add( "XML アンコメント (&X)", 25 );


2. "␣␣␣␣default:" のうえに挿入

    /* JavaScript コメントアウト1 */
    case 21:
      var p1 = "/* ", p2 = " */";
      if ( s.IsEmpty ){						// 選択範囲がなければ
        document.Write( p1 + p2 );				// コメントマーク /* & */ だけ挿入
        s.SetActivePos( s.GetActivePos() - p2.length );		// カーソルをコメント枠のなかに移動
      }
      else {							// 選択範囲があれば
        s.Text = p1 + st + p2;					// 選択範囲 st を /* コメントアウト */
        s.SetAnchorPoint( mePosLogical, ax, ay );		// 選択範囲を復元
      }
      break;


    /* * JavaScript コメントアウト2 */
    case 22:
      var p1 = "/* \n", p2 = "\n */", ast = " * ";
      if ( s.IsEmpty ){						// 選択範囲がなければ
        document.Write( p1 + ast + p2 );			// コメントマーク /* \n * & * & \n */ だけ挿入
        s.SetActivePos( s.GetActivePos() - p2.length );		// カーソルをコメント枠のなかに移動
      }
      else {							// 選択範囲があれば
        s.Text = CommentOutJS( st, p1, p2, ast );		// 選択範囲全体を /* *コメントアウト */
        s.SetAnchorPoint( mePosLogical, ax, ay );		// 選択範囲を復元
      }
      break;


    // JSアンコメント		※選択範囲内の各行頭のコメントマークにのみマッチ
    case 23:			// case 21 & 22 の /*␣ JavaScript コメント ␣*/ をアンコメントする
/* 
 * このタイプの複数行のコメントにたいしてもアンコメント処理します。
 * 行頭のアスタリスクの前後のスペースは削除されます。
 */
      if ( ! s.IsEmpty ) {				// 選択範囲があれば
        s.Text = UnCommentJS( st );			// コメントアウトを解除
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;


    // <!-- XML コメントアウト --> 
    case 24:
      var p1 = "<!-- ", p2 = " -->";
      if ( s.IsEmpty ) {				// 選択範囲がなければ
        document.Write( p1 + p2 );			// コメントマーク <!-- & --> だけ挿入
        s.SetActivePos( s.GetActivePos() - p2.length );	// カーソルをカッコのなかに移動
      }
      else {						// 選択範囲があれば
        s.Text = p1 + st + p2;				// 選択範囲 st を <!-- コメントアウト -->
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;


    // XML アンコメント		※選択範囲の先頭と末尾のコメントマーク "<!-- " " -->" にマッチ
    case 25:			// case 38 の <!--␣ XMLコメント ␣--> をアンコメントする
      if ( ! s.IsEmpty ) {							// 選択範囲があれば
        s.Text = st.replace( /^\s*<!-- ?/ , "" ).replace( / ?-->\s*$/ , "" );	// 先頭と末尾のコメントマークを削除
        s.SetAnchorPoint( mePosLogical, ax, ay );				// 選択範囲を復元
      }
      break;


3. ソースコードの末尾 ( "}" の下) に追加

function CommentOutJS( arg1, arg2, arg3, arg4 ) {	// CommentOutJS( st, p1, p2, ast )
  var a = arg1.split( "\n" );				// 選択範囲 st を "\n" で区切って配列 a に格納する
  for ( var i = 0; i < a.length; i++ )			// 「1行め」から「st の行数」回分だけ繰りかえし処理
    a[i] = arg4 + a[i];					// 各行の先頭に ast = " * " を追加する
  return arg2 + a.join( "\n" ) + arg3;			// 各行を "\n" で区切って連結し、先頭に p1 = "/*\n"、末尾に p2 = "\n */" を付け足す
}

function UnCommentJS( arg1 ) {				// UnCommentJS( st )
  var re1 = /^\/\*+\s*([^\n]*?\n?)/;			// 先頭行の正規表現
  var re2 = /(\n?[^\n]*?)\s*\*?\/$/;			// 末行の正規表現
  var re3 = /^\s*\*\s*/;				// 中間行の行頭の正規表現
  var a = arg1.split( "\n" );				// 選択範囲 st を "\n" で区切って配列 a に格納する
  for ( var i = 0; i < a.length - 1; i++ )		// 「1行め」から「st の行数 -1」回分だけ繰りかえし処理
    a[i] = a[i].replace( re3 ,"" );			// 各行頭のアスタリスクを削除
  return a.join( "\n" ).replace( re1 , "$1" ).replace( re2 , "$1" );	// 各行を "\n" で区切って連結し、先頭行と末行のコメントマークを削除
}
  • ポップアップメニュー項目とカッコ/引用符の定義配列 "var XX = new Array( … )" に20コ以上詰めこんでいるばあいは、追加コードのID 21~26 を適当な数字に変更してください。

引用の追加」マクロへの組みこみ用コードには、別途「行の先頭に貼り付け」もあります。


カッコで囲う (ポップアップメニューなし)

特定の種類のカッコを一発で追加する小マクロはキーアサイン集にもありますが、コードを改変して前後に付ける "カッコ" のかわりに "任意の文字列" を指定するばあいに「折り返し」表示と相性のよくない部分があります。

また、マクロ実行後のカーソル位置を選択範囲なしのときとありのときとで変えたいばあいも、こちらのコードがよいでしょう。

#title = "( カッコ )"
#tooltip = "( カッコ ) で囲う"
// MeryWiki の マクロライブラリ >> キーアサイン集 の「括弧で挟む」を改変
// 選択範囲の前後にカッコ以外にも任意の文字列を追加するマクロとしても流用できます

var s = document.selection;

// 選択範囲の各座標を取得
var ax = s.GetTopPointX( mePosLogical );
var ay = s.GetTopPointY( mePosLogical );

// 選択範囲のテキストを取得し、カッコを追加
var st = s.Text;
var pre = "(";	// 前に付ける文字列
var sur = ")";	// 後ろに付ける文字列
s.Text = pre + st + sur;

// カーソルを移動、または範囲選択
if ( ! st )	// 選択範囲なしだったばあい
  s.SetActivePos( s.GetActivePos() - sur.length );	// 後ろに付けた文字列 sur の前にカーソルを移動
else	// 選択範囲があったばあい
  s.SetAnchorPoint( mePosLogical, ax, ay );	// カッコを含めて範囲選択

メモ

  • 2018/08/24 (sukemaru)
ページを新規作成
  • 2018/08/26 (sukemaru)
「カッコで囲う (ポップアップメニューなし)」の節を追加
  • 2018/08/27 (sukemaru)
「カッコで囲う (ポップアップメニューあり)」のソースコードを修正
case1~8 の "s.CharLeft( false, p2[r].length );" を "s.SetActivePos( s.GetActivePos() - p2[r].length );" に変更
  • 2018/10/12 (sukemaru)
「カッコで囲う (ポップアップメニューあり)」のソースコードに "3文字ずつ前後を削除" を追加
組みこみ用コード「wiki用 文字列装飾」と「挿入型コメントアウト」の節を追加
「カッコで囲う.zip」のダウンロードリンクを追加
スポンサーリンク