2010-03-30 11 views
13

Secondo la pagina man per pbpaste,Ottenere dati RTF di Mac OS X cartone (appunti)

-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. 

Tuttavia (nella mia esperienza con 10.6 Snow Leopard, almeno), pbpaste -Prefer rtf mai, mai rinuncia al Dati RTF anche quando sono presenti sul tavolo di montaggio. C'è un altro modo semplice per ottenere il testo RTF di tutto ciò che è pronto per essere incollato?

Ho provato AppleScript, ma osascript -e 'the clipboard as «class RTF »' dà la risposta «data RTF 7B tonnellate di merda codificata Hex 7D». AppleScript può convertire questo hexdata in testo con cui posso giocare?

risposta

11

non riesco a vedere alcun modo per farlo dall'interno AppleScript, ma dal momento che si sta lavorando nella shell in ogni caso, avevo appena post- processalo: la "crap hex-encoded" è il dato RTF che desideri. Lo script semplice che posso pensare è

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

Una spiegazione: substr($_,11,-3) spoglia i bit «data RTF e »\n (ciascuno dei guillemets è due byte); pack("H*", ...) impacchetta i dati con codifica esadecimale in un attimo; unpack("C*", ...) decomprime un bytestream in una matrice di valori di caratteri; print chr foreach ... converte ciascun numero intero dell'array nel carattere corrispondente e lo stampa; e le opzioni -ne valutano lo script fornito per ogni riga, con quella riga memorizzata in modo implicito in $_. (Se si desidera che lo script in un file, basta assicurarsi che la linea shebang è #!/usr/bin/perl -ne.) Quindi, in esecuzione

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

vi darà output RTF crudo.

+1

Approccio intelligente. Una leggera semplificazione consiste nel sostituire la "classe RTF" con la semplice stringa '" RTF "' (notare lo spazio finale richiesto prima del delimitatore di chiusura in entrambi i casi): 'osascript -e 'negli appunti come" RTF "' | perl -ne 'print chr foreach unpack ("C *", pack ("H *", substr ($ _, 11, -3))) "' - funziona su (almeno) 10.8+. Si noti inoltre che, in base alla progettazione, il comando AppleScript segnalerà un errore se non ci sono dati RTF negli Appunti. – mklement0

+0

Ho aggiunto questo alias molto utile al mio '.profile':' alias pbpaste-rtf = "osascript -e 'negli appunti come \" RTF \ "' | perl -ne 'print chr foreach unpack (\" C * \ ", pack (\" H * \ ", substr (\ $ _, 11, -3))) '" '. –

0

ho trovato un conversation di questo con una rapida ricerca google

+0

"Tuttavia non sarà possibile manipolare l'RTF come stringa all'interno di AppleScript." Ho visto che nelle mie ricerche ho postato la domanda, ma trovo incredibile che non ci sia modo di estrarre i dati RTF senza scrivere in un file. (Voglio l'RTF su STDOut, così posso apportare ulteriori modifiche ad esso.) Qualcuno conosce abbastanza AppleScript per sapere se questo è vero? – Carl

+0

che cosa vuoi fare ai dati rtf supponendo che esiste un modo per ottenere i dati? – mcgrailm

+1

Converti in HTML quindi converti l'HTML in Markdown. Ovviamente, potrei semplicemente scrivere tempfile da qualche parte, ma preferirei davvero non per ragioni sia di prestazioni che estetiche. Sembra che AppleScript debba avere un modo per annullare l'esadecimale dei dati stessi. O che dovrebbe esistere qualche altro strumento per estrarre i dati dal tavolo di montaggio. – Carl

8

Penso che almeno su OS X 10.8 questo funzionerebbe se è stato copiato il contenuto HTML da Chrome:

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

+1; funziona ancora su 10.9. – mklement0

+0

funziona ancora su 10.10. –

0

E 'molto facile con AppleScript (testato in 10.11 El Capitan):

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

È possibile creare un servizio tramite Automator:

  1. aperto Automator
  2. rendere nuovo servizio ("Dienst" in tedesco)
  3. aggiungere "eseguire un AppleScript"
  4. ingresso: nulla; produzione; sostituisce Selezione

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. Ora salva il nuovo servizio e provalo: seleziona un testo, quindi vai al menu Applicazioni e scegli "Servizi"> "converti in formato RTF"