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

Emacs 组织模式在导出期间获取src块的内容,emacs,org-mode,org-babel,advising-functions,defadvice,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=\"te

以下是我想做的:

我有一段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()
这有两个问题。
script
变量的值是
nil
,脚本标记被转义(尖括号被
替换)。我可以通过将脚本标记放在评估之外来发现这种特殊的替换情况,但作为一般规则,我无法阻止这种情况发生(如果脚本中有小于或大于的符号,它们将被替换)

EDIT1:

快到了

建议
org babel get src block info
在本地存储代码块的内容,如果它被命名为变量
-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:
下面是失败的最小示例

但这将起作用并产生“预期”结果:

#+名称:数学
#+开始\u SRC js:exports无:无B是
//以二为底的对数:
var y=Math.log(x)/Math.log(2);
#+结束(SRC)
#+BEGIN_SRC emacs lisp:tagnle示例:导出两者:noweb yes:results html
; 
(打印(您的脚本可能位于此处的格式“%s”))
#+结束(SRC)
通过
的输出,您的脚本可以在这里
,JavaScript代码可以在eLisp代码块的注释中。

例如,在“插入脚本”中使用一个变量

:var data=block-name
如果希望块名的结果包含在“插入脚本”中

如果需要内容,请使用NoWeb符号,并带有“:NoWeb yes”,即使用:

<<block-name>>

在“插入脚本”中

#+开始HTML
(函数(){alert(“ding!”;})();
#+结束(HTML)

等等。NoWeb还有另一个表单:插入块名评估结果(!)。你甚至可以传递参数……我没有通过电子邮件收到你的评论是正常的吗?我只是看到了(偶然的)您对我的答案发表了评论…添加一条评论或简短的语句来解释此代码如何回答问题会很有帮助。
  #+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
:var data=block-name
<<block-name>>
#+BEGIN_HTML
<script>
    (function(){alert("ding !");})();
</script>
#+END_HTML