org #+include URL

有没有人考虑“org这类远程包含”特性,把数据分散地存储在各种论坛、textboard、博客、甚至对任何评论提供外链的网站?

比如,用下面函数将 https://emacs-china.org/ 的帖子转为纯文本(这类无关紧要的格式转换函数随机随意地存储于某网站中,即使丢失,也可以快速恢复):

#+begin_src emacs-lisp
  (lambda (url)
    (let* ((dom (with-temp-buffer
                  (shell-command (concat "curl -s " url) (current-buffer))
                  (libxml-parse-html-region (point-min) (point-max)))))
      (s-join "\n"
              (-map #'dom-texts
                    (dom-non-text-children (dom-by-class dom "^post$"))))))
#+end_src

再增加一个类似#+include的扩展(这函数能否也随机存在某个论坛中?):

#+begin_src emacs-lisp
(defun x-include (url &optional extract-url src-blk-name)
  (let* ((extract-url (or extract-url url))
         ;; url -> lisp function
         (dom (with-temp-buffer
                (shell-command
                 (concat "curl -s " extract-url) (current-buffer))
                (libxml-parse-html-region (point-min) (point-max))))
         (efunc (with-temp-buffer
                  (org-mode)
                  (insert (dom-texts dom "\n@@@\n"))
                  (let* ((src-blks (org-element-map
                                       (org-element-parse-buffer)
                                       `(src-block)
                                     #'identity))
                         (src-blks (if src-blk-name
                                       (--filter
                                        (string= (org-element-property :name it)
                                                 src-blk-name)
                                        src-blks)
                                     src-blks)))
                    (ignore-errors
                      (read (org-element-property :value (car src-blks))))))))
    ;; url -> org text
    (or (ignore-errors (funcall efunc url)) "")))
#+end_src

于是,这个帖子本身的内容在本地系统中成为:

#+begin_src emacs-lisp
(x-include "https://emacs-china.org/t/org-include-url/29242")
#+end_src

再抽象些:

src_org{(org-babel-call "~/org/a.org:format-convert" content-url)}

src_org{(org-babel-call "url:format-convert" content-url)}"

现在,format-convert可以随便存在某朵“云”上了。(:

25/3/25,2339注:不知道归档在web.archive.org的网站数据是否依赖原网站的状态? `用 elisp 手搓 gptel tools - Emacs-general - Emacs China

#+name: this-is-a-test-func
#+begin_src emacs-lisp :var a="world"
(concat  "hello " a "!")
#+end_src
2 个赞

不需要 #'

为什么?

lambda 被定义成宏了, 为了写起来方便

我的经验是,服务器端不靠谱,返回的内容各种各样都有,对各种论坛、textboard、博客、任何评论提供外链的网站都写一段代码来解析太累了,而且服务端更新了你代码也要跟着更新,很多服务器限制只能浏览器中访问,还需要把请求模拟成是浏览器发起的。

可能解决的办法是自己写服务端,都自己写服务端了就没有必要还写html,xml这些了,让服务端直接返回org文本即可(返回的org文本可包含链接具有交互性,还可以实现像使用web应用一样使用org-mode,这个什么时候我感觉已经做到完善了在细说吧)

假如有 rss 的话,好像可以用自带的 org-feed 库来获取内容,格式算是统一的

你说的这些问题确实是这个念头后续需要细致考虑的(更不说后面过于碎片化的链接如何管理、要不要做多重备份),现在我的假设是:先假定各种服务器的链接都正常。

这个念头的想法源于:我在本地写了很多org,借用org-babel的Literate programming(这不仅是elisp,还涵盖了各种org-babel支持的语言),混合了文档、代码、日志记录等等,导致很多代码十分碎片化,又担心瘫痪,所以想把一些东西分散到网络中。

当然,其实比较简单的做法是搞个org仓,我本地目前就是这么弄的。但因为我的org有些内容又不适合全部public,所以,权当是玩。

有什么现有的包提供现基于Web浏览org文件吗?我目前确实自己写了个本地的服务器(elisp),主要方便用手机看,也有简单的编辑功能。

了解。这几天正好看到rsshub。但,rss有些网站只提供摘要,要查看全部内容,还得另外访问。这个念头和rsshub有些类似:收集网络中的org碎片。rsshub已实现部分格式转换的处理,如果有无法满足需要的,最终还是得写诸如rsshub的路由之类的(个人感觉)。

org-transclusion-http 就是干这个的吧

他能把当下这个帖子的内容转为org吗?

Then move point onto the link, and run M-x org-transclusion-add . Emacs will download the webpage and convert its HTML content to Org mode with Pandoc before displaying as an Org subtree in the same buffer.

嗯,如果你的环境有这个包,你可以试下,烦看下这两段代码的输出有什么区别?

#+begin_src emacs-lisp
(x-include "https://emacs-china.org/t/org-include-url/29242")
#+end_src
#+transclude: [[https://emacs-china.org/t/org-include-url/29242]] 
#+begin_src emacs-lisp
(x-include "https://emacs-china.org/t/org-include-url/29242")
#+end_src

能够获取块

#+transclude: [[https://emacs-china.org/t/org-include-url/29242]]

运行出错了,应该是上游新版的org-transclude 的api 改了,报了个issue

个人感觉,org-transclude-http和org-rss一样,预先定义好了某种format-convert;但如有特殊需求,通常需要按这些package提供的接口按需扩展。

如果org本身提供一种org-babel-call,用URL加某种语义(比如src-block-name)定位到某类纯文本中的org代码块,且能载入该代码块并执行(类似在本地执行云端代码)。

你会发现,你甚至不需要安装任何package,你的代码(org-babel支持的任何语言)、笔记、碎片可以存在任何网站上。

比如,就按URL的定义:

;; Eval source block defined in URL with parameters in URL.
;; Source block is specified by `NAME' or the first block in URL.
;; Return the result of source block.
(org-babel-call URL &optional func-name)

改上述x-include接口为:

(org-babel-call "https://emacs-china.org/t/org-include-url/29242/")

通用性org-transclude-http会好些,灵活性肯定代码块强,以前特别想要这个功能 ,但发现最难控制的云端的内容,可靠性无法保证,不知啥时候就变了 :sweat_smile: 特别是代码块,花了心思调好了,哪天突然变了啥都不香了

明白,也确实。这念头太过理想——想把东西全散存网上。

rsshub 有个额外参数可以提取内容,我用下来兼容性还不错的

我用过其他类似的还有

通过写 css selector 或者 xpath 都可以把正文提取出来

你用下来,这些通用参数的配置或代码大致是什么样的?这些配置、代码你存储在哪?一些未被收录在rsshub中的网站的内容,需要自己开发转换代码吗?

以 rsshub 为例

这个是没有正文的: rsshub.email-once.com/hackernews?limit=5

这个是有正文的:新建标签页

区别就是在后面加个参数 mode=fulltext