Criando links permanentes para seções em HTML exportadas do modo organizacional

8

Por padrão, quando os documentos no modo organizacional são exportados para HTML, os links de seção e subseção se parecem com

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

O problema é que o link acima não apontará para a seção correta se eu reorganizar as seções.

Como podemos ter links permanentes para cada seção gerada automaticamente com a aparência abaixo?

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

Respostas:

11

Você pode obter esse resultado definindo a CUSTOM_IDpropriedade

Do seguinte arquivo:

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

Eu recebo o seguinte 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>

Então, Sub no customestá vinculado a #sec-1-1enquanto Sub customusa #customcomo referência.


IDs de geração automática

A adição org-idà lista de avaliações carregadas org-modulesou diretamente (require 'org-id)permitirá a geração de IDs usando org-id-get-create. A seguir, insira os IDs automaticamente e os use na exportação.

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

Isso deve examinar os títulos existentes em um buffer e atualizar os IDs. Ele só criará IDs se nenhum estiver 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. Isso não corrigirá os links do sumário para apontar para os IDs corretos. O sumário está configurado apenas para usar CUSTOM_IDou sec-#-#gerar links. No entanto, você pode acessar as seções pelos respectivos IDs (eu sugeriria alterar org-id-methodpara orgde uuidpara diminuir o tamanho do ID, se você pretender usá-lo dessa maneira.

CUSTOM_IDprovavelmente ainda é sua melhor aposta se você realmente deseja IDs legíveis por humanos para as manchetes. my/org-update-idsdeve poder ser usado como ponto de partida para isso (mapeie o buffer de cada título, vá para o título e execute uma ação).

Um ponto de partida seria (org-entry-put (point) "CUSTOM_ID" id)para definir e (org-entry-get (point) "CUSTOM_ID")obter. A determinação do que usar iddepende de como você deseja que eles sejam nomeados.

Jonathan Leech-Pepin
fonte
Obrigado! Vou preparar algo para gerar automaticamente os :CUSTOM_ID:valores e postar aqui. Este é o meu plano: seria complicado digitar o :PROPERTIES:bloco para cada subseção. Em vez disso, um código elisp pode gerar esses códigos para mim e gerar automaticamente o :CUSTOM_ID:se não existir; tudo no org-export-before-processing-hookmodo que o arquivo organizacional de origem não seja modificado. Pode levar algum tempo para implementar isso, mas publicarei aqui quando terminar.
precisa
Forneci um método para criar :ID:propriedades para cada um (e atualizar seu buffer para incluí-las quando estiverem faltando). Se você criar uma função para atribuir IDs dinamicamente aos títulos (com base no nome do título?), Poderá substituí-lo org-id-get-createe, em vez disso, usará o :Custom_ID:comando create .
Jonathan Leech-Pepin
my/org-update-idsafeta apenas um único elemento. Como atualizar todos os IDs ao mesmo tempo?
akater
11
Atualizado para corrigir esse problema. Eu o testei novamente e percebi que estava atualizando apenas algumas manchetes, mas não outras. Invertendo a lista de manchete começos correções que ele (a lista original marcas goto-charfalhar como são inseridas entradas)
Jonathan Sanguessuga-Pepin