From 35c116e16b319354322318b8405e557a61da4459 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Thu, 17 Mar 2011 12:12:31 +0100 Subject: [PATCH] org-inlinetask: modify export of inline tasks * lisp/org-inlinetask.el (org-inlinetask-export-templates): fix default templates. (org-inlinetask-export-handler): Ensure contents of inline task, if any, starts and ends with a newline character. Refactor and comment code. --- lisp/org-inlinetask.el | 98 ++++++++++++++++++++++++++---------------------- 1 files changed, 53 insertions(+), 45 deletions(-) diff --git a/lisp/org-inlinetask.el b/lisp/org-inlinetask.el index 990a1ac..96809ce 100644 --- a/lisp/org-inlinetask.el +++ b/lisp/org-inlinetask.el @@ -107,12 +107,12 @@ When nil, they will not be exported." :type 'boolean) (defvar org-inlinetask-export-templates - '((html "
%s%s
\n%s\n
" + '((html "
%s%s
%s
" '((unless (eq todo "") (format "%s%s " class todo todo priority)) heading content)) - (latex "\\begin\{description\}\n\\item[%s%s]~\n%s\n\\end\{description\}" + (latex "\\begin\{description\}\n\\item[%s%s]~%s\\end\{description\}" '((unless (eq todo "") (format "\\textsc\{%s%s\} " todo priority)) heading content)) (ascii " -- %s%s%s" @@ -306,66 +306,74 @@ If the task has an end part, also demote it." "Handle headlines with level larger or equal to `org-inlinetask-min-level'. Either remove headline and meta data, or do special formatting." (goto-char (point-min)) - (let* ((nstars (if org-odd-levels-only - (1- (* 2 (or org-inlinetask-min-level 200))) - (or org-inlinetask-min-level 200))) - (re1 (format "^\\(\\*\\{%d,\\}\\)[ \t]+.*\n" nstars)) - (re2 (concat "^[ \t]*" org-keyword-time-regexp)) - headline beg end stars content) - (while (re-search-forward re1 nil t) - (setq headline (match-string 0) - stars (match-string 1) - content nil) - (replace-match "") - (while (looking-at re2) - (delete-region (point) (1+ (point-at-eol)))) - (while (looking-at org-drawer-regexp) - (setq beg (point)) - (if (re-search-forward org-property-end-re nil t) - (delete-region beg (1+ (match-end 0))))) - (setq beg (point)) - (when (and (re-search-forward "^\\(\\*+\\)[ \t]+" nil t) - (= (length (match-string 1)) (length stars)) - (progn (goto-char (match-end 0)) - (looking-at "END[ \t]*$"))) - (setq content (buffer-substring beg (1- (point-at-bol)))) - (delete-region beg (1+ (match-end 0)))) + (let* ((keywords-re (concat "^[ \t]*" org-keyword-time-regexp)) + (inline-re (concat (org-inlinetask-outline-regexp) ".*"))) + (while (re-search-forward inline-re nil t) + (let ((headline (match-string 0)) + (beg (point-at-bol)) + (end (copy-marker (save-excursion + (org-inlinetask-goto-end) (point)))) + content) + ;; Delete SCHEDULED, DEADLINE... + (while (re-search-forward keywords-re end t) + (delete-region (point-at-bol) (1+ (point-at-eol)))) + (goto-char beg) + ;; Delete drawers + (while (re-search-forward org-drawer-regexp end t) + (when (save-excursion (re-search-forward org-property-end-re nil t)) + (delete-region beg (1+ (match-end 0))))) + ;; Get CONTENT, if any. + (goto-char beg) + (forward-line 1) + (unless (= (point) end) + (setq content (buffer-substring (point) + (save-excursion (goto-char end) + (forward-line -1) + (point))))) + ;; Remove the task. (goto-char beg) + (delete-region beg end) (when org-inlinetask-export - ;; content formatting - (when content - (if (not (string-match "\\S-" content)) - (setq content nil) - (if (string-match "[ \t\n]+\\'" content) + ;; Format CONTENT, if appropriate. + (setq content + (if (not (and content (string-match "\\S-" content))) + "" + ;; Ensure CONTENT has minimal indentation, a single + ;; newline character at its boundaries, and isn't + ;; protected. + (when (string-match "`\\([ \t]*\n\\)+" content) + (setq content (substring content (match-end 0)))) + (when (string-match "[ \t\n]+\\'" content) (setq content (substring content 0 (match-beginning 0)))) - (setq content (org-remove-indentation content)))) - ;; Prevent from protecting content if there's any - (setq content (or (and content - (org-add-props content '(org-protected nil))) - "")) - ;; grab elements to export + (org-add-props (concat "\n" (org-remove-indentation content) "\n") + '(org-protected nil)))) (when (string-match org-complex-heading-regexp headline) - (let* ((todo (or (match-string 2 headline) "")) + (let* ((nil-to-str + (function + ;; Change nil arguments into empty strings. + (lambda (el) (or (eval el) "")))) + ;; Set up keywords provided to templates. + (todo (or (match-string 2 headline) "")) (class (or (and (eq "" todo) "") (if (member todo org-done-keywords) "done" "todo"))) (priority (or (match-string 3 headline) "")) (heading (or (match-string 4 headline) "")) (tags (or (match-string 5 headline) "")) - (backend-spec (assq org-export-current-backend + ;; Read `org-inlinetask-export-templates'. + (backend-spec (assq org-export-current-backend org-inlinetask-export-templates)) (format-str (org-add-props (nth 1 backend-spec) '(org-protected t))) (tokens (cadr (nth 2 backend-spec))) - (nil-to-str - ;; Change nil arguments into empty strings - (lambda (el) (or (eval el) ""))) - ;; Build and ensure export string will not break lists + ;; Build export string. Ensure it won't break + ;; surrounding lists by giving it arbitrary high + ;; indentation. (export-str (org-add-props (eval (append '(format format-str) (mapcar nil-to-str tokens))) '(original-indentation 1000)))) - ;; Eventually insert it - (insert export-str "\n"))))))) + (insert export-str) + (unless (bolp) (insert "\n"))))))))) (defun org-inlinetask-get-current-indentation () "Get the indentation of the last non-while line above this one." -- 1.7.4.1