AppleScript: ¿Cómo verificar si el portapapeles consta de un archivo (en lugar de texto)?

5

Si mi entendimiento es correcto, hay dos tipos de contenido que pueden copiarse en el portapapeles global de Mac (para todo el sistema):

  • text

o

  • file

Aunque son dos tipos de datos diferentes y discretos, comparten el mismo portapapeles. Por ejemplo, si tiene una imagen file en su portapapeles, y luego copia una oración text , la oración sobrescribirá el archivo de imagen, y viceversa. Por favor, corrígeme si me equivoco.

Mi pregunta es, ¿cómo puedo determinar si el portapapeles no contiene text , usando AppleScript?

El contexto de mi pregunta es un archivo .scpt de AppleScript que habla el texto seleccionado en la voz del sistema a un volumen específico. El texto seleccionado se copia al portapapeles, y luego el texto se pronuncia a través del comando say . La secuencia de comandos se activa mediante la pulsación de teclas a través de FastScripts.app.

De vez en cuando, aparece un diálogo de error que dice "Número de error: -1728". Este error se produce cuando, en lugar de resaltar text , he resaltado o seleccionado un file real. La función de voz de Mac no puede hablar un file ; El habla solo puede verbalizar text .

Por lo tanto, me gustaría crear una declaración if...then en mi script para detectar este error. Idealmente, me gustaría convertir el file en text , si es posible de la forma en que lo hace TextEdit.

    
pregunta rubik's sphere 26.04.2017 - 04:24

1 respuesta

3

Si el Portapapeles contiene un objeto de archivo , entonces clipboard info contendrá, por ejemplo, «class furl» (una URL del archivo), junto con muchas otras clases.

El siguiente ejemplo código comprobará la presencia de «class furl» en el 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

Actualización:

Como mencioné en uno de mis comentarios, hay otras formas de codificar esto, y este enfoque devolverá una lista vacía o una lista que contenga una list , que debería ser más rápido en lugar de los 14 que devuelve el primer ejemplo si contiene un archivo . Si el Portapapeles no contiene un archivo , entonces la lista devuelta está vacía y se produce un error, configurando cbFile a false , y si no está vacío, configurándolo a true , que luego se prueba en el siguiente ejemplo.

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

Por cierto, ejecuté el comando purge en la Terminal entre pruebas de estos dos ejemplos y sentí que el segundo ejemplo es un poco más rápido, sin embargo, YMMV.

    
respondido por el user3439894 26.04.2017 - 06:04

Lea otras preguntas en las etiquetas