4 votos

AppleScript error: no puedo convertir de texto enriquecido en texto sin formato

He creado un AppleScript (.scpt) archivo titulado "Tipo Portapapeles Como una Sola Línea de Texto sin formato." La secuencia de comandos se activa mediante un atajo de teclado establecido por FastScripts.

Comportamiento deseado:

Quiero que esta secuencia de comandos para tomar el contenido del portapapeles, quitar todo el formato y, a continuación, quita los saltos de línea o fichas de este texto. Por último, quiero que la secuencia de comandos escriba el nuevo texto. Quiero preservar -- no sobrescribir -- el original el contenido del portapapeles.

El problema específico:

El error específico es que mi script no puede quitar todo el formato de algunas de texto enriquecido.

No puedo incluir lleno de contenido de texto enriquecido en un Intercambio de la Pila post. Por lo tanto, para ser testigo de mi problema exacto, por favor descargue este .archivo rtf a través de Dropbox. Abra este archivo en TextEdit.app. Destacar la sentencia y copia en el portapapeles. Entonces, el gatillo de mi script mientras el cursor está en una forma que apoya y muestra de texto enriquecido (de modo que usted puede ver que el script tipo de texto enriquecido).

Usted se dará cuenta de que la frase escrita es de contenido de texto enriquecido y aún contiene elementos de formato. Estos elementos incluyen el texto original de la fuente (Helvetica) y el tamaño de fuente original (12). Estos elementos han sido descartados. Por lo tanto, mi código es negligente o me ha encontrado un auténtico error dentro de AppleScript en sí. Estoy asumiendo que es el último.

El menor código 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:

En primer lugar, alguien puede confirmar que la declaró problema se produce en su equipo?

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

1voto

user3439894 Puntos 5883

Pruebas con su código y, a continuación, con mi propia sencillo AppleScript código, puedo reproducir el (no deseados) comportamiento a un punto que me gustaría estar de acuerdo con el comportamiento no es lo que quería y puede ser considerado un error, sin embargo la solución es un poco de un parche.

En este método, en lugar de establecer theClipboardTextWithoutAnyLineBreaksOrFormatting directamente al Portapapeles, ya que es donde el problema es, que va a ser escrito en un archivo temporal, luego se coloca en el Portapapeles con pbcopy en do shell script comando y, a continuación, se elimina el archivo temporal. Luego se puede pegar a la de destino punto de inserción.

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

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

1voto

Baczek Puntos 150

Porque the clipboard comando agregar otros tipos de forma automática, prueba este script:

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

el resultado es --> {{texto Unicode, 10}, {string, 5}, {chatarra estilos, 22}, {"clase utf8", 5}, {"clase ut16", 12}, {chatarra estilos, 22}}


Para evitar los estilos, el uso de la NSPasteboard's métodos:

-- *** 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:

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X