[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