Erstellen von Permalinks für Abschnitte in HTML, die aus dem Organisationsmodus exportiert wurden

8

Wenn Dokumente im Organisationsmodus in HTML exportiert werden, sehen die Links zu Abschnitten und Unterabschnitten standardmäßig so aus

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

Das Problem ist, dass der obige Link nicht auf den richtigen Abschnitt verweist, wenn ich die Abschnitte neu anordne.

Wie können wir Permalinks für jeden automatisch generierten Abschnitt haben, die wie folgt aussehen?

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

Antworten:

11

Sie können dieses Ergebnis erhalten, indem Sie die CUSTOM_IDEigenschaft festlegen.

Aus der folgenden Datei:

* 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:

Ich erhalte folgenden Export ( C-c C-e h H):

<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>

So Sub no customwird durch verbunden , #sec-1-1während Sub customVerwendungen #customals Referenz.


AutoGenerating IDs

Durch Hinzufügen org-idzur Liste der geladenen org-modulesoder direkt ausgewerteten (require 'org-id)IDs können IDs mit generiert werden org-id-get-create. Im Folgenden werden IDs automatisch eingefügt und beim Export verwendet.

;; 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)

Dies sollte Ihre vorhandenen Überschriften in einem Puffer durchsuchen und die IDs aktualisieren. Es werden nur IDs erstellt, wenn keine vorhanden sind.

(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)))))

Hinweis. Dadurch werden keine TOC-Links repariert, die auf die richtigen IDs verweisen. Das Inhaltsverzeichnis ist nur zur Verwendung CUSTOM_IDoder sec-#-#zum Generieren von Links konfiguriert . Sie können jedoch über ihre IDs auf die Abschnitte zugreifen (ich würde empfehlen org-id-method, orgvon uuidzu zu wechseln , um die ID-Länge zu verkürzen, wenn Sie sie auf diese Weise verwenden möchten .

CUSTOM_IDist wahrscheinlich immer noch die beste Wahl, wenn Sie tatsächlich lesbare Ausweise für die Überschriften wünschen. my/org-update-idssollte in der Lage sein, als Ausgangspunkt dafür verwendet zu werden (durch den Puffer für jede Überschrift abbilden, zur Überschrift gehen und dann eine Aktion ausführen).

Ein Ausgangspunkt wäre das (org-entry-put (point) "CUSTOM_ID" id)Setzen und (org-entry-get (point) "CUSTOM_ID")Erhalten. Die Bestimmung der Verwendung idhängt davon ab, wie sie benannt werden sollen.

Jonathan Leech-Pepin
quelle
Vielen Dank! Ich werde etwas erfinden, um die :CUSTOM_ID:Werte automatisch zu generieren und hier zu posten. Dies ist mein Plan: Es wäre umständlich, den :PROPERTIES:Block für jeden Unterabschnitt einzugeben. Stattdessen kann ein Elisp-Code diese für mich generieren und automatisch generieren, :CUSTOM_ID:wenn einer nicht existiert. alles in der, org-export-before-processing-hookdamit die Quell-Organisationsdatei nicht geändert wird. Es könnte einige Zeit dauern, bis ich dies implementiert habe, aber ich werde es hier veröffentlichen, wenn ich fertig bin.
Kaushal Modi
Ich habe eine Methode bereitgestellt, um :ID:Eigenschaften für jede zu erstellen (und Ihren Puffer zu aktualisieren, um sie dort einzuschließen, wo sie fehlen). Wenn Sie eine Funktion zum dynamischen Zuweisen von IDs zu Überschriften erstellen (basierend auf dem Überschriftennamen?), Können Sie diese ersetzen org-id-get-createund :Custom_ID:stattdessen die Option "Erstellen" verwenden.
Jonathan Leech-Pepin
my/org-update-idsbetrifft nur ein einzelnes Element. Wie aktualisiere ich alle IDs auf einmal?
Akater
1
Aktualisiert, um dieses Problem zu beheben. Ich hatte es erneut getestet und festgestellt, dass nur bestimmte Überschriften aktualisiert wurden, andere jedoch nicht. Das Umkehren der Liste der Überschriftenanfänge behebt das Problem (die ursprüngliche Liste schlägt goto-charfehl, wenn Einträge eingefügt werden)
Jonathan Leech-Pepin