Posted at

OSXでPDFから濁点付きのひらがなを普通にコピーする

Mac OSXでは,PDFから濁音付きの日本語をコピーしてどこかに貼り付けようとすると,変な感じになります。

スクリーンショット 2019-01-12 15.29.18.png

これは,OSXでは平仮名の濁音を「◯+゛」の「2字」(結合文字列)で表現しようとする傾向があるため,なんじゃないかと思っています。

 参考文献→文字コード地獄秘話 第2話:聖母マリアよ、二人を何故別々に? - ALBERT Engineer Blog

もっとも,JavaScriptではこうした結合文字列を等価性に基づく合成済み文字(例:て+゛→で)に正規化するString.normalize(form)が実装されています。

"て゛".normalize("NFC") という感じにすれば「で」になります。(「という感じ」というのは,この例は結合文字列ではなく単なる2文字なので,コピペしても動かない故。)

 参考文献→String.prototype.normalize() - MDN web docs

そんでもって,Macでクリップボードやシステムサービス的なものを操作しようと思ったら,古くからAppleScriptが使われていたのですが,最近はJavaScriptを使うこともできます。

つまり,JavaScriptの標準機能を使って,OSから容易に呼び出せる,結合文字列をどうにかするサービスを作ることができます。たとえばAutomator+JavaScriptで「クイックアクション」の「サービス」にしてシステム環境設定でキーボードショートカットを割り当てるとこんな感じに。

スクリーンショット 2019-01-12 15.47.42.png


たとえばこんなコード

スクリーンショット 2019-01-12 15.51.48.png

Automatorで【新規作成→クイックアクション】。

JavaScriptを実行→クリップボードにコピー。

JavaScriptの内容はこんな感じ。

function run(input, parameters) {   

// Your script goes here
return input.toString().normalize("NFC");
}


おまけ:クリップボード内を操作する。

上記はAutomatorのワークフローとして作りましたが,たとえばクリップボード内に置いたまま操作することも考えられます。

私の場合,他にも,半角を全角にしたりとか(裁判所への提出文書は全角にする慣行なので…)その他諸々の処理を加えたいので,こんな感じのスクリプトを作っています。


法曹用正規化コピー.scpt

var app = Application.currentApplication();

app.includeStandardAdditions = true;

var cb = app.theClipboard();

cb = cb.split("\r").join("\n"); // \rを普通の改行に
cb = cb.normalize("NFC"); //合成文字を単文字化
cb = cb.replace(/[^\x01-\x7E] [^\x01-\x7E]/g, function(s) { //全角文字間の半角スペース削除
return s.split(" ").join("");
});
cb = cb.replace(" "," "); //残った半角スペースを全角化
cb = cb.replace(/[A-Za-z0-9\(\)]/g, function(s) { //半角文字を全角化
return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
});

app.setTheClipboardTo(cb);


使い方:PDF等から任意の文字列をコピーし,上記スクリプトを実行してから貼り付ける。

AppleScript的な感じでJavaScriptでクリップボードを扱う場合,まずStandardAdditionsを呼び出せるようにする必要がある点に注意。

 参考文献→JavaScriptによるMacの自動操作入門の情報まとめ - 大石製作ブログ

スクリプトエディタ.appで上記スクリプトを作って,スクリプトメニューから使用。

 →インストール方法委細 AppleScript ことはじめ - Script Factory

これでてきとーな判決文からコピペして裁判所提出文書作成が容易に!