diff options
Diffstat (limited to 'lib/export-man.el')
-rw-r--r-- | lib/export-man.el | 73 |
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 |