2013-11-10 3 views
1

Я хочу закодировать сценарий (в Javascript/Extendscript), который копирует стили ячеек из исходного документа в один или несколько целевых документов. Функциональность должна быть похожа на существующую опцию «Добавить ячейки ячеек» в InDesign, за исключением того, что она должна быть в состоянии сделать это в пакетной папке вместо одного документа за раз.Indesign: Копирование стиля ячейки в новый документ

Вопросы:

1)

Код ниже работы:

cStyle_source = app.documents[0].cellStyles[1] 
cStyle_target = app.documents[0].cellStyles[2] 

value = cStyle_source.basedOn 
cStyle_target.basedOn = value 

Это правильно копирует стиль ячейки выбирается в соответствии с 'на основе' в стиле источника клеток к целевой стиль.

теперь я пытаюсь скопировать свойство BasedOn к целевому стилю в другого открытого документа:

cStyle_source = app.documents[0].cellStyles[1] 
cStyle_target = app.documents[1].cellStyles[2] 

value = cStyle_source.basedOn 
cStyle_target.basedOn = value 

Новый документом является копией первого, и она содержит все те же стили. Однако запуск этого кода дает мне сообщение об ошибке:

Недопустимое значение для свойства set 'basedOn'. Ожидаемый элемент CellStyle или string, но полученный CellStyle.

Это я, или это сообщение не имеет смысла? Почему это работает при применении значения свойства к стилю в том же документе, но не к другому документу?

2)

Почему пример кода ниже работы стили абзаца и стили символов, но не для стилей объектов и стилей ячеек?

myProperties = app.activeDocument.paragraphStyles[1].properties 
app.activeDocument.paragraphStyles[2].properties = myProperties 

Это очень удобно копирует все свойства от стиля 1 до стиля 2 и даже работает с документами. Очень просто.

Почему стили ячеек (и стили объектов) различны в этом отношении?

Кажется, мне нужно будет прокрутить каждое свойство, чтобы скопировать полный стиль ячейки, и поэтому моя проблема в 1) выше появилась.


UPDATE:

Я хотел бы добавить свое решение, чтобы скопировать весь стиль ячейки, в том числе «других» ID объектов, как basedOn, appliedParagraphStyle и образчиков.

function AddCStyles() { 
    var cStyles_source = app.documents[1].cellStyles; 
    var cStyles_target = app.activeDocument.cellStyles; 
    var loopLength = cStyles_target.length 
    for (var i in selectedCStyles) { 
     var myProperties = cStyles_source.item(selectedCStyles[i]).properties; 
     var incomingName = selectedCStyles[i]; 
     for (var j=0; j < loopLength; j++) { 
      if (incomingName === cStyles_target[j].name) { // Checks if cell style already exists. If yes, loop through properties and overwrite 
       for (var k in myProperties) { 
        try { 
        if (myProperties[k] == "[object CellStyle]") { 
         value = cStyles_source.item(selectedCStyles[i]).properties[k].name; 
         cStyles_target[j][k] = app.documents[0].cellStyles.item(value); 
         continue 
         } 
        if (myProperties[k] == "[object ParagraphStyle]") { 
         value = cStyles_source.item(selectedCStyles[i]).properties[k].name; 
         cStyles_target[j][k] = app.documents[0].paragraphStyles.item(value); 
         continue 
         } 
        if (myProperties[k] == "[object StrokeStyle]" || myProperties[k] == "[object Color]") { 
         value = cStyles_source.item(selectedCStyles[i]).properties[k].name; 
         cStyles_target[j][k] = value; 
         continue 
         } 
        cStyles_target[j][k] = myProperties[k]; 
        } 
        catch (e) {} 
        } 
       } 
      if (j === loopLength - 1 && cStyles_target.item(incomingName).isValid === false) { // If cell style doesn't exist, create new and loop through properties 
       var newCStyle = cStyles_target.add();    
       for (var k in myProperties) { 
        try { 
        if (myProperties[k] == "[object CellStyle]") { 
         value = cStyles_source.item(selectedCStyles[i]).properties[k].name; 
         newCStyle[k] = app.documents[0].cellStyles.item(value); 
         continue 
         } 
        if (myProperties[k] == "[object ParagraphStyle]") { 
         value = cStyles_source.item(selectedCStyles[i]).properties[k].name; 
         newCStyle[k] = app.documents[0].paragraphStyles.item(value); 
         continue 
         } 
        if (myProperties[k] == "[object StrokeStyle]" || myProperties[k] == "[object Color]") { 
         value = cStyles_source.item(selectedCStyles[i]).properties[k].name; 
         newCStyle[k] = value; 
         continue 
         } 
        newCStyle[k] = myProperties[k]; 
         } 
        catch (e) {} 
        } 
       } 
      }     
     } 
    } 

ответ

2

On (1): стили ячеек (и все остальное) идентифицируются не именем или индексом в массиве стилей, но документа шириной уникальный идентификатор - id элемент, который можно найти во всех собственных базовых объектах InDesign.Это гарантированно будет уникальным номером по всему документу; это один из основных блоков идентификатора.

Хотя свойство basedOn указывает на стиль ячейки, на самом деле оно содержит номер: идентификационный номер стиля ячейки basedOn.

Даже если имена стилей ячеек могут быть одинаковыми в двух документах, это не относится к их соответствующим идентификаторам. id создаются на базе первого обслуживания при построении новых объектов, но даже если вы построили два документа таким же образом, в то же время я бы не стал рассчитывать на то же имя.

Вы do знаете, однако, название стиля ячейки basedOn; и если есть стиль ячейки в другом документе с таким же именем, вы можете работать вокруг него с помощью этого:

value = cStyle_source.basedOn.name; 
cStyle_target.basedOn = app.documents[1].cellStyles.item(value); 

На (2): Как ни странно, очевидные копиях подхода только стиль ячейки name и это нужно немного копирования, чтобы получить другие элементы более, а также:

alert (app.activeDocument.cellStyles[2].name); 
myProperties = app.activeDocument.cellStyles[2].properties; 
cs = app.documents[1].cellStyles.add(); 
for (i in myProperties) 
try { 
    cs[i] = myProperties[i]; 
} catch (e) 
{ 
    // .. 
} 

она нуждается в try..catch, потому что не все свойства чтения/записи; он потерпит неудачу в отношении свойства только для чтения, такого как id. Кроме того, нельзя также скопировать все свойства, относящиеся к объектам (basedOn, цвета, стили линий). Но он хорошо работает для того, что остается - толщины линии, для одной.


Что это значит?

Функциональность должна быть такой же, как и существующая опция «Использовать стили ячеек» в InDesign, за исключением того, что она должна иметь возможность делать это в пакетной папке вместо одного документа за раз.

Вы можете перемещать файлы в своей папке и делать app.activeDocument.import (ImportFormat.CELL_STYLES_FORMAT, from, globalStrategy) для каждого из них.

См. #importStyles для полного объяснения параметров.

Единственное, что-то вроде, нет способа импортировать стили - 0 - вы должны настроить исходный файл со всеми, и только стилями ячеек, которые вы хотите в целевых файлах.

+0

Спасибо, Jongware! Думаю, я могу настроить код для поиска в целевом документе, и если стиль не существует, он пропустит это свойство. Однако я не могу использовать #importStyles, так как пользователю нужно будет выбрать определенные стили для копирования. Не могли бы вы объяснить, почему стиль ячейки настолько ограничен по сравнению с стилем абзаца? – UncleToft

+0

Боюсь, вам придется взять это как есть ... Обратите внимание, что * изначально * InDesign не имел табличных стилей. Это был разработанный извне и продаваемый плагин, который Adobe приобрела. Возможно, это единственная причина, по которой он не интегрируется полностью с другими элементами, доступными для сценариев (и позиция Adobe могла бы быть «если она работает, лучше не пытаться улучшить ее»). – usr2564301