1
0
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2025-01-05 11:45:52 +00:00

Fix the export of drawers

Exporting drawers was not really supported, now it is.
Drawers that are selected for export are formatted using the function
specified in the variable `org-export-format-drawer-function'.  If
that is nil, the default `org-export-format-drawer' will publish the
drawer as a colon example, i.e. verbatim and in fixed-width.
This commit is contained in:
Carsten Dominik 2009-11-11 19:14:43 +01:00
parent 5ac00be2c0
commit 49690e49ca
2 changed files with 61 additions and 27 deletions

View File

@ -1,5 +1,11 @@
2009-11-11 Carsten Dominik <carsten.dominik@gmail.com>
* org-exp.el (org-export-format-drawer-function): New variable.
(org-export-format-drawer): New function.
(org-export-preprocess-string): Pass the backend as a parameter to
`org-export-remove-or-extract-drawers'.
(org-export-remove-or-extract-drawers): New parameter BACKEND.
* org-protocol.el (org-protocol-char-to-string): New defsubst.
2009-11-10 Carsten Dominik <carsten.dominik@gmail.com>

View File

@ -1310,8 +1310,8 @@ on this string to produce the exported version."
(setq target-alist (org-export-define-heading-targets target-alist))
;; Get rid of drawers
(org-export-remove-or-extract-drawers drawers
(plist-get parameters :drawers))
(org-export-remove-or-extract-drawers
drawers (plist-get parameters :drawers) backend)
;; Get the correct stuff before the first headline
(when (plist-get parameters :skip-before-1st-heading)
@ -1535,33 +1535,61 @@ the current file."
(unless desc (insert "][" link))
(add-text-properties pos (point) props))))))
(defun org-export-remove-or-extract-drawers (all-drawers exp-drawers)
"Remove drawers, or extract the content.
(defun org-export-remove-or-extract-drawers (all-drawers exp-drawers backend)
"Remove drawers, or extract and format the content.
ALL-DRAWERS is a list of all drawer names valid in the current buffer.
EXP-DRAWERS can be t to keep all drawer contents, or a list of drawers
whose content to keep."
(unless (eq t exp-drawers)
(goto-char (point-min))
(let ((re (concat "^[ \t]*:\\("
(mapconcat
'identity
(org-delete-all exp-drawers
(copy-sequence all-drawers))
"\\|")
"\\):[ \t]*$"))
beg eol)
(while (re-search-forward re nil t)
(org-if-unprotected
(setq beg (match-beginning 0)
eol (match-end 0))
(if (re-search-forward "^\\([ \t]*:END:[ \t]*\n?\\)\\|^\\*+[ \t]"
nil t)
(if (match-end 1)
;; terminated in this entry
(progn
(delete-region beg (match-end 1))
(goto-char beg))
(goto-char eol))))))))
whose content to keep. Any drawers that are in ALL-DRAWERS but not in
EXP-DRAWERS will be removed.
BACKEND is the current export backend."
(goto-char (point-min))
(let ((re (concat "^[ \t]*:\\("
(mapconcat 'identity all-drawers "\\|")
"\\):[ \t]*$"))
name beg beg-content eol)
(while (re-search-forward re nil t)
(org-if-unprotected
(setq name (match-string 1))
(setq beg (match-beginning 0)
beg-content (1+ (point-at-eol))
eol (point-at-eol))
(if (not (and (re-search-forward
"^\\([ \t]*:END:[ \t]*\n?\\)\\|^\\*+[ \t]" nil t)
(match-end 1)))
(goto-char eol)
(goto-char (match-beginning 0))
(and (looking-at ".*\n?") (replace-match ""))
(setq content (buffer-substring beg-content (point)))
(delete-region beg (point))
(when (or (eq exp-drawers t)
(member name exp-drawers))
(setq content (funcall (or org-export-format-drawer-function
'org-export-format-drawer)
name content backend))
(insert content)))))))
(defvar org-export-format-drawer-function nil
"Function to be called to format the contents of a drawer.
The function must accept three parameters:
BACKEND one of the symbols html, docbook, latex, ascii, xoxo
NAME the drawer name, like \"PROPERIES\"
CONTENT the content of the drawer.
The function should return the text to be inserted into the buffer.
If this is nil, `org-export-format-drawer' is used as a default.")
(defun org-export-format-drawer (name content backend)
"Format the content of a drawer as a colon example."
(if (string-match "[ \t]+\\'" content)
(setq content (substring content (match-beginning 0))))
(while (string-match "\\`[ \t]*\n" content)
(steq content (substring content (match-end 0))))
(setq content (org-remove-indentation content))
(setq content (concat ": " (mapconcat 'identity
(org-split-string content "\n")
"\n: ")
"\n"))
(setq content (concat " : " (upcase name) "\n" content))
(org-add-props content nil 'org-protected t))
(defun org-export-handle-export-tags (select-tags exclude-tags)
"Modify the buffer, honoring SELECT-TAGS and EXCLUDE-TAGS.