mi内でタグ以外の箇所の半角英数字を一括全角置換したい
電書で縦書きの本を作ることが多いため、テキストエディタ「mi」内でXHTMLファイル内の半角英数字を全角に打ち替えなければならないことが時々あります。なんでそういうことになるのかと言えば、InDesignのデータ内では半角の英数字でも段落の設定次第で正立させて表示できるんですね。でもXHTMLとして書き出してしまうとそういう設定は飛んでしまうので半角英数字として横転してしまいます。なのでこれまでできるだけInDesign内で半角から全角に置換するようにしていましたが、やはり書き出してしまってから置換できてなかったのが判明して手で打ち替えるというケースがそれなりにあり、特に長めの単語ではめんどくさいし入力ミスが怖いなーと思っておりました。
ということで普段使っているテキストエディタ「mi」内で気軽に置換できるようにしたので以下メモです。
やりたいこと
- miに書き出した段階ではXHTMLタグテキストの編集になるため、タグ部分は除外して置換処理をしたい
- テキスト全体ではなく該当部分を選んで置換処理をかけたい
- できるならショートカットで置換できるように設定したい
Perlでの置換処理の内容
Perlで処理するための置換コード自体は以下。処理としてはテキストを<>で括られた文字列(要はXHTMLのタグ)を区切り文字として分割し、配列内各要素がタグかどうかを判定してタグではないものに対してのみ置換処理をかけています(なので使用者がタグの真ん中あたりから適当に範囲選択したりするとアレなことにはなるけどそれは無視)。ここいらのコードは市川せうぞーさんにヒントをいただきました。ありがとうございます。
1 2 3 4 5 6 7 8 9 10 |
utf8::decode($ARGV[0]); $_ = $ARGV[0]; my @splitArray = split(/(<[^<>]+?>)/, $_); foreach my $eachElement(@splitArray){ unless ($eachElement =~ /^<[^<>]+?>$/){ $eachElement =~ tr/0-9A-Za-z/0-9A-Za-z/; } } $_ = join(\"\", @splitArray); print $_; |
ワンライナー化してAppleScriptに組み込む
これをワンライナー化してAppleScriptに組み込むことでmiでの現在の選択部分に対して置換をかけられるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
on run tell application "mi" tell document 1 set stringRef to selection set regexp to "my @splitArray = split(/(<[^<>]+?>)/, $_);foreach my $eachElement(@splitArray){unless ($eachElement =~ /^<[^<>]+?>$/){$eachElement =~ tr/0-9A-Za-z/0-9A-Za-z/;}}$_ = join(\"\", @splitArray);print $_;" --文字列置換 try set mytxt to regexReplace(stringRef, regexp) of me end try set selection to mytxt end tell end tell end run --perl処理サブルーチン on regexReplace(stringRef, regexp) set perlScript to "utf8::decode($ARGV[0]); $_ = $ARGV[0]; " & regexp as Unicode text set perlScript to quoted form of perlScript try set stringRef to do shell script "perl -Mutf8 -e " & perlScript & " " & quoted form of (contents of stringRef) on error errMsg number errNum set msg to contents of stringRef display alert (msg & return & return & errMsg & return & errNum) as Unicode text end try return stringRef end regexReplace |
なお「on run」「end run」の行に関してはmi内のツールから実行するための記述なので、単体アプリとして保存して使うならなくてよいです。範囲選択した状態でアプリを実行すれば大丈夫。
miのモードにスクリプトを組み込む方法については詳述はしないのでmi公式ページなど見てください。実例としては以前に作ったこれの「その他」(Miscellaneous)フォルダに各種仕込んだりしてます。
キーボードショートカットで使えるようにしてさらに便利に
で、これをキーボードショートカット一発で使えると本当に快適だなーと思って調べていたのですが、macOS設定メニュー内、キーボード項目のショートカット設定で行けるという情報を見つけました。素晴らしい! 何でも行けるじゃないですかこれなら。
ということで早速設定。ついでにひらがな←→カタカナの変換も仕込みました。そちらもタグは除外して置換するようにしました。まあXHTMLのタグ内にカナとか漢字が混じってるとは思えないけど。
他にも仕事ごとにいろいろ仕込んで使えそうだけどまあそこいらはおいおい。
(2018.4.5)
タグ: Applescript, mi, Perl, ワンライナー
2018/04/05 20:33
大変勉強になります!