Error de AppleScript: no puedo convertir texto enriquecido a texto sin formato

3

Creé un archivo AppleScript (.scpt) titulado " Tipo de portapapeles como texto sencillo de una línea ". La secuencia de comandos se activa mediante un método abreviado de teclado establecido por FastScripts.

Comportamiento deseado:

Quiero que esta secuencia de comandos tome el contenido del portapapeles, elimine todo el formato y luego elimine los saltos de línea o las pestañas de este texto. Finalmente, quiero que el script escriba el nuevo texto. Quiero conservar, no sobrescribir, el contenido original del portapapeles.

El problema específico:

El error específico es que mi secuencia de comandos no puede eliminar todo el formato de algún texto enriquecido.

No puedo incluir contenido de texto enriquecido completo en una publicación de Stack Exchange. Por lo tanto, para presenciar mi problema exacto, descargue este archivo .rtf a través de Dropbox . Abra este archivo en TextEdit.app. Resalte la oración y cópiela en el portapapeles. Luego, active mi secuencia de comandos mientras el cursor esté en una forma que admita y muestre texto enriquecido (para que pueda ver que la secuencia de comandos escribirá texto enriquecido).

Observará que la oración escrita es contenido de texto enriquecido y aún contiene elementos de formato. Estos elementos incluyen la fuente de texto original (Helvetica) y el tamaño de fuente original (12). Estos elementos deberían haber sido descartados. Por lo tanto, o mi código es negligente o he encontrado un error genuino dentro del propio AppleScript. Supongo que es lo último.

El código más corto necesario para reproducir el error:

use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

-- Back up clipboard contents:
set savedClipboard to my fetchStorableClipboard()

(*
    Converting the clipboard text to plain text to remove any formatting:
    From: http://lifehacker.com/127683/clear-text-formatting-on-os-x
*)
set theClipboardTextWithoutAnyFormatting to (the clipboard as text)

(*
    Removing line breaks and indentations in clipboard text:
    From: http://stackoverflow.com/a/12546965 
*)
set AppleScript's text item delimiters to {return & linefeed, return, linefeed, character id 8233, character id 8232}
set theClipboardTextWithoutAnyFormatting to text items of (theClipboardTextWithoutAnyFormatting as text)
set AppleScript's text item delimiters to {" "}
set theClipboardTextWithoutAnyLineBreaksOrFormatting to theClipboardTextWithoutAnyFormatting as text

set the clipboard to theClipboardTextWithoutAnyLineBreaksOrFormatting
tell application "System Events" to keystroke "v" using {command down}
delay 0.1 -- Without this delay, may restore clipboard before pasting.
-- Restore the original clipboard:
my putOnClipboard:savedClipboard

on fetchStorableClipboard()
    set aMutableArray to current application's NSMutableArray's array() -- used to store contents
    -- get the pasteboard and then its pasteboard items
    set thePasteboard to current application's NSPasteboard's generalPasteboard()
    -- loop through pasteboard items
    repeat with anItem in thePasteboard's pasteboardItems()
        -- make a new pasteboard item to store existing item's stuff
        set newPBItem to current application's NSPasteboardItem's alloc()'s init()
        -- get the types of data stored on the pasteboard item
        set theTypes to anItem's types()
        -- for each type, get the corresponding data and store it all in the new pasteboard item
        repeat with aType in theTypes
            set theData to (anItem's dataForType:aType)'s mutableCopy()
            if theData is not missing value then
                (newPBItem's setData:theData forType:aType)
            end if
        end repeat
        -- add new pasteboard item to array
        (aMutableArray's addObject:newPBItem)
    end repeat
    return aMutableArray
end fetchStorableClipboard

on putOnClipboard:theArray
    -- get pasteboard
    set thePasteboard to current application's NSPasteboard's generalPasteboard()
    -- clear it, then write new contents
    thePasteboard's clearContents()
    thePasteboard's writeObjects:theArray
end putOnClipboard:

Primero, ¿alguien puede confirmar que el problema mencionado ocurre en su computadora?

Si es así, ¿cómo puedo eliminar todo el formato de texto enriquecido en AppleScript, teniendo en cuenta este error que he descubierto?

    
pregunta rubik's sphere 15.02.2017 - 04:45

2 respuestas

2

Debido a que el comando the clipboard agrega otros tipos automáticamente, pruebe este script:

set the clipboard to "hello" as string
delay 1
return clipboard info
  

el resultado es - > {{Texto Unicode, 10}, {cadena, 5}, {estilos de desecho,   22}, {«clase utf8», 5}, {«clase ut16», 12}, {estilos de chatarra, 22}}

Para evitar los estilos, use los métodos de NSPasteboard :

-- *** add the missing lines from your script here  ***
--- set the clipboard to theClipboardTextWithoutAnyLineBreaksOrFormatting -- don't use this command to avoid the scrap styles type.
my putTextOnClipboard:theClipboardTextWithoutAnyLineBreaksOrFormatting -- use this method to put some string in the clipboard.

tell application "System Events" to keystroke "v" using {command down}
delay 0.1 -- Without this delay, may restore clipboard before pasting.
-- Restore the original clipboard:
my putOnClipboard:savedClipboard


on putTextOnClipboard:t
    set thePasteboard to current application's NSPasteboard's generalPasteboard()
    thePasteboard's clearContents()
    thePasteboard's declareTypes:{current application's NSPasteboardTypeString} owner:(missing value)
    thePasteboard's setString:t forType:(current application's NSPasteboardTypeString)
    --> now the clipboard contains these types only: («class utf8», «class ut16», string and Unicode text)
end putTextOnClipboard:
    
respondido por el jackjr300 16.02.2017 - 05:37
2

Probando con su código y luego con mi propio código de AppleScript, puedo reproducir el comportamiento (no deseado) en un punto. Estoy de acuerdo en que el comportamiento no es lo que quería y podría ser considerado un error, sin embargo, la solución es un poco de un error.

En este método, en lugar de establecer theClipboardTextWithoutAnyLineBreaksOrFormatting directamente en el Portapapeles, porque ahí es donde está el problema , se escribirá en un archivo temporal y luego se colocará en el Portapapeles utilizando pbcopy en un comando do shell script y luego se elimina el archivo temporal. Luego se puede pegar en el punto de inserción de destino.

Para probar la solución código a continuación, comente la línea set the clipboard to theClipboardTextWithoutAnyLineBreaksOrFormatting y luego coloque la solución code directamente después de ella y antes de la línea tell application "System Events" to keystroke "v" using {command down} .

set tempFileToRead to POSIX path of (path to desktop) & ".tmpfile"
try
    set referenceNumber to open for access tempFileToRead with write permission
    write theClipboardTextWithoutAnyLineBreaksOrFormatting to referenceNumber
    close access referenceNumber
on error eStr number eNum
    display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
    try
        close access referenceNumber
    end try
    return
end try
do shell script "pbcopy<" & tempFileToRead & "; rm " & tempFileToRead
    
respondido por el user3439894 16.02.2017 - 04:32

Lea otras preguntas en las etiquetas