[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