Org-mode在导出时获取src块的内容

3

以下是我想要做的事情:

我有一段JavaScript代码片段,我希望它既能在org文档生成的HTML中显示,又能在HTML页面中执行该代码。 以一个简单的例子为例,让它像这样:

  #+NAME: block-name
  #+BEGIN_SRC javascript
  alert("Ding!");
  #+END_SRC

  #+NAME: insert-script
  #+BEGIN_SRC emacs-lisp :export results
  (format "<script type=\"text/javascript\">%s</script>" block-name)
  #+END_SRC

  #+CALL: insert-script()

但是这里抱怨未定义的符号 block-name
我发现了这个问题,它非常相似,但那里提供的答案对我不起作用。在Emacs org-mode中将一个代码块的源代码作为另一个代码块的输入 如何引用块的内容/名称的语法? 编辑: 我正在接近,但还没有到达:
   #+NAME: block-name
   #+BEGIN_SRC javascript :exports code
   alert("Ding!");
   #+END_SRC

   #+BEGIN_SRC emacs-lisp :exports results :var script=block-name
   (print (format "<script type=\"text/javascript\">%s</script>" script))
   #+END_SRC

   #+RESULTS:

这里有两个问题。首先,script变量的值为nil;其次,脚本标签被转义了(尖括号被替换为&lt;&gt;)。我可以将脚本标签放在评估之外来避免这种特定情况的替换,但我无法作为一般规则来防止这种情况(如果脚本中存在小于或大于符号,则它们将被替换)。 编辑1: 就快完成了!
建议org-babel-get-src-block-info将代码块的内容存储到本地,如果它已命名为一个变量<name>-text,那么我以后就可以获取它了。
(defadvice org-babel-get-src-block-info (after org-babel-store-info)
  (let* ((info-copy ad-return-value)
         (block-name (nth 4 info-copy))
         (block-text (nth 1 info-copy)))
    (when block-name
      (set (make-local-variable
            (intern (format "%s-text" block-name))) block-text))
    info-copy))
(ad-activate 'org-babel-get-src-block-info)

使用示例:

   #+NAME: block-name
   #+BEGIN_SRC javascript :exports code
   alert("Ding!");
   #+END_SRC

   #+NAME: insert-script
   #+BEGIN_SRC emacs-lisp :exports results :results html
     (print (format "<script type=\"text/javascript\">%s</script>"
                    block-name-text))
   #+END_SRC

   #+RESULTS:

转义是通过 :results html 选项处理的 - 这会导致 Org 直接插入 HTML。


  #+NAME: math
  #+BEGIN_SRC js :exports none :noweb yes
    // Logarithm of base two:
    var y = Math.log(x) / Math.log(2);
  #+END_SRC

  #+BEGIN_SRC emacs-lisp :tagnle example :exports results :noweb yes :results html
    (print (format "<script>%s</script>" "<<math>>"))
  #+END_SRC

  #+RESULTS:

以下是未能成功的最简示例。

但这个示例将会被正常执行并产生“期望”的结果:

  #+NAME: math
  #+BEGIN_SRC js :exports none :noweb yes
    // Logarithm of base two:
    var y = Math.log(x) / Math.log(2);
  #+END_SRC

  #+BEGIN_SRC emacs-lisp :tagnle example :exports both :noweb yes :results html
    ; <<math>>
    (print (format "<script>%s</script>" "your script could be here"))
  #+END_SRC

通过<script>your script could be here</script> 的输出以及eLisp代码块中的JavaScript代码注释。
2个回答

3

在您的“插入脚本”中使用变量,例如

:var data=block-name

如果你想要在“insert-script”中得到块名为“results”的结果,可以使用以下方法:

如果你想要得到内容,可以使用NoWeb标记,加上“:noweb yes”,即使用以下代码:

<<block-name>>

在您的“插入脚本”中。

2
等一下。NoWeb 还有另一种形式:<<block-name()>>,其中你可以插入 block-name 评估的结果(!)。你甚至可以传递参数... - fniessen
我没有通过电子邮件收到你的评论,这正常吗?我只是偶然看到你对我的回答进行了评论... - fniessen

-2
#+BEGIN_HTML
<script>
    (function(){alert("ding !");})();
</script>
#+END_HTML

5
添加一条评论或简短陈述会有所帮助,解释这段代码如何回答问题。 - skrrgwasme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接