●Perlって何? (PDF版-Acrobat3.0Jが必要です)

 Perl(パール)について,ご存知な方も多いと思いますので,簡単に説明します。元来はUNIXで使用されていたプログラミング言語です。UNIXでは,ちょっとした文字列処理をCでプログラムを書かずに,sedやawkといった言語を用いた処理を行っていました。テキストファイル内にある,あるパターンの文字列をsedやawkを通すことで,別の文字列に置換するこができます。Perlはその兄貴分と考えていいでしょう。単純な文字列置換はもちろん,複雑なプログラムも可能にしています。また,UNIXから移植され多くのOSで実行可能ですし,その配付も無料で行われています。最近では,インターネットのホームページでCGIを作成するのにPerlで行われるのが一般的になっていますので,この方面からPerlを知った方も多いのではないでしょうか。

●どうしてPerlなのか?

 高速な動作! Macで使用する範囲では同じ作業でもawkより速く処理します。
 大きなファイルでも楽々処理! 3,4MBのテキストファイルでも数分もかからずに(一般的な置換作業ならば)問題なく処理します。
 もちろん,その配付が無料であり誰でも使用して構わないことは大きな理由の一つになります。

●MacPerl & MacJPerl

 Macintosh上で利用可能なのがMacPerlです。ただし,このままですとテキストが1バイトの欧文を前提としています。2バイトの日本語も処理できるようにするには,パッチを当てる必要があります。パッチを当てたPerlをJPerlと呼んでます。MacPerlにパッチを当てたものがMacJPerlとなります。

●MacJPerlを用意する

 Perlのバージョンは最新では5となっています。ただし,JPerlではパッチが用意されていませんので,MacJPerlはバージョン4を利用します。また,MacJPerlでは,PowerMac版では動作が安定しない部分がありますので,68K版を使用します。

 CD-ROMには,以下のプログラムを収録しました。
  ・MacPerl 4.1.8(68K版)
  ・MJP418 (J14) キット
  ・MJP418 (J142) patch

 MacPerlにMJP418 (J14) キットのパッチを当て,MacJPerl418 (J14)にし,MJP418 (J142) patchのパッチでMacJPerl418 (J142)にしてください。以下,記事ではMacPerlと記載しますが,Mac-JPerl418(J142)を指し,スクリプトの実行もMacJPerl418(J142)を前提とします。

●QuarkXPressとの連携を考える

 では,QuarkXPressとはどのように連携させるか考えてみます。AppleScriptを用いずに,手作業で行う場合は次のようになります。

(1)テキストボックス内のテキストを「テキスト保存」する
(2)保存したファイルをMacPerlの入力ファイルとして,ある処理をさせる
(3)処理後の出力ファイルを,QuarkXPress側でテキストとして「テキスト取り込み」を行う

 これをAppleScriptで自動化する場合を考えてみます。

(1)処理文字列を選択する
  文字列を選択するか(「編集ツール」で文字列を反転させる),かテキストボックスを選択状態にします。
(2)処理するMacPerlプログラムを選択する
  処理するMacPerlプログラムによって,テキストをプレーンなテキストで処理するか,XpressTagとして処理するか選択できるようにします,
(3)MacPerlによる処理を行う
  (1)の選択した文字列をテキストファイルとしてテンポラリーファイルとして書きだし,MacPerlの入力ファイルとします。選択したMacPerlプログラムを実行します。その際,必要があれば,QuarkXPress側のフォント名称やフォントサイズをPerlに引き渡します。
(4)処理後のテキストファイルを読み込む
  処理後のテキストファイルを,選択した範囲に読み込ませます

●テキスト保存

 テキストを選択して保存するにはどういうスクリプトを書いたらよいでしょうか?

(1)選択したテキストボックス内の全テキスト
  (a) プレーンなテキストとして保存する

  tell application "QuarkXPress3.3J"
    tell document 1
      save story 1 of current box in "保存ファイル"
    end tell
  end tell

  (b) XPressTagとして保存する

  tell application "QuarkXPress3.3J"
    tell document 1
      save story 1 of current box in "保存ファイル" as "TEXT"
    end tell
  end tell

(2)選択した範囲のテキスト

  (a) プレーンなテキストとして保存する

  tell application "QuarkXPress3.3J"
    tell document 1
      set tool mode to contents mode
      save contents of selection in "保存ファイル"
    end tell
  end tell

  (b) XPressTagとして保存する

  tell application "QuarkXPress3.3J"
    tell document 1
      set tool mode to contents mode
      save contents of selection in "保存ファイル" as "TEXT"
    end tell
  end tell

 のようになります。XPressTagの場合は,as "TEXT" をsave文の末尾につけるだけで大丈夫です。

●テキスト取り込み

逆にテキストを取り込む場合です。

(1)選択したテキストボックス内の全テキスト

  tell application "QuarkXPress3.3J"
    set import styles to true
    tell document 1
      set story 1 of current box to alias {"保存ファイル"}
    end tell
  end tell

 読み込む場所がstory 1 of current box となります。

(2)選択した範囲のテキスト

  tell application "QuarkXPress3.3J"
    set import styles to true
    tell document 1
      set contents of selection to alias {"保存ファイル"}
    end tell
  end tell
 

 読み込む場所がcontents of selection となります。

 import stylesは「スタイルシートを含む」かどうかです。プレーンなテキストならば,この行は不要ですが,あっても取り込み内容に差はありません。しかし, XPressTagならば,絶対に必要になります。

●MacPerlに値を引き渡す

 テキストの保存と取り込み方法が分かったので残るは,Mac-Perlの部分です。問題なのは,

(1)入力ファイルをどのように指定するか
(2)QuarkXPressでの設定値(例:フォント名称,フォントサイズなど)をMacPerlに引き渡す方法はあるのか

 の2点でした。

(1)入力ファイルの指定方法

  tell application "MacPerl"
    Do Script {"実行プログラム","保存ファイル"} mode Batch
  end tell

 このように,実行プログラム名称の後に,保存ファイル名称を記入します。もちろん,両者ともパスを含んだ形式で記入します。

(2)QuarkXPressでの設定値の引渡し方法

 (1)のスクリプトにenvironmentパラメータを付与します

  tell application "MacPerl"
    Do Script {perlScript, tempFileName} mode Batch ツ
      environment {"FONTNAME",FTNAME,"FONTSIZE",FTSIZE}
     end tell

 environment {"FONTNAME",FTNAME,"FONTSIZE",FTSIZE}の意味は,MacPerlでの環境変数 FONTNAMEeに,FTNAMEの値を引渡し,環境変数 FONTSIZEには,FTSIZEの値を引渡すことを表しています。

 つまり,QuarkXPress側の処理で,変数FTNAMEとFTSIZEに値をセットしておきます。そして,environmentパラメータに引き渡します。MacPerl側では,$ENV{"FONTNAME"}によって変数FTNAMEの値を,$ENV{"FONTSIZE"}によって変数FTSIZEの値を得ることが出来ます。

 これによって,QuarkXPressでの値をMacPerlに引き渡すことが出来るようになりました。

(なお,environmentパラメータの値を利用するしないはMacPerlの実行スクリプトに依ります。MacPerl側で利用しないケースでenvironmentが記入されていても問題はありません)

●MacPerlプログラム

 MacPerlプログラムをどのように書くかは,Perl本が数多く出ていますので,それを参考にして下さい。ただし,保存する方法は,Droplet形式を選んで下さい。Text形式でも実行は可能ですが,問題が発生する場合があります。また,入力ファイルを上書きすることを前提としていますので,MacPerlでコマンドラインスイッチ -i オプションが必要になります。

●QuarkXPress & MacPerlスクリプト

- QuarkXPress & MacPerl Scripts

set tempFilePath to path to temporary items folder as text
set tempFileName to tempFilePath & "tempXPressText"
set PerlScript to choose file with prompt ツ
 "実行するPerlプログラムを選択してください" of type {"APPL"}
set textOrtag to button returned of ツ
 (display dialog "テキスト形式と XPressTags 形式、どちらで処理しましょうか?" buttons {"キャンセル", "テキスト", "XPressTags"})

--選択しているテキストボックスのテキストを保存

set selectChoice to button returned of (display dialog "処理範囲は?" buttons {"キャンセル", "ストーリー", "選択範囲"})
tell application "QuarkXPress3.3J"
  if selectChoice is "選択範囲" then
    tell document 1
      set tool mode to contents mode
      if contents of selection is "" then
        beep
        display dialog "テキストが選択されていません" buttons {"OK"} default button 1
        return
      end if
      set FTNAME to font of character 1 of selection of current box
      set FTSIZEN to round ((((size of character 1 of selection of current box) as points) as real) * 1000) rounding to nearest
      set FTSIZE to FTSIZEN / 1000 as text
      if textOrtag is "テキスト" then
        save contents of selection in tempFileName
      else
        save contents of selection in tempFileName as "TEXT"
      end if
    end tell
  else
    tell document 1
      try
        get box type of current box
      on error
        beep
        display dialog "テキストボックスが選択されていません" buttons {"OK"} default button 1
        return
      end try
      set FTNAME to font of character 1 of story 1 of current box
      set FTSIZEN to round ((((size of character 1 of selection of current box) as points) as real) * 1000) rounding to nearest
      set FTSIZE to FTSIZEN / 1000 as text
      if textOrtag is "テキスト" then
        save story 1 of current box in tempFileName
      else
        save story 1 of current box in tempFileName as "TEXT"
      end if
    end tell
  end if
end tell

--Perlで処理

with timeout of 300 seconds
  tell application "MacPerl"
    activate
    Do Script {PerlScript, tempFileName} mode Batch ツ
      environment {"FONTNAME", FTNAME, "FONTSIZE", FTSIZE}
  end tell
end timeout

--処理後のファイルを選択しているテキストボックスに読み込む

tell application "QuarkXPress3.3J"
  activate
  set import styles to true
  if selectChoice is "選択範囲" then
    tell document 1
      set contents of selection to alias {tempFileName}
    end tell
  else
    tell document 1
      set story 1 of current box to alias {tempFileName}
    end tell
    do updates
  end if
end tell

 次のMacPerlプログラムをサンプルとしてCD-ROMに収録しました。前ページのスクリプトを起動し,任意のMacPerlプログラムを選択して実行してみましょう。

1:全角欧文->半角一括置換(テキスト形式を選択)

 全角の英数字を半角に置換します

    #!/usr/local/bin/perl -pi.bak
    tr/A-Za-z/A-Za-z/;
    tr/0-9/0-9/;

2:縦組中の文字回転(テキスト形式を選択)

 0〜9,さらに2文字数字が連続した場合とA〜Zの場合,文字を回転させます。

    プログラム内容は,CD-ROMを参照して下さい

3:総ルビ付与(テキスト形式を選択)

 総ルビを振ります。辞書RUBIS.DICはMacPerlプログラムと同じ階層において下さい。

    プログラム内容は,CD-ROMを参照して下さい

 このように,MacPerlプログラムをいろいろ作るだけで,様々なテキスト処理が可能になります。QuarkXPress側ではテキストを選択してからAppleScriptを実行するだけでテキストが入れ替わりますので,MacPerlを意識せずに処理できます。

●最後に

 このスクリプトは,NiftyServe上で青山和光氏の助言をいただいて,ここまでに至りました。改めて御礼申し上げます。また,「文字情報と印刷・DTPフォーラム」(FPRINT)の15番会議室「せどおうくぱーる(SED, AWK, PERL)」発言番号1343番以降でいろいろなMacPerlプログラムや,このAppleScriptの改善が行われています。収録したプログラムは開発中のものが多くあります(8/7現在)。本番の使用に当たっては思わぬ障害が出るかもしれません。最新版の使用をお勧めしますので,是非,FPRINTの15番会議室を覗いてみてください。