30 Jul 2024
eww to org
Here's a quick'n'dirty command to generate an org-mode
rendering of an eww
page, taking into account not only links (as the built-in
org-eww-copy-for-org-mode
does), but also headings, italic and bold faces.
I am pretty sure it's full of corner cases and rough edges, but it's working for me as a starting point.
(defun jao-eww-to-org (&optional dest) "Render the current eww buffer using org markup. If DEST, a buffer, is provided, insert the markup there." (interactive) (unless (org-region-active-p) (let ((shr-width 80)) (eww-readable))) (let* ((start (if (org-region-active-p) (region-beginning) (point-min))) (end (if (org-region-active-p) (region-end) (point-max))) (buff (or dest (generate-new-buffer "*eww-to-org*"))) (link (eww-current-url)) (title (or (plist-get eww-data :title) ""))) (with-current-buffer buff (insert "#+title: " title "\n#+link: " link "\n\n") (org-mode)) (save-excursion (goto-char start) (while (< (point) end) (let* ((p (point)) (props (text-properties-at p)) (k (seq-find (lambda (x) (plist-get props x)) '(shr-url image-url outline-level face))) (prop (and k (list k (plist-get props k)))) (next (if prop (next-single-property-change p (car prop) nil end) (next-property-change p nil end))) (txt (buffer-substring (point) next)) (txt (replace-regexp-in-string "\\*" "·" txt))) (with-current-buffer buff (insert (pcase prop ((and (or `(shr-url ,url) `(image-url ,url)) (guard (string-match-p "^http" url))) (let ((tt (replace-regexp-in-string "\n\\([^$]\\)" " \\1" txt))) (org-link-make-string url tt))) (`(outline-level ,n) (concat (make-string (- (* 2 n) 1) ?*) " " txt "\n")) ('(face italic) (format "/%s/ " (string-trim txt))) ('(face bold) (format "*%s* " (string-trim txt))) (_ txt)))) (goto-char next)))) (pop-to-buffer buff) (goto-char (point-min))))