emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[O] Extract item body with drawers/properties


From: Christopher J. White
Subject: [O] Extract item body with drawers/properties
Date: Sun, 06 May 2012 18:28:57 -0400
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:12.0) Gecko/20120428 Thunderbird/12.0.1

Hi Folks,

Is there a function to extract the body of an item minus all the auxiliary information?

* Item
  This is the text I want.
  And here is the second line.
  SCHEDULED: <2012-05-12>
  DEADLINE: <2012-05-13>
  :PROPERTIES:
  :foo: bar
  :END:
  And it's conceivable there is more below drawers...
** Sub-Item 1
** Sub-Item 2

Basically I want a function that does the following:

(org-entry-get-text)
"This is the text I want
And here is the second line.
And it's conceivable there is more below drawers..."

Point is at "* Item" when this is called.

For one project (org-toodledo), I coded a version (see below) that pulls out the drawers, drops properties SCHEDULED/DEADLINE/CLOSED, and pulls off any indentation, and it works pretty well, although it is probably not complete for all cases. However, I'm now working on extensions for another project (org-taskjuggler) and want to again pull out the note.

I tried again to find such a function in the org source files, but I just can't seem to find it.

Does it exist? If not, does it make sense to make my version below workable for org-mode developers in general?

(Related, what is the right term for this block of text? Note? Content? Text?)

Thanks
...cj

(defun org-toodledo-entry-note ()
  "Extract the note for this task."
  (save-excursion
    (org-back-to-heading t)
    (when (looking-at org-complex-heading-regexp)
      (goto-char (match-end 0))
      (let ((text (buffer-substring-no-properties
                   (point)
                   (if (re-search-forward org-complex-heading-regexp nil t)
                       (match-beginning 0)
                     (org-end-of-subtree t t)))))
        (with-temp-buffer
          (insert text)

          ;; Pull out DEADLINE / SCHEDULED / CLOSED fields
          (dolist (str (list (regexp-quote org-deadline-string)
                             (regexp-quote org-scheduled-string)
                             (regexp-quote org-closed-string)))
            (goto-char (point-min))
            (when (re-search-forward
                   (concat "\\<" str " +[<\[][^]>\n]+[]>][ \t]*") nil t)
              (replace-match "XXXX ")))

          ;; Drop any empty lines with only XXXX
          (goto-char (point-min))
          (while (re-search-forward "^ *\\(XXXX \\)+\n" nil t)
            (replace-match ""))

          ;; Drop any remaining XXXX
          (goto-char (point-min))
          (while (re-search-forward "XXXX " nil t)
            (replace-match ""))

;; org-export-remove-or-extract-drawers removed an argument sometime around version 7
          (if (>= (string-to-number org-version) 7)
              (org-export-remove-or-extract-drawers org-drawers nil)
            (org-export-remove-or-extract-drawers org-drawers nil nil))

;; Trim leading/trailing empty lines, but preserve whitepace at the beginning of the line
          (goto-char (point-min))
          (if (re-search-forward "\\=\\( *\n\\)+" nil t)
              (replace-match ""))

          (goto-char (point-min))
          (if (re-search-forward "\\( *\n\\)+\\'" nil t)
              (replace-match ""))

          (goto-char (point-max))
          (insert "\n")

;; Finally, if this was indented and indenting notes, remove indentation
          (when org-toodledo-indent-task-note
            (goto-char (point-min))
            (when (re-search-forward "^ +" nil t)
              (let ((str (match-string 0)))
                (goto-char (point-min))
                (while (re-search-forward (format "^%s" str) nil t)
                  (replace-match "")))))

          (let ((s (buffer-substring-no-properties (point-min)
                                                   (point-max))))
(if (string-match "\\(\\`[ \t]*[\n\r]+\\)+" s) (setq s (replace-match "" t t s))) (if (string-match "\\([\n\r]+[ \t]*\\)+\\'" s) (setq s (replace-match "" t t s)))
            s)
          )
        )
      )
    )
  )




reply via email to

[Prev in Thread] Current Thread [Next in Thread]