[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(DTPtechNote:203) regex_kerning
(*
regex_kerning
【QXPドキュメント上の<数字>と<単位>の間をカーニングします。とりあえず汎用性はまるでありません】
2002.06.06 (c)市川せうぞー ym3s-ickw@asahi-net.or.jp
mgrep OSAX 1.7.1(http://www.bekkoame.ne.jp/~iimori/)を使用します。
難波師匠のご指導をいただきました。
・<μ>と<単位>の間は詰めます
・正規表現はイッパツ勝負になってます。リストにすべきかも(ツライからパス)。
*)
--------------------------------------------------------★変数宣言でもしとくかってこった
property reg_str : "([0-9μ])(mm|cm|mol|m)" --性器表現
property kerning_default : 50 --デフォルトのカーニング値
property kerning_set1 : -30 --カーニング値のセット1(μの場合)
global G_counter
set G_counter to 0 --カウンター
--------------------------------------------------------●コントロールルーチン
tell current application
activate
display dialog "このスクリプトはQXPドキュメント上の<数字>と<単位>の間をカーニングします。そのために組み版が変わる可能性があります。それでも続行しますか?"
end tell
my confirm_osax()
my ver()
my doc_open()
my do_it()
tell current application
activate
if G_counter > 0 then
display dialog "とりあえず" & G_counter & "箇所のカーニング値を変更しました。かならず確認を行ってください。"
else
display dialog "とりあえず、カーニング値を変更すべき箇所は見あたりませんでした。"
end if
end tell
--------------------------------------------------------●実行ルーチン
to do_it()
tell application "QuarkXPress 3.3"
activate
tell document 1
repeat with i from 1 to (count of page)
show page i
tell page i
repeat with j from 1 to (count of text box)
tell text box j
set selected to true
set ans_list to my GetPos((contents of text 1), reg_str)
repeat with ii in ans_list
set {s, e, my_kerning} to contents of ii
--show character s
set properties of text from character s to character e to {kern:my_kerning}
set G_counter to G_counter + 1
end repeat
end tell
end repeat
end tell
end repeat
end tell
end tell
end do_it
--------------------------------------------------------●検索ルーチン(なんの汎用性もありません。。。っていうかね、こんなことしなくちゃいけないのは誰のせいなの?)
to GetPos(TXT, reg_str)
set byte_list to {} --このサブルーチンの返り血{{スタートバイト数, 終わりバイト数, カーニング量}, ...}
set start_byte to 0 --次の検索のバイト数
repeat --無限・野本ルーチン
set Sms to {}
try --subMatchStrがないときでも、こうすると他のふたつは得られる。こうしないとエラーで止まる
set {matchLen:MatchL, matchPos:MatchP, subMatchStr:Sms} to mgrep TXT regex reg_str scriptCode 1 with byteCount
end try
if MatchL = -1 then exit repeat --マッチなし。
--カーニング値のセット。。。まあこういうのをいきあたりばったりな決めうちっていうんでしょうな。
if item 1 of Sms is "μ" then
set my_kerning to kerning_set1
set first_Len to 2
else
set my_kerning to kerning_default --デフォルトのカーニング値
set first_Len to 1
end if
--set first_Len to my bytelength(contents of item 1 of Sms) --最初の項目のバイト値を得る。遅いから却下です閣下。
set start_byte to (start_byte + MatchP) --スタートバイト(ここから)
set end_byte to (start_byte + first_Len - 1) --エンドバイト(ここまで)
set end of byte_list to {start_byte, end_byte, my_kerning}
set start_byte to start_byte + MatchL - 1 --次の検索のための調整
set {matchLen:MatchL2, matchPos:MatchP2} to mgrep TXT regex reg_str scriptCode 1 --こっちは文字数でのお返事
set TXT to text (MatchP2 + MatchL2) thru -1 of TXT --元テキストの再設定
end repeat
return byte_list
end GetPos
--------------------------------------------------------●文字のバイト数を求める
to bytelength(str)
set the clipboard to str
item 2 of (item 1 of (clipboard info))
end bytelength
--------------------------------------------------------●osaxがインストールされているかどうかの確認。
to confirm_osax()
tell application "Finder"
if not ((exists file "mgrep.PPC" of (path to scripting additions)) or (exists file "mgrep.PPC" of folder "スクリプティング機能追加" of (path to extensions folder))) then
activate
display dialog "mgrep OSAX がインストールされていません" & return & ツ
"(http://www.bekkoame.ne.jp/~iimori/)" & return & ツ
"からダウンロードしてください" with icon 0
error number -128
end if
end tell
end confirm_osax
--------------------------------------------------------●QuarkXPress 3.3Jバージョン確認ルーチン
to ver()
tell application "QuarkXPress 3.3"
set QXP_ver to version
if (QXP_ver as text) is not "3.31J" then
activate
beep 10
display dialog "ゴラア!" & return & "このプログラムはVer. 3.31J以外では動作しません" buttons {"キャンセル"} with icon 2
end if
end tell
end ver
--------------------------------------------------------●ドキュメントが開かれているかどうか
to doc_open()
if not (exists document 1 of application "QuarkXPress 3.3") then
activate
beep
tell APPL to display dialog "ドキュメントが開かれていません" buttons "キャンセル" default button 1
end if
end doc_open