Make a new special property BLOCKED, indicating if entry is blocked

Requested by John Wiegley.
This commit is contained in:
Carsten Dominik 2009-12-17 10:55:53 +01:00
parent fc96f63056
commit b8e0d6fdb4
2 changed files with 62 additions and 22 deletions

View File

@ -1,5 +1,14 @@
2009-12-18 Carsten Dominik <carsten.dominik@gmail.com>
* org.el (org-all-time-keywords): New variable.
(org-set-regexps-and-options): Set `org-all-time-keywords'.
(org-entry-blocked-p): New function.
(org-special-properties): Add BLOCKED as a new special property.
(org-entry-properties): New optional argument SPECIFIC, only parse
for this property when it is specified.
(org-entry-get): Pass a SPECIFIC argument to
`org-entry-properties'.
* org-latex.el (org-export-as-latex): Preprocess TEXT as well.
2009-12-17 Carsten Dominik <carsten.dominik@gmail.com>

View File

@ -3702,6 +3702,9 @@ Also put tags into group 4 if tags are present.")
(defvar org-planning-or-clock-line-re nil
"Matches a line with planning or clock info.")
(make-variable-buffer-local 'org-planning-or-clock-line-re)
(defvar org-all-time-keywords nil
"List of time keywords.")
(make-variable-buffer-local 'org-all-time-keywords)
(defconst org-plain-time-of-day-regexp
(concat
@ -4074,6 +4077,10 @@ means to push this value onto the list in the variable.")
"\\|" org-deadline-string
"\\|" org-closed-string "\\|" org-clock-string
"\\)\\>\\)")
org-all-time-keywords
(mapcar (lambda (w) (substring w 0 -1))
(list org-scheduled-string org-deadline-string
org-clock-string org-closed-string))
)
(org-compute-latex-and-specials-regexp)
(org-set-font-lock-defaults))))
@ -10230,6 +10237,18 @@ changes because there are unchecked boxes in this entry."
(throw 'dont-block nil)))))
t)) ; do not block
(defun org-entry-blocked-p ()
"Is the current entry blocked?"
(if (org-entry-get nil "NOBLOCKING")
nil ;; Never block this entry
(not
(run-hook-with-args-until-failure
'org-blocker-hook
(list :type 'todo-state-change
:position (point)
:from 'todo
:to 'done)))))
(defun org-update-statistics-cookies (all)
"Update the statistics cookie, either from TODO or from checkboxes.
This should be called with the cursor in a line with a statistics cookie."
@ -12298,7 +12317,7 @@ a *different* entry, you cannot use these techniques."
(defconst org-special-properties
'("TODO" "TAGS" "ALLTAGS" "DEADLINE" "SCHEDULED" "CLOCK" "CLOSED" "PRIORITY"
"TIMESTAMP" "TIMESTAMP_IA")
"TIMESTAMP" "TIMESTAMP_IA" "BLOCKED")
"The special properties valid in Org-mode.
These are properties that are not defined in the property drawer,
@ -12432,7 +12451,7 @@ If the drawer does not exist and FORCE is non-nil, create the drawer."
(insert ":END:\n"))
(cons beg end)))))
(defun org-entry-properties (&optional pom which)
(defun org-entry-properties (&optional pom which specific)
"Get all properties of the entry at point-or-marker POM.
This includes the TODO keyword, the tags, time strings for deadline,
scheduled, and clocking, and any additional properties defined in the
@ -12440,7 +12459,10 @@ entry. The return value is an alist, keys may occur multiple times
if the property key was used several times.
POM may also be nil, in which case the current entry is used.
If WHICH is nil or `all', get all properties. If WHICH is
`special' or `standard', only get that subclass."
`special' or `standard', only get that subclass. If WHICH
is a string only get exactly this property. Specific can be a sting, the
specific property we are interested in. Specifying it can speed
things up because then unnecessary parsing is avoided."
(setq which (or which 'all))
(org-with-point-at pom
(let ((clockstr (substring org-clock-string 0 -1))
@ -12458,30 +12480,38 @@ If WHICH is nil or `all', get all properties. If WHICH is
(when (memq which '(all special))
;; Get the special properties, like TODO and tags
(goto-char beg)
(when (and (looking-at org-todo-line-regexp) (match-end 2))
(when (and (or (not specific) (string= specific "TODO"))
(looking-at org-todo-line-regexp) (match-end 2))
(push (cons "TODO" (org-match-string-no-properties 2)) props))
(when (looking-at org-priority-regexp)
(when (and (or (not specific) (string= specific "PRIORITY"))
(looking-at org-priority-regexp))
(push (cons "PRIORITY" (org-match-string-no-properties 2)) props))
(when (and (setq value (org-get-tags-string))
(when (and (or (not specific) (string= specific "TAGS"))
(setq value (org-get-tags-string))
(string-match "\\S-" value))
(push (cons "TAGS" value) props))
(when (setq value (org-get-tags-at))
(push (cons "ALLTAGS" (concat ":" (mapconcat 'identity value ":") ":"))
(when (and (or (not specific) (string= specific "TAGS"))
(setq value (org-get-tags-at)))
(push (cons "ALLTAGS" (concat ":" (mapconcat 'identity value ":")
":"))
props))
(while (re-search-forward org-maybe-keyword-time-regexp end t)
(setq key (if (match-end 1) (substring (org-match-string-no-properties 1) 0 -1))
string (if (equal key clockstr)
(org-no-properties
(org-trim
(when (or (not specific) (string= specific "TAGS"))
(push (cons "BLOCKED" (if (org-entry-blocked-p) "t" "")) props))
(when (or (not specific) (member specific org-all-time-keywords))
(while (re-search-forward org-maybe-keyword-time-regexp end t)
(setq key (if (match-end 1) (substring (org-match-string-no-properties 1) 0 -1))
string (if (equal key clockstr)
(org-no-properties
(org-trim
(buffer-substring
(match-beginning 3) (goto-char (point-at-eol)))))
(substring (org-match-string-no-properties 3) 1 -1)))
(unless key
(if (= (char-after (match-beginning 3)) ?\[)
(setq key "TIMESTAMP_IA")
(setq key "TIMESTAMP")))
(when (or (equal key clockstr) (not (assoc key props)))
(push (cons key string) props)))
(substring (org-match-string-no-properties 3) 1 -1)))
(unless key
(if (= (char-after (match-beginning 3)) ?\[)
(setq key "TIMESTAMP_IA")
(setq key "TIMESTAMP")))
(when (or (equal key clockstr) (not (assoc key props)))
(push (cons key string) props))))
)
@ -12523,8 +12553,9 @@ If the property is not present at all, nil is returned."
t))
(org-entry-get-with-inheritance property)
(if (member property org-special-properties)
;; We need a special property. Use brute force, get all properties.
(cdr (assoc property (org-entry-properties nil 'special)))
;; We need a special property. Use `org-entry-properties' to
;; retrieve it, but specify the wanted property
(cdr (assoc property (org-entry-properties nil 'special property)))
(let ((range (org-get-property-block)))
(if (and range
(goto-char (car range))