TrueとFalse を切り替える

提供: MeryWiki
2020年5月13日 (水) 01:10時点におけるSukemaru (トーク | 投稿記録)による版 (ソースコードと ZIP 書庫を更新)
ナビゲーションに移動 検索に移動

Yes/No マクロ(TrueFalse を切り替える)

ダウンロード >> 「TrueとFalseを切り替える.zip」 2020/05/12 (アイコン入り)
改造版 (ToDoリストモード[1]を搭載) >> 「YES/NO マクロ(ToDo).zip」 2020/05/12 (アイコン入り)


YESNO マクロ

  • 選択範囲の文字列が "True" なら "False" に、"False" なら "True" に変換します。
ソースコード内に相互変換する単語のグループを登録して使用します。
選択範囲がないときにはキャレット位置の単語を自動選択するように設定できます。


  • ダブルクリックでは一括選択できない「同一記号の繰り返し文字列」を自動選択する機能を、おまけ機能として試験実装してあります(2020/05/12)。
##########
※※※※※※※※
※ 単語の自動選択用の設定項目が有効 wordSelectionEnable = true で、選択範囲のない状態でこのマクロを実行したときのみ。
※ 登録リストの単語に合致することはないとおもうので、範囲選択操作の補助機能として使用してください。


  • True ⇔ False や Yes ⇔ No、はい ⇔ いいえ の 2つの単語の相互変換 なら
[ "True", "False" ], 
[ "Yes", "No" ], 
[ "はい", "いいえ" ], 


  • ほげ → ふが → ぴよ → ほげ のような 3つ以上の単語を順々に変換 する場合も、列挙するだけです。
[ "ほげ", "ふが", "ぴよ" ], 
[ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ], 


  • 単語グループの登録は「頭文字が大文字」
[ "Hoge", "Fuga", "Piyo" ], 
[ "Hoge", "Fuga", "Piyo" ], 
だけであっても、「小文字」だけの差分 hoge → fuga → piyo や hoge → fuga → piyo、 「大文字」だけの差分 HOGE → FUGA  → PIYO や HOGE → FUGA → PIYO も変換できます。
※「小文字」だけのグループを登録した場合は「大文字」差分の変換もでき、「大文字」だけのグループを登録した場合は「小文字」差分の変換もできますが、どちらも「頭文字が大文字」の差分の変換はできません。 基本的に「頭文字が大文字」での登録をおすすめします。
※ 先頭以外にも大文字がある HoGe, FUga, PiyO などは変換しません (これらを変換させる場合は、別途で完全一致する単語グループが必要)。


  • 小文字や大文字の差分では変換させたくない グループを登録する場合は、グループの先頭に 0, を(引用符で囲わずに)置きます。
    以下の例では mozilla や FIREFOX, ThunderBird は変換されません。
[ 0, "Mozilla", "Firefox", "Thunderbird" ], 
FireFox や ThunderBird のように先頭以外にも大文字がある単語については、別途で完全一致する単語グループの登録が必要となります。


  • 「大文字」だけを除外したい 場合は、0, 付きの「頭文字」のグループと「小文字」のグループを登録します。
    以下の例では ALPHA や BRAVO は変換されません。
[ 0, "Alpha", "Bravo", "Charlie", "Delta", "Echo" ],  
[ 0, "alpha", "bravo", "charlie", "delta", "echo" ],  
先頭の 0, は 「完全一致のみ」のフラグ になります( → 1 や false, true などを置くとエラー)。
"0", だと 半角数字の "文字列" になるのでグループ内の単語のひとつとして登録されます。


  • 左 → 右 方向には変換しても 右 → 左 (末尾から先頭)方向に変換させたくない場合 は、グループの最後に空の要素 , "" を置きます。
    以下の例では Mery から Notepad や Terapad には変換されません。
[ 0, "Notepad", "Mery", "" ],
[ "Terapad", "EmEditor", "gPad", "秀丸", "Mery", "" ],
※ グループの途中に空の要素「 "" 」があると、「 "" 」以降の単語には変換されなくなります。


  • 2020/05/12 仕様変更:
※うえの例の [ ... , "Mery", "" ], のグループよりもうしろに
[ "Mery", "メリー", "羊" ], 
のようなグループがある場合は、 Mery → メリー → 羊 → Mery と変換されます。


マクロを実行しても正しくトグル変換しないときやエラーになったときは、"ダブルクォート"、カンマ「 , 」、[ 角カッコ ] の過不足を確認してください( [ 角カッコ ] を閉じたうしろにはカンマ「 , 」が必要)。
また、おなじ単語を別のグループにも重複して登録していないかを確認してください(先に登録されたグループが優先的に参照されます)。


ソースコード

#title = "Yes/No マクロ"
#tooltip = "True と False を切り替える"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",265
// #icon = "TF.ico"

/**
 * --------------------------------------------------------
 * 「Yes/No マクロ」(True と False を切り替える)
 * sumemaru, 2018/11/20 - 2020/05/12
 * --------------------------------------------------------
 * 選択範囲の文字列が "True" なら "False" に、"False" なら "True" にする
 * 
 * ■同一記号の繰り返し文字列の自動選択 (2020/05/12 追加)
 * ・ e.g. #### や ※※※※ など、ダブルクリックでは範囲選択できないものを自動選択する
 * 
 * ※ 単語グループの登録リストの仕様や変換処理の基本動作は 2018/11/27 版と共通
 * ※ Yes/No マクロでは、"任意の文字列" を "" に変換(文字列を削除)することはできない
 * ※ 単語グループ登録リストを上から順番に検索するので
 *    優先度の高いグループを上に置くこと
 */

// ---------- ▼ 設定項目 ▼ ----------

// ■選択範囲がないときにキャレット位置の単語を自動選択するか?
var wordSelectionEnable = true;		// false なら、選択範囲のないときは変換しない

// ■変換後に選択範囲を残すか?
var leftSelectionEnable = true;		// true なら、連続実行でトグル変換できる

// ---------- ▲ 設定項目 ▲ ----------

var a = new Array(	// ←消しちゃダメ

// ---------- ▼ 単語グループを登録 ▼ ----------

  // 単語を "ダブルクォート" か 'シングルクォート' で囲い、カンマ「 , 」で区切って並べる。
  // ・グループを [ 角カッコ ] で囲い、うしろにもカンマ「 , 」を付けること。
  // ※マクロを実行して正しくトグルしないときやエラーになったときは、
  //  "ダブルクォート"/カンマ「 , 」/[ 角カッコ ] の過不足を確認。


  /* Positive or Negative */
  [ "True", "False" ], 
  [ "Yes", "No" ], 
  [ "On", "Off" ], 
  [ "Enable", "Disable" ], 
  [ "Positive", "Negative" ], 
  [ "Possible", "Impossible" ], 



  /* (中略) */



  [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ], 
  [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ], 
  [ "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳" ], 
  [ "➀", "➁", "➂", "➃", "➄", "➅", "➆", "➇", "➈", "➉" ], 


// ---------- ▲ 単語グループを登録 ▲ ----------

// var a = new Array ...	を閉じる
[] );		// ← 消しちゃダメ

// ---------- ▼ メインコード ▼ ----------

var d = editor.ActiveDocument;
var s = editor.ActiveDocument.selection;

if ( d.ReadOnly ) {
  Status = " ドキュメントは書き換え禁止です。";
}
else {
  Redraw = false;
  var st = yesNo = "";

  // 単語の自動選択 + 同一記号の繰り返し文字列の自動選択
  if ( s.IsEmpty && wordSelectionEnable ) {
    s.SelectWord();
    st = s.Text;
    if ( st.length == 1 ) {
      var ay = s.GetActivePointY( mePosLogical );
      var tx = s.GetTopPointX( mePosLogical );
      var bx = s.GetBottomPointX( mePosLogical );
      var line = d.GetLine( ay, 0 ),  len = line.length;
      for ( ; tx > 0; tx -- ) {
        if ( line.charAt( tx - 2 ) != st ) break;
      }
      for ( ; bx <= len; bx ++ ) {
        if ( line.charAt( bx - 1 ) != st ) break;
      }
      s.SetActivePoint( mePosLogical, tx, ay, false );
      s.SetActivePoint( mePosLogical, bx, ay, true );
    }
  }
  st = s.Text;

  if ( st ) {
    yesNo = ConvertYesNo( st, a );
    if ( yesNo && yesNo != st ) {
      s.Text = yesNo;

      if ( leftSelectionEnable ) {			// 単語先頭まで範囲選択
        s.SetAnchorPos( s.GetActivePos() - yesNo.length );
      }
      else if ( wordSelectionEnable ) {		// 単語先頭にカーソルを移動
        s.SetActivePos( s.GetActivePos() - yesNo.length );
      }
    }
  }

  Redraw = true;
}


/**
 * 関数 ConvertYesNo( str, listArray )
 * Yes/No 変換
 * listArray の単語グループリストに str がマッチしたとき、変換した単語で返す
 * 2020/05/12: 変数を適宜追加、変数名を変更、コードを圧縮
 */
function ConvertYesNo( str, list ) {
  var word = "",  group,  gLen;

  ListLoop:
  for ( var i = 0, aLen = list.length, group; i < aLen; i ++ ) {
    group = list[i];  gLen = group.length;
    if ( gLen < 2 ) { continue ListLoop; }	// 空のグループはスキップ

    GroupLoop:
    for ( var j = 0; j < gLen; j ++ ) {
      if ( ! group[j] ) { continue GroupLoop; }	// 空の要素 "" と 0 フラグはスキップ

      // ヒット(完全一致)したら Hoge, hoge, HOGE
      if ( group[j] === str ) {
        word = ( j < gLen - 1 )   ? group[ j + 1 ] 	// ひとつ右の単語を返す
             : ( group[0] !== 0 ) ? group[0]		// いちばん左の単語を返す
             :/*(group[0] === 0)*/  group[1];		// ふたつめの単語を返す
        if ( word ) { break ListLoop; }
      }

      // 小文字にしてくらべてヒットしたら( 0 フラグなし)
      else if ( group[0] !== 0
      && group[j].toLowerCase() == str.toLowerCase() ) {
        word = ( j < gLen - 1 ) ? group[ j + 1 ]	// ひとつ右
                                : group[0];			// いちばん左
        // もとの単語が小文字のみなら小文字で、大文字のみなら大文字で返す
        word = ( str == str.toLowerCase() ) ? word.toLowerCase()
             : ( str == str.toUpperCase() ) ? word.toUpperCase()
                        /* else */          : "";	// 変換なし
        if ( word ) { break ListLoop; }
      }
    }
  }
  return word;
}

メモ

  • 2018/11/25 sukemaru
ソースコードを変更しました。
  • 2018/11/27 sukemaru
ソースコードを変更しました。
  • 2019/05/06 sukemaru
「ToDoリストモード」搭載の改造版のリンクを追加しました(単語登録リストの仕様は 2018/11/27 の通常版とおなじ)。
  • 2020/05/12 sukemaru
ソースコードを更新しました(単語登録リストの仕様は 2018/11/27 の通常版とおなじまま)。
ZIP 書庫内のソースコードでは、単語グループのリストは sukemaru の自家用状態のまま 300 件(グループ)ぐらい詰めこんであります。
スポンサーリンク