‘Applescript’ タグのついている投稿

「自然順ソート」あれこれ

2016/09/20

 最近ちょっとしたツールを作っていて、スクリプト内で「Finderの表示順にファイルをソート(整列)させたい」という要件がありまして、なかなかに手こずったので今後のために備忘録としてまとめておきます。

Finderでのソート順って?

 まず、Finderでのソート順って何かっていいますと、

ファイル1,ファイル2,ファイル3…ファイル10,ファイル11,ファイル12

 となるようなソート方法のことです。文字列の後に数字が来るような場合でも数値順にソートさせたい。
 perlなどで普通に文字列順にソートさせても数値でソートさせても

ファイル1,ファイル10,ファイル11,ファイル12,ファイル2,ファイル3…

 となってしまい、思ったような処理ができません。

 Finderでのソート順については、降りてきた天の声によると

 とのことらしく。ありがとうございます@ogwataさん。

 なお、どうやらJIS X 4061 照合順番で定義されてるようなソート方法を「自然順ソート」と言うらしいのですが、PerlだとSort::Naturallyあたりのモジュールを利用すればできる模様(参考)。ただ今回は配布ツールでの使用を考えているので、CPANからモジュールを入れる的な話はできれば避けたく、いろいろと違う方向性を模索していたわけです。

Xojo内でCocoaのライブラリを呼び出してソート

 フロントエンドのツールはXojoなので、Xojo内でできればなと思って、過去にQiitaにされていたアップされていたこちらの神エントリをもとにどうにかソートできるようにしたのが以下。さすがです@monokanoさん。

 Xojo内でモジュール化しておいて元の配列を投げ、ソート後の配列を得る、みたいな使い方です。今回の目的としてはFinderのソート順の再現なので、Finderと同じエンジンを使うこちらが一番目的に叶いそうです。ただもちろんCocoaのライブラリを呼び出している以上Mac専用にはなります。

Applescriptでの自然順ソート

 AppleScriptでもできそうかなということでこちらの投稿をもとに作ってみたのが以下。

 他の処理系に投げるので一回文字列に結合して引数として投げ、ソートした後に再結合した文字列を得ます。でそれをまた分解して配列に。
 AppleScriptはテキストアイテムデリミタでの文字列の分解結合処理がいつもながらややこしいのですが、そのあたりはまあご愛敬ということで。こちらもAppleScriptを使う以上Mac専用です。まあそのうちAppleScriptで自然順ソートさせなきゃならないケースも出てくるかも知れないし。

PHPのnatsort関数でソート

 PHPには自然順ソートができるnatsortという関数がデフォルトで入っているとのことなのでやってみたのが以下。

 一番簡単かも。Mac環境に依存しないのでそういう意味での使い出もありそうです。

 3種類の自然順ソートを収録したXojoのファイルをこちら (343)に置いておきます。

 で、ブログにまとめてたら最後になんかPerlでモジュールを使わずにできそうなサンプルを発見してしまった。最初に出てきて欲しかった(汗)。

(2016.9.20)

追加情報メモ。
・ApplescriptならFinderにtellしてsort by nameで並べ替えちゃうのが手っ取り早いと。ただし処理は遅いから大量のファイル処理には向かないとのこと。
・OS Xでもバージョンによって微妙にソート結果が変わったりするらしい。なので確実にFinderのソート順通りのソート結果が欲しければApplescript上からFinderを呼び出して値を取得するか、Cocoaのライブラリを呼び出してソートさせるかするしかない。
・対象がファイル名ならPerl内からosascriptでApplescript呼んでFinderに聞くのが手っ取り早いんじゃないのと言われたのでちょい試しました。以下コードをメモ。

行けますね。楽でいいかも。

Text::MarkdownでHTMLを生成してみる

2012/08/06

 テキスト文書から簡単にHTMLなどのタグ付きテキストを生成するための方法のひとつとして、「Wiki記法」というものがあります。これはHTMLを直にバリバリ書くのはそれなりに手間がかかるために作られた軽量マークアップ言語で、Wikipediaで使われる独自記法や、はてなダイアリーで使用できるはてな記法などもこういった軽量マークアップ言語の範疇に入ります。
 そういったもののひとつで、比較的メジャーなものに「Markdown記法」※1があり、この記法で書かれたテキストからHTMLに変換するための「Text::Markdown」というPerlのモジュールが公開されていますので、電子書籍制作のツールとして利用できるのではないかと思い、ちょっと試してみました。

CPANからText::Markdownをインストールする

 Mac OS Xには標準でPerlがインストールされており、特にインストール等の作業を行うことなしにターミナルやスクリプト等を介して利用することができます。ただ、Text::Markdownは標準で入っているモジュールではありませんので、別途Perlのライブラリ・モジュールアーカイブである「CPAN」からインストールし、使用できるようにしておく必要があります。これは以下の手順で行いました。

1 cpanminusをインストールする

cpanminusをインストール

cpanminusをインストール

 正直インストールに関してはOSや環境による差異が大きいようで、私はこのあたりのものをやっと使えるようになったレベルですのでインストール時のオプション等でそう詳しいことはわかりませんし、おそらくここで上げている以外のインストール方法もあると思われるのですが、とりあえずこちらの環境(OS X 10.7)でインストールに成功したパターンを上げておきます。

 まず、cpanminus(cpanm)をインストールします。cpanminusは、標準で入っているcpanコマンドよりも簡単にモジュールのインストールを行えるインストーラです。なお、Mac OS X 10.7では、cpanminusのインストールを実行する前にDeveloper Tools(Xcode)及び、gcc-4.2をインストールしておく必要があるようです。XcodeはApp Store、gcc-4.2はこちらから入手できます(GCC-10.7.pkg)。また、言うまでもありませんがインターネット接続環境は必須です。

 これらをあらかじめインストールした上で、ターミナルから

curl -L http://cpanmin.us | perl – –sudo App::cpanminus

 のコマンドを打ち込むことで、cpanminusのインストールが完了します。途中でパスワードを聞かれますので、OSのログインパスワードを入力してください。インストールに関しての参考文献はこちら※2。また、書籍になりますがPerl CPANモジュールガイド(ワークスコーポレーション)に詳しい解説が掲載されており、参考になりました。

2 Text::Markdownをインストールする

次に、cpanminusを使用してText::Markdownをインストールします。同じくターミナルから

sudo -H cpanm Text::Markdown

 のコマンドを打ち込み、インストールします。インストール後、「man Text::Markdown」と入力してターミナル内画面にText::Markdownのマニュアルが表示されればOKです(マニュアル画面から抜けるには「Q」をタイプ)。

ターミナルから使ってみる

 まずはターミナルからコマンドラインで使ってみます。以下のコマンドを打ち込み、欧文スペースを入力した後、末尾に処理したいファイルをドラッグ&ドロップし、リターンキーを押します。

perl -i -pe ‘use Text::Markdown qw/markdown/;$_ = markdown($_)’ 処理したいファイル

HTMLに変換された

HTMLに変換された

 これだけで、Markdown記法のテキストがHTMLタグテキストに変換されます。もとのテキストの改行コードをCR(Mac)にしておくこと、ファイル名に日本語や空白文字を使わないことなど注意点はいくつかありますが、それなりに便利に使えそうです。

テキストエディタ内で使えるようにしてみた

 せっかくなので、アプリケーション内からApplescript経由で呼び出せるようにしてみました。フロントエンドにはいつも使用しているフリーのテキストエディタ、「mi」を使いました。変換したいテキスト範囲をエディタ内で選択し、スクリプトを実行すると変換が実行されます。

tell application “mi”

–選択範囲のテキストを取得

set myTxt to selection of document 1

–変換対象テキストに取得したテキストをセット

set stringRef to myTxt

–perlの置換式を設定

set regexp to “use Text::Markdown qw/markdown/;my $html = markdown($_);print $html;”

–サブルーチンに置換式、変換対象テキストを投げ、Text::MarkdownモジュールでMarkdownテキストをHTMLに変換、変数modoriに変換後のテキストを取得

try

set modori to regexReplace(stringRef, regexp) of me

end try

–選択範囲のテキストを置き換える

set selection of document 1 to modori

end tell

–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

 処理としてはApplescriptで現在選択しているテキストを取得し、ワンライナー構文でPerlに送ってText::MarkdownでHTML変換しています。その後処理を終えて戻ってきたテキストを再びApplescriptで選択範囲に書き込んでいます。

 今回使ってみた感想として、正直Markdown記法自体は簡便過ぎて電子書籍の制作自体には補助的にしか使えそうにないという印象を受けました。ルビやSectionなどのHTML5関連の記述はMarkdown記法ではできないことや※3、テーブルタグの記述にも対応していませんのでかなり機能的に割り切った印象を受けます。ただ、それでもブログの記事作成等には十分使えそうですし、テキスト内の一部分を選択してHTMLに変換するなどの使用法なら電子書籍の制作の役にも立ちそうですので公開してみました。なお、このスクリプトを使用したことでコンテンツ破損などの損害が生じた場合、私としての責任は負いかねますのであくまで自己責任にてご使用ください。

 また、CPANはこの「Text::Markdown」に限らず数限りないモジュールが登録されている先人の叡智の結晶で、使い方を習得しさえすれば正直「宝の山」と思いますので、使ったことのない方はぜひ試してみることをお勧めしておきます。Applescriptと連携させればInDesignやIllustratorの自動処理にももちろん使えます(使ってます)。
 私はPerlは勉強し始めたばかりの素人ですが、多少かじった程度でもDTPの効率化目的で相当役に立つツールであることを日々実感しております。

※1 参考(Markdown記法):http://blog.2310.net/archives/6
※2 参考(cpanmインストール):http://artifactsauce.blogspot.jp/2010/10/cpanmmac-os-x.html http://www.goodpic.com/mt/archives2/2011/10/osx_107_lion_perl_cpanm.html
※3 通常のHTMLタグをMarkdown構文の中に記述することは可能です。

(2012.8.06)

プロフィール
Jun Tajima

こちらにて、電子書籍&Web制作を担当しています。
このブログは、EPUB3をはじめとした電子書籍制作担当オペレータからの、「電子書籍の制作時にたとえばこんな問題が出てきていますよ」的な「現地レポート」です。少しでも早い段階で快適な電子書籍閲覧・制作環境が整うことを願って、現場からの声を発信していこうと目論んでおります。

当ブログ内の記事・資料は、私の所属しております組織の許諾を得て掲載していますが、内容は私個人の見解に基づくものであり、所属する組織の見解を代表するものではありません。また、本ブログの情報・ツールを利用したことにより、直接的あるいは間接的に損害や債務が発生した場合でも、私および私の所属する組織は一切の責任を負いかねます。