2010-03-30 21 views
13

Zgodnie z man strony dla pbpaste,Pobieranie danych RTF z Mac OS X kartonowe (schowka)

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

jednak (w moim doświadczeniu z 10.6 Snow Leopard przynajmniej) pbpaste -Prefer rtf nigdy, przenigdy nie porzuca Dane RTF, nawet jeśli istnieje na stole montażowym. Czy istnieje inny prosty sposób na uzyskanie tekstu RTF tego, co jest gotowe do wklejenia?

Próbowałem AppleScript, ale osascript -e 'the clipboard as «class RTF »' daje odpowiedź «data RTF 7B ton kodowanej szesnastkowo bzdury 7D». Czy AppleScript może przekonwertować te heksdany na tekst, który mogę odtwarzać?

Odpowiedz

11

nie widzę żadnego sposobu, aby to zrobić od wewnątrz AppleScript, ale skoro pracujesz w powłoce tak, ja po prostu post- Przetwórz: "szydło zakodowane" to dane RTF, które chcesz. Najprostszym skrypt można myśleć jest

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

Wyjaśnienie: substr($_,11,-3) Odcina «data RTF i »\n bitów (każdy z guillemets ma dwa bajty); pack("H*", ...) pakuje dane zakodowane w postaci szesnastkowej w bajttream; unpack("C*", ...) rozpakowuje bytestream do tablicy wartości znaków; print chr foreach ... konwertuje każdą liczbę całkowitą w tablicy na odpowiadającą jej postać i drukuje ją; a opcje -ne oceniają skrypt podany dla każdej linii, z tą linią niejawnie zapisaną w $_. (Jeśli chcesz, aby skrypt w oddzielnym pliku, wystarczy upewnić się, że linia shebang jest #!/usr/bin/perl -ne). Następnie uruchomiony

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

daje surowe wyjście RTF.

+1

Sprytne podejście. Niewielkie uproszczenie polega na zastąpieniu '« class RTF »' zwykłym łańcuchem '" RTF "' (zwróć uwagę na wymaganą końcową spację przed zamykającym separatorem w obu przypadkach): 'osascript -e 'schowek jako" RTF "' | perl -ne 'print chr foreach unpack ("C *", pakiet ("H *", substr ($ _, 11, -3)))' '- działa na (co najmniej) 10.8+. Zauważ także, że - według projektu - polecenie AppleScript zgłosi błąd, jeśli w schowku nie ma danych RTF. – mklement0

+0

Dodałem ten naprawdę przydatny alias do mojego '.profile':' alias pbpaste-rtf = "osascript -e 'do schowka jako \" RTF \ "' | perl -ne 'print chr foreach unpack (\" C * \ ", pakiet (\" H * \ ", substr (\ $ _, 11, -3)))" ". –

0

znalazłem conversation o tym z szybkiego wyszukiwania google

+0

"Jednak nie będziesz w stanie manipulować RTF jako ciągiem wewnątrz AppleScript." Widziałem to w moich poszukiwaniach, zanim opublikowałem pytanie, ale uważam za niewiarygodne, że nie ma sposobu, aby uzyskać dane RTF bez zapisywania do pliku. (Chcę RTF na STDOut, więc mogę wprowadzić dalsze zmiany.) Czy ktoś wie wystarczająco AppleScript, aby wiedzieć, czy to prawda? – Carl

+0

co to jest, że chcesz zrobić dane rtf zakładając, że istnieje sposób, aby uzyskać dane? – mcgrailm

+1

Przekształć w HTML, a następnie przekonwertuj HTML na Markdown. Oczywiście, mógłbym po prostu napisać gdzieś plik tymczasowy, ale wolałbym nie z powodów wydajnościowych i estetycznych. Wygląda na to, że AppleScript powinien mieć sposób na wyodrębnienie samych danych. Lub że istnieje jakieś inne narzędzie do pobierania danych z obszaru roboczego. – Carl

8

myślę, że przynajmniej na OS X 10.8 to będzie działać, jeśli kopiowana zawartość HTML z Chrome:

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

+1; nadal działa na 10.9. – mklement0

+0

nadal działa w dniu 10.10. –

0

Jest bardzo łatwy poprzez AppleScript (sprawdzone 10.11 El Capitan):

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

można utworzyć usługę poprzez Automator:

  1. otwarty Automator
  2. zrobić nową usługę ("Dienst" w języku niemieckim)
  3. dodać "Execute do AppleScript"
  4. wejściowe: nic; wydajność; zastępuje Selection

skryptu:

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

zrobić. Teraz zapisz nową usługę i wypróbuj ją: wybierz tekst, a następnie przejdź do menu aplikacji i wybierz "Usługi"> "przekonwertuj na RTF"