以下是我想要做的事情:
我有一段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
;其次,脚本标签被转义了(尖括号被替换为<
和>
)。我可以将脚本标签放在评估之外来避免这种特定情况的替换,但我无法作为一般规则来防止这种情况(如果脚本中存在小于或大于符号,则它们将被替换)。
编辑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代码注释。