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
Другие вопросы по тегам