Kann org-babel Code durch HTML-Ausgabe beim HTML-Export ersetzen?

8

Ich verwende den Organisationsmodus, um Webseiten meiner Notizen zu generieren. Kann ich Code einbetten, um zusätzliches HTML usw. zu generieren? org-babel generiert Ergebnisse, scheint jedoch die Ergebnisse zusätzlich zum Code anzuzeigen. Ich möchte, dass der Code HTML erstellt, das den Code selbst ersetzt.

h4labs
quelle
1
Verwenden Sie :exports results; Siehe Exportieren von Codeblöcken . (Lassen Sie mich wissen, ob dies für Sie funktioniert und ob ich dies in eine Antwort umwandeln sollte.)
Constantine
Funktioniert das mit HTML? Ich denke, die Ergebnisse werden in einem <pre> -Tag platziert.
h4labs

Antworten:

6

Wie ich in einem Kommentar erwähnt habe, beschreibt der Abschnitt Exportieren von Codeblöcken zulässige Werte der :exportsOption: code(Inhalt des Blocks), results(Ergebnisse seiner Auswertung), both(Code und Ergebnisse) und none(nichts wird exportiert).

Standardmäßig versucht Org, die Ergebnisse der Auswertung eines Quellcodeblocks zu interpretieren (und ihn beispielsweise in eine Tabelle umzuwandeln). Wenn eine solche Interpretation fehlschlägt, werden die Bewertungsergebnisse als Monospace-Text formatiert und sehen <pre> ... </pre>beim Export in HTML so aus, als wären sie eingepackt .

Glücklicherweise können wir Org anweisen, die Bewertungsergebnisse in eine spezielle Art von Block zu setzen :results(siehe Ergebnisse der Bewertung und :results). Wenn Sie einen Quellcodeblock zum Generieren eines Teils einer HTML-Seite verwenden möchten, verwenden Sie :results value htmloder :results output htmlund Org, um die Ergebnisse in einen #+BEGIN_HTML ... #+END_HTMLBlock zu packen.

Hier ist ein minimales Beispiel ( #+OPTIONSsind irrelevant, ich habe sie hinzugefügt, um die Überprüfung des exportierten HTML-Codes mithilfe zu vereinfachen 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.
Konstantin
quelle
Wie man einfach den Codeblock durch das Ergebnis ersetzt, ohne einen Zeilenumbruch wie # + begin # + end ... Ich versuche, eine Liste von Zahlen mit einem Python-Skript einzufügen.
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

Dadurch wird eine HTML-Seite (beim Export nach HTML) mit einer Schaltfläche generiert.

Um Verwirrung zu vermeiden: Der erste Block wird beim Export nicht ausgewertet. Sie müssten es auswerten, indem Sie den Punkt darauf verschieben und drücken C-c C-c.

Mehr noch, Sie müssten anrufen

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

Oder ähnliches, bevor dieser Code ausgeführt wird, damit Babel den htmlBlock als ausführbar erkennt .

Das Beispiel sollte jedoch hauptsächlich zeigen, wie Sie Ihre eigene "Sprache" hinzufügen können, die auf ein bestimmtes Backend abzielt. Sie hätten es leicht tun können, ohne neue Sprachen hinzuzufügen, und vielleicht mit weniger Komplikationen, wenn Sie so etwas tun würden:

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

Der Vorteil meines ersten Ansatzes ist, dass Sie nach dem Bearbeiten mit C-c 'aktiviert werden html-mode.

wvxvw
quelle
Außerdem wird org-babel-execute: html für den Rest dieser Emacs-Sitzung neu definiert.
Malabarba
@ Malabarba Ich wusste nicht, dass es eine hat (oder?).
wvxvw
Ich weiß nicht, ich habe nur angenommen, dass es so ist. Was ist der Zweck des ersten Codeblocks? Definiert es nicht eine Funktion, die ändert, wie der zweite Codeblock verarbeitet wird?
Malabarba
@ Malabarba Yup, aber nach meinem besten Wissen gibt es keine ob-html.el. Um einen HTML-Block zu exportieren, müsste man eine solche Funktion definieren (ich mache dies für andere Markups, die ich verwende, insbesondere für YAML). Dies unterscheidet sich #+begin_html ... #+end_htmldarin, dass ich dies auch als primitive Template-Engine verwenden kann, indem ich Variablen an die Blöcke übergebe (meine tatsächliche org-babel-execute:htmlist mehr involviert als das).
wvxvw
Aha. Es macht jetzt Sinn.
Malabarba