Найти / заменить в 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