InDesign脚本更改textframe中的子字符串样式

时间:2014-10-29 11:17:52

标签: html css adobe-indesign extendscript

我想构建一个InDesign脚本,当您导入html标签(如粗体和斜体)时,这些单词将转换为粗体或斜体。

e.g。

I really like <strong>walking to the park</strong> and eating icecream将是:

我非常喜欢走到公园并吃冰淇淋。

然而,在我的文字框架中,我只能得到一个完整的段落来挑选一种风格而不是单个的单词或短语。

在下面的示例中,我希望将粗体样式应用于secondPhrase变量(我没有问题剥离标记等 - 只是想知道如何将样式应用于JUST the SecondPhrase

with (myElement) {

    // Apply basic text style
    applyParagraphStyle(myDoc.paragraphStyles.item("DefaultText"));

    var firstPhrase = "I really like";
    var secondPhrase = " walking to the park";  
    var thirdPhrase = " and eating icecream";

    contents = firstLine + secondLine + thirdPhrase;

}

2 个答案:

答案 0 :(得分:2)

下面的代码应该可以解决问题。 insertionPoint的行为与InDesign中的光标相同。如果你继续抓住最后一个insertionPoint,你可以在添加文字时改变它的风格。

var doc = app.documents.add();

var frame = doc.pages[0].textFrames.add({
   geometricBounds: [6, 6, 40, 40]
});

var bold = doc.characterStyles.add({ name: "Bold", fontStyle: "Bold" });
var none = doc.characterStyles.itemByName("[None]");

frame.insertionPoints.lastItem().applyCharacterStyle(none);

frame.insertionPoints.lastItem().contents = "I really like";

frame.insertionPoints.lastItem().applyCharacterStyle(bold);

frame.insertionPoints.lastItem().contents = " walking to the park";

frame.insertionPoints.lastItem().applyCharacterStyle(none);

frame.insertionPoints.lastItem().contents = " and eating icecream";

答案 1 :(得分:1)

这是对乔希的解决方案的干预 - 插入点是要走的路。如果您需要操作,镜像或使用动态JSON内容/想要分离文本,您需要通过循环运行它,并简单地将您的文本块分配为对象。这样可以更容易地换出文本并使用Array.prototype.reverse()之类的东西,我需要在我的情况下使用它。

这是我的看法:

// Basic Setup
var doc = app.documents.add();
var myPage = doc.pages.item(0); // Arbitrary page

// Character-Styles
var bold = doc.characterStyles.add({ name: "Bold", fontStyle: "Bold" });
var none = doc.characterStyles.itemByName("[None]");

// My String as an Array of Objects (Basic JSON format)
var myStringsAndStyles = [
  {
    contents: "I really like",
    characterStyle: none
  },
  {
    contents: " walking to the park ",
    characterStyle: bold
  },
  {
    contents: "and eating ice cream.",
    characterStyle: none
  }
];

// Do stuff
with ( myPage) {

  var myTextFrame = textFrames.add({
    geometricBounds: [6, 6, 40, 40] // Arbitrary coords
  });

  with ( myTextFrame.insertionPoints ) {
    for ( var i = 0, arrlength = myStringsAndStyles.length; i < arrlength; i++ ) {
      lastItem().properties = {
        contents: myStringsAndStyles[i].contents,
        appliedCharacterStyle: myStringsAndStyles[i].characterStyle
      }
    }
  }

}

Ta da!