2010-07-16 7 views
17

¿Cómo se puede obtener el texto enriquecido o el código fuente HTML desde el portapapeles X? Por ejemplo, si copia algún texto de un navegador web y lo pega en kompozer, se pega como HTML, con enlaces, etc. conservados. Sin embargo, xclip -o para la misma selección simplemente genera texto sin formato, reformateado de forma similar a elinks -dump. Me gustaría sacar el HTML y convertirlo en un editor de texto (específicamente vim).Obteniendo fuente HTML o texto enriquecido del portapapeles X

He preguntado the same question on superuser.com, porque esperaba que hubiera una utilidad para hacer esto, pero no recibí ninguna respuesta informativa. La API X Clipboard es para mí una bestia misteriosa; cualquier consejo sobre piratear algo para obtener esta información es bienvenido. Mi idioma de elección en estos días es Python, pero casi todo está bien.

Respuesta

21

En X11 debe comunicarse con el propietario de la selección, preguntar sobre los formatos admitidos y luego solicitar los datos en el formato específico. Creo que la forma más fácil de hacerlo es utilizando kits de herramientas de ventanas existentes. P.ej. con Python y GTK:

#!/usr/bin/python 

import glib, gtk 

def test_clipboard(): 
    clipboard = gtk.Clipboard() 
    targets = clipboard.wait_for_targets() 
    print "Targets available:", ", ".join(map(str, targets)) 
    for target in targets: 
     print "Trying '%s'..." % str(target) 
     contents = clipboard.wait_for_contents(target) 
     if contents: 
      print contents.data 

def main(): 
    mainloop = glib.MainLoop() 
    def cb(): 
     test_clipboard() 
     mainloop.quit() 
    glib.idle_add(cb) 
    mainloop.run() 

if __name__ == "__main__": 
    main() 

salida tendrá el siguiente aspecto:

$ ./clipboard.py 
Targets available: TIMESTAMP, TARGETS, MULTIPLE, text/html, text/_moz_htmlcontext, text/_moz_htmlinfo, UTF8_STRING, COMPOUND_TEXT, TEXT, STRING, text/x-moz-url-priv 
... 
Trying 'text/html'... 
I asked <a href="http://superuser.com/questions/144185/getting-html-source-or-rich-text-from-the-x-clipboard">the same question on superuser.com</a>, because I was hoping there was a utility to do this, but I didn't get any informative responses. 
Trying 'text/_moz_htmlcontext'... 
<html><body class="question-page"><div class="container"><div id="content"><div id="mainbar"><div id="question"><table><tbody><tr><td class="postcell"><div><div class="post-text"><p></p></div></div></td></tr></tbody></table></div></div></div></div></body></html> 
... 
Trying 'STRING'... 
I asked the same question on superuser.com, because I was hoping there was a utility to do this, but I didn't get any informative responses. 
Trying 'text/x-moz-url-priv'... 
http://stackoverflow.com/questions/3261379/getting-html-source-or-rich-text-from-the-x-clipboard 
+0

¡Funciona bien, muchas gracias! Envié esta funcionalidad a una interfaz de línea de comandos primordial: http://github.com/intuited/clipcli ........................... ....... ¿Algún consejo sobre cómo analizar el objetivo TIMESTAMP? No parece ser una marca de tiempo UNIX. Presumiblemente hay información en la documentación de GTK; Solo me tomé el tiempo para buscarlo de manera superficial. – intuited

+0

El tipo TIMESTAMP definido por el protocolo X11 no tiene nada que ver con los segundos desde Epoch. Este es un entero sin signo de 32 bits que contiene el tiempo en milisegundos, generalmente desde el inicio del servidor X. No creo que tenga un uso directo para una aplicación de usuario final. – rkhayrov

+0

Me gustaría una versión de KDE de esto. ¿Alguna sugerencia? La búsqueda de "Python API de portapapeles kde" no arrojó nada útil para mí. – MountainX

30

Para complementar @rkhayrov's answer, existe un comando para que ya: xclip. O más exactamente, hay un patch to xclip que era added to xclip later on in 2010, pero aún no se ha lanzado, eso lo hace. Por lo tanto, asumiendo que su sistema operativo como barcos de Debian con la cabeza subversión de xclip:

para enumerar los objetivos para la selección CLIPBOARD:

$ xclip -selection clipboard -o -t TARGETS 
TIMESTAMP 
TARGETS 
MULTIPLE 
SAVE_TARGETS 
text/html 
text/_moz_htmlcontext 
text/_moz_htmlinfo 
UTF8_STRING 
COMPOUND_TEXT 
TEXT 
STRING 
text/x-moz-url-priv 

Para seleccionar un objetivo particular:

$ xclip -selection clipboard -o -t text/html 
 <a href="https://stackoverflow.com/users/200540/rkhayrov" title="3017 reputation" class="comment-user">rkhayrov</a> 
$ xclip -selection clipboard -o -t UTF8_STRING 
rkhayrov 
$ xclip -selection clipboard -o -t TIMESTAMP 
684176350 

Y xclip también puede establecer y poseer una selección (-i en lugar de -o).

+5

¡Agradable! ¿Alguna idea de por qué no se ha lanzado aún? – intuited

Cuestiones relacionadas