[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[O] Fwd: property drawer search -- org-element-headline-parser
From: |
Keith David Bershatsky |
Subject: |
[O] Fwd: property drawer search -- org-element-headline-parser |
Date: |
Mon, 23 Dec 2013 22:17:49 -0800 |
Between the version 7.9.3f and 8.2.3a, the org team changed the property drawer
from lowercase to capital letters for the org-element-headline-parser -- this
resulted in several hours of lost time tracking down the issue. The issue is
now resolved -- I hope there was a good reason for changing it.
Keith
---------------------------------------
Begin forwarded message:
> From: Keith David Bershatsky <address@hidden>
> Date: December 23, 2013 6:46:57 PM PST
> To: address@hidden
> Subject: property drawer search -- org-element-headline-parser
>
> The property drawer search (which was working with Org version 7.9.3f) is no
> longer working with Org version 8.2.3a. The following 'example' function
> works correctly when using the prior version of org-element-headline-parser.
> Emacs Trunk (built today) comes with Org version 8.2.3a.
>
> (require 'org)
>
> (require 'org-element)
>
> (defun example ()
> "For this example to work, it will need to create a file --
> 'org-agenda-files'
> You may adjust the location of the file. The file will not be deleted
> automatically."
> (interactive)
> (let ((sample-todo (concat
> "** Active [#A] smith @ drawer-one (fishing) | drawer-two (tennis).
> :lawlist:\n"
> " DEADLINE: <2013-12-21 Sat 17:00> SCHEDULED: <2013-12-21 Sat>\n"
> " :PROPERTIES:\n"
> " :DRAWER-ONE: fishing\n"
> " :DRAWER-TWO: tennis\n"
> " :END:\n\n"
> "** Next-Action [#B] doe @ drawer-one (football) | drawer-two
> (bowling). :fred:\n"
> " DEADLINE: <2013-12-22 Sun 08:30> SCHEDULED: <2013-12-22 Sun>\n"
> " :PROPERTIES:\n"
> " :DRAWER-ONE: football\n"
> " :DRAWER-TWO: bowling\n"
> " :END:\n\n"
> "** Reference [#C] john @ drawer-one (fishing) | drawer-two
> (sky-diving). :george:\n"
> " DEADLINE: <2013-12-23 Mon 10:15> SCHEDULED: <2013-12-23 Mon>\n"
> " :PROPERTIES:\n"
> " :DRAWER-ONE: fishing\n"
> " :DRAWER-TWO: sky-diving\n"
> " :END:\n\n"
> "** Someday [#D] jane @ drawer-one (basket-ball) | drawer-two
> (bowling). :sam:\n"
> " DEADLINE: <2013-12-24 Tues 12:00> SCHEDULED: <2013-12-24 Tues>\n"
> " :PROPERTIES:\n"
> " :DRAWER-ONE: basket-ball\n"
> " :DRAWER-TWO: bowling\n"
> " :END:")))
> (if (get-buffer "foo.org")
> (progn
> (switch-to-buffer "foo.org")
> (erase-buffer)
> (delete-other-windows))
> (switch-to-buffer (get-buffer-create "foo.org")))
> (org-mode)
> (insert sample-todo)
> (goto-char (point-min))
> (or (y-or-n-p (format "For this example work, you must save this buffer
> as a file. Proceed with example?"))
> (error "Canceled."))
> (write-file "~/Desktop/foo.org" t)
> (let* (
> (display-buffer-alist nil) ;; lawlist custom setting
> (filename (buffer-file-name))
> (org-agenda-files (list filename))
> (org-agenda-only-exact-dates t)
> (org-agenda-show-all-dates nil)
> (org-deadline-warning-days 0)
> (org-agenda-time-grid nil)
> (org-agenda-span 'month)
> (org-agenda-entry-types '(:deadline))
> (month "12")
> (year "2013")
> (org-agenda-start-day (concat year "-" month "-" "01"))
> (drawer-content (read-string "basket-ball | bowling | fishing |
> football | sky-diving | tennis: " nil))
> (org-agenda-skip-function (lambda ()
> (org-back-to-heading t)
> (let* (
> (element (org-element-at-point))
> (drawer-one (org-element-property :drawer-one element))
> (drawer-two (org-element-property :drawer-two element)))
> (cond
> ((not (or
> (equal drawer-one drawer-content)
> (equal drawer-two drawer-content)))
> (message "drawer-one: %s" drawer-one)
> (message "drawer-two: %s" drawer-two)
> (org-end-of-subtree t))
> (t nil) )) )))
> (org-agenda-list)) ))
>
> (defalias 'org-element-headline-parser 'lawlist-org-element-headline-parser)
> (defun lawlist-org-element-headline-parser (limit &optional raw-secondary-p)
> "Parse an headline.
>
> Return a list whose CAR is `headline' and CDR is a plist
> containing `:raw-value', `:title', `:begin', `:end',
> `:pre-blank', `:hiddenp', `:contents-begin' and `:contents-end',
> `:level', `:priority', `:tags', `:todo-keyword',`:todo-type',
> `:scheduled', `:deadline', `:timestamp', `:clock', `:category',
> `:quotedp', `:archivedp', `:commentedp' and `:footnote-section-p'
> keywords.
>
> The plist also contains any property set in the property drawer,
> with its name in lowercase, the underscores replaced with hyphens
> and colons at the beginning (i.e. `:custom-id').
>
> When RAW-SECONDARY-P is non-nil, headline's title will not be
> parsed as a secondary string, but as a plain string instead.
>
> Assume point is at beginning of the headline."
> (save-excursion
> (let* ((components (org-heading-components))
> (level (nth 1 components))
> (todo (nth 2 components))
> (todo-type
> (and todo (if (member todo org-done-keywords) 'done 'todo)))
> (tags (let ((raw-tags (nth 5 components)))
> (and raw-tags (org-split-string raw-tags ":"))))
> (raw-value (or (nth 4 components) ""))
> (quotedp
> (let ((case-fold-search nil))
> (string-match (format "^%s\\( \\|$\\)" org-quote-string)
> raw-value)))
> (commentedp
> (let ((case-fold-search nil))
> (string-match (format "^%s\\( \\|$\\)" org-comment-string)
> raw-value)))
> (archivedp (member org-archive-tag tags))
> (footnote-section-p (and org-footnote-section
> (string= org-footnote-section raw-value)))
> ;; Normalize property names: ":SOME_PROP:" becomes
> ;; ":some-prop".
> (standard-props (let (plist)
> (mapc
> (lambda (p)
> (let ((p-name (downcase (car p))))
> (while (string-match "_" p-name)
> (setq p-name
> (replace-match "-" nil nil p-name)))
> (setq p-name (intern (concat ":" p-name)))
> (setq plist
> (plist-put plist p-name (cdr p)))))
> (org-entry-properties nil 'standard))
> plist))
> (time-props (org-entry-properties nil 'special "CLOCK"))
> (scheduled (cdr (assoc "SCHEDULED" time-props)))
> (deadline (cdr (assoc "DEADLINE" time-props)))
> (clock (cdr (assoc "CLOCK" time-props)))
> (timestamp (cdr (assoc "TIMESTAMP" time-props)))
> (begin (point))
> (end (save-excursion (goto-char (org-end-of-subtree t t))))
> (pos-after-head (progn (forward-line) (point)))
> (contents-begin (save-excursion
> (skip-chars-forward " \r\t\n" end)
> (and (/= (point) end) (line-beginning-position))))
> (hidden (org-invisible-p2))
> (contents-end (and contents-begin
> (progn (goto-char end)
> (skip-chars-backward " \r\t\n")
> (forward-line)
> (point)))))
> ;; Clean RAW-VALUE from any quote or comment string.
> (when (or quotedp commentedp)
> (let ((case-fold-search nil))
> (setq raw-value
> (replace-regexp-in-string
> (concat
> (regexp-opt (list org-quote-string org-comment-string))
> "\\(?: \\|$\\)")
> ""
> raw-value))))
> ;; Clean TAGS from archive tag, if any.
> (when archivedp (setq tags (delete org-archive-tag tags)))
> (let ((headline
> (list 'headline
> (nconc
> (list :raw-value raw-value
> :begin begin
> :end end
> :pre-blank
> (if (not contents-begin) 0
> (count-lines pos-after-head contents-begin))
> :hiddenp hidden
> :contents-begin contents-begin
> :contents-end contents-end
> :level level
> :priority (nth 3 components)
> :tags tags
> :todo-keyword todo
> :todo-type todo-type
> :scheduled scheduled
> :deadline deadline
> :timestamp timestamp
> :clock clock
> :post-blank (count-lines
> (if (not contents-end) pos-after-head
> (goto-char contents-end)
> (forward-line)
> (point))
> end)
> :footnote-section-p footnote-section-p
> :archivedp archivedp
> :commentedp commentedp
> :quotedp quotedp)
> standard-props))))
> (org-element-put-property
> headline :title
> (if raw-secondary-p raw-value
> (org-element-parse-secondary-string
> raw-value (org-element-restriction 'headline) headline)))))))
>
>
> Thanks,
>
> Keith