分享:在php的输出缓冲区里写org | 文学编程转org为htm文本

应该没人会这么做, 但我这样做了两三年了, 用于在emacs之外仅只有浏览器可以用时看org写的内容.

注: 对其它人大概是不适用的,或者是没法做到,又或者看不懂我写的(需要会php).

我有一些org文件的后缀名是php, 我在开头第一行写上 * <?php /*-*-org-*-*/ ob_clean();ob_start(); ?>, 这样emacs打开就会用org-mode渲染了, 把org内容移进来, org文件的最后这么写

* <?php
#+BEGIN_SRC php
# org的注释是#开头,php的注释也是#开头的,可以通用
#+END_SRC

里面的php代码做的事: 用ob_get_clean() 获取输出缓冲区里的org文本插入一些div标签在输出到到浏览器,css+js引入

引入js做的事: 轮循服务端php获取org文本的md5值, 用于org内容改了后页面自动刷新.

第一行的 ob_start(); 新建输出缓冲区, 我开始没写, org内容多了后会出现缓冲区内容丢失, 忘记是内容大于多少kb会出现了(也可能新版php修复了这个问题).

虽然这么做了很久, 但一直都是简单加几个div标签进去,效果原生, 至今也没能写一个org转htm的模板出来. 没通用性,php code也就不发出来了.

如果也有人喜欢这么做,或者我那天真能写一个org转htm的模板出来, 再来发

---------------- 更新 ----------------

只要是用php写过网站的人对这种用法应该都不会陌生, 遇到复杂的前端页面时, div层层嵌套本身已经较为混乱了, 在把php也加进去代码结构就更乱了, 如果js也在一个页面的话…, 不知有多少phper受过此折磨.

我把html换成了org, 意外的感觉很舒爽, 笔记部分,代码部分,预处理脚本部分还是全写在一个文件里面, 但并无混乱感.

不足之处是: 和php绑定越来越深了, php+org看起来居然也搭. 按理说和org最搭的应该是elisp, 就如同html与js的关系.

仔细想下,org和elisp绑定越深可能并不利于org的流行, 有些emacs之外的org实现, 不如人意的地方一般认为是没有elisp, 而要用elisp就只能用emacs, 这个不足我理解不是没有elisp,而是没有一个能与之完美结合的脚本语言可用

最初的html是没有js的, 功能有限, html在加上一门脚本语言后才开始真正流行起来,记得这类语言除了js外好像还有很多但最终只留下了js.

所以org搭配一个脚本语言一起用是合理的, 也许这才是org-mode直正的打开方式

6 个赞

好奇这里的PHP项目是如何部署,以及如何路由笔记文件?

在配好php的apache或nginx里指定好网站根目录,在把php文件放到网站根目录下面, 如路径是d:/www/f/china.php, d:/www 为网站根目录,那路由就是 http://ip地址/f/china.php

1 个赞

最近遇到一个问题, 问 chatGPT 说用宏或python解决(如上图), 于是决定临时写些php脚本处理, 重新审视了我这个用法, 发现可以改进的地方:

首先org文件的后缀名是php, 然后在第一行写/*-*-org-*-*/, 让emacs打开文件时用org-mode渲染, 没必要这样的, 可以就用org后缀名, 把网站目录下的org文件都当作php脚本预处理就可以了.

需要配置web服务器, 我当前电脑用的是apache, 打开apache配置文件, 发现这样一行AddType application/x-httpd-php .php .htm .jsp , 原来我早就做过这件事了, 把网站目录下.htm .jsp文件都当作php脚本处理, 其中会有jsp是当初为了使网站看起来像是用java开发加上的. 现在在加一个.org

这样做了以后, 在org文件中需要临时写脚本处理的地方只需要写在开始处写,* <?php ob_clean(); ob_start(); ?>, 结束处写

* <?php
#+begin_src php
$txt= ob_get_clean();
# ……
#+end_src

就可以了,效果图

org-title-ji

1 个赞

我觉得你的用法,完全可以用英文在 reddit 里发帖,给老外看看我们国人的想象力

说得没错,应该如此,不过最近太忙了,work上的事情多到正常睡眠时间都不能保证,每天有点空闲时间去补觉(躺地板 :joy:)。 先立个flag : 等熬过这段时间,就去学习怎么用英文来写文章,不信写不出来。

这一点很有启发意义

有 AI 帮你翻译,不用完全自学英语这么麻烦

上面说的那个多少多少集to-org-title的问题,解决的脚本还没发,补发下,供大家参考

#+begin_src php
$txt=ob_get_clean();
echo "* temp\n";
die( 第x集to_org_title($txt) );
function 第x集to_org_title(string $txt){
  $ret="";
  foreach( explode("\n",$txt) as $f=>$row ){
    $row=trim($row);
    if(mb_substr($row,0,1)=="第"){
      if(mb_strpos($row,"集")!==false){
        $ret.="* ".$row."\n";
      }else{#有`第`字未找到`集`字的情况
        $ret.=$row."\n";
        echo $row."\n";
      }
    }else{
      $ret.=$row."\n";
    }
  }
  return $ret;
}
#+end_src