我正在尝试使用inDesign JSX脚本将以下数据插入到文档中:
data = [{heading:"Heading 1", content: ["Some content"]},
{heading:"Heading 2", content: ["Some other content with", "Multiple paragraphs"]}]
数据必须放在单个TextFrame中,但在标题和内容上具有不同的样式。
我可以通过textFrame.contents
变量一次性查看添加文本的唯一方法:
allContent = "";
headingParagraphs = []; // keep track of which paragraphs are headings
paragraph = 0;
for (var i = 0; i < data.length; i++) {
allContent += data.heading + "\r"; // Use a newline to split the paragraph
headingParagraphs.push(paragraph);
paragraph++;
for (var j = 0; j < data.content.length; j++) {
allContent += data.content[j] + "\r"; // Use a newline to split the paragraph
paragraph++;
}
}
textFrame.contents = allContent; // all data is in, but all text is styled the same
然后,一旦数据进入,我会迭代段落并在标题中添加一些样式:
for (var i = 0; i < textFrame.paragraphs.count(); i++) {
if (headingParagraphs.indexOf(i) != -1) { // this is a heading paragraph
textFrame.paragraphs[i].pointSize = 20;
}
}
这适用于适合一个页面的小数据集,但是一旦内容比框架大,paragraphs
只返回可见的段落。如果我继续使用新的textFrame,则段落会被拆分,headingParagraphs[]
数组不再排列。
理想情况下,我想在添加下一个内容之前追加内容并设置样式 - 但是API文档并不是很清楚如何做到这一点(如果有的话)
// Pseudo code:
for all sections:
append the heading to the frame, split to next page if needed
style all the *new* paragraphs as headings
for all section contents
append the content to the frame, split to next page if needed
style any *new* paragraphs as normal content
有没有办法在添加内容后使用追加功能或其他方式将标题指定到正确的位置?也许在定义样式的内容中有特殊字符?
答案 0 :(得分:6)
您的较长文字会搞砸,因为目前您正在一个文本框架中工作。一旦文本用完这一帧,你就不能将它们称为这个框架&#34;拥有&#34;段落了。使用parentStory
代替整个故事,在一个文本框架内或跨越一个以上。如果文本超载,它也会继续工作。
因此,如果您有一个名为textFrame
的起始帧,请将新变量story
设置为textFrame.parentStory
并使用该变量添加文字。
至于向此框架添加文本(/ story):实际上,没有快速添加格式化文本的方法。设置contents
仅适用于具有相同格式的长时间片段。我使用的一种方法是将INX格式的文本写入临时文件并导入它。对于短片段来说速度很慢,但是在Javascript本身中可以非常有效地创建更大的故事(高达数百页),然后将其导入到ID中......好吧,它不是快但比试图做到更快&#34;手动&#34;。
另一种方法是一次添加一个段落的内容。诀窍是设置格式并将文本添加到story.insertionPoints[-1]
。这是一个特别方便的符号,指的是故事的最后文本插入点。您可以将插入点视为&#34;文本光标&#34 ;;你可以申请&#39;格式化它,然后添加的任何文本也将具有此格式。
您的代码段经过重新设计,一次只能添加一个data
项:
for (var i = 0; i < data.length; i++)
{
story.insertionPoints[-1].pointSize = 20;
story.insertionPoints[-1].contents = data[i].heading + "\r"; // Use a newline to split the paragraph
story.insertionPoints[-1].pointSize = 10;
for (var j = 0; j < data[i].content.length; j++)
{
story.insertionPoints[-1].contents = data[i].content[j] + "\r"; // Use a newline to split the paragraph
}
}
需要注意的一点是,您无法暂时覆盖此处的pointSize
。如果您将其设置为较大尺寸,则还必须将其重新设置为原始大小(我的代码段中的&#39; 10&#39;)。
我可以说服你使用段落样式吗?对于段落样式,您可以使用
hdrStyle = app.activeDocument.paragraphStyles.item("Header");
textStyle = app.activeDocument.paragraphStyles.item("Text");
for (var i = 0; i < data.length; i++)
{
story.insertionPoints[-1].contents = data[i].heading + "\r"; // Use a newline to split the paragraph
story.insertionPoints[-2].appliedParagraphStyle = hdrStyle;
for (var j = 0; j < data[i].content.length; j++)
{
story.insertionPoints[-1].contents = data[i].content[j] + "\r"; // Use a newline to split the paragraph
story.insertionPoints[-2].appliedParagraphStyle = textStyle;
}
}
请注意,此处反映插入内容和应用格式是值得的。这是任何以前的临时&#39;格式化被清除;以这种方式应用段落样式会覆盖任何和所有本地覆盖。由于您必须将样式应用于上一个段落(刚刚插入的硬回复之前的段落),您可以在此处使用insertionPoints[-2]
。
使用样式优于本地格式的优势是无数的。您可以使用单个命令应用所需的所有格式,安全地删除所有本地覆盖的格式,并在不满意的情况下全局更改格式的任何部分,而不必使用稍微不同的设置重新运行脚本。 / p>