Найти / заменить в Keynote на Applescript

Я не могу понять, как автоматизировать функцию поиска / замены в Keynote 6.2.

Моя цель - найти / заменить во всем документе. У меня есть текст из буфера обмена, который я хочу заменить строку.

Самый близкий из приведенных мною сценариев на этой странице, но он не работает в Keynote 6.2.

http://macscripter.net/viewtopic.php?id=26603

Кто-нибудь может помочь?

1 ответ

Просто сделал это на основе настройки того, с чем вы связались, чтобы работать с моим v6.2.2 Keynote. Надеюсь, это поможет вам начать работу (обратите внимание на примеры в словаре AppleScript Keynote):

tell application "Keynote"
    tell document 1
        set slidebody to object text of default body item of current slide
        set slidebody to my searchnreplace("foo", "BEE", slidebody)
        set object text of default body item of slide 1 to slidebody
        set slidetitle to object text of default title item of current slide
        set slidetitle to my searchnreplace("foo", "AAK", slidetitle)
        set object text of default title item of slide 1 to slidetitle
    end tell
end tell

-- I am a very old search & replace function...
on searchnreplace(searchstr, replacestr, txt)
    considering case, diacriticals and punctuation
        if txt contains searchstr then
            set olddelims to AppleScript's text item delimiters
            set AppleScript's text item delimiters to {searchstr}
            set txtitems to text items of txt
            set AppleScript's text item delimiters to {replacestr}
            set txt to txtitems as Unicode text
            set AppleScript's text item delimiters to olddelims
        end if
    end considering
    return txt
end searchnreplace

До:введите описание изображения здесьПосле:введите описание изображения здесь

[РЕДАКТИРОВАТЬ] Чтобы сделать текстовые элементы в вашем проекте заметки (в отличие от "титровальных объектов" или "объектов тела"), вы можете сделать следующее (обратите внимание, что это чувствительно к регистру и что, конечно же, чтобы сделать несколько элементов Вы сделаете повторный цикл):

tell application "Keynote"
    tell document 1
        set textObjectText to object text of text item 1 of current slide
        set adjustedText to my searchnreplace("Foo", "BEE", textObjectText)
        set object text of text item 1 of slide 1 to adjustedText
    end tell
end tell

-- I am the same very old search & replace function...
on searchnreplace(searchstr, replacestr, txt)
    considering case, diacriticals and punctuation
        if txt contains searchstr then
            set olddelims to AppleScript's text item delimiters
            set AppleScript's text item delimiters to {searchstr}
            set txtitems to text items of txt
            set AppleScript's text item delimiters to {replacestr}
            set txt to txtitems as Unicode text
            set AppleScript's text item delimiters to olddelims
        end if
    end considering
    return txt
end searchnreplace

До и после:

введите описание изображения здесь

введите описание изображения здесь

[РЕДАКТИРОВАТЬ ВТОРОЕ]

Следующий код запрашивает у пользователя поиск и замену строк (используя два диалоговых окна) и заменяет каждое вхождение каждого текстового элемента замененной версией. Странно, это включает default body item а также default title item но не изменяет текст (для этого вам нужно будет использовать вариант примера, который я впервые показал).

tell application "Keynote"
    activate
    set q1 to display dialog "Enter Search String:" default answer "" buttons {"Cancel", "OK..."} default button 2
    set s to (text returned of q1)
    set q2 to display dialog "Enter Replace String:" default answer s buttons {"Cancel", "OK"} default button 2
    set r to (text returned of q2)


    tell document 1
        set ii to (count of text items of current slide)
        set textItemmax to ii
        repeat with i from 1 to textItemmax by 1
            set textObjectText to (object text of text item i of current slide) as text
            set adjustedText to my searchnreplace(s, r, textObjectText)
            set object text of text item i of current slide to adjustedText
        end repeat
    end tell
end tell

-- I am the same very old search & replace function...
on searchnreplace(searchstr, replacestr, txt)
    considering case, diacriticals and punctuation
        if txt contains searchstr then
            set olddelims to AppleScript's text item delimiters
            set AppleScript's text item delimiters to {searchstr}
            set txtitems to text items of txt
            set AppleScript's text item delimiters to {replacestr}
            set txt to txtitems as Unicode text
            set AppleScript's text item delimiters to olddelims
        end if
    end considering
    return txt
end searchnreplace

[EDIT THREE] Это будет циклически перемещаться по слайдам и текстовым элементам (я очень надеюсь, что это приведет вас туда, куда вы хотите):

tell application "Keynote"
    activate
    set q1 to display dialog "Enter Search String:" default answer "" buttons {"Cancel", "OK..."} default button 2
    set s to (text returned of q1)
    set q2 to display dialog "Enter Replace String:" default answer s buttons {"Cancel", "OK"} default button 2
    set r to (text returned of q2)


    set slideMax to (count of slides of document 1)
    repeat with slideIndex from 1 to slideMax by 1
        set ii to (count of text items of slide slideIndex of document 1)
        set textItemmax to ii
        repeat with i from 1 to textItemmax by 1
            set textObjectText to (object text of text item i of slide slideIndex of document 1)
            set adjustedText to my searchnreplace(s, r, textObjectText as text)
            set object text of text item i of slide slideIndex of document 1 to (adjustedText as text)
        end repeat
    end repeat
end tell


-- I am the same very old search & replace function...
on searchnreplace(searchstr, replacestr, txt)
    considering case, diacriticals and punctuation
        if txt contains searchstr then
            set olddelims to AppleScript's text item delimiters
            set AppleScript's text item delimiters to {searchstr}
            set txtitems to text items of txt
            set AppleScript's text item delimiters to {replacestr}
            set txt to txtitems as Unicode text
            set AppleScript's text item delimiters to olddelims
        end if
    end considering
    return txt
end searchnreplace
Другие вопросы по тегам