Org-mode получает содержимое блока src во время экспорта
Вот что я пытаюсь сделать:
У меня есть фрагмент кода JavaScript, который я хочу отобразить в HTML-коде, созданном из документа org, и хочу, чтобы этот код выполнялся на странице 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
и теги сценария экранируются (угловые скобки заменяются <
а также >
, Я мог бы найти этот конкретный случай замены, поместив теги сценария вне оценки, но я не смогу предотвратить это как общее правило (если в сценарии есть знаки "меньше" или "больше", они будут заменить).
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>
и код JavaScript в комментариях блока кода eLisp.
2 ответа
Используйте переменную в вашем "insert-script", например
:var data=block-name
если вы хотите результаты block-name внутри вашего "insert-script".
Если вы хотите содержимое, используйте обозначение NoWeb с ":noweb yes", то есть используйте:
<<block-name>>
в вашем "insert-script".
#+BEGIN_HTML
<script>
(function(){alert("ding !");})();
</script>
#+END_HTML