组织模式在导出期间获取src块的内容

时间:2013-06-18 21:40:26

标签: emacs org-mode org-babel advising-functions defadvice

这是我正在尝试做的事情:

我有一段JavaScript代码,我希望在组织文档生成的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

我发现这个问题非常相似,但那里给出的答案对我不起作用。 Make the source code from one code block the input to another code block in 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;替换。我可以通过放置找到这种特殊的替换案例评估之外的脚本标签,但我不能阻止这作为一般规则(如果脚本中有一个小于或更大的标志,它们将被替换)。

EDIT1:

几乎就在那里!

建议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 个答案:

答案 0 :(得分:2)

在“insert-script”中使用变量,例如

:var data=block-name

如果你想在你的“插入脚本”中使用块名称的结果

如果你想要内容,请使用NoWeb表示法,使用“:noweb yes”,即使用:

<<block-name>>

在“插入脚本”中。

答案 1 :(得分:0)

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