Mon, February 15, 2010
EDDでテキスト範囲に指定したフォントが反映されない問題を MIF上で解決する
構造化FrameMaker8の話。 EDD上でテキスト範囲指定している要素に対して、合成フォントやフォントファミリを指定しても 有効にならない。合成フォントでは、EDDの指定自体が反映されないようだ。 (再度構造化ツールでEDD書き出ししたときに指定が無効になっていないかで確認)
以前の自分の調査によれば...
継承元の段落書式に合成フォントを指定するとNG になるらしい。 逆に合成フォントを継承元の段落書式に設定していなければ、 EDDでテキスト範囲に対して行った書式設定は有効かされると...
というメモを見つけた。(この内容が真実かどうかは現時点では未確認です。)
ただFrameMaker GUI上で直接該当要素(この例では markup)に対して 合成フォントを指定してやればきちんと有効になる。
そこで、今回はMIF上でこのGUIで行ったのと同じ操作を行うことにした、という話。
こんな対処をしなければならないのはレアケースだとは思いますが、 EDD+テキスト範囲指定にはいままでもいろいろ苦しめられてきたので、メモとして残します。
何をどうしたいのか?
結論としては、Aの状態のMIFをBの状態のMIFにしたいだけです。
Aの状態
<ElementBegin
<Unique 1016512>
<ETag `markup'>
<Attributes
<Attribute
<AttrName `font-weight'>
<AttrValue `bold'>
> # end of Attribute
> # end of Attributes
<Collapsed No>
<SpecialCase No>
<AttributeDisplay AllAttributes>
> # end of ElementBegin
<String `利用できる出力'>
<ElementEnd `markup'>
Bの状態
<Font
<FTag `'>
<FPlatformName `W.A-OTF 新ゴ Pro M.R.505'>
<FWesternPlatformName `W.Arial.R.400'>
<FFamily `A-OTF 新ゴ Pro M'>
<FCombinedFontName `M'>
<FEncoding `JISX0208.ShiftJIS'>
<FLocked No>
> # end of Font
<ElementBegin
<Unique 1016512>
<ETag `markup'>
<Attributes
<Attribute
<AttrName `font-weight'>
<AttrValue `bold'>
> # end of Attribute
> # end of Attributes
<Collapsed No>
<SpecialCase No>
<AttributeDisplay AllAttributes>
> # end of ElementBegin
<String `利用できる出力'>
<ElementEnd `markup'>
<Font
<FTag `'>
<FLocked No>
> # end of Font
AとBの差分
0a1,9
> <Font
> <FTag `'>
> <FPlatformName `W.A-OTF 新ゴ Pro M.R.505'>
> <FWesternPlatformName `W.Arial.R.400'>
> <FFamily `A-OTF 新ゴ Pro M'>
> <FCombinedFontName `M'>
> <FEncoding `JISX0208.ShiftJIS'>
> <FLocked No>
> > # end of Font
15a25,28
> <Font
> <FTag `'>
> <FLocked No>
> > # end of Font
A状態からB状態を作り出すための groovy コード
結局...
<ElementBegin <Unique 1016512> <ETag `markup'>
〜
<ElementEnd `markup'>
の部分を見つけて、
それを包み込むように Font タグを入れればよい。
実際にはまず該当場所を見つけ、その前後にフォントタグを挿入します。
※Font タグは単なる固定文字列なので、扱いは楽です。
Fontタグの前半部分
<Font
<FTag `'>
<FPlatformName `W.A-OTF 新ゴ Pro M.R.505'>
<FWesternPlatformName `W.Arial.R.400'>
<FFamily `A-OTF 新ゴ Pro M'>
<FCombinedFontName `M'>
<FEncoding `JISX0208.ShiftJIS'>
<FLocked No>
> # end of Font
ここでは、合成フォントM(新ゴ+Arial) を挿入
Fontタグの後半部分
<Font
<FTag `'>
<FLocked No>
> # end of Font
コード
step1 ... 該当部分を見つける
markup 要素として記述されている部分を mif データから見つけるコード。
import java.util.regex.*
def getText(){
f=new File('sample_a.mif')
f.newReader('UTF-8').text
}
regex = '<ElementBegin\\s{1,}<Unique \\d{1,}>\\s{1,}<ETag `markup\'>.*?<ElementEnd `markup\'>'
pat = Pattern.compile(regex,Pattern.DOTALL)
m = pat.matcher( getText() )
result = m.find()
while( result ){
println '---'
println m.group()
result = m.find()
}
このコードでねらった部分が取り出せることを確認します。
step2 ... 該当部分の前後に Font タグを入れる
import java.util.regex.*
BR = System.getProperty('line.separator')
REGEX = '<ElementBegin\\s{1,}<Unique \\d{1,}>\\s{1,}<ETag `markup\'>.*?<ElementEnd `markup\'>'
INPUT_F = new File('sample_a.mif')
OUTPUT_F = new File('result.mif')
// 追加するフォントタグの前半
FONT_TAG_BEGIN = '''
<Font
<FTag `'>
<FPlatformName `W.A-OTF 新ゴ Pro M.R.505'>
<FWesternPlatformName `W.Arial.R.400'>
<FFamily `A-OTF 新ゴ Pro M'>
<FCombinedFontName `M'>
<FEncoding `JISX0208.ShiftJIS'>
<FLocked No>
> # end of Font
'''
// 追加するフォントタグの後半
FONT_TAG_END = '''
<Font
<FTag `'>
<FLocked No>
> # end of Font
'''
// 改行コードの修正
def fixLineTerminators( def infile, def outfile ){
sb = ''<<''
infile.newReader('UTF-8').eachLine{ sb << it << BR }
pw = outfile.newPrintWriter('UTF-8')
pw.print( sb.toString() )
pw.close()
}
// 1) mif ファイルを読む
text = INPUT_F.newReader('UTF-8').text
// 2) Matcherをつくる
pat = Pattern.compile(REGEX,Pattern.DOTALL)
m = pat.matcher( text )
// 3) 該当部分を置きかえる(フォントタグで包む)
sb = ''<<''
result = m.find()
while( result ){
m.appendReplacement(sb, FONT_TAG_BEGIN + m.group() + FONT_TAG_END );
result = m.find()
}
m.appendTail(sb);
// 4) 結果の出力
pw = OUTPUT_F.newPrintWriter('UTF-8')
pw.print( sb.toString() )
pw.close()
// 5) 改行コードの修正
fixLineTerminators( OUTPUT_F,OUTPUT_F )