O org-babel pode substituir o código pela saída de código na exportação de html?

8

Estou usando o modo organizacional para gerar páginas da web de minhas anotações. Posso incorporar código para gerar HTML adicional, etc? O org-babel irá gerar resultados, mas parece mostrar os resultados além do código. Gostaria que o código criasse html que substituísse o próprio código.

h4labs
fonte
11
Use :exports results; consulte Exportando blocos de código . (Deixe-me saber se isso funciona para você e se eu deveria converter isso em uma resposta.)
Constantine
Isso funcionará com HTML? Eu acho que os resultados são colocados dentro de uma tag <pre>.
H4labs

Respostas:

6

Como mencionei em um comentário, a seção Exportando blocos de código descreve os valores permitidos da :exportsopção: code(conteúdo do bloco), results(resultados de sua avaliação), both(código e resultados) e none(nada é exportado).

Por padrão, a organização tenta interpretar os resultados da avaliação de um bloco de código-fonte (e transformá-lo em uma tabela, por exemplo). Se essa interpretação falhar, os resultados da avaliação serão formatados como texto monoespaçado e parecerão agrupados <pre> ... </pre>quando exportados para HTML.

Felizmente, podemos dizer à Org para colocar os resultados da avaliação em um tipo especial de bloco usando :results(consulte Resultados da avaliação e :results). Se você quiser usar um bloco de código-fonte para gerar parte de uma página HTML, use :results value htmlor :results output htmle Org agrupará os resultados em um #+BEGIN_HTML ... #+END_HTMLbloco.

Aqui está um exemplo mínimo ( #+OPTIONSsão irrelevantes, eu os adicionei para facilitar a inspeção do 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.
Constantine
fonte
como substituir apenas o bloco de código pelo resultado sem quebra automática como # + begin # + end ... Estou tentando inserir uma lista de figuras usando um script 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

Isso irá gerar a página HTML (após a exportação para HTML) com um botão.

Para evitar confusão: o primeiro bloco não será avaliado durante a exportação. Você precisaria avaliá-lo movendo o ponto para ele e pressionando C-c C-c.

Mais ainda, você precisaria ligar

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

Ou similar antes que esse código seja executado, para que Babel reconheça o htmlbloco como executável.

Mas, na verdade, o exemplo tinha como objetivo principal mostrar como você pode prosseguir sobre a adição de seu próprio "idioma", que visa um back-end específico. Você poderia ter feito isso facilmente sem adicionar novos idiomas e, talvez, com menos complicações, fazendo algo assim:

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

A vantagem da minha primeira abordagem é que, ao editar com C-c ', você fica html-modeativado.

wvxvw
fonte
Ele também redefinirá org-babel-execute: html pelo restante da sessão do emacs.
Malabarba
@ Malabarba Eu não sabia que tinha um (tinha?).
wvxvw
Não sei, apenas presumi que sim. Qual é o objetivo do primeiro bloco de código? Ele não define uma função que altera como o segundo bloco de código é processado?
Malabarba
@ Malabarba Yup, mas, tanto quanto sei, não existe ob-html.el. Portanto, para exportar um bloco de HTML, seria necessário definir essa função (eu faço isso para outras marcações que uso, principalmente para YAML). Isso é diferente #+begin_html ... #+end_html, pois eu também posso usá-lo como um mecanismo de modelo primitivo, passando variáveis ​​para os blocos (meu atual org-babel-execute:htmlestá mais envolvido que isso).
wvxvw
Eu vejo. Faz sentido agora.
Malabarba