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 и теги сценария экранируются (угловые скобки заменяются &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> и код 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
Другие вопросы по тегам