Chế độ Org - Phân tích cú pháp HTML phong phú trực tiếp khi dán?


12

Hiện tại, đối với các công cụ đáng chú ý như EvernoteQuiver, tôi có thể sao chép trực tiếp nội dung HTML từ trình duyệt yêu thích của mình và sau đó dán chúng vào ứng dụng, với tất cả các định dạng + liên kết được giữ nguyên. Tuy nhiên, trong orgmode, dường như tất cả các thông tin định dạng bị mất.

Tôi đã thấy ai đó đề nghị sử dụng ewwđể duyệt web và sao chép nội dung quaeww-org . Tuy nhiên, điều đó thực sự tẻ nhạt (Tôi không nghĩ rằng sẽ có nhiều người duyệt web bằng cách sử dụng ewwthay vì các trình duyệt hiện đại. Tôi sẽ phải mở lại liên kết đó ewwvà thực hiện sao chép, đôi khi ewwkhông đề cập đến làm cho nội dung độc đáo).

Có thể để Emacsphân tích trực tiếp HTML đã sao chép khi dán không? Ngay cả khi chưa có công cụ nào cho việc đó, liệu có khả thi để tạo ra một công cụ không?

Đây gần như là điều duy nhất ngăn tôi chuyển sang orgmodetừ các công cụ ghi chú khác.


Vui lòng làm rõ ý của bạn bằng cách "phân tích trực tiếp HTML đã sao chép"
mankoff

@mankoff OK Tôi đoán tôi không đủ rõ ràng trong mô tả của mình. Những gì tôi muốn là ví dụ nếu HTML ban đầu đã <b>text</b>xong tôi Cmd + Cvào nó, nó có thể được chuyển đổi sang *text*trong org modecủa một số phương tiện khi dán. Hoặc nếu không, ít nhất là giữ nguyên mã HTML gốc để tôi có thể xem chúng ở định dạng đúng ban đầu của chúng sau này. Tình hình hiện tại bằng cách nào đó chỉ có văn bản đơn giản sẽ được hiển thị.
xji

Ví dụ, chúng tôi có ở đây <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>. Nếu tôi sao chép đoạn này, tôi muốn có thể sao chép định dạng của nó trong orgmode.
xji

1
@mankoff Tuyệt vời! Nó đã làm việc! Bạn là đàn ông! Tôi nghĩ bạn thậm chí có thể xem xét việc gửi nó dưới dạng gói Emacs, v.v ... haha. Điều này có thể làm cho org moderất nhiều người dùng thân thiện. Trên thực tế tôi thích nó hơn với định dạng mà không cần chuyển đổi RTF trung gian vì nó bảo tồn nhiều thông tin hơn. Ví dụ #+BEGIN_QUOTE#+BEGIN_EXAMPLEtrong câu trả lời của bạn sẽ không được bảo tồn với chuyển đổi bổ sung.
xji

1
@incandescentman Đó chỉ là cố gắng loại bỏ một số thông tin định dạng, ví dụ như một số CSS trong trang web. Bạn có thể thử nó và xem những gì nó làm cho sự khác biệt.
xji

Câu trả lời:


12

nó là khả thi để làm cho một?

Vì đây là emacs, vâng .

Cách tiếp cận của tôi là sử dụng một công cụ của bên thứ 3 có thể lấy HTML và chuyển đổi thành văn bản thuần túy hoặc thậm chí trực tiếp sang định dạng Org. Tôi nghĩ rằng đây là một hack xấu xí, và có thể có cách tốt hơn để làm điều này, nhưng có vẻ như nó hoạt động cho các trường hợp thử nghiệm của tôi.

(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))

Thật không may, HTML bây giờ cực kỳ phức tạp - không còn là một số thẻ viết tay đơn giản. Việc gắn thẻ HTML phức tạp này yêu cầu lệnh shell phức tạp ở trên. Nó làm như sau:

  1. osascriptlấy văn bản HTML từ bảng ghi tạm. Nó được mã hóa hex, vì vậy
  2. perl chuyển đổi hex thành một chuỗi
  3. Chúng tôi có thể chuyển đổi HTML đó sang Org trực tiếp bằng pandoc, nhưng HTML chứa đầy các thẻ phức tạp và do đó tạo ra một tấn mã Org. Để đơn giản HTML đến bộ thẻ tối thiểu cần thiết để nắm bắt định dạng, tôi
  4. Chuyển đổi HTML sang json và sau đó
  5. Chuyển đổi json thành Org (hai bước này đơn giản hóa HTML).

Lưu ý rằng osascriptdành cho MacOS. Để sửa đổi các bước 1-2 cho Linux, hãy thay thế đối số shell-lệnh-to-string bằng

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

Trong mọi trường hợp, đầu ra của pandoclệnh được trả về emacs và được chèn vào bộ đệm.

Liên kết lệnh Emacs mới với một khóa tương tự như "dán" nhưng điều đó có nghĩa là "dán và chuyển đổi từ html" cho bạn và nó sẽ hoạt động.

Ngoài ra, nếu bạn không muốn nghĩ về việc sử dụng lệnh dán nào, thì đây là phiên bản Linux sẽ chuyển đổi HTML khi có sẵn trên bảng tạm và nếu không sẽ quay lại văn bản thuần túy:

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

Một bổ sung: Dường như pandoctự động sử dụng không gian Không phá vỡ khá nhiều thay vì không gian bình thường khi chuyển đổi văn bản nội tuyến được định dạng (in đậm, in nghiêng, mã, v.v.), orgmodetheo mặc định không được nhận dạng . Bạn phải thêm nó () org-emphasis-regexp-componentsvào để các văn bản đó được định dạng chính xác orgmode.
xji

Đáng chú ý là phiên bản "phát hành" của xclip không hỗ trợ tùy chọn -t; vì vậy xclip phải được xây dựng từ github. Ngoài ra, bạn có thể cần phải chuyển đầu vào và đầu ra của iconv utf-8
pandoc

xclipcũng có trên OS X (có lẽ chỉ cài đặt w / X11 và / hoặc Công cụ dành cho nhà phát triển?), vì vậy câu trả lời được cải thiện cũng có thể hoạt động trên OS X.
mankoff

@JIXiang Làm cách nào để sửa đổi câu trả lời được chấp nhận để nó cũng chuyển đổi không gian không phá vỡ thành không gian bình thường?
sợi đốt

1
@incandescentman Ban đầu tôi đã sửa đổi tệp gói của chế độ org để nó nhận ra không gian không phá vỡ như một dấu phân cách. Tuy nhiên, hóa ra là tẻ nhạt với thay đổi phiên bản. Sau đó tôi đã đưa ra một vấn đề về repo của pandoc mà bạn có thể tìm kiếm. Về cơ bản, bạn có thể sử dụng "bộ lọc" trong pandoc để thực hiện thay thế tự động. Nhưng điều đó đôi khi cũng thất bại. Vì vậy, bây giờ tôi chỉ chủ yếu chọn thủ công nội dung được dán và thực hiện thay thế. Sự thay thế cuối cùng của tôi gần như luôn luôn là cái này vì vậy tôi chỉ cần cuộn lên lịch sử thay thế của mình và áp dụng.
xji
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.