summaryrefslogtreecommitdiffstats
path: root/lib/export-man.el
diff options
context:
space:
mode:
Diffstat (limited to 'lib/export-man.el')
-rw-r--r--lib/export-man.el73
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/export-man.el b/lib/export-man.el
new file mode 100644
index 0000000..03ef843
--- /dev/null
+++ b/lib/export-man.el
@@ -0,0 +1,73 @@
+;;; export-man.el -- Export man page and filter result
+
+;;; Commentary:
+;;;
+;;; Exports a man page and filters the result so we can exclude parts of the man
+;;; page based on features enabled in the build system.
+;;;
+;;; The export-man-page function is called from common.mk with --eval
+
+;;; Code:
+
+(require 'ox-man)
+(require 'parse-time)
+
+(defvar feature-exclude-tags
+ '(("LIBBPF_PERF_BUFFER__CONSUME" . "feat_perfbuf"))
+ "Mapping of feature strings to exclude tags for man page export.")
+
+(defvar feature-exclude-regexes
+ '(("LIBBPF_PERF_BUFFER__CONSUME" . "--perf-wakeup"))
+ "Mapping of feature strings to regexes to filter form export man page.")
+
+(defun get-feature-values (enabled-feats exclude-list)
+ "Get feature-tag values for ENABLED-FEATS based on EXCLUDE-LIST."
+ (delq nil (mapcar #'(lambda (f)
+ (unless (member (car f) enabled-feats)
+ (cdr f)))
+ exclude-list)))
+
+(defun replace-regexp-in-buffer (regexp replace)
+ "Replace REGEXP with REPLACE in buffer."
+ (let ((case-fold-search nil))
+ (goto-char 0)
+ (when (re-search-forward regexp nil t)
+ (replace-match replace))))
+
+(defun open-file (filename)
+ "Find file FILENAME but complain if it doesn't exist."
+ (if (file-exists-p filename)
+ (find-file filename)
+ (error "File not found: %s" filename)))
+
+(defun get-file-mod-time (filename)
+ (let* ((file-modtime (file-attribute-modification-time (file-attributes filename)))
+ (git-logtime (ignore-errors (shell-command-to-string
+ (format "git log -1 --pretty='format:%%cI' -- %s" filename))))
+ (git-modtime (ignore-errors (parse-iso8601-time-string git-logtime))))
+ (or git-modtime file-modtime)))
+
+(defun filter-post-export (file feat-list version modtime)
+ "Post-process exported FILE based on features in FEAT-LIST and VERSION."
+ (let ((exclude-regexes (get-feature-values feat-list feature-exclude-regexes))
+ (date (format-time-string "%B %_d, %Y" modtime))
+ (make-backup-files nil))
+ (with-current-buffer (open-file file)
+ (mapc #'(lambda (r) (delete-matching-lines r)) exclude-regexes)
+ (replace-regexp-in-buffer "DATE" date)
+ (replace-regexp-in-buffer "VERSION" version)
+ (replace-regexp-in-buffer "^.SH \"\\([^\"]+\\) - \\([^\"]+\\)\""
+ ".SH \"NAME\"\n\\1 \\\\- \\2\n.SH \"SYNOPSIS\"")
+ (save-buffer))))
+
+(defun export-man-page (outfile infile enabled-features version)
+ "Export man page from INFILE into OUTFILE with ENABLED-FEATURES and VERSION."
+ (let* ((feat-list (split-string enabled-features))
+ (org-export-exclude-tags (get-feature-values feat-list feature-exclude-tags))
+ (modtime (get-file-mod-time infile)))
+ (with-current-buffer (open-file infile)
+ (org-export-to-file 'man outfile)
+ (filter-post-export outfile feat-list version modtime))))
+
+(provide 'export-man)
+;;; export-man.el ends here