有没有通过修改 shr 实现使 eww 直接得到网页的 org mode 格式(从而剪藏网页) 的包?

网页剪藏是我感觉 org mode 不如 obsidian, notion 等方便的地方. org-web-tools-read-url-as-org 转换效果大多数时候都不让我满意, 所以我通常是先拷贝到 obsidian, 再用 pandoc 转为 org mode. 有时候效果也不太好, 而且为了剪藏网页我还得开着 obsidian.

我想到, 如果对 shr 中解析 DOM 比如 shr-tag-a 进行 override, 使之显示 org-mode 的内容, 比如:

(defun my/shr-tag-a (dom)
  (let ((url (dom-attr dom 'href))
        (title (dom-text dom)))
    (insert (format "[[%s][%s]]" url title))
    ))

或许能让 eww 直接显示 org-mode 内容, 这样就非常方便了. 想问有按这个思路现成的包么? 或者你们有更好的剪藏网页的思路么?

2024-05-15 09.39.32

懒猫大神的 EAF 浏览器中集成了 Readability,可以做到很好的提取网页正文。

我个人对于想要保存的网页采用的流程是:

  • 使用 eaf 浏览器打开网页
  • M-x eaf-py-proxy-insert_or_switch_to_reader_mode 切换到 reader_mode,该命令会帮我提取正文。并且我在 eaf 的 Python 源码 /Users/c/.emacs.d/elpa/29.3/develop/eaf-20240321.230436/app/browser/buffer.py 的 switch_to_reader_mode 中做了小小的 hack:
    @interactive(insert_or_do=True)
    def switch_to_reader_mode(self):
        if self.buffer_widget.execute_js("document.getElementById('readability-page-1') != null;"):
            message_to_emacs("Reader mode has been enable in current page.")
        else:
            self.load_readability_js()

            html = self.buffer_widget.execute_js("new Readability(document).parse().content;")
            if html is None:
                self.refresh_page()
                message_to_emacs("Cannot parse text content of current page, failed to switch reader mode.")
            else:
                self.buffer_widget.setHtml(get_emacs_var("eaf-browser-reader-mode-style") + html)
                eval_in_emacs("hurricane/html-to-org-with-pandoc", [html])

注意最后一句 eval_in_emacs("hurricane/html-to-org-with-pandoc", [html]) 是我自己添加的,只添加了这里。

hurricane/html-to-org-with-pandoc 是我自己定义的函数:

(defun hurricane/html-to-org-with-pandoc (html)
  (kill-new (org-web-tools--html-to-org-with-pandoc html)))

该函数非常简单就是使用 org-web-tools 包中的函数 org-web-tools–html-to-org-with-pandoc 将 eaf Readability 提取的正文经 pandoc 转换为 org mode,并 kill-new 到剪贴板。

  • 打开 org 文件,粘贴上一个步骤获得的网页正文。

对于粘贴到 org 文件的网页正文中的图片链接,我是使用

(defun hurricane/org-download-images ()
  (interactive)
  (let* (($inputStr (if (use-region-p)
                        (buffer-substring-no-properties (region-beginning) (region-end))
                      (let ($p0 $p1 $p2
                                ($pathStops "^  \t\n\"`'‘’“”|[]{}「」<>〔〕〈〉《》【】〖〗«»‹›❮❯❬❭〘〙·。\\"))
                        (setq $p0 (point))
                        (skip-chars-backward $pathStops)
                        (setq $p1 (point))
                        (goto-char $p0)
                        (skip-chars-forward $pathStops)
                        (setq $p2 (point))
                        (goto-char $p0)
                        (buffer-substring-no-properties $p1 $p2)))))
    (next-line)
    (org-download-image $inputStr)
    (org-display-inline-images)))

这个函数手动下载,具体看 GIF 演示。

2 个赞

我在 gnus 这类使用 shr 渲染 HTML 的包里使用 org-eww-copy-for-org-mode 复制 HTML 到 org 里

网页剪藏的话,我用 wallabag (有两个不错的 wallabag Emacs 包,但我还没试用),diigo 也不错。原则上不把整篇网页剪藏到 org。曾经我用 OneNote 的时候有过剪藏网页的习惯,后来发现把剪藏网页和自己的笔记混在一起非常糟糕:严重干扰搜索结果导致笔记搜索很难用。

大部分剪藏的网页,其实读完之后不太会看第二遍。而自己亲手写的笔记往往以后会几十次地重新搜索查看。使用频率是完全不一样的。

现在我的笔记是笔记,网页剪藏是网页剪藏。有可能会经常翻阅的网页会自行精炼之后写到笔记里。如果某个网页里有一段话我想直接复制到笔记里,用 Firefox 插件 Copy-as-Org-Mode