【问题标题】:How do I map all objects in Indesign file to XML如何将 Indesign 文件中的所有对象映射到 XML
【发布时间】:2018-04-05 02:35:08
【问题描述】:

最终目标

最终,我需要将我的 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 元素,因为这些元素实际上并未正式“映射”到 XML 元素。它们在更改时不会自动更新。当对 InDesign 文件进行更改时,我将不得不覆盖所有 XML,从而消除了 data-id 值的一致性。

另外,当我这样做时,一切都乱了套,并且与 InDesign 文件中的布局方式脱节。

如果我能将所有内容映射到地图上,一号计划似乎仍然最有希望。

请放轻松

我希望这一切都清楚。 FWIW,我是 JS / HTML 人,而不是 InDesign 人。我是 InDesign 新手,我只是想弄清楚如何为我所在组织的 InDesign 用户实现这个过程。

【问题讨论】:

    标签: javascript html xml adobe-indesign


    【解决方案1】:

    如果文本被丢弃,可能是映射不完整或文本不可标记,例如脚注,可能是文本变量或标题。 要使它们进入循环,您需要在导出之前将它们转换为常规文本。 但以防万一,这里有一个简单的脚本。你可以试试看是否能捕捉到有问题的文本。

    //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 时,InDesign 都会崩溃。
    • 可能是一个错误。我可以很好地导出。您使用的是哪个版本?你是最新的吗?可能内容太大了。尝试设置一个虚拟属性而不是 UUID 并查看 InDesign 是否在不崩溃的情况下导出。这是为了看看UUID是不是有罪。
    【解决方案2】:

    显然,未映射到 XML 的对象是一个链接的 InCopy 文件,该文件已被锁定,无法进行任何编辑。为了将其映射到 XML,我必须在其中单击,然后选择 Edit > InCopy > Check Out。之后,它使用我上面的“一号计划”毫无困难地进行了映射。

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多