「
利用者:Masme
」を編集中
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
=マクロ「テキスト整形」の仕様変更について (2019/05/01)= マクロ「テキスト整形」の処理の流れを「前処理」「本処理」「後処理」の3段階に分けて考えたとき、モード (F/R/RS) 別に異なっていた流れを統合し、モードを廃止しようと考えています。 {|class="wikitable" !colspan="4"| 旧仕様 |- ! モード !! 前処理 !! 本処理 !! 後処理 |- ! F | なし | 引数に Selection を渡して処理 | なし |- ! R | なし |rowspan="2"| 引数に Selection.Text を渡して処理 |rowspan="2"| 戻り値で選択範囲を置換、再選択 |- ! RS | 選択範囲を行全体に拡張 |- !colspan="4"| 新仕様 |- | | オプションで指定 | 第1引数に Selection.Text を、<br>第2引数に Selection を渡して処理 | 戻り値で置換・再選択を制御 |} ==後処理:戻り値による選択範囲の置換・再選択の制御== Mery 2.7.0 にて「マクロで Chakra (jscript9.dll) における [[マクロリファレンス:Window_インターフェイス#Quit_メソッド|Quit メソッド]]をサポート外にした」([https://www.haijin-boys.com/software/mery/mery-2-7-0 公式記事])ことを受け、戻り値により後処理(選択範囲の置換・再選択)を制御できる仕組みを導入します。 String (文字列) か Array (配列) を return すると、選択範囲を置換してカーソルを移動します。それ以外 (undefined など) の場合は、選択範囲に対し何もしません。<br> <code>Quit();</code> (処理を中断) の代替策として <code>return;</code> (undefined を返す) などとすることで処理を終了させることができます。 <syntaxhighlight lang="javascript"> f.push(["例1","",function(){ return "abcd" }]); f.push(["例2","",function(){ return ["ab","cd"] }]); f.push(["例3","",function(){ return ["ab","cd",""] }]); f.push(["例4","",function(){ return; }]); </syntaxhighlight> {|class="wikitable" ! 例 !! 動作 |- | <code>"abcd"</code> || abcd に置換後、abcd を選択 = <code>["","abcd",""]</code> |- | <code>["ab","cd"]</code> || abcd に置換後、ab と cd の間に移動 |- | <code>["ab","cd",""]</code> || abcd に置換後、cd を選択 |- | String / Array 以外 || 選択範囲に対し何もしない |} ==本処理:第2引数を復活== マクロ「[[テキスト変換]]」の第2引数を復活し、第1引数に Document.Selection.Text を、第2引数に Document.Selection を渡すようにします。 「テキスト整形」で第2引数を削除したのは、「テキスト変換」で Selection を利用したコマンドが無かったこと、戻り値で選択範囲が置換されるため Selection を利用しづらいと感じたことが理由でした。 「テキスト整形」でモード F を設け分離したのも、そうした理由によりますが、戻り値で選択範囲を置換するかしないか制御できるようになったため状況が変わりました。 ==前処理:モードを廃止、オプションに変更== 「モード」を「オプション」に変更し、機能を追加します。 {|class="wikitable" | <code>s</code> || 実行に範囲選択を要求 (require selection)<br>非選択時はメニュー項目がグレーになり実行不可 |- | <code>c</code> || 実行にクリップボードを要求 (require clipboard)<br>貼り付けが行えない状況では同上 |- | <code>L</code> || 行選択してから処理 (select Line)<br>モード RS はオプション L に変更 |- | <code>O</code> || 非選択時はすべて選択してから処理 (select OR all)<br>※実験的機能(変更・廃止の可能性あり) |} * 複数指定する場合、空白で区切ります。順序は問いません。 * モードは必須でしたが、オプションは任意です。 * 上記以外の文字(オプション)を指定してもエラーにはなりません。<br>モード F/R/RS はオプション F/R/RS と認識されるが効果は無い、ということになります。 ==旧仕様から新仕様への移行方法== 移行を補助するコマンドを用意しました。 ※新仕様の基本コード用。旧仕様で使用する場合は、オプション "L" をモード "RS" に書き換えてください。 <pre> f.push(["拡張コードを旧→新仕様に変換","L",function(_){ //2019/06/01 return _.replace(/^(\s*(?:\/\/[\/\s]*)?)f\.push\(\[("[^\\"]*(?:\\.[^\\"]*)*"|'[^\\']*(?:\\.[^\\']*)*'),"(RS?|F)",function\(([$0-9A-Za-z_]*)\)/gm,function(_,cmnt,name,mode,arg){return cmnt+'f.push(['+name+',"'+(mode==="RS"?"L":"")+'",function('+(mode==="F"&&arg?"_,":"")+arg+')'}) }]); </pre> 旧仕様のコマンドに対し、上記のコマンドを実行すると、以下のように置換され、新仕様の基本コードで問題なく動作するようになります。 ;モード F <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;"><samp>f.push(["コマンド名","<span style="background:#fcc;">F</span>",function(a) 以下略</samp></p> :↓ <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;"><samp>f.push(["コマンド名","",function(<span style="background:#fcc;">_,</span>a) 以下略</samp></p> ;モード R <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;"><samp>f.push(["コマンド名","<span style="background:#fcc;">R</span>",function(a) 以下略</samp></p> :↓ <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;"><samp>f.push(["コマンド名","",function(a) 以下略</samp></p> ;モード RS <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;"><samp>f.push(["コマンド名","<span style="background:#fcc;">RS</span>",function(a) 以下略</samp></p> :↓ <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;"><samp>f.push(["コマンド名","<span style="background:#fcc;">L</span>",function(a) 以下略</samp></p> ==変更点まとめ== {|class="wikitable" ! 機能 !! 旧仕様 !! 新仕様 !! 備考 |- ! モード F |style="background:#cfc;"| 利用可 ||style="background:#fc6;"| 動作不良 | 引数を利用しているものは動作しなくなります |- ! モード R |style="background:#cfc;"| 利用可 ||style="background:#fc6;"| 動作可 | 動作しますが、モード名の R は不要です(削除推奨) |- ! モード RS |style="background:#cfc;"| 利用可 ||style="background:#fc6;"| 動作不良 | 動作しますが、行選択はされなくなります |- ! 戻り値制御 |style="background:#fc6;"| 動作不良 ||style="background:#cfc;"| 利用可 | 旧仕様では文字列以外に非対応、モード F では利用不可 |- ! 第2引数 |style="background:#fcc;"| 利用不可 ||style="background:#cfc;"| 利用可 | モード F は第2引数利用に移行 |- ! オプション |style="background:#fcc;"| 利用不可 ||style="background:#cfc;"| 利用可 | モード RS はオプション L に移行 |} ==記事ソースから拡張コードを抽出== 「テキスト整形」の記事ソースから拡張コードを抽出するコマンドを用意しました。 ※新仕様の基本コード用。文書全体を対象に置換が行われます。 <pre> f.push(["記事ソースから拡張コードを抽出","",function(_,$){ //2019/12/21 $.SelectAll(); var src=$.Text.match(/(?:^|\n)=拡張コード=\n[\s\S]*?(\n==[\s\S]*?)(?:\n=拡張コード:書式=\n|$)/); if(src)$.Text=src[1].replace(/\n==([^=]+)==\n([\s\S]*?)(?=\n==[^=]|$)/g,function(_,ctg,src){var cmd=[], res, re=new RegExp(/^<pre(?: [^>]*)?>\s*(f\.push\(\[[\s\S]*?\]\);)\s*<\/pre>/gm); while(res=re.exec(src)){cmd.push(res[1].replace(/&amp;/g,"&"))} return 'f.push(["'+ctg+'",function(f){\n\n'+ cmd.join("\n\n") +'\n\n}]);\n\n'}).slice(0,-1) }]); </pre> <b>使用手順</b> # 「[[テキスト整形]]」の記事上部にある [編集] タブをクリックする。<br>または、記事の「[[テキスト整形#拡張コード|拡張コード]]」見出しの [編集] リンクをクリックする。 # 記事編集ページに移動するので、テキストボックス内の文章をすべて選択し、コピーする。<br>※テキストボックス内を右クリックしてメニューから実行するのが一番わかりやすいと思われます。 #* コピーした後は戻る(ブラウザバック)か閉じるかして記事編集ページから離れてください。 # Mery で文書を新規作成し、コピーした文章を貼り付ける。 # 「テキスト整形」マクロを起動し、「記事ソースから拡張コードを抽出」コマンドを実行する。 =マクロ「テキスト整形」の仕様変更について (2015/02/14)= ==モード R/RS 実行後、処理した範囲を選択し直すように== <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;">旧仕様では、コマンド実行後は<span style="background:#bfdfff; border-right:2px solid;">範囲選択が 解 除 されました。↵<br>新仕様では、コマンド実行前に選択範囲を 記 憶 し、実行後に 復 元 します。↵<br>処理の結果、字数が 増 減 した場合は、選択範囲が 調 整 </span>されます。↵</p> :↓ コマンド「空白文字を除去」実行 <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;">旧仕様では、コマンド実行後は<span style="background:#bfdfff; border-right:2px solid;">範囲選択が解除されました。↵<br>新仕様では、コマンド実行前に選択範囲を記憶し、実行後に復元します。↵<br>処理の結果、字数が増減した場合は、選択範囲が調整</span>されます。↵</p> この変更により、コマンドの効果範囲が目視できるようになり、また、選択し直す手間なく別の処理に移ることができるようになります。 * モード R では、選択範囲の始点終点の位置関係が維持されます。 * モード RS では、選択範囲を行頭行末まで拡張した状態が記憶されます。始点は上端行頭、終点は下端行末となります。 * コマンド実行中にカーソル位置を移動させる処理がある場合には対応できません。 ==モード RM を廃止== モード RM (一行ごとに処理) は、マクロ「[[テキスト変換]]」の関数タイプ replaceL に相当し、モード RS で実現可能な処理をより簡素に記述するために設けられた機能です。<br> しかし、以下のような難点が見受けられることから、廃止を考えるに至りました。 * モード RS より簡素に記述できるとは必ずしも限らない。 * モード RS で実現可能=代替可能であり、RM ならではの利点が無い。 * モード R/RS に比べ処理が異質で、コマンドを作る際はそれを考慮しなければならない。<br>※異質=R/RS が「選択範囲の文字列」を対象に処理を行うのに対し、RM は「選択範囲の各行の文字列」を対象に処理を行う。 <syntaxhighlight lang="javascript"> //※モード RM では「クロージャ」という仕組みを使用する必要があり難解 f.push(["各行行頭に文字列付加...","RM",(function(a){ var p=null; return function(a){ if(!p){ if(!(p=Prompt("各行行頭に付加する文字列:",""))){Quit()} } return p+a } })()]); //※モード RS で replace(正規表現) を使用するほうが簡素に記述できる f.push(["各行行頭に文字列付加...","RS",function(a){ var p=Prompt("各行行頭に付加する文字列:",""); if(!p)Quit(); return a.replace(/^/gm,p) }]); </syntaxhighlight> <syntaxhighlight lang="javascript"> //※モード RM でも、 f.push(["空白行を削除","RM",function(a){ return a.match(/^[ \t]*$/)? null:a }]); //※モード RS でも、必要な知識や字数がほぼ変わらない時がある f.push(["空白行を削除","RS",function(a){ return a.replace(/^[ \t]*$\n?/gm,"") }]); </syntaxhighlight> <syntaxhighlight lang="javascript"> //※モード RM なら正規表現に頼らず簡素に記述できるコマンドもあるが、 f.push(["インデント(半角空白2個)","RM",function(a){ return " "+a }]); f.push(["インデント(半角空白2個)","RS",function(a){ return a.replace(/^/gm," ") }]); //※正規表現を利用したコマンドも数多くあり、利点になりづらい f.push(["行頭 \/\/ を付加/削除","RM",function(a){ return a.match(/^\/\/.*$/)? a.slice(2): "\/\/"+a }]); f.push(["行頭 \/\/ を付加/削除","RS",function(a){ return a.replace(/^(\/\/)?/gm,function(s){return s? "": "\/\/"}) }]); </syntaxhighlight> ==モード CR を廃止、replaceBatch メソッドを追加== モード CR (連続置換) は、<code>replace</code> を連鎖させる記法(メソッドチェーン)をより簡素に記述するために設けられた機能です。 <syntaxhighlight lang="javascript"> f.push(["コマンド名","R",function(a){ return a.replace(/ABC/g,"DEF").replace(/\(1\)/g,"①").replace(/GHI/gi,"JKL") }]); //↓簡素化 f.push(["コマンド名","CR",function(a){ return [ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]}]); </syntaxhighlight> しかし、モードの一種としたがゆえに、他のモードでは利用できない事、<code>replace</code> のような使い方ができない事が難点としてありました。<br> <code>replaceBatch</code> メソッドは、この難点を解消するために設けられる機能です。 <syntaxhighlight lang="javascript"> //※モード R で利用する(基本形) f.push(["コマンド名","R",function(a){ return a.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]); //※モード RS で利用する(選択範囲を拡張) f.push(["コマンド名","RS",function(a){ return a.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]); //※モード F で利用する(▲非推奨) f.push(["コマンド名","F",function(a){ a.Text = a.Text.replaceBatch([ ["ABC","DEF"],["(1)","①"],[/GHI/gi,"JKL"] ]) }]); </syntaxhighlight> <syntaxhighlight lang="javascript"> //※replace のようにメソッドチェーンが可能 f.push(["コマンド名","R",function(a){ return a.replace(省略).replaceBatch([ 省略 ]).replace(省略) }]); </syntaxhighlight> ===モード CR → R (replaceBatch) への移行方法=== 以下のように書き換えることで移行が可能です。 <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;"><samp>f.push(["コマンド名","<span style="background:#fcc;">CR</span>",function(a){<br> return <span style="background:#fcc;">[</span> [検索1,置換1],[検索2,置換2] 中略 <span style="background:#fcc;">]</span>}]);</samp></p> :↓ <p style="background:#f9f9f9; border:1px dashed #999; padding:6px;"><samp>f.push(["コマンド名","<span style="background:#fcc;">R</span>",function(a){<br> return <span style="background:#fcc;">a.replaceBatch([</span> [検索1,置換1],[検索2,置換2] 中略 <span style="background:#fcc;">]) </span>}]);</samp></p> ==変更点まとめ== {|class="wikitable" ! 機能 !! 旧仕様 !! 新仕様 !! 備考 |- ! モード F |style="background:#cfc;"| 利用可 ||style="background:#cfc;"| 利用可 | 変更なし |- ! モード R |style="background:#cfc;"| 利用可 ||style="background:#cfc;"| 利用可 | 選択範囲を維持・調整するように |- ! モード RS |style="background:#cfc;"| 利用可 ||style="background:#cfc;"| 利用可 | 選択範囲を維持・調整するように |- ! モード RM |style="background:#cfc;"| 利用可 ||style="background:#fcc;"| 廃止 | モード RS で作り直し |- ! モード CR |style="background:#cfc;"| 利用可 ||style="background:#fcc;"| 廃止 | replaceBatch メソッドに移行 |- ! replaceBatch |style="background:#fcc;"| エラー ||style="background:#cfc;"| 利用可 | 旧仕様ではコマンド実行時にエラーが発生する |}
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
利用者ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク