Applescript для назначения тега XML всем изображениям в документе InDesign

У меня странная проблема. Мой короткий яблочный скрипт вроде работает. Я хочу пометить все прямоугольники (это то, что библиотека Adobe называет кадрами изображения) с помощью тега XML «Изображение».

set tagName to "Image"
set imageList to {}

tell application "Adobe InDesign CC 2018"
tell active document

    set x to make XML element of first XML element with properties {markup tag:tagName}

    set imageList to every rectangle //there are 4 rectangles
    repeat with i from 1 to number of items in imageList
        tell item i of imageList to markup using x

    end repeat

end tell

end tell

Журнал показывает, что он размечает каждый прямоугольник. Но когда я проверяю документ, только последний прямоугольник в imageList фактически показывает, что тег XML применен.

Более того, я могу отменить или остановить скрипт, и последнее изображение перед отменой получает тег. (То есть, если я отменяю обработку прямоугольника 2, прямоугольник 2 получает изображение, а прямоугольники 1, 3 и 4 — нет.


person Paeon    schedule 01.10.2018    source источник
comment
Пометьте одинаковые изображения вручную. Можете ли вы пометить более одного?   -  person Jongware    schedule 02.10.2018
comment
Это противоречило бы цели applescript, которая состоит в том, чтобы автоматизировать процесс.   -  person Paeon    schedule 02.10.2018
comment
Я понимаю. Но не из любопытства спросил. Потому что, если я прав, ты не сможешь.   -  person Jongware    schedule 02.10.2018
comment
На самом деле я был.   -  person Paeon    schedule 04.10.2018


Ответы (2)


Ваш текущий критерий:

Во-первых, критерий, который вы сейчас используете для вывода изображения, подвержен ошибкам. Элемент страницы, тип которого равен rectangle, не обязательно соответствует изображению. Например; изображение может быть помещено внутри круга, и в этом случае его тип будет oval (а не rectangle).

Следующая строка кода в вашем вопросе гласит:

set imageList to every rectangle

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


Рекомендуемый критерий:

Чтобы вывести изображение, я рекомендую использовать all graphics вместо rectangles для получения списка изображений. Словарь InDesign Applescript описывает graphic как:

graphic Импортированная графика в любом формате графического файла (включая векторные и растровые форматы).


Решение:

Следующая суть AppleScript демонстрирует способ автоматизации процесса пометки всех изображений тегом XML с именем "Изображения". Каждое результирующее помеченное изображение будет добавлено как дочерний XML-элемент корневого XML-элемента документа.

set tagName to "Image"

tell application "Adobe InDesign CC 2018"
  tell active document
    if (count of page items) = 0 then return

    set locked of every layer to false
    set locked of every page item to false

    repeat with currentImage in all graphics
      if associated XML element of currentImage is not equal to nothing then
        untag associated XML element of currentImage
      end if
      make XML element at XML element 1 with properties {markup tag:tagName, XML content:currentImage}
    end repeat

  end tell
end tell

Пояснение

  1. set tagName to "Image" присваивает имя элемента XML (например, «Изображение») переменной tagName.

  2. Строка, которая гласит:

    if (count of page items) = 0 then return
    

    гарантирует, что мы выйдем из скрипта раньше, если документ не содержит элементов страницы.

  3. Строки, которые гласили:

    set locked of every layer to false
    set locked of every page item to false
    

    гарантирует, что все слои документа и элементы страницы будут разблокированы. Если изображение было заблокировано, его нельзя пометить.

  4. Строки, читающие:

    if associated XML element of currentImage is not equal to nothing then
      untag associated XML element of currentImage
    end if
    

    удаляет любые существующие теги, которые могут быть у изображения, поскольку они могут быть неверными.

  5. Чтение строки:

    make XML element at XML element 1 with properties {markup tag:tagName, XML content:currentImage}
    

    выполняет фактическую маркировку изображения.

person RobC    schedule 04.10.2018
comment
Спасибо. Документы Indesign, с которыми я работаю, содержат только изображения, поэтому каждый прямоугольник — это изображение. Я использую InDesign для изменения размера и положения миниатюр, основных изображений, изображений слайдера и т. д., а затем вывожу их в HTML с фиксированным размером. Но сейчас мы меняем дизайн веб-сайта, поэтому мне нужно экспортировать документы в формате XML, который создает папку и на основе моего выбора экспортирует исходное изображение. Так что да, я знаю, что прямоугольник не обязательно является изображением, но в моем случае это будет так. - person Paeon; 04.10.2018

Благодаря предложению Марка Энтони на MacScripter.net. Это работает для моих нужд. Все документы, которые я обрабатываю, содержат только изображения (никакой другой графики, рамок и т. д.).

set tagName to "Image"
set imageList to {}

tell application "Adobe InDesign CC 2018"
tell active document

    set x to make XML element of first XML element with properties {markup tag:tagName}

    set imageList to every rectangle
    repeat with rect in imageList
        make XML element at XML element 1 with properties {markup tag:"Image", 
XML content:rect}
    end repeat

end tell

end tell
person Paeon    schedule 04.10.2018