これが私がやろうとしていることです:
組織ドキュメントから生成された HTML に表示し、そのコードを HTML ページで実行したい JavaScript コードのスニペットがあります。単純な例として、次のようにします。
#+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()
しかし、これは undefined symbol について文句を言います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:
これには 2 つの問題があります。script
変数の値はnil
で、スクリプト タグはエスケープされています (山かっこは and に置き換えられてい<
ます>
。スクリプト タグを評価の外に置くことで、この特定の置換のケースを見つけることができましたが、一般的にこれを防ぐことはできません。ルール (スクリプト内に「より少ない」または「より大きな」記号がある場合、それらは置き換えられます)。
EDIT1:
もうすぐそこ!
org-babel-get-src-block-info
variable に名前が付けられている場合は、コードのブロックのコンテンツをローカルに保存するようにアドバイスしました<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 コード。