3

InDesign では、xml ファイルからテキストを取り出して textFrame に配置しています。textFrame は一部のタグをサポートしていないため、textFrame 内の太字、斜体、および太字斜体のタグを、プログラムで適用された書式設定に置き換える必要があります。私はもともと Adob​​e の 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
*/
4

1 に答える 1

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.

これを示すフィドルがあります。

最後に、価値のあることとして、javascript で大文字の識別子を使用することは標準的な方法ではないと思います。

于 2012-08-27T04:10:47.750 に答える