> From: Ihor Radchenko <yanta...@posteo.net> > Date: Sat, 13 Apr 2024 14:00:48 +0000 > > Protesilaos Stavrou <i...@protesilaos.com> writes: > >> With regard to the disambiguation scheme, I am playing around with >> various scenaria to see how Org HTML export behaves. Using the >> following: >> ... >> This is test 2 <sup><a id="fnr.1.100" class="footref" href="#fn.1" >> role="doc-backlink">1</a></sup> >> ... >> This is test 3 <sup><a id="fnr.1.100" class="footref" href="#fn.1" >> role="doc-backlink">1</a></sup> >> >> Notice that the 100 in the ID is not incremented further. I guess this >> is something that can be worked on but, again, I think it is separate >> from the issue of using the label for the ID and HREF. >> >> Any thoughts? > > Duplicate IDs are against HTML spec: > https://softwareengineering.stackexchange.com/questions/127178/two-html-elements-with-same-id-attribute-how-bad-is-it-really > > So, this is a bug.
Indeed! We can look into this separately. >>>> Though I should have clarified my intent earlier: the idea is to use the >>>> label as a fixed reference to the footnote, so that the link does not >>>> change between exports. This is the same principle as what we do with >>>> links to headings that have a CUSTOM_ID. >>>> >>>> As such, the anchor text can still be the way it is now as an >>>> automatically generated number sequence (^1, ^2, etc.), but the HTML >>>> "id" and "href" values will be constructed based on the label of the >>>> footnote, NOT its number in the sequence. > > See the attached tentative patch. > [... 144 lines elided] Thank you! I just tried it. I encountered two problems with it, which I am addressing with the two attached patches (feel free to modify as needed). In short: 1. The footnote definitions at the bottom of the file were still using the ordinal HTML id, which did not correspond to the href with the label. 2. If the file had a mixture of labeled and anonymous/unlabeled footnotes, then the export would break as it would be passing a nil value to 'string-to-number'. Please let me know how to proceed. -- Protesilaos Stavrou https://protesilaos.com
>From 0fb81645aafb780116465e13758601ff1183e043 Mon Sep 17 00:00:00 2001 Message-Id: <0fb81645aafb780116465e13758601ff1183e043.1714117826.git.i...@protesilaos.com> From: Protesilaos Stavrou <i...@protesilaos.com> Date: Fri, 26 Apr 2024 10:41:51 +0300 Subject: [PATCH 1/2] Use the label, if present, in footnote definition * lisp/ox-html.el (org-html-footnote-section): Account for a non-nil label value. --- lisp/ox-html.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/ox-html.el b/lisp/ox-html.el index aa0f891..95ecb44 100644 --- a/lisp/ox-html.el +++ b/lisp/ox-html.el @@ -1896,7 +1896,9 @@ (defun org-html-footnote-section (info) (let ((inline? (not (org-element-map def org-element-all-elements #'identity nil t))) (anchor (org-html--anchor - (format "fn.%d" n) + (if label + (format "fn.%s" label) + (format "fn.%d" n)) n (format " class=\"footnum\" href=\"#fnr.%s\" role=\"doc-backlink\"" (or label n)) info)) -- 2.39.2
>From 112c5671e5f55ea1d9e5e9fb6dd647e6a739c9ac Mon Sep 17 00:00:00 2001 Message-Id: <112c5671e5f55ea1d9e5e9fb6dd647e6a739c9ac.1714117826.git.i...@protesilaos.com> In-Reply-To: <0fb81645aafb780116465e13758601ff1183e043.1714117826.git.i...@protesilaos.com> References: <0fb81645aafb780116465e13758601ff1183e043.1714117826.git.i...@protesilaos.com> From: Protesilaos Stavrou <i...@protesilaos.com> Date: Fri, 26 Apr 2024 10:49:26 +0300 Subject: [PATCH 2/2] Guard against nil label value for footnotes * lisp/ox-html.el (org-html-footnote-section) (org-html-footnote-reference): Check if label is a string before passing it to 'string-to-number'. This fixes the case where we are exporting some footnotes with a label and some without a label. --- lisp/ox-html.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lisp/ox-html.el b/lisp/ox-html.el index 95ecb44..0237e61 100644 --- a/lisp/ox-html.el +++ b/lisp/ox-html.el @@ -1886,7 +1886,8 @@ (defun org-html-footnote-section (info) ;; - the footnotes are re-numbered by ;; `org-export-get-footnote-number'. If the label is not ;; a number, keep it. - (when (equal label (number-to-string (string-to-number label))) + (when (and (stringp label) + (equal label (number-to-string (string-to-number label)))) (setq label nil)) ;; `org-export-collect-footnote-definitions' can return ;; two kinds of footnote definitions: inline and blocks. @@ -2754,8 +2755,10 @@ (defun org-html-footnote-reference (footnote-reference _contents info) ;; the footnotes are re-numbered by ;; `org-export-get-footnote-number'. If the label is not a ;; number, keep it. - (label (if (equal label (number-to-string (string-to-number label))) - nil label)) + (label (if (and (stringp label) + (equal label (number-to-string (string-to-number label)))) + nil + label)) (id (format "fnr.%s%s" (or label n) (if (org-export-footnote-first-reference-p -- 2.39.2