From bcc84ac7feccf285811d3bc3254fa10062c9334c Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Fri, 16 Sep 2022 19:33:02 +0200 Subject: [PATCH] Add version headlines to HTML NEWS export This allows linking to, e.g. "NEWS.28.html#28.1" to go directly to those release notes. * admin/admin.el (admin--org-export-headers-format) (make-news-html-file): Add XX.Y version headlines with an HTML anchor. --- admin/admin.el | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/admin/admin.el b/admin/admin.el index 60b043a3516..14f0f80188b 100644 --- a/admin/admin.el +++ b/admin/admin.el @@ -773,7 +773,7 @@ Optional argument TYPE is type of output (nil means all)." (defvar admin--org-export-headers-format "\ #+title: GNU Emacs %s NEWS -- history of user-visible changes #+author: -#+options: author:nil creator:nil toc:1 num:2 *:nil \\n:t ^:nil tex:nil +#+options: author:nil creator:nil toc:2 num:3 *:nil \\n:t ^:nil tex:nil #+language: en #+HTML_LINK_HOME: /software/emacs #+HTML_LINK_UP: /software/emacs @@ -851,12 +851,13 @@ $Date: %s $ (unless (file-exists-p (expand-file-name "src/emacs.c" root)) (user-error "%s doesn't seem to be the root of an Emacs source tree" root)) (admin--require-external-package 'htmlize) - (let* ((orig (expand-file-name "etc/NEWS" root)) - (new (expand-file-name (format "etc/NEWS.%s.org" version) root)) - (html-file (format "%s.html" (file-name-base new))) + (let* ((newsfile (expand-file-name "etc/NEWS" root)) + (orgfile (expand-file-name (format "etc/NEWS.%s.org" version) root)) + (html (format "%s.html" (file-name-base orgfile))) (copyright-years (format-time-string "%Y"))) - (copy-file orig new t) - (find-file new) + (delete-file orgfile) + (copy-file newsfile orgfile t) + (find-file orgfile) ;; Find the copyright range. (goto-char (point-min)) @@ -931,6 +932,34 @@ $Date: %s $ (org-mode) (save-buffer) + ;; Make everything one level lower. + (goto-char (point-min)) + (while (re-search-forward (rx bol (group (+ "*")) " ") nil t) + (replace-match "*\\1" nil nil nil 1)) + + ;; Insert anchors for different versions. + (goto-char (point-min)) + (let (last-major last-minor) + (while (re-search-forward (rx bol "** " (+ (not "\n")) "in Emacs " + (group digit digit) "." (group digit) + eol) + nil t) + (unless (and (equal (match-string 1) last-major) + (equal (match-string 2) last-minor)) + (setq last-major (match-string 1)) + (setq last-minor (match-string 2)) + (forward-line -1) + (insert (format + (concat + ;; Add anchor to allow linking to + ;; e.g. "NEWS.28.html#28.1". + "#+HTML:

 

\n" + "* Changes in Emacs %s.%s\n") + last-major last-minor + last-major last-minor))))) + + (save-buffer) + ;; Make the HTML export. (let* ((org-html-postamble (format admin--org-html-postamble @@ -942,12 +971,12 @@ $Date: %s $ (org-html-export-as-html)) ;; Write HTML to file. - (let ((new (expand-file-name html-file (expand-file-name "etc" root)))) - (write-file new) + (let ((html (expand-file-name html (expand-file-name "etc" root)))) + (write-file html) (unless noninteractive - (find-file new) + (find-file html) (html-mode)) - (message "Successfully exported HTML to %s" new)))) + (message "Successfully exported HTML to %s" html)))) ;; Stuff to check new `defcustom's got :version tags. -- 2.39.2