Tryb organizacji - parsowanie bogatego kodu HTML bezpośrednio podczas wklejania?

12

Obecnie w przypadku narzędzi do tworzenia notatek, takich jak Evernotei Quiver, mogę bezpośrednio kopiować treści HTML z mojej ulubionej przeglądarki, a następnie wklejać je do aplikacji, z zachowaniem całego formatowania + linku. Jednak w trybie org wydaje się, że wszystkie informacje o formatowaniu są tracone.

Widziałem, że ktoś sugeruje używanie ewwdo przeglądania Internetu i kopiowania treści za pośrednictwemeww-org . Jest to jednak bardzo żmudne (nie sądzę, aby wiele osób przeglądało Internet ewww dzisiejszych czasach zamiast współczesnych przeglądarek. Będę musiał ponownie otworzyć ten link ewwi wykonać kopiowanie, nie wspominając o tym, że czasami ewwnie ładnie renderuj zawartość).

Czy można Emacswkleić bezpośrednio parsowany skopiowany kod HTML? Nawet jeśli nie istnieje jeszcze żadne narzędzie do tego, czy można je stworzyć?

To prawie jedyna rzecz, która powstrzymuje mnie przed przejściem orgmodez innych narzędzi do sporządzania notatek.

Xji
źródło
Wyjaśnij, co rozumiesz przez „bezpośrednie przeanalizowanie skopiowanego kodu HTML”
mankoff,
@mankoff OK Chyba nie byłem wystarczająco jasny w moim opisie. To, czego chcę, to na przykład, jeśli oryginalny kod HTML miał go <b>text</b>później po jego Cmd + Cwłączeniu, można go *text*w org modejakiś sposób przekonwertować podczas wklejania. A jeśli nie, przynajmniej zachowaj oryginalny kod HTML, aby móc później wyświetlić go w odpowiednim formacie. Obecna sytuacja jest w jakiś sposób renderowana tylko zwykły tekst.
Xji
Na przykład mamy tutaj <p>I've seen somebody <a href="http://emacs.stackexchange.com/q/7171/115">suggest using <code>eww</code> to browse the web and copy the content via <code>eww-org</code></a>. However that is really tedious(I don't think there would be a lot of people browsing the web using <code>eww</code> instead of modern browsers nowadays. I'll have to open that link again in <code>eww</code> and do the copying, not to mention sometimes <code>eww</code> doesn't render the contents nicely). </p>. Jeśli skopiuję ten akapit, chcę móc odtworzyć jego formatowanie orgmode.
Xji
1
@mankoff Wonderful! Zadziałało! Jesteś mężczyzną! Myślę, że możesz nawet rozważyć przesłanie go jako pakietu Emacsa itp. Haha. To może uczynić org modeo wiele bardziej przyjaznym dla użytkownika. Właściwie bardziej podoba mi się to z formatowaniem bez pośredniej konwersji RTF, ponieważ zachowuje więcej informacji. Na przykład #+BEGIN_QUOTEi #+BEGIN_EXAMPLEw Twojej odpowiedzi nie zostałyby zachowane przy dodatkowej konwersji.
Xji
1
@incandescentman To tylko próba usunięcia niektórych informacji o formatowaniu, np. trochę CSS na stronie internetowej. Możesz spróbować sam i przekonać się, jaką to robi różnicę.
Xji

Odpowiedzi:

12

czy można to zrobić?

Ponieważ to jest emacs, tak .

Moje podejście polega na użyciu narzędzi innych firm, które mogą pobierać HTML i konwertować na zwykły tekst lub nawet bezpośrednio do formatu Org. Myślę, że to brzydki hack i mogą istnieć lepsze sposoby, ale wygląda na to, że działa w moich przypadkach testowych.

(defun kdm/html2org-clipboard ()
  "Convert clipboard contents from HTML to Org and then paste (yank)."
  (interactive)
  (kill-new (shell-command-to-string "osascript -e 'the clipboard as \"HTML\"' | perl -ne 'print chr foreach unpack(\"C*\",pack(\"H*\",substr($_,11,-3)))' | pandoc -f html -t json | pandoc -f json -t org"))
  (yank))

Niestety, HTML jest teraz niezwykle skomplikowany - nie ma już prostych odręcznych tagów. To złożone tagowanie HTML wymaga skomplikowanego polecenia powłoki powyżej. Wykonuje następujące czynności:

  1. osascriptpobiera tekst HTML ze schowka. Jest więc zakodowany szesnastkowo, więc
  2. perl konwertuje hex na ciąg znaków
  3. Możemy przekonwertować ten HTML bezpośrednio do organizacji za pomocą pandoc, ale HTML jest pełen skomplikowanych tagów i dlatego generuje mnóstwo kodu organizacji. Aby po prostu HTML do minimalnego zestawu tagów potrzebnych do przechwycenia formatowania, I
  4. Konwertuj HTML na json, a następnie
  5. Konwertuj json na Org (te dwa kroki upraszczają HTML).

Uwaga: osascriptdotyczy MacOS. Aby zmodyfikować kroki 1-2 w systemie Linux, zamień argument polecenia shell-command-to-string na

"xclip -o -t text/html | pandoc -f html -t json | pandoc -f json -t org"

W każdym razie dane wyjściowe pandocpolecenia są zwracane do emacsa i wstawiane do bufora.

Powiąż nowe polecenie Emacsa z klawiszem podobnym do „wklej”, ale to oznacza dla ciebie „wklej i przekonwertuj z html” i powinno działać.

Alternatywnie, jeśli nie chcesz myśleć o tym, którego polecenia wklej użyć, oto wersja systemu Linux, która konwertuje HTML, gdy jest on dostępny w schowku, a w przeciwnym razie wróci do zwykłego tekstu:

"xclip -o -t TARGETS | grep -q text/html && (xclip -o -t text/html | pandoc -f html -t json | pandoc -f json -t org) || xclip -o"
mankoff
źródło
Jeden dodatek: Wygląda na to, że podczas konwersji sformatowanego tekstu wstawionego (pogrubienie, kursywa, kod itp.) pandocAutomatycznie używa spacji niełamliwych zamiast normalnej spacji, które orgmodedomyślnie nie są rozpoznawane . Musisz dodać go (), aby org-emphasis-regexp-componentspoprawnie sformatować te teksty orgmode.
Xji
zwłaszcza „wydana” wersja xclip nie obsługuje opcji -t; więc xclip musi być zbudowany z github. Konieczne może być także przesyłanie danych wejściowych i wyjściowych przez iconv utf-8
pandoc
xclipjest także w systemie OS X (być może tylko w / X11 i / lub zainstalowane narzędzia programistyczne?), więc poprawiona odpowiedź może również działać w systemie OS X.
mankoff,
@JIXiang Jak zmodyfikować zaakceptowaną odpowiedź, aby przekształciła spacje nierozdzielające się w spacje normalne?
incandescentman
1
@incandescentman Pierwotnie zmodyfikowałem plik pakietu org-mode, aby rozpoznał nierozdzielające miejsce jako separator. Okazało się to jednak żmudne ze względu na zmiany wersji. Następnie podniosłem kwestię dotyczącą repozytorium pandoc, o której możesz szukać. Zasadniczo możesz użyć „filtra” w pandoc, aby wykonać automatyczne podstawienie. Ale czasami to również zawodzi. Więc teraz po prostu w większości ręcznie wybieram wklejoną treść i dokonuję podstawienia. Moje ostatnie zastąpienie jest prawie zawsze tym, więc po prostu przewijam historię zmian i aplikuję.
Xji