Tạo permalinks cho các phần trong HTML được xuất từ ​​chế độ org


8

Theo mặc định khi các tài liệu chế độ tổ chức được xuất sang HTML, các liên kết phần và phần phụ trông giống như

file:///path/to/export/location/doc.html#sec-1-1

Vấn đề là liên kết trên sẽ không trỏ đến phần chính xác nếu tôi sắp xếp lại các phần.

Làm thế nào chúng ta có thể có permalinks cho mỗi phần được tạo tự động trông như dưới đây?

file:///path/to/export/location/doc.html#introduction

Câu trả lời:


11

Bạn có thể nhận được kết quả này bằng cách đặt thuộc CUSTOM_IDtính.

Từ tập tin sau:

* Test
:PROPERTIES:
:CREATED:  [2014-10-02 Thu 11:48]
:END:
** Sub no custom
:PROPERTIES:
:CREATED:  [2014-10-02 Thu 11:49]
:END:
** Sub custom
:PROPERTIES:
:CREATED:  [2014-10-02 Thu 11:49]
:CUSTOM_ID: Custom
:END:

Tôi nhận được Xuất ( C-c C-e h H) sau:

<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1. Test</a>
<ul>
<li><a href="#sec-1-1">1.1. Sub no custom</a></li>
<li><a href="#Custom">1.2. Sub custom</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-sec-1" class="outline-2">
<h2 id="sec-1"><span class="section-number-2">1</span> Test</h2>
<div class="outline-text-2" id="text-1">
</div>
<div id="outline-container-sec-1-1" class="outline-3">
<h3 id="sec-1-1"><span class="section-number-3">1.1</span> Sub no custom</h3>
<div class="outline-text-3" id="text-1-1">
</div>
</div>
<div id="outline-container-Custom" class="outline-3">
<h3 id="Custom"><a id="sec-1-2"></a><span class="section-number-3">1.2</span> Sub custom</h3>

Vì vậy, Sub no customđược liên kết đến #sec-1-1trong khi Sub customsử dụng #customnhư là tài liệu tham khảo.


ID tự động tạo

Thêm org-idvào danh sách được tải org-moduleshoặc đánh giá trực tiếp (require 'org-id)sẽ cho phép tạo ID bằng cách sử dụng org-id-get-create. Sau đây sẽ tự động chèn ID và sử dụng chúng khi xuất.

;; Use custom ID if present, otherwise create a new one when trying to
;; resolve links
(setq org-id-link-to-org-use-id
      'create-if-interactive-and-no-custom-id)

;; Based on org-expiry-insinuate
(add-hook 'org-insert-heading-hook 'org-id-get-create)
(add-hook 'org-after-todo-state-change-hook 'org-id-get-create)
(add-hook 'org-after-tags-change-hook 'org-id-get-create)

Điều này sẽ xem qua các tiêu đề hiện có của bạn trong bộ đệm và cập nhật ID. Nó sẽ chỉ tạo ID nếu không có.

(defun my/org-update-ids ()
  (interactive)
  (let* ((tree (org-element-parse-buffer 'headline))
         (map (reverse
               (org-element-map tree 'headline
                 (lambda (hl)
                   (org-element-property :begin hl))))))
    (save-excursion
      (cl-loop for point in map do
               (goto-char point)
               (org-id-get-create)))))

Ghi chú. Điều này sẽ không sửa các liên kết TOC để trỏ đến ID chính xác. TOC chỉ được cấu hình để sử dụng CUSTOM_IDhoặc sec-#-#để tạo liên kết. Tuy nhiên bạn có thể truy cập vào các phần bằng của (Tôi sẽ đề nghị thay đổi ID của họ org-id-methodđể orgtừ uuidđể rút ngắn chiều dài ID nếu bạn có ý định sử dụng nó theo cách này.

CUSTOM_IDcó lẽ vẫn là đặt cược tốt nhất của bạn nếu bạn thực sự muốn ID người dễ đọc cho các tiêu đề. my/org-update-idsnên có thể được sử dụng làm điểm bắt đầu cho điều đó (ánh xạ qua bộ đệm cho từng tiêu đề, đi đến tiêu đề sau đó thực hiện hành động).

Một điểm khởi đầu sẽ là (org-entry-put (point) "CUSTOM_ID" id)để thiết lập và (org-entry-get (point) "CUSTOM_ID")để có được. Việc xác định những gì sẽ sử dụng idlà phụ thuộc vào cách bạn muốn đặt tên chúng.


Cảm ơn! Tôi sẽ nấu một cái gì đó để tự động tạo ra các :CUSTOM_ID:giá trị và đăng ở đây. Đây là kế hoạch của tôi: Sẽ rất khó khăn khi gõ :PROPERTIES:khối cho mỗi phần phụ. Thay vào đó, một mã elisp có thể tạo mã cho tôi và tự động tạo mã :CUSTOM_ID:nếu không tồn tại; tất cả org-export-before-processing-hookđể tập tin org nguồn không bị sửa đổi. Tôi có thể mất một chút thời gian để thực hiện điều này, nhưng sẽ đăng nó ở đây khi hoàn thành.
Kaushal Modi

Tôi đã cung cấp một phương pháp để tạo :ID:các thuộc tính cho từng (và để cập nhật bộ đệm của bạn để bao gồm chúng ở những nơi còn thiếu). Nếu bạn tạo một hàm để gán ID động cho các tiêu đề (dựa trên tên tiêu đề?), Bạn có thể thay thế nó trong org-id-get-createvà nó sẽ sử dụng tạo :Custom_ID:thay thế.
Jonathan Leech-Pepin

my/org-update-idschỉ ảnh hưởng đến một yếu tố duy nhất. Làm thế nào để cập nhật tất cả IDs cùng một lúc?
akater

1
Cập nhật để khắc phục vấn đề đó. Tôi đã thử nghiệm lại và nhận ra rằng nó chỉ cập nhật một số tiêu đề nhất định chứ không phải các tiêu đề khác. Đảo ngược danh sách bắt đầu tiêu đề sửa nó (danh sách ban đầu goto-charkhông thành công khi các mục được chèn)
Jonathan Leech-Pepin
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.