[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(DTPtechNote:206) Re: regex_kerning
>お尋ねしたい件があるのです。別スレで。
なんでしょう? 昼から気になっているんですが(笑)
で、ちょっと汎用的にしてみました。
なんかつくづくドキュンなわたくし...
(*
regex_kerning
【QXPドキュメント上の任意の文字間をカーニングします。だいぶ汎用性がでてきました】
2002.06.07 (c)市川せうぞー ym3s-ickw@asahi-net.or.jp
mgrep OSAX 1.7.1(http://www.bekkoame.ne.jp/~iimori/)を使用します。
難波師匠のご指導をいただきました。
・ツメ指示(reg_list)は{"正規表現strings", カーニング量real}となっており、グループ1とグループ2の間をカーニングします。
*)
--------------------------------------------------------★変数宣言でもしとくかってこった
set reg_list to {{"(°)(F)", -100}, {"(μ)([AglmV])", -20}, {"(N)(・)", -50}, {"(・)(m)", -50}, {"([0-9])([A℃GghJKlmMQsSUVW]|bp|cal|cd|CFU|cm|dl|dyn|Eq|eV|Hz|IU|kcal|kg|kHz|kl|km|kPa|kW|N・m|ng|nm|Osm|oz|Pa|pg|ppm|rad|rpm|Torr)", 30}} --性器表現
--------------------------------------------------------●コントロールルーチン
tell current application
activate
display dialog "このスクリプトはQXPドキュメント上の任意の文字間をカーニングします。そのために組み版が変わる可能性があります。それでも続行しますか?"
end tell
my confirm_osax()
my ver()
my doc_open()
set G_counter to my do_it(reg_list)
tell current application
activate
if G_counter > 0 then
display dialog "とりあえず" & G_counter & "箇所のカーニング値を変更しました。かならず確認を行ってください。"
else
display dialog "とりあえず、カーニング値を変更すべき箇所は見あたりませんでした。"
end if
end tell
--------------------------------------------------------●実行ルーチン
to do_it(reg_list)
set G_counter to 0
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 ii from 1 to (count of text box)
tell text box ii
set selected to true
repeat with iii in reg_list
set {reg_str, my_kerning} to contents of iii
set TXT to contents of text 1
if TXT is not "" then --カラテキストボックスは無視する
set ans_list to my GetPos(TXT, reg_str)
repeat with iiii in ans_list
set {s, e} to contents of iiii
set properties of text from character s to character e to {kern:my_kerning}
set G_counter to G_counter + 1
end repeat
end if
end repeat
end tell
end repeat
end tell
end repeat
end tell
end tell
return G_counter
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 --マッチなし。
--カーニング値のセット。。。まあこういうのをいきあたりばったりな決めうちっていうんでしょうな。
set tmp_str to contents of item 1 of Sms
if tmp_str is "μ" or tmp_str is "°" or tmp_str is "・" then
set first_Len to 2
else
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 beginning of byte_list to {start_byte, end_byte} --ケツから入れテクぜ!
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()
tell application "QuarkXPress 3.3"
if not (exists document 1) then
activate
beep
display dialog "ドキュメントが開かれていません" buttons "キャンセル" default button 1
end if
end tell
end doc_open