Org-babel có thể thay thế mã bằng đầu ra mã khi xuất html không?


8

Tôi đang sử dụng chế độ org để tạo các trang web ghi chú của mình. Tôi có thể nhúng mã để tạo HTML bổ sung không? org-babel sẽ tạo ra kết quả nhưng dường như hiển thị kết quả bên cạnh mã. Tôi muốn mã để tạo html sẽ thay thế chính mã đó.


1
Sử dụng :exports results; xem Xuất khối mã . (Hãy cho tôi biết nếu điều này có hiệu quả với bạn và nếu tôi nên chuyển đổi câu trả lời này thành câu trả lời.)
Constantine

Điều này có hoạt động với HTML không? Tôi nghĩ rằng kết quả được đặt trong thẻ <pre>.
h4labs

Câu trả lời:


6

Như tôi đã đề cập trong một nhận xét, phần Xuất khối mã mô tả các giá trị cho phép của :exportstùy chọn: code(nội dung của khối), results(kết quả đánh giá của nó), both(mã và kết quả) và none(không có gì được xuất).

Theo mặc định, Org cố gắng diễn giải các kết quả đánh giá một khối mã nguồn (và biến nó thành một bảng chẳng hạn). Nếu việc giải thích như vậy thất bại, kết quả đánh giá được định dạng dưới dạng văn bản đơn cách và trông như thể được bao bọc <pre> ... </pre>khi xuất sang HTML.

May mắn thay, chúng ta có thể yêu cầu Org đưa kết quả đánh giá vào một loại khối đặc biệt bằng cách sử dụng :results(xem Kết quả đánh giá:results). Nếu bạn muốn có thể sử dụng khối mã nguồn để tạo một phần của trang HTML, hãy sử dụng :results value htmlhoặc :results output htmlOrg sẽ gói kết quả trong một #+BEGIN_HTML ... #+END_HTMLkhối.

Đây là một ví dụ tối thiểu ( #+OPTIONSkhông liên quan, tôi đã thêm chúng để dễ kiểm tra mã HTML đã xuất bằng cách sử dụng 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.

làm thế nào để chỉ thay thế khối mã bằng kết quả mà không có bất kỳ sự bao bọc nào như # + started # + end ... Tôi đang cố gắng chèn một danh sách các số liệu bằng cách sử dụng tập lệnh 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

Điều này sẽ tạo trang HTML (khi xuất sang HTML) bằng một nút.

Để tránh nhầm lẫn: khối đầu tiên sẽ không được đánh giá trong quá trình xuất. Bạn sẽ cần phải đánh giá nó bằng cách di chuyển điểm đến nó và nhấn C-c C-c.

Hơn nữa, bạn sẽ cần phải gọi

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

Hoặc tương tự trước khi mã này được thực thi, để Babel sẽ nhận ra htmlkhối là có thể thực thi được.

Nhưng thực sự, ví dụ này chủ yếu nhằm chỉ ra cách bạn có thể tiến hành thêm "ngôn ngữ" của riêng mình nhằm vào một phụ trợ cụ thể. Bạn có thể dễ dàng thực hiện nó mà không cần thêm bất kỳ ngôn ngữ mới nào, và, có lẽ, ít phức tạp hơn bằng cách làm một cái gì đó như thế này:

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

Ưu điểm của phương pháp đầu tiên của tôi là một khi chỉnh sửa C-c ', bạn sẽ được html-modebật.


Nó cũng sẽ định nghĩa lại org-babel-exec: html cho phần còn lại của phiên emacs đó.
Malabarba

@Malabarba Tôi không biết nó có một cái (phải không?).
wvxvw

Tôi không biết, tôi chỉ cho rằng nó đã làm. Mục đích của khối mã đầu tiên là gì? Nó không định nghĩa một hàm thay đổi cách khối mã thứ hai được xử lý sao?
Malabarba

@Malabarba Yup, nhưng theo hiểu biết tốt nhất của tôi thì không có ob-html.el. Vì vậy, để xuất một khối HTML, người ta sẽ phải xác định một hàm như vậy (tôi làm điều này cho các đánh dấu khác mà tôi sử dụng, đặc biệt là cho YAML). Điều này khác với #+begin_html ... #+end_htmlở chỗ tôi cũng có thể sử dụng nó như một công cụ khuôn mẫu nguyên thủy thông qua việc chuyển các biến cho các khối (thực tế của tôi org-babel-execute:htmlcó liên quan nhiều hơn thế).
wvxvw

Tôi hiểu rồi. Nó có ý nghĩa bây giờ.
Malabarba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.