diff options
Diffstat (limited to 'lisp/org/ox.el')
-rw-r--r-- | lisp/org/ox.el | 474 |
1 files changed, 277 insertions, 197 deletions
diff --git a/lisp/org/ox.el b/lisp/org/ox.el index d412f57360a..9ab813a1b14 100644 --- a/lisp/org/ox.el +++ b/lisp/org/ox.el @@ -3,6 +3,7 @@ ;; Copyright (C) 2012-2021 Free Software Foundation, Inc. ;; Author: Nicolas Goaziou <n.goaziou at gmail dot com> +;; Maintainer: Nicolas Goaziou <n.goaziou at gmail dot com> ;; Keywords: outlines, hypermedia, calendar, wp ;; This file is part of GNU Emacs. @@ -73,6 +74,8 @@ (require 'cl-lib) (require 'ob-exp) +(require 'oc) +(require 'oc-basic) ;default value for `org-cite-export-processors' (require 'ol) (require 'org-element) (require 'org-macro) @@ -139,7 +142,9 @@ (:with-tasks nil "tasks" org-export-with-tasks) (:with-timestamps nil "<" org-export-with-timestamps) (:with-title nil "title" org-export-with-title) - (:with-todo-keywords nil "todo" org-export-with-todo-keywords)) + (:with-todo-keywords nil "todo" org-export-with-todo-keywords) + ;; Citations processing. + (:cite-export "CITE_EXPORT" nil org-cite-export-processors)) "Alist between export properties and ways to set them. The key of the alist is the property name, and the value is a list @@ -1207,12 +1212,12 @@ keywords are understood: or \\='(?l \"Export to LaTeX\" - (?p \"As PDF file\" org-latex-export-to-pdf) - (?o \"As PDF file and open\" - (lambda (a s v b) - (if a (org-latex-export-to-pdf t s v b) - (org-open-file - (org-latex-export-to-pdf nil s v b))))))) + ((?p \"As PDF file\" org-latex-export-to-pdf) + (?o \"As PDF file and open\" + (lambda (a s v b) + (if a (org-latex-export-to-pdf t s v b) + (org-open-file + (org-latex-export-to-pdf nil s v b))))))) or the following, which will be added to the previous sub-menu, @@ -1386,11 +1391,13 @@ e.g., `org-export-create-backend'. It specifies which back-end specific items to read, if any." (let ((line (let ((s 0) alist) - (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-*\\)[ \t]*" options s) + (while (string-match "\\(.+?\\):\\((.*?)\\|\\S-+\\)?[ \t]*" options s) (setq s (match-end 0)) - (push (cons (match-string 1 options) - (read (match-string 2 options))) - alist)) + (let ((value (match-string 2 options))) + (when value + (push (cons (match-string 1 options) + (read value)) + alist)))) alist)) ;; Priority is given to back-end specific options. (all (append (org-export-get-all-options backend) @@ -1569,7 +1576,7 @@ process." plist prop ;; Evaluate default value provided. - (let ((value (eval (nth 3 cell)))) + (let ((value (eval (nth 3 cell) t))) (if (eq (nth 4 cell) 'parse) (org-element-parse-secondary-string value (org-element-restriction 'keyword)) @@ -1878,6 +1885,8 @@ Return a string." (cond ;; Ignored element/object. ((memq data (plist-get info :ignore-list)) nil) + ;; Raw code. + ((eq type 'raw) (car (org-element-contents data))) ;; Plain text. ((eq type 'plain-text) (org-export-filter-apply-functions @@ -1944,7 +1953,7 @@ Return a string." data (cond ((not results) "") - ((memq type '(org-data plain-text nil)) results) + ((memq type '(nil org-data plain-text raw)) results) ;; Append the same white space between elements or objects ;; as in the original buffer, and call appropriate filters. (t @@ -2559,16 +2568,16 @@ another buffer, effectively cloning the original buffer there. The function assumes BUFFER's major mode is `org-mode'." (with-current-buffer buffer - `(lambda () - (let ((inhibit-modification-hooks t)) - ;; Set major mode. Ignore `org-mode-hook' as it has been run - ;; already in BUFFER. - (let ((org-mode-hook nil) (org-inhibit-startup t)) (org-mode)) - ;; Copy specific buffer local variables and variables set - ;; through BIND keywords. - ,@(let ((bound-variables (org-export--list-bound-variables)) - vars) - (dolist (entry (buffer-local-variables (buffer-base-buffer)) vars) + (let ((str (org-with-wide-buffer (buffer-string))) + (narrowing + (if (org-region-active-p) + (list (region-beginning) (region-end)) + (list (point-min) (point-max)))) + (pos (point)) + (varvals + (let ((bound-variables (org-export--list-bound-variables)) + (varvals nil)) + (dolist (entry (buffer-local-variables (buffer-base-buffer))) (when (consp entry) (let ((var (car entry)) (val (cdr entry))) @@ -2583,27 +2592,35 @@ The function assumes BUFFER's major mode is `org-mode'." ;; Skip unreadable values, as they cannot be ;; sent to external process. (or (not val) (ignore-errors (read (format "%S" val)))) - (push `(set (make-local-variable (quote ,var)) - (quote ,val)) - vars)))))) - ;; Whole buffer contents. - (insert ,(org-with-wide-buffer (buffer-string))) - ;; Narrowing. - ,(if (org-region-active-p) - `(narrow-to-region ,(region-beginning) ,(region-end)) - `(narrow-to-region ,(point-min) ,(point-max))) - ;; Current position of point. - (goto-char ,(point)) - ;; Overlays with invisible property. - ,@(let (ov-set) - (dolist (ov (overlays-in (point-min) (point-max)) ov-set) + (push (cons var val) varvals))))) + varvals)) + (ols + (let (ov-set) + (dolist (ov (overlays-in (point-min) (point-max))) (let ((invis-prop (overlay-get ov 'invisible))) (when invis-prop - (push `(overlay-put - (make-overlay ,(overlay-start ov) - ,(overlay-end ov)) - 'invisible (quote ,invis-prop)) - ov-set))))))))) + (push (list (overlay-start ov) (overlay-end ov) + invis-prop) + ov-set)))) + ov-set))) + (lambda () + (let ((inhibit-modification-hooks t)) + ;; Set major mode. Ignore `org-mode-hook' as it has been run + ;; already in BUFFER. + (let ((org-mode-hook nil) (org-inhibit-startup t)) (org-mode)) + ;; Copy specific buffer local variables and variables set + ;; through BIND keywords. + (pcase-dolist (`(,var . ,val) varvals) + (set (make-local-variable var) val)) + ;; Whole buffer contents. + (insert str) + ;; Narrowing. + (apply #'narrow-to-region narrowing) + ;; Current position of point. + (goto-char pos) + ;; Overlays with invisible property. + (pcase-dolist (`(,start ,end ,invis) ols) + (overlay-put (make-overlay start end) 'invisible invis))))))) (defun org-export--delete-comment-trees () "Delete commented trees and commented inlinetasks in the buffer. @@ -2709,8 +2726,8 @@ a list of footnote definitions or in the widened buffer." ) ;; seen (dolist (l (funcall list-labels tree)) (cond ;; ((member l seen)) - ((member l known-definitions) (push l defined)) - (t (push l undefined))))) + ((member l known-definitions) (push l defined)) + (t (push l undefined))))) ;; Complete MISSING-DEFINITIONS by finding the definition of every ;; undefined label, first by looking into DEFINITIONS, then by ;; searching the widened buffer. This is a recursive process @@ -2722,7 +2739,7 @@ a list of footnote definitions or in the widened buffer." (cond ((cl-some (lambda (d) (and (equal (org-element-property :label d) label) - d)) + d)) definitions)) ((pcase (org-footnote-get-definition label) (`(,_ ,beg . ,_) @@ -2785,16 +2802,16 @@ containing their first reference." ;; the definitions at the end of the tree. (org-footnote-section (org-element-adopt-elements - tree - (org-element-create 'headline - (list :footnote-section-p t - :level 1 - :title org-footnote-section - :raw-value org-footnote-section) - (apply #'org-element-create - 'section - nil - (nreverse definitions))))) + tree + (org-element-create 'headline + (list :footnote-section-p t + :level 1 + :title org-footnote-section + :raw-value org-footnote-section) + (apply #'org-element-create + 'section + nil + (nreverse definitions))))) ;; Otherwise add each definition at the end of the section where it ;; is first referenced. (t @@ -2817,8 +2834,8 @@ containing their first reference." d)) definitions))) (org-element-adopt-elements - (org-element-lineage reference '(section)) - definition) + (org-element-lineage reference '(section)) + definition) ;; Also insert definitions for nested ;; references, if any. (funcall insert-definitions definition)))))))))) @@ -2947,10 +2964,8 @@ Return code as a string." (org-export-backend-name backend)) (org-export-expand-include-keyword) (org-export--delete-comment-trees) - (org-macro-initialize-templates) - (org-macro-replace-all (append org-macro-templates - org-export-global-macros) - parsed-keywords) + (org-macro-initialize-templates org-export-global-macros) + (org-macro-replace-all org-macro-templates parsed-keywords) ;; Refresh buffer properties and radio targets after previous ;; potentially invasive changes. (org-set-regexps-and-options) @@ -2977,6 +2992,10 @@ Return code as a string." (setq info (org-combine-plists info (org-export-get-environment backend subtreep ext-plist))) + ;; Pre-process citations environment, i.e. install + ;; bibliography list, and citation processor in INFO. + (org-cite-store-bibliography info) + (org-cite-store-export-processor info) ;; De-activate uninterpreted data from parsed keywords. (dolist (entry (append (org-export-get-all-options backend) org-export-options-alist)) @@ -3010,6 +3029,11 @@ Return code as a string." ;; Now tree is complete, compute its properties and add them ;; to communication channel. (setq info (org-export--collect-tree-properties tree info)) + ;; Process citations and bibliography. Replace each citation + ;; and "print_bibliography" keyword in the parse tree with + ;; the output of the selected citation export processor. + (org-cite-process-citations info) + (org-cite-process-bibliography info) ;; Eventually transcode TREE. Wrap the resulting string into ;; a template. (let* ((body (org-element-normalize-string @@ -3022,16 +3046,19 @@ Return code as a string." (funcall inner-template body info)) info)) (template (cdr (assq 'template - (plist-get info :translate-alist))))) + (plist-get info :translate-alist)))) + (output + (if (or (not (functionp template)) body-only) full-body + (funcall template full-body info)))) + ;; Call citation export finalizer. + (setq output (org-cite-finalize-export output info)) ;; Remove all text properties since they cannot be ;; retrieved from an external process. Finally call ;; final-output filter and return result. (org-no-properties (org-export-filter-apply-functions (plist-get info :filter-final-output) - (if (or (not (functionp template)) body-only) full-body - (funcall template full-body info)) - info)))))))) + output info)))))))) ;;;###autoload (defun org-export-string-as (string backend &optional body-only ext-plist) @@ -3104,22 +3131,22 @@ locally for the subtree through node properties." (keyword (unless (assoc keyword keywords) (let ((value (if (eq (nth 4 entry) 'split) - (mapconcat #'identity (eval (nth 3 entry)) " ") - (eval (nth 3 entry))))) + (mapconcat #'identity (eval (nth 3 entry) t) " ") + (eval (nth 3 entry) t)))) (push (cons keyword value) keywords)))) (option (unless (assoc option options) - (push (cons option (eval (nth 3 entry))) options)))))) + (push (cons option (eval (nth 3 entry) t)) options)))))) ;; Move to an appropriate location in order to insert options. (unless subtreep (beginning-of-line)) ;; First (multiple) OPTIONS lines. Never go past fill-column. (when options (let ((items (mapcar - #'(lambda (opt) (format "%s:%S" (car opt) (cdr opt))) + (lambda (opt) (format "%s:%S" (car opt) (cdr opt))) (sort options (lambda (k1 k2) (string< (car k1) (car k2))))))) (if subtreep (org-entry-put - node "EXPORT_OPTIONS" (mapconcat 'identity items " ")) + node "EXPORT_OPTIONS" (mapconcat #'identity items " ")) (while items (insert "#+options:") (let ((width 10)) @@ -3609,7 +3636,7 @@ will become the empty string." (attributes (let ((value (org-element-property attribute element))) (when value - (let ((s (mapconcat 'identity value " ")) result) + (let ((s (mapconcat #'identity value " ")) result) (while (string-match "\\(?:^\\|[ \t]+\\)\\(:[-a-zA-Z0-9_]+\\)\\([ \t]+\\|$\\)" s) @@ -3659,7 +3686,8 @@ the communication channel used for export, as a plist." (when (symbolp backend) (setq backend (org-export-get-backend backend))) (org-export-barf-if-invalid-backend backend) (let ((type (org-element-type data))) - (when (memq type '(nil org-data)) (error "No foreign transcoder available")) + (when (memq type '(nil org-data raw)) + (error "No foreign transcoder available")) (let* ((all-transcoders (org-export-get-all-transcoders backend)) (transcoder (cdr (assq type all-transcoders)))) (unless (functionp transcoder) (error "No foreign transcoder available")) @@ -4194,10 +4222,10 @@ Return modified DATA." (or rules org-export-default-inline-image-rule)) ;; Replace contents with image link. (org-element-adopt-elements - (org-element-set-contents l nil) - (with-temp-buffer - (save-excursion (insert contents)) - (org-element-link-parser)))))))) + (org-element-set-contents l nil) + (with-temp-buffer + (save-excursion (insert contents)) + (org-element-link-parser)))))))) info nil nil t)) data) @@ -4553,6 +4581,17 @@ objects of the same type." ((funcall predicate el info) (cl-incf counter) nil))) info 'first-match))))) +;;;; For Raw objects +;; +;; `org-export-raw-string' builds a pseudo-object out of a string +;; that any export back-end returns as-is. + +(defun org-export-raw-string (s) + "Return a raw object containing string S. +A raw string is exported as-is, with no additional processing +from the export back-end." + (unless (stringp s) (error "Wrong raw contents type: %S" s)) + (org-element-create 'raw nil s)) ;;;; For Src-Blocks ;; @@ -4702,7 +4741,7 @@ code." ;; should start six columns after the widest line of code, ;; wrapped with parenthesis. (max-width - (+ (apply 'max (mapcar 'length code-lines)) + (+ (apply #'max (mapcar #'length code-lines)) (if (not num-start) 0 (length (format num-fmt num-start)))))) (org-export-format-code code @@ -5082,8 +5121,8 @@ INFO is a plist used as a communication channel." ;; A cell ends a column group either when it is at the end of a row ;; or when it has a right border. (or (eq (car (last (org-element-contents - (org-export-get-parent table-cell)))) - table-cell) + (org-export-get-parent table-cell)))) + table-cell) (memq 'right (org-export-table-cell-borders table-cell info)))) (defun org-export-table-row-starts-rowgroup-p (table-row info) @@ -5398,6 +5437,16 @@ transcoding it." (secondary-closing :utf-8 "‘" :html "‘" :latex "\\grq{}" :texinfo "@quoteleft{}") (apostrophe :utf-8 "’" :html "’")) + ("el" + (primary-opening + :utf-8 "«" :html "«" :latex "\\guillemotleft{}" + :texinfo "@guillemetleft{}") + (primary-closing + :utf-8 "»" :html "»" :latex "\\guillemotright{}" + :texinfo "@guillemetright{}") + (secondary-opening :utf-8 "“" :html "“" :latex "``" :texinfo "``") + (secondary-closing :utf-8 "”" :html "”" :latex "''" :texinfo "''") + (apostrophe :utf-8 "’" :html "’")) ("en" (primary-opening :utf-8 "“" :html "“" :latex "``" :texinfo "``") (primary-closing :utf-8 "”" :html "”" :latex "''" :texinfo "''") @@ -5437,6 +5486,12 @@ transcoding it." (secondary-closing :utf-8 "‘" :html "‘" :latex "\\grq{}" :texinfo "@quoteleft{}") (apostrophe :utf-8 "’" :html "’")) + ("it" + (primary-opening :utf-8 "“" :html "“" :latex "``" :texinfo "``") + (primary-closing :utf-8 "”" :html "”" :latex "''" :texinfo "''") + (secondary-opening :utf-8 "‘" :html "‘" :latex "`" :texinfo "`") + (secondary-closing :utf-8 "’" :html "’" :latex "'" :texinfo "'") + (apostrophe :utf-8 "’" :html "’")) ("no" ;; https://nn.wikipedia.org/wiki/Sitatteikn (primary-opening @@ -5483,7 +5538,7 @@ transcoding it." (apostrophe :utf-8 "’" :html "’")) ("ru" ;; https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%B2%D1%8B%D1%87%D0%BA%D0%B8#.D0.9A.D0.B0.D0.B2.D1.8B.D1.87.D0.BA.D0.B8.2C_.D0.B8.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D1.83.D0.B5.D0.BC.D1.8B.D0.B5_.D0.B2_.D1.80.D1.83.D1.81.D1.81.D0.BA.D0.BE.D0.BC_.D1.8F.D0.B7.D1.8B.D0.BA.D0.B5 - ;; http://www.artlebedev.ru/kovodstvo/sections/104/ + ;; https://www.artlebedev.ru/kovodstvo/sections/104/ (primary-opening :utf-8 "«" :html "«" :latex "{}<<" :texinfo "@guillemetleft{}") (primary-closing :utf-8 "»" :html "»" :latex ">>{}" @@ -5745,6 +5800,7 @@ them." ("ru" :html "Автор" :utf-8 "Автор") ("sl" :default "Avtor") ("sv" :html "Författare") + ("tr" :default "Yazar") ("uk" :html "Автор" :utf-8 "Автор") ("zh-CN" :html "作者" :utf-8 "作者") ("zh-TW" :html "作者" :utf-8 "作者")) @@ -5757,12 +5813,14 @@ them." ("it" :default "Continua da pagina precedente") ("ja" :default "前ページからの続き") ("nl" :default "Vervolg van vorige pagina") + ("pl" :default "Ciąg dalszy poprzedniej strony") ("pt" :default "Continuação da página anterior") ("pt_BR" :html "Continuação da página anterior" :ascii "Continuacao da pagina anterior" :default "Continuação da página anterior") ("ro" :default "Continuare de pe pagina precedentă") ("ru" :html "(Продолжение)" :utf-8 "(Продолжение)") - ("sl" :default "Nadaljevanje s prejšnje strani")) + ("sl" :default "Nadaljevanje s prejšnje strani") + ("tr" :default "Önceki sayfadan devam ediyor")) ("Continued on next page" ("ar" :default "التتمة في الصفحة التالية") ("cs" :default "Pokračuje na další stránce") @@ -5772,18 +5830,21 @@ them." ("it" :default "Continua alla pagina successiva") ("ja" :default "次ページに続く") ("nl" :default "Vervolg op volgende pagina") + ("pl" :default "Kontynuacja na następnej stronie") ("pt" :default "Continua na página seguinte") ("pt_BR" :html "Continua na próxima página" :ascii "Continua na proxima pagina" :default "Continua na próxima página") ("ro" :default "Continuare pe pagina următoare") ("ru" :html "(Продолжение следует)" :utf-8 "(Продолжение следует)") - ("sl" :default "Nadaljevanje na naslednji strani")) + ("sl" :default "Nadaljevanje na naslednji strani") + ("tr" :default "Devamı sonraki sayfada")) ("Created" ("cs" :default "Vytvořeno") ("nl" :default "Gemaakt op") ;; must be followed by a date or date+time ("pt_BR" :default "Criado em") ("ro" :default "Creat") - ("sl" :default "Ustvarjeno")) + ("sl" :default "Ustvarjeno") + ("tr" :default "Oluşturuldu")) ("Date" ("ar" :default "بتاريخ") ("ca" :default "Data") @@ -5808,6 +5869,7 @@ them." ("ru" :html "Дата" :utf-8 "Дата") ("sl" :default "Datum") ("sv" :default "Datum") + ("tr" :default "Tarih") ("uk" :html "Дата" :utf-8 "Дата") ("zh-CN" :html "日期" :utf-8 "日期") ("zh-TW" :html "日期" :utf-8 "日期")) @@ -5831,6 +5893,7 @@ them." :utf-8 "Уравнение") ("sl" :default "Enačba") ("sv" :default "Ekvation") + ("tr" :default "Eşitlik") ("zh-CN" :html "方程" :utf-8 "方程")) ("Figure" ("ar" :default "شكل") @@ -5850,6 +5913,7 @@ them." ("ro" :default "Imaginea") ("ru" :html "Рисунок" :utf-8 "Рисунок") ("sv" :default "Illustration") + ("tr" :default "Şekil") ("zh-CN" :html "图" :utf-8 "图")) ("Figure %d:" ("ar" :default "شكل %d:") @@ -5871,6 +5935,7 @@ them." ("ru" :html "Рис. %d.:" :utf-8 "Рис. %d.:") ("sl" :default "Slika %d") ("sv" :default "Illustration %d") + ("tr" :default "Şekil %d:") ("zh-CN" :html "图%d " :utf-8 "图%d ")) ("Footnotes" ("ar" :default "الهوامش") @@ -5879,7 +5944,7 @@ them." ("da" :default "Fodnoter") ("de" :html "Fußnoten" :default "Fußnoten") ("eo" :default "Piednotoj") - ("es" :ascii "Nota al pie de pagina" :html "Nota al pie de página" :default "Nota al pie de página") + ("es" :ascii "Notas al pie de pagina" :html "Notas al pie de página" :default "Notas al pie de página") ("et" :html "Allmärkused" :utf-8 "Allmärkused") ("fi" :default "Alaviitteet") ("fr" :default "Notes de bas de page") @@ -5897,6 +5962,7 @@ them." ("ru" :html "Сноски" :utf-8 "Сноски") ("sl" :default "Opombe") ("sv" :default "Fotnoter") + ("tr" :default "Dipnotlar") ("uk" :html "Примітки" :utf-8 "Примітки") ("zh-CN" :html "脚注" :utf-8 "脚注") @@ -5917,6 +5983,7 @@ them." ("ru" :html "Список распечаток" :utf-8 "Список распечаток") ("sl" :default "Seznam programskih izpisov") + ("tr" :default "Program Listesi") ("zh-CN" :html "代码目录" :utf-8 "代码目录")) ("List of Tables" ("ar" :default "قائمة بالجداول") @@ -5939,6 +6006,7 @@ them." :utf-8 "Список таблиц") ("sl" :default "Seznam tabel") ("sv" :default "Tabeller") + ("tr" :default "Tablo Listesi") ("zh-CN" :html "表格目录" :utf-8 "表格目录")) ("Listing" ("ar" :default "برنامج") @@ -5958,6 +6026,7 @@ them." ("ru" :html "Распечатка" :utf-8 "Распечатка") ("sl" :default "Izpis programa") + ("tr" :default "Program") ("zh-CN" :html "代码" :utf-8 "代码")) ("Listing %d:" ("ar" :default "برنامج %d:") @@ -5977,6 +6046,7 @@ them." ("ru" :html "Распечатка %d.:" :utf-8 "Распечатка %d.:") ("sl" :default "Izpis programa %d") + ("tr" :default "Program %d:") ("zh-CN" :html "代码%d " :utf-8 "代码%d ")) ("References" ("ar" :default "المراجع") @@ -5988,7 +6058,8 @@ them." ("nl" :default "Bronverwijzingen") ("pt_BR" :html "Referências" :default "Referências" :ascii "Referencias") ("ro" :default "Bibliografie") - ("sl" :default "Reference")) + ("sl" :default "Reference") + ("tr" :default "Referanslar")) ("See figure %s" ("cs" :default "Viz obrázek %s") ("fr" :default "cf. figure %s" @@ -5998,7 +6069,8 @@ them." :html "Zie figuur %s" :latex "Zie figuur~%s") ("pt_BR" :default "Veja a figura %s") ("ro" :default "Vezi figura %s") - ("sl" :default "Glej sliko %s")) + ("sl" :default "Glej sliko %s") + ("tr" :default "bkz. şekil %s")) ("See listing %s" ("cs" :default "Viz program %s") ("fr" :default "cf. programme %s" @@ -6007,7 +6079,8 @@ them." :html "Zie programma %s" :latex "Zie programma~%s") ("pt_BR" :default "Veja a listagem %s") ("ro" :default "Vezi tabelul %s") - ("sl" :default "Glej izpis programa %s")) + ("sl" :default "Glej izpis programa %s") + ("tr" :default "bkz. program %s")) ("See section %s" ("ar" :default "انظر قسم %s") ("cs" :default "Viz sekce %s") @@ -6026,6 +6099,7 @@ them." ("ru" :html "См. раздел %s" :utf-8 "См. раздел %s") ("sl" :default "Glej poglavje %d") + ("tr" :default "bkz. bölüm %s") ("zh-CN" :html "参见第%s节" :utf-8 "参见第%s节")) ("See table %s" ("cs" :default "Viz tabulka %s") @@ -6036,7 +6110,8 @@ them." :html "Zie tabel %s" :latex "Zie tabel~%s") ("pt_BR" :default "Veja a tabela %s") ("ro" :default "Vezi tabelul %s") - ("sl" :default "Glej tabelo %s")) + ("sl" :default "Glej tabelo %s") + ("tr" :default "bkz. tablo %s")) ("Table" ("ar" :default "جدول") ("cs" :default "Tabulka") @@ -6052,6 +6127,7 @@ them." ("ro" :default "Tabel") ("ru" :html "Таблица" :utf-8 "Таблица") + ("tr" :default "Tablo") ("zh-CN" :html "表" :utf-8 "表")) ("Table %d:" ("ar" :default "جدول %d:") @@ -6074,6 +6150,7 @@ them." :utf-8 "Таблица %d.:") ("sl" :default "Tabela %d") ("sv" :default "Tabell %d") + ("tr" :default "Tablo %d") ("zh-CN" :html "表%d " :utf-8 "表%d ")) ("Table of Contents" ("ar" :default "قائمة المحتويات") @@ -6101,6 +6178,7 @@ them." :utf-8 "Содержание") ("sl" :default "Kazalo") ("sv" :html "Innehåll") + ("tr" :default "İçindekiler") ("uk" :html "Зміст" :utf-8 "Зміст") ("zh-CN" :html "目录" :utf-8 "目录") ("zh-TW" :html "目錄" :utf-8 "目錄")) @@ -6119,6 +6197,7 @@ them." ("ru" :html "Неизвестная ссылка" :utf-8 "Неизвестная ссылка") ("sl" :default "Neznana referenca") + ("tr" :default "Bilinmeyen referans") ("zh-CN" :html "未知引用" :utf-8 "未知引用"))) "Dictionary for export engine. @@ -6176,97 +6255,93 @@ to `:default' encoding. If it fails, return S." ;; For back-ends, `org-export-add-to-stack' add a new source to stack. ;; It should be used whenever `org-export-async-start' is called. -(defmacro org-export-async-start (fun &rest body) +(defun org-export-async-start (fun body) "Call function FUN on the results returned by BODY evaluation. -FUN is an anonymous function of one argument. BODY evaluation -happens in an asynchronous process, from a buffer which is an -exact copy of the current one. +FUN is an anonymous function of one argument. BODY should be a valid +ELisp source expression. BODY evaluation happens in an asynchronous process, +from a buffer which is an exact copy of the current one. Use `org-export-add-to-stack' in FUN in order to register results in the stack. This is a low level function. See also `org-export-to-buffer' and `org-export-to-file' for more specialized functions." - (declare (indent 1) (debug t)) - (org-with-gensyms (process temp-file copy-fun proc-buffer coding) - ;; Write the full sexp evaluating BODY in a copy of the current - ;; buffer to a temporary file, as it may be too long for program - ;; args in `start-process'. - `(with-temp-message "Initializing asynchronous export process" - (let ((,copy-fun (org-export--generate-copy-script (current-buffer))) - (,temp-file (make-temp-file "org-export-process")) - (,coding buffer-file-coding-system)) - (with-temp-file ,temp-file - (insert - ;; Null characters (from variable values) are inserted - ;; within the file. As a consequence, coding system for - ;; buffer contents will not be recognized properly. So, - ;; we make sure it is the same as the one used to display - ;; the original buffer. - (format ";; -*- coding: %s; -*-\n%S" - ,coding - `(with-temp-buffer - (when org-export-async-debug '(setq debug-on-error t)) - ;; Ignore `kill-emacs-hook' and code evaluation - ;; queries from Babel as we need a truly - ;; non-interactive process. - (setq kill-emacs-hook nil - org-babel-confirm-evaluate-answer-no t) - ;; Initialize export framework. - (require 'ox) - ;; Re-create current buffer there. - (funcall ,,copy-fun) - (restore-buffer-modified-p nil) - ;; Sexp to evaluate in the buffer. - (print (progn ,,@body)))))) - ;; Start external process. - (let* ((process-connection-type nil) - (,proc-buffer (generate-new-buffer-name "*Org Export Process*")) - (,process - (apply - #'start-process - (append - (list "org-export-process" - ,proc-buffer - (expand-file-name invocation-name invocation-directory) - "--batch") - (if org-export-async-init-file - (list "-Q" "-l" org-export-async-init-file) - (list "-l" user-init-file)) - (list "-l" ,temp-file))))) - ;; Register running process in stack. - (org-export-add-to-stack (get-buffer ,proc-buffer) nil ,process) - ;; Set-up sentinel in order to catch results. - (let ((handler ,fun)) - (set-process-sentinel - ,process - `(lambda (p status) - (let ((proc-buffer (process-buffer p))) - (when (eq (process-status p) 'exit) - (unwind-protect - (if (zerop (process-exit-status p)) - (unwind-protect - (let ((results - (with-current-buffer proc-buffer - (goto-char (point-max)) - (backward-sexp) - (read (current-buffer))))) - (funcall ,handler results)) - (unless org-export-async-debug - (and (get-buffer proc-buffer) - (kill-buffer proc-buffer)))) - (org-export-add-to-stack proc-buffer nil p) - (ding) - (message "Process `%s' exited abnormally" p)) - (unless org-export-async-debug - (delete-file ,,temp-file))))))))))))) + (declare (indent 1)) + ;; Write the full sexp evaluating BODY in a copy of the current + ;; buffer to a temporary file, as it may be too long for program + ;; args in `start-process'. + (with-temp-message "Initializing asynchronous export process" + (let ((copy-fun (org-export--generate-copy-script (current-buffer))) + (temp-file (make-temp-file "org-export-process"))) + (let ((coding-system-for-write 'utf-8-emacs-unix)) + (write-region + ;; Null characters (from variable values) are inserted + ;; within the file. As a consequence, coding system for + ;; buffer contents could fail to be recognized properly. + (format ";; -*- coding: utf-8-emacs-unix; lexical-binding:t -*-\n%S" + `(with-temp-buffer + ,(when org-export-async-debug '(setq debug-on-error t)) + ;; Ignore `kill-emacs-hook' and code evaluation + ;; queries from Babel as we need a truly + ;; non-interactive process. + (setq kill-emacs-hook nil + org-babel-confirm-evaluate-answer-no t) + ;; Initialize export framework. + (require 'ox) + ;; Re-create current buffer there. + (funcall ',copy-fun) + (restore-buffer-modified-p nil) + ;; Sexp to evaluate in the buffer. + (print ,body))) + nil temp-file nil 'silent)) + ;; Start external process. + (let* ((process-connection-type nil) + (proc-buffer (generate-new-buffer-name "*Org Export Process*")) + (process + (apply + #'start-process + (append + (list "org-export-process" + proc-buffer + (expand-file-name invocation-name invocation-directory) + "--batch") + (if org-export-async-init-file + (list "-Q" "-l" org-export-async-init-file) + (list "-l" user-init-file)) + (list "-l" temp-file))))) + ;; Register running process in stack. + (org-export-add-to-stack (get-buffer proc-buffer) nil process) + ;; Set-up sentinel in order to catch results. + (let ((handler fun)) + (set-process-sentinel + process + (lambda (p _status) + (let ((proc-buffer (process-buffer p))) + (when (eq (process-status p) 'exit) + (unwind-protect + (if (zerop (process-exit-status p)) + (unwind-protect + (let ((results + (with-current-buffer proc-buffer + (goto-char (point-max)) + (backward-sexp) + (read (current-buffer))))) + (funcall handler results)) + (unless org-export-async-debug + (and (get-buffer proc-buffer) + (kill-buffer proc-buffer)))) + (org-export-add-to-stack proc-buffer nil p) + (ding) + (message "Process `%s' exited abnormally" p)) + (unless org-export-async-debug + (delete-file temp-file)))))))))))) ;;;###autoload (defun org-export-to-buffer - (backend buffer - &optional async subtreep visible-only body-only ext-plist - post-process) + (backend buffer + &optional async subtreep visible-only body-only ext-plist + post-process) "Call `org-export-as' with output to a specified buffer. BACKEND is either an export back-end, as returned by, e.g., @@ -6301,14 +6376,15 @@ This function returns BUFFER." (declare (indent 2)) (if async (org-export-async-start - `(lambda (output) - (with-current-buffer (get-buffer-create ,buffer) - (erase-buffer) - (setq buffer-file-coding-system ',buffer-file-coding-system) - (insert output) - (goto-char (point-min)) - (org-export-add-to-stack (current-buffer) ',backend) - (ignore-errors (funcall ,post-process)))) + (let ((cs buffer-file-coding-system)) + (lambda (output) + (with-current-buffer (get-buffer-create buffer) + (erase-buffer) + (setq buffer-file-coding-system cs) + (insert output) + (goto-char (point-min)) + (org-export-add-to-stack (current-buffer) backend) + (ignore-errors (funcall post-process))))) `(org-export-as ',backend ,subtreep ,visible-only ,body-only ',ext-plist)) (let ((output @@ -6329,8 +6405,8 @@ This function returns BUFFER." ;;;###autoload (defun org-export-to-file - (backend file &optional async subtreep visible-only body-only ext-plist - post-process) + (backend file &optional async subtreep visible-only body-only ext-plist + post-process) "Call `org-export-as' with output to a specified file. BACKEND is either an export back-end, as returned by, e.g., @@ -6364,11 +6440,12 @@ or FILE." (declare (indent 2)) (if (not (file-writable-p file)) (error "Output file not writable") (let ((ext-plist (org-combine-plists `(:output-file ,file) ext-plist)) - (encoding (or org-export-coding-system buffer-file-coding-system))) + (encoding (or org-export-coding-system buffer-file-coding-system)) + auto-mode-alist) (if async (org-export-async-start - `(lambda (file) - (org-export-add-to-stack (expand-file-name file) ',backend)) + (lambda (file) + (org-export-add-to-stack (expand-file-name file) backend)) `(let ((output (org-export-as ',backend ,subtreep ,visible-only ,body-only @@ -6422,7 +6499,10 @@ Return file name as a string." (throw :found (org-element-property :value element)))))))) ;; Extract from buffer's associated file, if any. - (and visited-file (file-name-nondirectory visited-file)) + (and visited-file + (file-name-nondirectory + ;; For a .gpg visited file, remove the .gpg extension: + (replace-regexp-in-string "\\.gpg\\'" "" visited-file))) ;; Can't determine file name on our own: ask user. (read-file-name "Output file: " pub-dir nil nil nil @@ -6483,7 +6563,7 @@ If optional argument SOURCE is non-nil, remove it instead." (let ((source (or source (org-export--stack-source-at-point)))) (setq org-export-stack-contents (cl-remove-if (lambda (el) (equal (car el) source)) - org-export-stack-contents)))) + org-export-stack-contents)))) (defun org-export-stack-view (&optional in-emacs) "View export results at point in stack. @@ -6499,16 +6579,16 @@ within Emacs." (defvar org-export-stack-mode-map (let ((km (make-sparse-keymap))) (set-keymap-parent km tabulated-list-mode-map) - (define-key km " " 'next-line) - (define-key km "\C-n" 'next-line) - (define-key km [down] 'next-line) - (define-key km "\C-p" 'previous-line) - (define-key km "\C-?" 'previous-line) - (define-key km [up] 'previous-line) - (define-key km "C" 'org-export-stack-clear) - (define-key km "v" 'org-export-stack-view) - (define-key km (kbd "RET") 'org-export-stack-view) - (define-key km "d" 'org-export-stack-remove) + (define-key km " " #'next-line) + (define-key km "\C-n" #'next-line) + (define-key km [down] #'next-line) + (define-key km "\C-p" #'previous-line) + (define-key km "\C-?" #'previous-line) + (define-key km [up] #'previous-line) + (define-key km "C" #'org-export-stack-clear) + (define-key km "v" #'org-export-stack-view) + (define-key km (kbd "RET") #'org-export-stack-view) + (define-key km "d" #'org-export-stack-remove) km) "Keymap for Org Export Stack.") @@ -6706,7 +6786,7 @@ back to standard interface." ;; on the first key, if any. A nil value means KEY will ;; only be activated at first level. (if (or (eq access-key t) (eq access-key first-key)) - (propertize key 'face 'org-warning) + (propertize key 'face 'org-dispatcher-highlight) key))) (fontify-value (lambda (value) @@ -6725,16 +6805,16 @@ back to standard interface." (cond ((and (numberp key-a) (numberp key-b)) (< key-a key-b)) ((numberp key-b) t))))) - 'car-less-than-car)) + #'car-less-than-car)) ;; Compute a list of allowed keys based on the first key ;; pressed, if any. Some keys ;; (?^B, ?^V, ?^S, ?^F, ?^A, ?&, ?# and ?q) are always ;; available. (allowed-keys (nconc (list 2 22 19 6 1) - (if (not first-key) (org-uniquify (mapcar 'car entries)) + (if (not first-key) (org-uniquify (mapcar #'car entries)) (let (sub-menu) - (dolist (entry entries (sort (mapcar 'car sub-menu) '<)) + (dolist (entry entries (sort (mapcar #'car sub-menu) #'<)) (when (eq (car entry) first-key) (setq sub-menu (append (nth 2 entry) sub-menu)))))) (cond ((eq first-key ?P) (list ?f ?p ?x ?a)) |