「
TrueとFalse を切り替える
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
== ソースコード == <syntaxhighlight lang="javascript" style="height:120em; overflow:auto;"> #title = "Yes/No マクロ" #tooltip = "True と False を切り替える" // #icon = "TF.ico" // #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",265 /** * -------------------------------------------------------- * 「Yes/No マクロ」(True と False を切り替える) * sumemaru, 2018/11/20 - 2020/07/01 * https://www.haijin-boys.com/wiki/TrueとFalse_を切り替える * -------------------------------------------------------- * 選択範囲の文字列が "True" なら "False" に、"False" なら "True" にする * * ■ マルチカーソル/複数選択範囲に対応 (2020/07/01) * ※ 矩形選択範囲から実行したときは、行に分けてからマルチ処理 * * ■ 選択範囲の文字列が日付なら「今日の日付」に変換(2020/07/01 追加) * ■ 同一記号の繰り返し文字列の自動選択 (2020/05/12 追加) * ※ e.g. #### や ※※※※ など、ダブルクリックでは範囲選択できないものを自動選択する * ref. https://www.haijin-boys.com/wiki/拡張自動選択 * https://www.haijin-boys.com/wiki/%E6%8B%A1%E5%BC%B5%E8%87%AA%E5%8B%95%E9%81%B8%E6%8A%9E * * ※ 単語グループの登録リストの仕様や変換処理の基本動作は 2018/11/27 版と共通 * ※ Yes/No マクロでは、"任意の文字列" を "" に変換(文字列を削除)することはできない * ※ 単語グループ登録リストを上から順番に検索するので * 優先度の高いグループを上に置くこと */ // ---------- ▼ 設定項目 ▼ ---------- // ■ 選択範囲がないときにキャレット位置の単語を自動選択するか? var wordSelectionEnable = true; // false なら、選択範囲のないときは変換しない // ■ 「空白文字列の自動選択」に「全角空白」を含める var fullWSpc = true; // // true 含める (タブと全角/半角空白)/ false 含めない (タブと半角空白のみ) // ■ 選択範囲の文字列が日付なら「今日の日付」に変換して終了する var dateConvEnable = true; // true なら「今日の日付」に変換して終了(選択範囲を残さない) // ■ 変換後に選択範囲を残すか? 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, s = d.selection; var sx = ScrollX, sy = ScrollY; /* マルチカーソル/複数選択範囲に対応 */ var dt = d.Text; var sMode = s.Mode || 1; var arg = [ wordSelectionEnable, fullWSpc, dateConvEnable, leftSelectionEnable, a ]; // 選択範囲が1つで矩形選択ではないとき if ( sMode == 1 ) { YesNoMacro_Main( arg ); } // 矩形選択または複数選択のとき else { BeginUndoGroup(); if ( ! d.ReadOnly ) { AddUndo(); } MultiFunction( YesNoMacro_Main, arg ); EndUndoGroup(); } /* 無駄な UNDO 履歴が残らないよう対策 */ // テキストの変更なしなら一度 UNDO して、拡張自動選択だけ再試行する if ( sMode > 1 && d.Text === dt ) { if ( ! d.ReadOnly ) { d.Undo(); } if ( wordSelectionEnable ) { MultiFunction( SelectWordEx, fullWSpc ); } } ScrollX = sx; ScrollY = sy; // ---------- ▲ マルチカーソル/複数選択対応 ▲ ---------- // // ---------- ▼ メインコード ▼ ---------- /** * 関数 YesNoMacro_Main() * 「Yes/No マクロ」メインコード */ function YesNoMacro_Main( arg ) { var wordSelectionEnable = arg[0]; var fullWSpc = arg[1]; var dateConvEnable = arg[2]; var leftSelectionEnable = arg[3]; var a = arg[4]; var d = editor.ActiveDocument, s = d.selection; var st = yesNo = s.Text; // 選択範囲の文字列が日付なら「今日の日付」に変換して終了 // ※ 選択範囲を残さない if ( ! d.ReadOnly && st && dateConvEnable ) { yesNo = DateOfToday( st ); if ( yesNo !== st ) { s.Text = yesNo; return; } } // 単語の自動選択 または拡張自動選択 // ※「同一記号の繰り返し」/「全角空白を含む空白文字列」/「日付」の // 拡張自動選択をしたときは終了 if ( s.IsEmpty && wordSelectionEnable && SelectWordEx( fullWSpc ) ) { return; } st = yesNo = s.Text; if ( d.ReadOnly ) { Status = " ドキュメントは書き換え禁止です。"; return; } else if ( ! st ) { Status = " 選択範囲がありません。"; return; } else { // 「Yes/No」変換 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 ); } } } } /** * 関数 ConvertYesNo( str, listArray ) * Yes/No 変換 * listArray の単語グループリストに str がマッチしたとき、変換した単語で返す * 2020/05/12: 変数を適宜追加、変数名を変更、コードを圧縮 */ function ConvertYesNo( str, list ) { var word = ""; ListLoop: for ( var i = 0, aLen = list.length, group, gLen; i < aLen; i ++ ) { group = list[i]; gLen = group.length; // 空のグループはスキップ if ( gLen < 2 ) { continue ListLoop; } GroupLoop: for ( var j = 0; j < gLen; j ++ ) { // 空の要素 "" と 0 フラグはスキップ if ( ! group[j] ) { continue GroupLoop; } // ヒット(完全一致)したら 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; } // ---------- ▲ メインコード ▲ ---------- // ---------- ▼ 拡張コード ▼ ---------- /** * 関数 SelectWordEx( optionfullWSpc ) * 単語の自動選択 または * 「全角空白を含む空白文字列」/「同一記号の繰り返し」/「日付」の自動選択 */ function SelectWordEx( fullWSpc ) { var d = editor.ActiveDocument, s = d.selection; if ( s.IsEmpty ) { s.SelectWord(); } // キャレットは選択範囲の末尾 var st = s.Text; if ( ! st ) { return false; } var ax = s.GetActivePointX( mePosLogical ); var ay = s.GetActivePointY( mePosLogical ); var line = d.GetLine( ay, 0 ); var str1 = line.slice( 0, ax - 1 ); // キャレットより前の文字列 var str2 = line.slice( ax - 1 ); // キャレットより後ろの文字列 // ※ 全角空白をふくむ空白文字列全体を自動選択 if ( fullWSpc && /^[\t ]+$/.test( st ) ) { var sig1 = String( str1.match( /[\t ]+$/ ) || "" ); var sig2 = String( str2.match( /^[\t ]+/ ) || "" ); if ( sig1 || sig2 ) { s.SetAnchorPoint( mePosLogical, ax - sig1.length, ay ); s.SetActivePoint( mePosLogical, ax + sig2.length, ay, true ); } if ( s.Text !== st ) { return true; } } // ※ 同一記号の繰り返し文字列の自動選択 if ( st.length === 1 ) { var sig1 = String( str1.match( new RegExp( "\\" + st + "+$", "" ) ) || "" ); var sig2 = String( str2.match( new RegExp( "^\\" + st + "+", "" ) ) || "" ); if ( sig1 || sig2 ) { s.SetAnchorPoint( mePosLogical, ax - sig1.length, ay ); s.SetActivePoint( mePosLogical, ax + sig2.length, ay, true ); } if ( s.Text !== st ) { return true; } } // ※ 日付の自動選択 if ( /^\d{4}$/.test( st ) // yyyy && ( mmdd = str2.match( /^年(?:0?[1-9]|1[0-2])月(?:0?[1-9]|[12][0-9]|3[01])日/ ) ) || ( mmdd = str2.match( /^([-.\/])(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|[12][0-9]|3[01])\b/ ) ) ) { s.SetActivePoint( mePosLogical, ax + String( mmdd[0] ).length, ay, true ); return true; } var reg1 = /^(?:19|20)\d{2}([-.\/])(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|[12][0-9]|3[01])$/; var reg2 = /^(?:19|20)\d{2}年(?:0?[1-9]|1[0-2])月(?:0?[1-9]|[12][0-9]|3[01])日$/; if ( /^(?:0?[1-9]|1[0-2])$/.test( st ) // mm && ( yy = str1.slice( 0, - st.length ).match( /\b\d{4}[-.\/年]$/ ) ) && ( dd = str2.match( /^[-.\/月](?:0?[1-9]|[12][0-9]|3[01])日?(?=$|\D)/ ) ) && ( reg1.test( yy + st + dd ) || reg2.test( yy + st + dd ) ) ) { s.SetAnchorPoint( mePosLogical, ax - ( yy + st ).length, ay ); s.SetActivePoint( mePosLogical, ax + String( dd ).length, ay, true ); return true; } if ( /^(?:0?[1-9]|[12][0-9]|3[01])$/.test( st ) // dd && ( yymm = str1.slice( 0, - st.length ).match( /\b\d{4}[-.\/年](?:0?[1-9]|1[0-2])[-.\/月]$/ ) ) && ( dd = str2.match( /^日?(?=$|\D)/ ) ) && ( reg1.test( yymm + st + dd ) || reg2.test( yymm + st + dd ) ) ) { s.SetAnchorPoint( mePosLogical, ax - ( yymm + st ).length, ay ); s.SetActivePoint( mePosLogical, ax + String( dd ).length, ay, true ); return true; } return false; } /** * 関数 DateOfToday( str ) * 選択範囲の文字列が日付なら今日の日付に変換する * ※ 月 日 はゼロパディングする */ function DateOfToday( str ) { var reg1 = /^(?:19|20)\d{2}([-.\/])(?:0?[1-9]|1[0-2])(\1)(?:0?[1-9]|[12][0-9]|3[01])(\b)$/; var reg2 = /^(?:19|20)\d{2}(年)(?:0?[1-9]|1[0-2])(月)(?:0?[1-9]|[12][0-9]|3[01])(日)$/; if ( str.match( reg1 ) || str.match( reg2 ) ) { var sep1 = RegExp["$1"], sep2 = RegExp["$2"], sep3 = RegExp["$3"]; var Pad = function( tmp ) { return tmp < 10 ? "0" + tmp : tmp; } var dt = new Date(); var yyyy = dt.getFullYear() + sep1; var mm = Pad( dt.getMonth() + 1 ) + sep2; var dd = Pad( dt.getDate() ) + sep3; str = yyyy + mm + dd; } return str; } /** * 関数 MultiFunction( Fn, arg1 ) * マルチカーソル(複数選択範囲)に対応させる * 第1引数: Function; 選択範囲ごとに適用する処理の関数 * 第2引数以降: Function に渡す引数をまとめた配列 */ function MultiFunction( Fn, arg ) { var d = editor.ActiveDocument; var s = d.selection; // 矩形選択範囲は行に分ける s.Mode = meModeMulti; // 選択範囲の座標を取得 var sCount = s.Count; var Sel = []; for ( var i = 0; i < sCount; i ++ ) { Sel[i] = { act: s.GetActivePos( i ), anc: s.GetAnchorPos( i ) }; } // 各選択範囲を処理 var r = selEx = false; for ( var i = 0, diff = 0, dl; i < sCount; i ++ ) { dl = d.TextLength; s.SetActivePos( Sel[i].act + diff ); s.SetAnchorPos( Sel[i].anc + diff ); Fn( arg ); // YesNoMacro_Main() 関数で Yes/No 変換 // Fn() の残した選択範囲(またはキャレット位置)を回収 Sel[i].act = s.GetActivePos(); Sel[i].anc = s.GetAnchorPos(); diff += d.TextLength - dl; // 文字数の増減量(累積) } // マルチカーソル(複数選択範囲)を復帰 for ( var i = 0; i < sCount; i ++ ) { s.AddPos( Sel[i].anc, Sel[i].act ); } } // ---------- ▲ 拡張コード ▲ ---------- </syntaxhighlight>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク