2010-03-30 13 views
13

De acuerdo con la página man para pbpaste,Obtener datos RTF de Mac OS X cartón (portapapeles)

-Prefer {txt | rtf | ps} 
      tells pbpaste what type of data to look for in the pasteboard 
      first. As stated above, pbpaste normally looks first for plain 
      text data; however, by specifying -Prefer ps you can tell 
      pbpaste to look first for Encapsulated PostScript. If you spec- 
      ify -Prefer rtf, pbpaste looks first for Rich Text format. In 
      any case, pbpaste looks for the other formats if the preferred 
      one is not found. The txt option replaces the deprecated ascii 
      option, which continues to function as before. Both indicate a 
      preference for plain text. 

Sin embargo (en mi experiencia con 10.6 Snow Leopard por lo menos), pbpaste -Prefer rtf nunca, nunca abandona la Datos RTF incluso cuando existe en la mesa de trabajo. ¿Hay alguna otra manera simple de obtener el texto RTF de lo que esté listo para pegarse?

Intenté AppleScript, pero osascript -e 'the clipboard as «class RTF »' da la respuesta «data RTF 7B tonelada de mierda codificada hexadecimal 7D». ¿AppleScript puede convertir estos datos hexadecimales en texto con el que puedo jugar?

Respuesta

11

No puedo ver ninguna manera de hacerlo desde el interior de AppleScript, pero ya se está trabajando en la cáscara de todos modos, que acababa de post- procesarlo: la "basura codificada en hexadecimal" es la información RTF que desea. La secuencia de comandos simple que puedo pensar es

perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' 

Una explicación: substr($_,11,-3) tiras fuera de los bits «data RTF y »\n (cada uno de los guillemets es de dos bytes); pack("H*", ...) paquetes de datos codificados hexadecimales en un bytestream; unpack("C*", ...) desempaqueta un bytestream en una matriz de valores de caracteres; print chr foreach ... convierte cada número entero en la matriz en su carácter correspondiente y lo imprime; y las opciones -ne evalúan la secuencia de comandos dada para cada línea, con esa línea implícitamente almacenada en $_. (Si quiere que la escritura en su propio archivo, basta con que la línea shebang es #!/usr/bin/perl -ne.) A continuación, se ejecuta

osascript -e 'the clipboard as «class RTF »' | \ 
    perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' 

le dará salida RTF prima.

+1

Enfoque inteligente. Una ligera simplificación es reemplazar '" clase RTF »' por una simple cadena '" RTF "' (tenga en cuenta el espacio final requerido antes del delimitador de cierre en cualquier caso): 'osascript -e 'el portapapeles como" RTF "' | perl -ne 'print chr foreach unpack ("C *", paquete ("H *", substr ($ _, 11, -3))) '' - funciona en (al menos) 10.8+. También tenga en cuenta que, por diseño, el comando AppleScript informará un error si no hay datos RTF en el portapapeles. – mklement0

+0

He añadido este alias muy útil a mi '.profile':' alias pbpaste-rtf = "osascript -e 'el portapapeles como \" RTF \ "' | perl -ne 'print chr foreach unpack (\" C * \ ", paquete (\" H * \ ", substr (\ $ _, 11, -3))) '" '. –

0

me encontré con un conversation de esto con una rápida búsqueda en Google

+0

"Sin embargo, no podrá manipular el RTF como una cadena dentro AppleScript." Lo vi en mis búsquedas antes de publicar la pregunta, pero me parece increíble que no haya forma de sacar los datos RTF sin escribir en un archivo. (Quiero el RTF en STDOut, así puedo hacer más cambios). ¿Alguien sabe lo suficiente de AppleScript para saber si esto es cierto? – Carl

+0

¿Qué es lo que quieres hacer con los datos de RTF, suponiendo que hay una forma de obtener los datos? – mcgrailm

+1

Convierta a HTML y luego convierta el HTML a Markdown. Obviamente, podría escribir tempfile en alguna parte, pero preferiría no hacerlo por razones de rendimiento y estéticas. Parece que AppleScript debería tener una forma de descomprimir los datos en sí. O que debería existir alguna otra herramienta para sacar datos de la mesa de trabajo. – Carl

8

creo que al menos en OS X 10.8 esto funcionaría si ha copiado el contenido HTML desde Chrome:

osascript -e 'the clipboard as "HTML"'|perl -ne 'print chr foreach unpack("C*",pack("H*",substr($_,11,-3)))' 
+0

+1; todavía funciona en 10.9. – mklement0

+0

aún funciona en 10.10. –

0

Es muy fácil a través de AppleScript (probado en 10.11 El Capitán):

set the clipboard to (the clipboard as «class RTF ») 

Se puede crear un servicio a través de Automator:

  1. abierta Automator
  2. hacer nuevo servicio ("Dienst" en alemán)
  3. añadir "ejecutar un AppleScript"
  4. de entrada: nada; salida; Selección reemplaza

The Script:

-- name: convert to RTF 
on run {input, parameters} 
    set the clipboard to (the clipboard as «class RTF ») 
    return the clipboard 
end run 

Done. Ahora guarde el nuevo Servicio y para probarlo: Seleccione un texto, luego vaya al Menú de la Aplicación y elija "Servicios"> "convertir a RTF"