Crear enlaces permanentes para secciones en HTML exportadas desde el modo org

8

Por defecto, cuando los documentos del modo org se exportan a HTML, los enlaces de la sección y la subsección se ven como

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

El problema es que el enlace anterior no apuntará a la sección correcta si reorganizo las secciones.

¿Cómo podemos tener enlaces permanentes para cada sección autogenerada que se ve a continuación?

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

Respuestas:

11

Puede obtener este resultado configurando la CUSTOM_IDpropiedad.

Del siguiente archivo:

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

Me sale el siguiente 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>

Por Sub no customlo tanto, está vinculado por #sec-1-1while mientras se Sub customusa #customcomo referencia.


ID de generación automática

Agregar org-ida la lista de org-modulesevaluaciones cargadas o directamente (require 'org-id)permitirá generar ID utilizando org-id-get-create. Lo siguiente insertará ID automáticamente y los usará en la exportación.

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

Esto debería mirar a través de sus titulares existentes en un búfer y actualizar las ID. Solo creará ID si no hay ninguno presente.

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

Nota. Esto no arreglará los enlaces TOC para que apunten a las ID correctas. TOC solo está configurado para usar CUSTOM_IDo sec-#-#para generar enlaces. Sin embargo, puede acceder a las secciones por sus ID (sugeriría cambiar org-id-methoda orgde uuidpara acortar la longitud de la ID si tiene la intención de usarla de esta manera.

CUSTOM_IDsigue siendo probablemente su mejor opción si realmente desea identificaciones legibles para los titulares. my/org-update-idsdebe poder usarse como punto de partida para eso (mapear a través del búfer para cada título, ir al título y luego realizar una acción).

Un punto de partida sería (org-entry-put (point) "CUSTOM_ID" id)para establecer y (org-entry-get (point) "CUSTOM_ID")obtener. Determinar qué usar iddepende de cómo desea que se nombren.

Jonathan Leech-Pepin
fuente
¡Gracias! Prepararé algo para generar automáticamente los :CUSTOM_ID:valores y publicar aquí. Este es mi plan: sería engorroso escribir el :PROPERTIES:bloque para cada subsección. En cambio, un código elisp puede generarlos para mí y generar automáticamente el :CUSTOM_ID:si no existe; todo org-export-before-processing-hookpara que el archivo de origen no se modifique. Podría llevarme algún tiempo implementar esto, pero lo publicaré aquí cuando termine.
Kaushal Modi
He proporcionado un método para crear :ID:propiedades para cada uno (y para actualizar su búfer para incluirlos donde faltan). Si crea una función para asignar ID dinámicamente a los titulares (¿según el nombre del título?), Puede sustituirla org-id-get-createy usará create the :Custom_ID:en su lugar.
Jonathan Leech-Pepin
my/org-update-idssolo afecta a un solo elemento. ¿Cómo actualizar todos los correos IDelectrónicos a la vez?
akater
1
Actualizado para solucionar ese problema. Lo probé nuevamente y me di cuenta de que solo estaba actualizando ciertos titulares pero no otros. Invertir la lista de los titulares de inicio lo corrige (la lista original goto-charfalla cuando se insertan las entradas)
Jonathan Leech-Pepin