Index > EDDでテキスト範囲に指定したフォントが反映されない問題を MIF上で解決する
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 )
 Twitter
follow me on Twitter
 Categories