InDesign_Script-如何查出錨定物件(CS5)

InDesign_Script-如何查出錨定物件(CS5)

image

如上圖所示,在最外層的最大文字框裡的文字流中,嵌了2個文字框的錨定(第一塊、第二塊),2個文字框中,又各自嵌入了1個文字框錨定物件(第二塊、第四塊)。

以往錨定物件需透過Anchored尋找。現在可以透過文字流逐字作業的過程中,判斷是否遇到了錨定物件;以期順便取出子框中的內容,同時還有個重大意義,就是取出的子框內容,能跟父親(錨定點)在一起,兒子不用流落異鄉。

或許甚為奇怪,在程式中以InDesign的搜尋功能取得所要的文字,豈不快哉!何須用到逐字作業這檔麻煩事呢?

舉個例子:

假設使用者期望能取出符合,[段落樣式一]、[段落樣式二]、[字元樣式一]、[字元樣式二]的文字

到此,用搜尋作業做沒問題,但在看下去。

同時使用者期望取出的文字內容排列能比照原文。

這點就比較頭大。搜尋作業是一批批做,結果也是一批批的。[段落樣式一] 與[字元樣式一]的結果當然兜不在一起。更別提文字排列與原文同。

有兩種方式解決:

一、用資料庫輔助,先把所有文字框資料,抽提至資料庫中,同時記下相關數據(所屬文字框Index、父框編號、所在頁面、前後關聯文框、框內文字所套之段樣、字樣等等),然後在由資料庫中按順序取出判斷樣式條件。但是這工程著實浩大。殺雞牛刀,搬石砸腳。

二、在主文框之內文文字流中,逐字判斷,若為一般文字判斷條件取出,若為文字框錨定,則轉至子框中判斷,判斷完畢後再出來繼續父文字流中的逐字判斷。但子框內可能還有子框錨定物件,因此還需加上遞迴判斷。其中判斷文字流中是否遇到文字框錨定,便會用到本文提供的技巧。

 


function checkEveryChar( mainStory )
{
    for( var v1=0 ; v1<mainStory.characters.length ; v1++ ) // 針對主要文框內容逐字執行
    {        
        var inChar = mainStory.characters[v1];
        if( inChar.textFrames.length==0 ) // 若子框內再沒有包含其他子框
        {
            tmpStr += inChar.contents; // 直接取出或加上其他判斷
        }
        if( inChar.textFrames.length>0 ) // 若子框內尚含有其他子框錨定
        {
           for( var v3=0 ; v3<inChar.textFrames.length ; v3++ ) // 有多少子子框就做多少次
           {
               checkEveryChar( inChar.textFrames[v3].parentStory ); //遞迴執行
           }
        }
    }
}

var inDoc = app.activeDocument;
var firstTf = inDoc.textFrames[0];
var tmpStr = "";
checkEveryChar( firstTf.parentStory );
alert( tmpStr );

說明:

1.透過Character的TextFrames數量判斷該字是不是錨定點。

2.如果子框還有子子框,則再交由checkEveryChar()遞迴處裡

3. checkEveryChar()傳入的參數以Story物件為主,目的在防止溢文導致文字處裡不完全的情況發生。

結果

image

“第二塊”文框,錨定在”第一”與”塊”字中間。

“第三塊”文框,錨定在”第三”與”塊”字中間。

故結果為正確。