如何将 Indesign 文件中的所有对象映射到 XML
How do I map all objects in Indesign file to XML
目标结束
最终,我需要将我的 InDesign 文件导出到 HTML,这样每个 HTML 块级元素都有一个唯一的 ID(只要它是什么并不重要)因为它是唯一的),一个唯一的 ID 也保留在 InDesign 文件中并且不会更改,无论用户对 InDesign 内容进行什么修改,并且在 HTML 中与每个元素一起导出。像这样:
<p data-id="4j8w53">My first paragraph</p>
<p data-id="k39dh2">My second paragraph</p>
然后当 InDesign 用户更改内容并重新导出到 HTML 时,现有 ID 仍然存在,如下所示:
<p data-id="4j8w53">My first paragraph is awesome!</p>
<p data-id="lq09cf">My inserted paragraph</p>
<p data-id="k39dh2">My second paragraph</p>
如果有人知道一个简单的方法来做到这一点,我很想听听。
一号计划
为了解决这个问题,我决定将 InDesign 文件中的所有内容映射到 XML,然后通过 JS 用户脚本将我的 ID 属性添加到 XML 项目,然后通过另一个 JS 用户脚本将 XML 导出为 HTML。由于 XML 项目实际上映射到 InDesign 项目,因此 ID 将随着文本更改而保留。
问题在于:我似乎无法使用 mapStylesToXMLTags()
函数将 我所有的 InDesign 内容 映射到 XML。我在文件中有一堆 stories
,其中一个在我导出时从未出现在 XML 中。它只是丢失了。
如果我可以在使用 mapStylesToXMLTags()
时让 所有内容 显示在导出的 XML 中,那可能会解决我的问题。
或者,如果有不同的映射机制可以将我的所有项目实际映射到 XML 并保留映射,那也可能有效。
计划二
如果我在 app.documents[0]
中递归循环 allPageItems
并手动创建 XML 而不是使用 mapStylesToXMLTags()
,那么丢失的对象就会像其他所有内容一样显示出来。
但是,我为 XML 元素提供的 ID 不会附加到 InDesign 元素,因为这些元素实际上不是正式的 "mapped" 到 XML 元素。它们在更改时不会自动更新。当对 InDesign 文件进行更改时,我将不得不覆盖所有 XML,从而消除数据 ID 值的一致性。
此外,当我这样做时,所有内容都乱七八糟,与 InDesign 文件中的布局方式不符。
第一个计划似乎仍然是最有希望的,如果我能把所有内容都映射出来的话。
请放轻松
我希望一切都清楚。 FWIW,我是 JS / HTML 人,而不是 InDesign 人。我是 InDesign 的新手,我只是想弄清楚如何为我组织的 InDesign 用户实现此过程。
如果文本被丢弃,则可能是映射不完整或文本不可标记,例如脚注、可能是文本变量或标题。
要使它们进入循环,您需要在导出之前将它们转换为常规文本。
但以防万一,这里有一个简单的脚本。你可以试一试,看看它是否捕捉到有问题的文本。
//MAIN ROUTINE
var main = function() {
var doc = app.properties.activeDocument,
fgp = app.findGrepPreferences.properties,
fcgo = app.findChangeGrepOptions.properties,
found, n = 0, text, pTag, xe;
//Exit if no documents open
if ( !doc ) {
alert("You need an open document" );
return;
}
//Setting F/R Grep
app.findGrepPreferences = app.findChangeGrepOptions = null;
app.findGrepPreferences.properties = {
findWhat : "^.+",
}
app.findChangeGrepOptions.properties = {
includeFootnotes:false,
includeHiddenLayers:true,
includeLockedLayersForFind:true,
includeLockedStoriesForFind:true,
includeMasterPages:true,
}
//Adding "p" tag if needed
pTag = doc.xmlTags.itemByName("p");
!pTag.isValid && pTag = doc.xmlTags.add({name:"p"});
//Getting paragraphs occurences
found = doc.findGrep();
n = found.length;
while ( n-- ) {
text = found[n];
xe = text.associatedXMLElements;
//Adding "p" tags with ids if needed
if ( !xe.length || xe[0].markupTag.name!="p") {
doc.xmlElements[0].xmlElements.add( pTag, text ).xmlAttributes.add('id', guid () );
}
}
//Reverting initial F/R settings
app.findGrepPreferences.properties = fgp;
app.findChangeGrepOptions.properties = fcgo;
}
//Returns unique ID
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}
var u;
//Run
app.doScript ( "main()",u,u,UndoModes.ENTIRE_SCRIPT, "The Script" );
显然,未映射到 XML 的对象是链接的 InCopy 文件,该文件已被锁定,无法进行任何编辑。为了将其映射到 XML,我必须在其中单击,然后 select 编辑 > InCopy > 签出。在那之后,它使用我上面的 "Plan Number One" 毫无困难地映射。
目标结束
最终,我需要将我的 InDesign 文件导出到 HTML,这样每个 HTML 块级元素都有一个唯一的 ID(只要它是什么并不重要)因为它是唯一的),一个唯一的 ID 也保留在 InDesign 文件中并且不会更改,无论用户对 InDesign 内容进行什么修改,并且在 HTML 中与每个元素一起导出。像这样:
<p data-id="4j8w53">My first paragraph</p>
<p data-id="k39dh2">My second paragraph</p>
然后当 InDesign 用户更改内容并重新导出到 HTML 时,现有 ID 仍然存在,如下所示:
<p data-id="4j8w53">My first paragraph is awesome!</p>
<p data-id="lq09cf">My inserted paragraph</p>
<p data-id="k39dh2">My second paragraph</p>
如果有人知道一个简单的方法来做到这一点,我很想听听。
一号计划
为了解决这个问题,我决定将 InDesign 文件中的所有内容映射到 XML,然后通过 JS 用户脚本将我的 ID 属性添加到 XML 项目,然后通过另一个 JS 用户脚本将 XML 导出为 HTML。由于 XML 项目实际上映射到 InDesign 项目,因此 ID 将随着文本更改而保留。
问题在于:我似乎无法使用 mapStylesToXMLTags()
函数将 我所有的 InDesign 内容 映射到 XML。我在文件中有一堆 stories
,其中一个在我导出时从未出现在 XML 中。它只是丢失了。
如果我可以在使用 mapStylesToXMLTags()
时让 所有内容 显示在导出的 XML 中,那可能会解决我的问题。
或者,如果有不同的映射机制可以将我的所有项目实际映射到 XML 并保留映射,那也可能有效。
计划二
如果我在 app.documents[0]
中递归循环 allPageItems
并手动创建 XML 而不是使用 mapStylesToXMLTags()
,那么丢失的对象就会像其他所有内容一样显示出来。
但是,我为 XML 元素提供的 ID 不会附加到 InDesign 元素,因为这些元素实际上不是正式的 "mapped" 到 XML 元素。它们在更改时不会自动更新。当对 InDesign 文件进行更改时,我将不得不覆盖所有 XML,从而消除数据 ID 值的一致性。
此外,当我这样做时,所有内容都乱七八糟,与 InDesign 文件中的布局方式不符。
第一个计划似乎仍然是最有希望的,如果我能把所有内容都映射出来的话。
请放轻松
我希望一切都清楚。 FWIW,我是 JS / HTML 人,而不是 InDesign 人。我是 InDesign 的新手,我只是想弄清楚如何为我组织的 InDesign 用户实现此过程。
如果文本被丢弃,则可能是映射不完整或文本不可标记,例如脚注、可能是文本变量或标题。 要使它们进入循环,您需要在导出之前将它们转换为常规文本。 但以防万一,这里有一个简单的脚本。你可以试一试,看看它是否捕捉到有问题的文本。
//MAIN ROUTINE
var main = function() {
var doc = app.properties.activeDocument,
fgp = app.findGrepPreferences.properties,
fcgo = app.findChangeGrepOptions.properties,
found, n = 0, text, pTag, xe;
//Exit if no documents open
if ( !doc ) {
alert("You need an open document" );
return;
}
//Setting F/R Grep
app.findGrepPreferences = app.findChangeGrepOptions = null;
app.findGrepPreferences.properties = {
findWhat : "^.+",
}
app.findChangeGrepOptions.properties = {
includeFootnotes:false,
includeHiddenLayers:true,
includeLockedLayersForFind:true,
includeLockedStoriesForFind:true,
includeMasterPages:true,
}
//Adding "p" tag if needed
pTag = doc.xmlTags.itemByName("p");
!pTag.isValid && pTag = doc.xmlTags.add({name:"p"});
//Getting paragraphs occurences
found = doc.findGrep();
n = found.length;
while ( n-- ) {
text = found[n];
xe = text.associatedXMLElements;
//Adding "p" tags with ids if needed
if ( !xe.length || xe[0].markupTag.name!="p") {
doc.xmlElements[0].xmlElements.add( pTag, text ).xmlAttributes.add('id', guid () );
}
}
//Reverting initial F/R settings
app.findGrepPreferences.properties = fgp;
app.findChangeGrepOptions.properties = fcgo;
}
//Returns unique ID
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
}
var u;
//Run
app.doScript ( "main()",u,u,UndoModes.ENTIRE_SCRIPT, "The Script" );
显然,未映射到 XML 的对象是链接的 InCopy 文件,该文件已被锁定,无法进行任何编辑。为了将其映射到 XML,我必须在其中单击,然后 select 编辑 > InCopy > 签出。在那之后,它使用我上面的 "Plan Number One" 毫无困难地映射。