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ã đó.
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ã đó.
Câu trả lời:
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 :exports
tù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á và :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 html
hoặc :results output html
Org sẽ gói kết quả trong một #+BEGIN_HTML ... #+END_HTML
khối.
Đây là một ví dụ tối thiểu ( #+OPTIONS
khô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.
#+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 html
khố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-mode
bật.
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:html
có liên quan nhiều hơn thế).
: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.)