Applescript и Quarkxpress Passport v 6.5
У меня есть скрипт, который проходит через несколько абзацев / строк и соответственно применяет таблицы стилей абзацев и символов. Хотя сценарий работает отлично (я надеюсь, что это может кому-то помочь) - процесс занимает слишком много времени - я мог бы пройти долгий путь... Я надеялся, что кто-то может помочь мне сократить время обработки. Ниже Applescript: также несколько строк моего текста (оригинальный текст содержит 80) строк.
Текст Quarxpress:
R45m HOUSE. Landmark property with panoramic views, 2000m2 on over 8 200m2. web ref: 3036011
R35m HOUSE. Contemporary 4 bedroomed home on view slopes of Mount Street web ref: 3137609
R27.5m HOUSE. Ambassadorial 6 bedroomed home on over 5000m2 web ref: 3137592
R19.95m HOUSE. Brand new Georgian 5 bedroomed home on an acre web ref: 3057625
R19m ESTATE. Classical home of 1200m2 on 5000m2 of landscaped gardens web ref: 234336
R17.5m BOUTIQUE HOTEL. 11 Luxurious suites within a majestic setting on over 5000m2 web ref:3147123
R16.95m HOUSE. Classical 5 bedroomed home on 4127m2 in Hamilton Enclosure web ref: 3230085
R15.5m HOUSE. Georgian residence of 1100m2 close to the Country Club web ref: 737272
R13.5m HOUSE. A master-built contemporary home, amazing easterly views web ref: 3096574
R9.95m HOUSE. Renovated family home with pool and court on an acre in Bryanston West web ref: 3193537
R8.95m ESTATE. 43 on Eccleston. Packages in R8m’s. Contemporary home with views web ref: 3225098
R8.25m HOUSE. Renovated 4 bedroom home in top ave in Bryanston East on 3255m2 web ref: 3248317
R6.95m HOUSE. Nico van der Meulen contemporary masterpiece requiring final finishing web ref: 3212495
R5.95m HOUSE. Renovated 3 bedroom home in boomed enclosure on 4660m2. web ref: 3247597
R5.5m HOUSE. Prime position in boomed enclosure in Bryanston East, excellent potential web ref: 3201665
To view any of the above call Regan: 088 888 8888 or Erica: 088 888 8888
Мой Applescript:
tell application "QuarkXPress Passport"
tell document 1
set MyStyle3 to object reference of character spec "RedCopy"
set MyStyle1 to object reference of style spec "MainCopy"
set MyStyle4 to object reference of character spec "BoldCopy"
tell story 1 of current box
set style sheet of every paragraph to null
delay 5
set ParagraphCounter to (get count of paragraphs)
repeat with n from 1 to ParagraphCounter
tell paragraph n
try
set style sheet to MyStyle1
end try
try
if words 1 thru 2 contains "." then
set character style of words 1 thru 3 to MyStyle4
else
set character style of words 1 thru 2 to MyStyle4
end if
end try
try
set character style of word 2 to MyStyle4
end try
try
set character style of words -3 thru -1 to MyStyle4
end try
try
if words 1 thru 2 starts with "To view" then
set character style of words 1 thru -1 to MyStyle3
end if
end try
end tell
end repeat
end tell
end tell
end tell
beep 3
1 ответ
Почему Apple медленно работает?
Самая большая хитрость для улучшения производительности в Applescript - это удалить как можно больше AppleEvents. Каждая команда, которую вы вводите непосредственно в приложение, выполняется как AppleEvent. Например, следующий код выполняет два AppleEvents. Одно, чтобы получить все слова в абзаце, и одно, чтобы задать стиль символов для абзаца:
tell story 1 of current box
tell paragraph n
if words 1 thru 2 contains "." then
set character style of words 1 thru 3 to MyStyle4
else
set character style of words 1 thru 2 to MyStyle4
end if
end tell
end tell
Анализ
Итак, глядя на ваш скрипт, у вас есть 5 AppleEvents в настройке, 7, которые регулярно выполняются во время цикла, и 1, который выполняется для последней строки ("для просмотра"). 5 + 80 * 6 + 1 = 486 AppleEvents для 80 строк текста.
Включив некоторые из этих событий в настройку и работая непосредственно с нативными типами Applescript, вы можете значительно сократить это число.
Исправления
1) Удалить ненужный код
Вы можете полностью удалить следующую строку:
set character style of word 2 to MyStyle4
Вы уже подаете заявку MyStyle4
на слово 2, когда вы проверяете на период.
--word 2 is covered under both "words 1 thru 2" and "words 1 thru 3".
if words 1 thru 2 contains "." then
set character style of words 1 thru 3 to MyStyle4
else
set character style of words 1 thru 2 to MyStyle4
end if
2) Применить значения по умолчанию за пределами цикла.
Вы применяете null
style sheet
ко всем абзацам, затем повторно примените MyStyle1
к каждому абзацу по одному. Так что убери эти строки
set style sheet of every paragraph to null
[...]
set style sheet to MyStyle1
и заменить его перед циклом
set style sheet of every paragraph to MyStyle1
Вы можете применить то же самое к жирному шрифту последних трех слов:
-- this is being run during every iteration of the loop
set character style of words -3 thru -1 to MyStyle4
Примените все это перед циклом, и это будет стоить вам только один AppleEvent
set character style of words -3 thru -1 of every paragraph to MyStyle4
3) Не используйте AppleEvents, когда вам не нужно
Как уже говорилось ранее, каждый раз, когда вы запрашиваете информацию у Quark, она стоит AppleEvent. Во время 80-строчного текста вы отправляете 160 AppleEvents для следующих проверок:
tell paragraph n
if words 1 thru 2 contains "." then [...]
if words 1 thru 2 starts with "To view" then [...]
end tell
Чтобы это исправить, вы можете получить весь текст заранее, что сделает абзацы родными типами абзацев, и выполнить на нем условную проверку. Итак, перед циклом:
tell story 1 of current box
set quarkText to every paragraph
end tell
Это даст вам список строк, которые вы можете обработать, и использовать условные выражения, не отправляя AppleEvents в Quark.
Собираем все вместе
Итак, как будет выглядеть такой скрипт?
tell application "QuarkXPress Passport"
tell document 1
set MyStyle1 to object reference of style spec "MainCopy"
set MyStyle3 to object reference of character spec "RedCopy"
set MyStyle4 to object reference of character spec "BoldCopy"
tell story 1 of current box
-- Anything that is run during every iteration should be moved outside
-- the loop, and targeted at every paragraph.
set style sheet of every paragraph to MyStyle1
set character style of words -3 thru -1 of every paragraph to MyStyle4
delay 5
-- Transform data once, instead of every loop iteration
set quarkText to every paragraph
set ParagraphCounter to (get count of quarkText)
repeat with n from 1 to ParagraphCounter
-- currentLine is now a string that is not dependent on Quark, which
-- means you have cut way down on AppleEvents
set currentLine to item n of quarkText
tell paragraph n
if word 1 of currentLine contains "." then
set character style of words 1 thru 3 to MyStyle4 -- AppleEvent
else
set character style of words 1 thru 2 to MyStyle4 -- AppleEvent
end if
if currentLine starts with "To view" then
set character style of words 1 thru -1 to MyStyle3 -- AppleEvent
end if
end tell
end repeat
end tell
end tell
end tell
beep 3
Обратите внимание, что я изменил if statement
это выглядит на период. В чистом Applescript, если вокруг точки нет пробелов, он, по-видимому, считается частью слова.
word 1 of "R27.5m HOUSE." --> "R27.5m"
Теперь в настройках есть 6 AppleEvents, только одно, которое регулярно выполняется во время цикла, и одно для последней строки, в результате чего счетчик уменьшается до 6 + 80 * 1 + 1 = 87 AppleEvents.
Предостережение
У меня не установлен Quark на моем компьютере, но, глядя на код, который вы написали, ключевое слово word
может столкнуться со словарем Quark. В этом случае вам может понадобиться переместить всю проверку строк за пределы блока Quark Tell. Моя первая мысль: вы могли бы создать подпрограмму, которая фактически применяет стили, и вызывать эту подпрограмму, когда это необходимо:
on apply_style(characterStyle, paragraphNumber, startWord, endWord)
tell application "QuarkXPress Passport"
tell document 1
tell story 1 of current box
tell paragraph paragraphNumber
set character style of words startWord thru endWord to MyStyle4
end tell
end tell
end tell
end tell
end apply_style
tell application "QuarkXPress Passport"
tell document 1
set MyStyle1 to object reference of style spec "MainCopy"
set MyStyle3 to object reference of character spec "RedCopy"
set MyStyle4 to object reference of character spec "BoldCopy"
tell story 1 of current box
set style sheet of every paragraph to MyStyle1
set character style of words -3 thru -1 of every paragraph to MyStyle4
delay 5
set quarkText to every paragraph
end tell
end tell
end tell
set ParagraphCounter to (get count of quarkText)
repeat with n from 1 to ParagraphCounter
set currentLine to item n of quarkText
if word 1 of currentLine contains "." then
set myStyle to MyStyle4
set startingAt to 1
set endingAt to 3
else if currentLine starts with "To view" then
set myStyle to MyStyle3
set startingAt to 1
set endingAt to -1
else
set myStyle to MyStyle4
set startingAt to 1
set endingAt to 2
end if
my apply_style(myStyle, n, startingAt, endingAt)
end repeat
beep 3