![](/img/trans.png)
[英]Adobe InDesign JavaScript XML: How to add XML structure tags programmatically?
[英]Parsing HTML text for Adobe InDesign--tags inside other tags
在InDesign中,我從xml文件中提取文本並將其放在textFrame中。 由於textFrame不支持某些標記,因此我必須在textFrame中替換粗體,斜體和boldItalic標記,並以編程方式應用格式。 我最初使用Adobe的GREP搜索/替換進行此操作,但如果標記位於另一個標記內,則它無法正常工作(例如,' <b>a<i>b</i>c</b>
')。 所以我決定使用蠻力並通過標簽分割字符串,然后遍歷每個項目。 我提出的代碼是有效的,但我很好奇是否有更好,更有效的方法來做到這一點?
目前,它存儲字體和文本位置以添加該字體。 標簽也被刪除。
注意:有一個單獨的字體可以將文本設置為粗體和斜體。 如果我對<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
*/
我正在等待<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.
這是一個證明這一點的小提琴 。
最后,對於它的價值,我不認為在javascript中使用大寫標識符是標准做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.