2012-08-27 200 views
3

在InDesign中,我將文本從XML文件中提取出來並放入文本框中。由於textFrame不支持某些標籤,因此我必須使用編程方式應用格式化來替換textFrame中的粗體,斜體和boldItalic標籤。我原本使用Adobe的GREP搜索/替換功能來做這件事,但如果標籤位於另一個標籤內,它就無法正常工作(例如'<b>a<i>b</i>c</b>')。所以我決定使用蠻力並通過標籤拆分字符串,然後遍歷每個項目。代碼我想出了一些作品,但我很好奇,如果有更好,更有效的方法來做到這一點?解析Adobe InDesign的HTML文本 - 其他標籤內的標籤

目前,它存儲字體以及將該字體添加到的文本位置。標籤也被刪除。

注意:有一個單獨的字體,樣式文本粗體和斜體。如果我對<bi>標籤造成混淆,我很抱歉。它本意是成爲一個角色的標籤,需要大膽和斜體。 <b><i>text</i></b>可能是更好的解決方案。無論如何,對於適當的字符而言,它絕對需要作爲單獨的樣式。

var TAGSOBJ = {'<b>': 'Arial\tBold', 
       '<i>': 'Arial\tItalic', 
       '<bi>': 'Arial\tBold Italic', 
       '</b>': 'Arial\tBold', 
       '</i>': 'Arial\tItalic', 
       '</bi>': 'Arial\tBold Italic'}; 
var BGNTAGSOBJ = {'<b>': null, '<i>': null, '<bi>': null}; 
var ENDTAGSOBJ = {'</b>': null, '</i>': null, '</bi>': null}; 

var txt = 'This is some <b>really important <i>text</i></b> with <i>some <b>very <bi>very <br> very</bi> important</b> things</i> in it.'; 

var n = 0; 
var prevTag = ''; 
var noTagTxt = ''; 
var dataArray = [['none']]; 

var txtArray = txt.split(/(<\/?(?:b|i|bi)>)/); 

for (var i = 0; i < txtArray.length; i++) { 
    var iTxt = txtArray[i]; 

    if (iTxt in BGNTAGSOBJ) { 
     dataArray.push([TAGSOBJ[iTxt]]); 
     prevTag = iTxt; 
    } else if (iTxt in ENDTAGSOBJ) { 
     if (prevTag in ENDTAGSOBJ) { 
      dataArray[dataArray.length - 1][0] = TAGSOBJ[iTxt]; 
     } 

     dataArray.push(['none']); 
     prevTag = iTxt; 
    } else if (iTxt.length > 0) { 
     var iTxtLen = iTxt.length; 

     dataArray[dataArray.length - 1].push([n, n + (iTxtLen - 1)]); 

     noTagTxt += iTxt; 

     n += iTxtLen; 
    } else { 
     dataArray[dataArray.length - 1][0] = 'none'; 
    } 
} 

for (var i = 0; i < dataArray.length; i++) { 
    $.writeln(dataArray[i]); // print to console in extendscript 
} 
$.writeln(noTagTxt); 

/* Outputs to console in extendscript: 
none,0,12 
Arial Bold,13,29 
Arial Italic,30,33 
Arial Bold 
none,34,39 
Arial Italic,40,44 
Arial Bold,45,49 
Arial Bold Italic,50,63 
Arial Bold,64,73 
Arial Italic,74,80 
none,81,87 
This is some really important text with some very very <br> very important things in it. 
Result: undefined 
*/ 
+0

首先,如果您選擇的是實際名稱而不是「user1626601」,那麼您會更加尊重和關注您的問題。其次,什麼是標籤?沒有這樣的事情。 – ErikE

+0

選民致關閉:這個問題出了什麼問題? – ErikE

+0

我們正在處理自定義字體,因此我們爲一個斜體和粗體字體組成了標記。這是否有一個標準?也許文字? – j2112

回答

0

我在等待<bi>標籤的解釋,但在此期間,這裏有一些剔除標籤和收集你所需要的信息的代碼。我也沒有100%清楚字體的東西。 TAGSOBJ中的值是實際應用格式所需的值嗎?

var 
    content = 'This is some <b>really important <i>text</i></b> with <i>some <b>very very <br>very important</b> things</i> in it.', 
    tagPattern = /<\/?(i|b)\b[^>]*>/ig, 
    stack = [], 
    tags = [], 
    offset = 0, 
    match, 
    tag; 

while (match = tagPattern.exec(content)) { 
    if (match[0].substr(1, 1) !== '/') { 
     stack.push(match.index - offset); 
    } else { 
     tags.push({ 
      tag: match[1], 
      from: stack.splice(-1, 1)[0], 
      to: match.index - offset 
     }); 
    } 
    offset += match[0].length; 
} 
content = content.replace(tagPattern, ''); 
// now use tags array and perform needed actions. 

這是a fiddle demonstrating this

最後,對於它的價值,我認爲在JavaScript中使用大寫標識符並不是標準做法。

+0

是的,TAGSOBJ中的值將用於將字體/樣式應用於文本。 – j2112