Q: Voglio copiare in clipboard del testo formattato ma anche del testo senza formattazione come faccio?
A: Per copiare in clipboard in formati diversi dal testo cosidetto piatto ovvero senza formattazione si usano i flavor.
Utilizzando i flavor si possono copiare
- dati che non sono necessariamente testo, ad esempio una immagine
- gli stessi dati ma in formati differenti, ad esempio del testo formattato in HTML e lo stesso testo senza formattazione.
Il vantaggio di copiare lo stesso testo ma in differenti formati e' quello di sfruttare al massimo il programma sul quale si incolla.
Si pensi ad OpenOffice Writer, puo' essere utile incollare del testo ben formattato ma lo stesso testo incollato in un editor come Emacs puo' essere visualizzato ugualmente bene togliendo colori, stile e quant'altro.
In XUL si usa nsITransferable. Si specifica il MIME type e se l'applicazione dove si incolla e' in grado di gestirlo si vedra' qualcosa di piu' completo del semplice testo.
Il codice riportato di seguito inserisce in clipboard del codice HTML che se incollato in OpenOffice, Word etc visualizzera' del testo in rosso.
var textHtml = "<font color='#FF0000'>Hello world in red</font>";
var xferable = Components.classes["@mozilla.org/widget/transferable;1"]
.createInstance(Components.interfaces.nsITransferable);
xferable.addDataFlavor("text/html");
var htmlstring = Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
htmlstring.data = textHtml;
xferable.setTransferData("text/html", htmlstring, textHtml.length * 2);
var clipboard = Components.classes["@mozilla.org/widget/clipboard;1"]
.getService(Components.interfaces.nsIClipboard);
clipboard.setData(xferable, null,
Components.interfaces.nsIClipboard.kGlobalClipboard);
Il testo pero' non potra' essere incollato in Emacs, VI, UltraEdit, KomodoEdit etc. per farlo basta aggiungere un altro flavor con MIME text/unicode anziche' text/html. Quindi al codice presentato basta aggiungere quello di seguito.
var plainText = "Hello world in plain";
xferable.addDataFlavor("text/unicode");
var unicodestring = Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
unicodestring.data = plainText;
xferable.setTransferData("text/unicode", unicodestring, plainText.length * 2);
Adesso se si incolla in un editor di testo plain otterremo "Hello world in plain" se incolliamo su Writer, Word, Calc, Excel otterremo "Hello world in red". I programmi come Writer oppure Word permettono di incollare usando il comando "Incolla speciale" con il nostro codice sara' possibile scegliere tra i due formati.