¿Puede org-babel reemplazar código con salida de código en la exportación html?

8

Estoy usando el modo org para generar páginas web de mis notas. ¿Puedo incrustar código para generar HTML adicional, etc.? org-babel generará resultados, pero parece mostrar los resultados además del código. Me gustaría que el código creara html que reemplazaría el código en sí.

h4labs
fuente
1
Uso :exports results; ver Exportar bloques de código . (Avíseme si esto funciona para usted y si debo convertir esto en una respuesta.)
Constantine
¿Funcionará esto con HTML? Creo que los resultados se colocan dentro de una etiqueta <pre>.
h4labs

Respuestas:

6

Como mencioné en un comentario, la sección Exportar bloques de código describe los valores permitidos de la :exportsopción: code(contenido del bloque), results(resultados de su evaluación), both(código y resultados) y none(no se exporta nada).

Por defecto, Org intenta interpretar los resultados de evaluar un bloque de código fuente (y convertirlo en una tabla, por ejemplo). Si tal interpretación falla, los resultados de la evaluación se formatean como texto monoespacial y se ven como envueltos <pre> ... </pre>cuando se exportan a HTML.

Afortunadamente, podemos decirle a Org que coloque los resultados de la evaluación en un tipo especial de bloque usando :results(ver Resultados de la evaluación y :results). Si usted quiere ser capaz de utilizar un bloque de código fuente para generar una parte de una página HTML, uso :results value htmlo :results output htmly Org envolverá resultados en un #+BEGIN_HTML ... #+END_HTMLbloque.

Aquí hay un ejemplo mínimo ( #+OPTIONSson irrelevantes, los agregué para que sea más fácil inspeccionar el código HTML exportado usando C-c C-e h H):

#+OPTIONS: html-postamble:nil
#+OPTIONS: html-preamble:nil html-scripts:nil html-style:nil
#+OPTIONS: html5-fancy:nil tex:t

Some text.

#+BEGIN_SRC python :exports results :results value html
  return "<hr> Generated HTML code. <hr>"
#+END_SRC

More text.
Constantina
fuente
cómo reemplazar el bloque de código con el resultado sin ningún ajuste como # + begin # + end ... Estoy tratando de insertar una lista de figuras usando un script de Python.
godblessfq
6
#+begin_src emacs-lisp :exports none
  (defun org-babel-execute:html (body params) body)
#+end_src

#+begin_src html :exports results :results html
  <input type="button" name="clickme" value="Click Me!">
#+end_src

Esto generará una página HTML (al exportar a HTML) con un botón.

Para evitar confusiones: el primer bloque no se evaluará durante la exportación. Debería evaluarlo moviendo el punto hacia él y presionando C-c C-c.

Más aún, deberías llamar

(org-babel-do-load-languages 'org-babel-load-languages '((html . t)))

O similar antes de que se ejecute este código, para que Babel reconozca el htmlbloque como ejecutable.

Pero en realidad, el ejemplo pretendía principalmente mostrar cómo puede proceder para agregar su propio "idioma" dirigido a un backend particular. Podría haberlo hecho fácilmente sin agregar ningún idioma nuevo y, tal vez, con menos complicaciones al hacer algo como esto:

#+begin_src emacs-lisp :exports results :results html
  "<input type=\"button\" name=\"clickme\" value=\"Click Me!\">"
#+end_src

La ventaja de mi primer enfoque es que una vez que edite con C-c ', se html-modeactivará.

wvxvw
fuente
También redefinirá org-babel-execute: html para el resto de esa sesión de emacs.
Malabarba
@Malabarba No sabía que tenía uno (¿verdad?).
wvxvw
No sé, supuse que sí. ¿Cuál es el propósito del primer bloque de código? ¿No define una función que cambia cómo se procesa el segundo bloque de código?
Malabarba
@Malabarba Sí, pero que yo sepa no hay una ob-html.el. Entonces, para exportar un bloque de HTML, uno tendría que definir dicha función (lo hago para otras marcas que utilizo, en particular para YAML). Esto es diferente de #+begin_html ... #+end_htmlque también puedo usar esto como un motor de plantillas primitivo al pasar variables a los bloques (mi real org-babel-execute:htmlestá más involucrado que eso).
wvxvw
Veo. Tiene sentido ahora.
Malabarba