Applescript для внесения внутренних изменений в группу текстовых полей - PullRequest
1 голос
/ 29 января 2020

В настоящее время у меня есть AppleScript, который вносит небольшие изменения в текстовые поля в документе indesign. Скрипт идет постранично, и если применяемый стиль объекта называется определенным именем и содержит определенный символ, он будет применять стиль абзаца. Вот пример моего сценария:

tell application "Adobe InDesign"
    repeat with x from 1 to count pages
        set ThisPage to page x
        tell ThisPage
            if exists (text frames whose (name of applied object style is "PriceBox" and contents contains "/$")) then
                set myFrames to (text frames whose (name of applied object style is "PriceBox" and contents contains "/$"))
                tell myFrames
                    repeat with r from 1 to count items
                        set applied paragraph style of paragraphs of item r of myFrames to "2forPrice"
                    end repeat
                end tell
            end if
        end tell
    end repeat
end tell

Что он делает, он идет на первую страницу документа, и если есть текстовое поле с именем «PriceBox» и текстовое поле содержит символы "/ $" в нем, он изменит стиль абзаца на именованный стиль "2forPrice".

Это прекрасно работает, когда на каждой странице есть 1 "листинг". Я пытаюсь сделать эту работу, где есть несколько групп списков и сделать скрипт go для каждой группы блоков отдельно и запустить скрипт. Любой способ сказать, может ли это быть сделано группой, а не страницей?

Спасибо за вашу помощь !!

ОБНОВЛЕНИЕ: Вот скриншоты того, что он делает, я пропустил несколько шагов, чтобы заставить это работать, но я скорее использую группы коробок. This is what's considered a

Here is how all the groups are laid out on one page

Take a look at the changes to the prices if it's a

Picture1: Это то, что считая «группой», я хочу поместить все эти блоки в одну группу.

Рисунок 2: Вот как все группы расположены на одной странице

Рисунок 3: Посмотрите на изменяет цены, если это «2for», например 2 / $ 6

Я хочу, чтобы мой скрипт go группировал по группам, а не по страницам, чтобы выполнить оператор if и изменить стиль абзаца , Еще раз спасибо за вашу помощь!

Ответы [ 4 ]

1 голос
/ 30 января 2020

@ Тед: В зависимости от того, насколько хорошо реализована объектная модель событий Apple в приложении, вы сможете сделать все это одной командой:

tell application "Adobe InDesign"
  tell front document
    tell pages
      tell (text frames whose name of applied object style is "PriceBox" and contents contains "/$")
        set applied paragraph style of paragraphs to "2forPrice"
      end tell
    end tell
  end tell
end tell

(Совет: IP-адрес события Apple C это RP C + запросы , а не OOP.)

[ETA] Как отмечает примечание ниже, это не будет работать с сгруппированными текстовыми фреймами, поэтому вот рекурсивный вариант, который будет:

to walkGroups(groupRef)
  tell application "Adobe InDesign CS6"
    tell groupRef
      tell (text frames whose name of applied object style is "PriceBox" and contents contains "/$")
        if it exists then
          set applied paragraph style of paragraphs to "2forPrice"
        end if
      end tell
      repeat with subgroupRef in groups
        my walkGroups(subgroupRef)
      end repeat
    end tell
  end tell
end walkGroups


tell application "Adobe InDesign CS6"
  my walkGroups(front document)
end tell
0 голосов
/ 30 января 2020

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

Например, если имеется 3 текстовых фрейма и одна группа из 2 текстовых фреймов, количество текстовых фреймов для страницы будет равно 3, но количество элементов страницы будет равно 4 (три несгруппированных текстовых фрейма плюс один группа из 2 текстовых фреймов.

0 голосов
/ 30 января 2020

Подход ONE-LINER / STORY

Как вы можете видеть, поиск текстовых фреймов путем поиска страниц, разворотов, вставки досок, групп и т. Д. c. может быть сложно. В API скрипта нет команды «дать мне все текстовые фреймы в макете, независимо от того, где они находятся».

Обходной путь здесь заключается в использовании объекта истории. Если вы попросите InDesign предоставить вам список всех историй (или текстовых потоков) в макете, вы получите их независимо от того, где они могут существовать в макете.

Пример ниже начинается со всех историй, которые связаны с текстовым фреймом, а затем совпадают только с историями, в которых стиль объекта текстового фрейма - «тест». Затем он применяет стиль абзаца к абзацам этих историй.

tell application "Adobe InDesign CC 2018"
        set applied paragraph style of paragraphs of (stories of document 1 whose class of (object reference of item 1 of text containers) is text frame and name of applied object style of item 1 of text containers = "test" and contents contains "/$") to "Body Text"
end tell

ЕСЛИ ПРЕДПОЧТИТЕЛЬНЫЕ СЛОВА ПРЕДПОЧТЕНЫ

tell application "Adobe InDesign CC 2018"
    tell document 1
        tell (stories whose class of (object reference of item 1 of text containers) is text frame and name of applied object style of item 1 of text containers = "test" and contents contains "/$")
            set applied paragraph style of paragraphs to "Body Text"
        end tell
    end tell
end tell
0 голосов
/ 29 января 2020

Я действительно не знаю, как работать с InDesign - у меня есть его старая копия, но было бы неплохо, если бы вы предоставили пример документа, который я мог бы загрузить и протестировать - но только с точки зрения AppleScript вы, вероятно, захотите сделать что-то вроде этого:

tell application "Adobe InDesign"
    repeat with this_page in pages
        tell this_page
            set text_frames_list to (text frames whose name of applied object style is "PriceBox" and contents contains "/$")
            repeat with a_text_frame in text_frames_list
                tell a_text_frame
                    set applied paragraph style of paragraphs of a_text_frame to "2forPrice"
                end tell
            end repeat
        end tell
    end repeat
end tell
...