pkg update and first config fix

org-brain not working, add org-roam
This commit is contained in:
2022-12-19 23:02:34 +01:00
parent 02b3e07185
commit 82f05baffe
885 changed files with 356098 additions and 36993 deletions

View File

@@ -1,8 +1,8 @@
;;; ox-texinfo.el --- Texinfo Back-End for Org Export Engine -*- lexical-binding: t; -*-
;; Copyright (C) 2012-2021 Free Software Foundation, Inc.
;; Copyright (C) 2012-2022 Free Software Foundation, Inc.
;; Author: Jonathan Leech-Pepin <jonathan.leechpepin at gmail dot com>
;; Maintainer: Nicolas Goaziou <n.goaziou at gmail dot com>
;; Maintainer: Nicolas Goaziou <mail@nicolasgoaziou.fr>
;; Keywords: outlines, hypermedia, calendar, wp
;; This file is part of GNU Emacs.
@@ -26,11 +26,14 @@
;;; Code:
(require 'org-macs)
(org-assert-version)
(require 'cl-lib)
(require 'ox)
(defvar orgtbl-exp-regexp)
(defvar org-texinfo-supports-math--cache)
;;; Define Back-End
@@ -55,6 +58,8 @@
(italic . org-texinfo-italic)
(item . org-texinfo-item)
(keyword . org-texinfo-keyword)
(latex-environment . org-texinfo-latex-environment)
(latex-fragment . org-texinfo-latex-fragment)
(line-break . org-texinfo-line-break)
(link . org-texinfo-link)
(node-property . org-texinfo-node-property)
@@ -83,7 +88,8 @@
(verse-block . org-texinfo-verse-block))
:filters-alist
'((:filter-headline . org-texinfo--filter-section-blank-lines)
(:filter-parse-tree . org-texinfo--normalize-headlines)
(:filter-parse-tree . (org-texinfo--normalize-headlines
org-texinfo--separate-definitions))
(:filter-section . org-texinfo--filter-section-blank-lines)
(:filter-final-output . org-texinfo--untabify))
:menu-entry
@@ -118,8 +124,10 @@
(:texinfo-table-default-markup nil nil org-texinfo-table-default-markup)
(:texinfo-text-markup-alist nil nil org-texinfo-text-markup-alist)
(:texinfo-format-drawer-function nil nil org-texinfo-format-drawer-function)
(:texinfo-format-inlinetask-function nil nil org-texinfo-format-inlinetask-function)))
(:texinfo-format-inlinetask-function nil nil org-texinfo-format-inlinetask-function)
(:texinfo-compact-itemx nil "compact-itemx" org-texinfo-compact-itemx)
;; Redefine regular options.
(:with-latex nil "tex" org-texinfo-with-latex)))
;;; User Configurable Variables
@@ -354,6 +362,37 @@ The function should return the string to be exported."
:group 'org-export-texinfo
:type 'function)
;;;; LaTeX
(defcustom org-texinfo-with-latex (and org-export-with-latex 'detect)
"When non-nil, the Texinfo exporter attempts to process LaTeX math.
When set to t, the exporter will process LaTeX environments and
fragments as Texinfo \"@displaymath\" and \"@math\" commands
respectively. Alternatively, when set to `detect', the exporter
does so only if the installed version of Texinfo supports the
necessary commands."
:group 'org-export-texinfo
:package-version '(Org . "9.6")
:type '(choice
(const :tag "Detect" detect)
(const :tag "Yes" t)
(const :tag "No" nil)))
;;;; Itemx
(defcustom org-texinfo-compact-itemx nil
"Non-nil means certain items in description list become `@itemx'.
If this is non-nil and an item in a description list has no
body but is followed by another item, then the second item is
transcoded to `@itemx'. See info node `(org)Plain lists in
Texinfo export' for how to enable this for individual lists."
:package-version '(Org . "9.6")
:group 'org-export-texinfo
:type 'boolean
:safe t)
;;;; Compilation
(defcustom org-texinfo-info-process '("makeinfo --no-split %f")
@@ -407,6 +446,30 @@ If two strings share the same prefix (e.g. \"ISO-8859-1\" and
(regexp-opt '("eps" "pdf" "png" "jpg" "jpeg" "gif" "svg"))))
"Rules characterizing image files that can be inlined.")
(defvar org-texinfo--quoted-keys-regexp
(regexp-opt '("BS" "TAB" "RET" "ESC" "SPC" "DEL"
"LFD" "DELETE" "SHIFT" "Ctrl" "Meta" "Alt"
"Cmd" "Super" "UP" "LEFT" "RIGHT" "DOWN")
'words)
"Regexp matching keys that have to be quoted using @key{KEY}.")
(defconst org-texinfo--definition-command-alist
'(("deffn Command" . "Command")
("defun" . "Function")
("defmac" . "Macro")
("defspec" . "Special Form")
("defvar" . "Variable")
("defopt" . "User Option")
(nil . "Key"))
"Alist mapping Texinfo definition commands to output in Info files.")
(defconst org-texinfo--definition-command-regexp
(format "\\`%s: \\(.+\\)"
(regexp-opt
(delq nil (mapcar #'cdr org-texinfo--definition-command-alist))
t))
"Regexp used to match definition commands in descriptive lists.")
;;; Internal Functions
@@ -570,6 +633,130 @@ INFO is a plist holding export options."
(`(,_ ,_ . ,sections) sections)
(_ (user-error "Unknown Texinfo class: %S" class)))))
(defun org-texinfo--separate-definitions (tree _backend info)
"Split up descriptive lists in TREE that contain Texinfo definition commands.
INFO is a plist used as a communication channel.
Return new tree."
(org-element-map tree 'plain-list
(lambda (plain-list)
(when (eq (org-element-property :type plain-list) 'descriptive)
(let ((contents (org-element-contents plain-list))
(items nil))
(dolist (item contents)
(pcase-let ((`(,cmd . ,args) (org-texinfo--match-definition item)))
(cond
(cmd
(when items
(org-texinfo--split-plain-list plain-list (nreverse items))
(setq items nil))
(org-texinfo--split-definition plain-list item cmd args))
(t
(when args
(org-texinfo--massage-key-item plain-list item args info))
(push item items)))))
(unless (org-element-contents plain-list)
(org-element-extract-element plain-list)))))
info)
tree)
(defun org-texinfo--match-definition (item)
"Return a cons-cell if ITEM specifies a Texinfo definition command.
The car is the command and the cdr is its arguments."
(let ((tag (car-safe (org-element-property :tag item))))
(and tag
(stringp tag)
(string-match org-texinfo--definition-command-regexp tag)
(pcase-let*
((cmd (car (rassoc (match-string-no-properties 1 tag)
org-texinfo--definition-command-alist)))
(`(,cmd ,category)
(and cmd (save-match-data (split-string cmd " "))))
(args (match-string-no-properties 2 tag)))
(cons cmd (if category (concat category " " args) args))))))
(defun org-texinfo--split-definition (plain-list item cmd args)
"Insert a definition command before list PLAIN-LIST.
Replace list item ITEM with a special-block that inherits the
contents of ITEM and whose type and Texinfo attributes are
specified by CMD and ARGS."
(let ((contents (org-element-contents item)))
(org-element-insert-before
(apply #'org-element-create 'special-block
(list :type cmd
:attr_texinfo (list (format ":options %s" args))
:post-blank (if contents 1 0))
(mapc #'org-element-extract-element contents))
plain-list))
(org-element-extract-element item))
(defun org-texinfo--split-plain-list (plain-list items)
"Insert a new plain list before the plain list PLAIN-LIST.
Remove ITEMS from PLAIN-LIST and use them as the contents of the
new plain list."
(org-element-insert-before
(apply #'org-element-create 'plain-list
(list :type 'descriptive
:attr_texinfo (org-element-property :attr_texinfo plain-list)
:post-blank 1)
(mapc #'org-element-extract-element items))
plain-list))
(defun org-texinfo--massage-key-item (plain-list item args info)
"In PLAIN-LIST modify ITEM based on ARGS.
Reformat ITEM's tag property and determine the arguments for the
`@findex' and `@kindex' commands for ITEM and store them in ITEM
using the `:findex' and `:kindex' properties.
If PLAIN-LIST is a description list whose `:compact' attribute is
non-nil and ITEM has no content but is followed by another item,
then store the `@findex' and `@kindex' values in the next item.
If the previous item stored its respective values in this item,
then move them to the next item.
INFO is a plist used as a communication channel."
(let ((key nil)
(cmd nil))
(if (string-match (rx (+ " ")
"(" (group (+ (not (any "()")))) ")"
(* " ")
eos)
args)
(setq key (substring args 0 (match-beginning 0))
cmd (match-string 1 args))
(setq key args))
(org-element-put-property
item :tag
(cons (org-export-raw-string (org-texinfo-kbd-macro key t))
(and cmd `(" (" (code (:value ,cmd :post-blank 0)) ")"))))
(let ((findex (org-element-property :findex item))
(kindex (org-element-property :kindex item))
(next-item (org-export-get-next-element item nil))
(mx (string-prefix-p "M-x " key)))
(when (and (not cmd) mx)
(setq cmd (substring key 4)))
(when (and cmd (not (member cmd findex)))
(setq findex (nconc findex (list cmd))))
(unless mx
(setq kindex (nconc kindex (list key))))
(cond
((and next-item
(or (plist-get info :texinfo-compact-itemx)
(org-not-nil
(org-export-read-attribute :attr_texinfo plain-list :compact)))
(not (org-element-contents item))
(eq 1 (org-element-property :post-blank item)))
(org-element-put-property next-item :findex findex)
(org-element-put-property next-item :kindex kindex)
(org-element-put-property item :findex nil)
(org-element-put-property item :kindex nil))
(t
(org-element-set-contents
item
(nconc (mapcar (lambda (key) `(keyword (:key "KINDEX" :value ,key))) kindex)
(mapcar (lambda (cmd) `(keyword (:key "FINDEX" :value ,cmd))) findex)
(org-element-contents item))))))))
;;; Template
(defun org-texinfo-template (contents info)
@@ -990,25 +1177,42 @@ contextual information."
CONTENTS holds the contents of the item. INFO is a plist holding
contextual information."
(let* ((tag (org-element-property :tag item))
(split (org-string-nw-p
(org-export-read-attribute :attr_texinfo
(org-element-property :parent item)
:sep)))
(items (and tag
(let ((tag (org-export-data tag info)))
(if split
(split-string tag (regexp-quote split) t "[ \t\n]+")
(list tag))))))
(format "%s\n%s"
(pcase items
(`nil "@item")
(`(,item) (concat "@item " item))
(`(,item . ,items)
(concat "@item " item "\n"
(mapconcat (lambda (i) (concat "@itemx " i))
items
"\n"))))
(or contents ""))))
(plain-list (org-element-property :parent item))
(compact (and (eq (org-element-property :type plain-list) 'descriptive)
(or (plist-get info :texinfo-compact-itemx)
(org-not-nil (org-export-read-attribute
:attr_texinfo plain-list :compact)))))
(previous-item nil))
(when (and compact
(org-export-get-next-element item info)
(not (org-element-contents item))
(eq 1 (org-element-property :post-blank item)))
(org-element-put-property item :post-blank 0))
(if (and compact
(setq previous-item (org-export-get-previous-element item info))
(not (org-element-contents previous-item))
(eq 0 (org-element-property :post-blank previous-item)))
(format "@itemx%s\n%s"
(if tag (concat " " (org-export-data tag info)) "")
(or contents ""))
(let* ((split (org-string-nw-p (org-export-read-attribute
:attr_texinfo plain-list :sep)))
(items (and tag
(let ((tag (org-export-data tag info)))
(if split
(split-string tag (regexp-quote split)
t "[ \t\n]+")
(list tag))))))
(format "%s\n%s"
(pcase items
(`nil "@item")
(`(,item) (concat "@item " item))
(`(,item . ,items)
(concat "@item " item "\n"
(mapconcat (lambda (i) (concat "@itemx " i))
items
"\n"))))
(or contents ""))))))
;;;; Keyword
@@ -1032,6 +1236,52 @@ CONTENTS is nil. INFO is a plist holding contextual information."
(concat "@listoffloats "
(org-export-translate "Listing" :utf-8 info))))))))
;;;; LaTeX Environment
(defun org-texinfo-latex-environment (environment _contents info)
"Transcode a LaTeX ENVIRONMENT from Org to Texinfo.
CONTENTS is ignored. INFO is a plist holding contextual information."
(let ((with-latex (plist-get info :with-latex)))
(when (or (eq with-latex t)
(and (eq with-latex 'detect)
(org-texinfo-supports-math-p)))
(let ((value (org-element-property :value environment)))
(string-join (list "@displaymath"
(string-trim (org-remove-indentation value))
"@end displaymath")
"\n")))))
;;;; LaTeX Fragment
(defun org-texinfo-latex-fragment (fragment _contents info)
"Transcode a LaTeX FRAGMENT from Org to Texinfo.
INFO is a plist holding contextual information."
(let ((with-latex (plist-get info :with-latex)))
(when (or (eq with-latex t)
(and (eq with-latex 'detect)
(org-texinfo-supports-math-p)))
(let ((value (org-remove-indentation
(org-element-property :value fragment))))
(cond
((or (string-match-p "^\\\\\\[" value)
(string-match-p "^\\$\\$" value))
(concat "\n"
"@displaymath"
"\n"
(string-trim (substring value 2 -2))
"\n"
"@end displaymath"
"\n"))
((string-match-p "^\\$" value)
(concat "@math{"
(string-trim (substring value 1 -1))
"}"))
((string-match-p "^\\\\(" value)
(concat "@math{"
(string-trim (substring value 2 -2))
"}"))
(t value))))))
;;;; Line Break
(defun org-texinfo-line-break (_line-break _contents _info)
@@ -1611,7 +1861,28 @@ contextual information."
(format "@display\n%s@end display" contents))
;;; Interactive functions
;;; Public Functions
(defun org-texinfo-kbd-macro (key &optional noquote)
"Quote KEY using @kbd{...} and if necessary @key{...}.
This is intended to be used as an Org macro like so:
#+macro: kbd (eval (org-texinfo-kbd-macro $1))
Type {{{kbd(C-c SPC)}}}.
Also see info node `(org)Key bindings in Texinfo export'.
If optional NOQOUTE is non-nil, then do not add the quoting
that is necessary when using this in an Org macro."
(format (if noquote "@kbd{%s}" "@@texinfo:@kbd{@@%s@@texinfo:}@@")
(let ((case-fold-search nil))
(replace-regexp-in-string
org-texinfo--quoted-keys-regexp
(if noquote "@key{\\&}" "@@texinfo:@key{@@\\&@@texinfo:}@@")
key t))))
;;; Interactive Functions
;;;###autoload
(defun org-texinfo-export-to-texinfo
@@ -1747,6 +2018,31 @@ Return INFO file name or an error if it couldn't be produced."
(message "Process completed.")
output))
(defun org-texinfo-supports-math-p ()
"Return t if the installed version of Texinfo supports \"@math\".
Once computed, the results remain cached."
(unless (boundp 'org-texinfo-supports-math--cache)
(setq org-texinfo-supports-math--cache
(let ((math-example "1 + 1 = 2"))
(let* ((input-file
(make-temp-file "test" nil ".info"))
(input-content
(concat (format "@setfilename %s" input-file) "\n"
"@node Top" "\n"
(format "@displaymath{%s}" math-example) "\n")))
(with-temp-file input-file
(insert input-content))
(let* ((output-file (org-texinfo-compile input-file))
(output-content (with-temp-buffer
(insert-file-contents output-file)
(buffer-string))))
(let ((result (string-match-p (regexp-quote math-example)
output-content)))
(delete-file input-file)
(delete-file output-file)
(if result t nil)))))))
org-texinfo-supports-math--cache)
(provide 'ox-texinfo)