Если я правильно понимаю, есть два типа контента, которые можно скопировать в глобальный (общесистемный) буфер обмена Mac:
text
или
file
Несмотря на то, что это два разных дискретных типа данных, они используют один и тот же буфер обмена. Например, если у вас есть изображение file
в буфере обмена, а затем вы копируете text
предложение, предложение перезапишет файл изображения, и наоборот. Пожалуйста, поправьте меня, если я ошибаюсь.
Мой вопрос: как я могу определить, не содержит ли буфер обмена файлы text
, используя AppleScript?
Контекст моего вопроса — это файл AppleScript .scpt, в котором выделенный текст озвучивается системным голосом с заданной громкостью. Выделенный текст копируется в буфер обмена, а затем текст проговаривается с помощью say
команды. Скрипт запускается нажатием клавиши через FastScripts.app.
Время от времени мне выдается диалоговое окно об ошибке, в котором говорится: «Номер ошибки: -1728». Эта ошибка возникает, когда вместо того, чтобы text
быть выделенным, я выделил или выбрал фактический файл file
. Функция «Речь» Mac не может произносить file
; Речь может только вербализовать text
.
Итак, я хотел бы создать if...then
оператор в своем сценарии, чтобы поймать эту ошибку. В идеале я хотел бы преобразовать в file
, text
если это возможно, так, как это делает TextEdit.
Если буфер обмена содержит файловый объект , то он clipboard info
будет содержать, например, «class furl»
(URL-адрес файла) вместе со многими другими классами.
Следующий пример кода проверит наличие «class furl»
в clipboard info
:
if ((clipboard info) as string) contains "«class furl»" then
say "the clipboard contains a file named " & (the clipboard as string)
else
say "the clipboard does not contain a file"
end if
Обновлять:
Как я упоминал в одном из своих комментариев, есть и другие способы закодировать это, и этот подход вернет либо пустой список , либо список, содержащий один список , что должно быть быстрее вместо 14, которые возвращает первый пример, если он содержит файл . Если в буфере обмена нет файла , то возвращаемый список будет пустым и выдаст ошибку, установив cbFile
значение false
, а если оно не пусто, установив его в значение true
, которое затем проверяется в следующем примере.
try
(item 1 of (clipboard info for «class furl»))
set cbFile to true
on error
set cbFile to false
end try
if cbFile then
say "the clipboard contains a file named " & (the clipboard as string)
else
say "the clipboard does not contain a file"
end if
Между прочим, я запустил purge
команду в Терминале между тестированием этих двух примеров, и мне показалось, что второй пример немного быстрее, однако YMMV.
if ((clipboard info) as string) contains "«class furl»"
то я хотел бы, чтобы мой скрипт использовал say
имя файла буфера обмена.clipboard info
может содержать всего 4 класса, а если true, может содержать гораздо больше, например 14 классов. Все они должны быть пронумерованы, и перечисление некоторых из них может занять больше времени, чем других, что еще больше увеличивает ожидаемую задержку. Так что это само по себе запускает задержку diff. Кроме того, если это правда, буфер обмена запрашивается для имени файла в виде строки, таким образом, добавляя больше к задержке diff. Имеет ли это смысл?osascript
была time
разница между двумя версиями. Я закрывал / открывал терминал и использовал purge
команду между каждым запуском, и когда все было сказано, готовая версия 1 имела разницу 0,719 с между ветвью T / F, а версия 2 имела разницу 0,363 с между ветвью T / F по сравнению с 0,356. s diff между каждой версией. Хотя версия 2 была технически быстрее, разница незначительна.
кланомат
Биг Мак
сфера рубика
Биг Мак
сфера рубика
сфера рубика