Time comparisons for property searches.

This commit is contained in:
Carsten Dominik 2008-07-01 16:23:17 -07:00
parent 507700505a
commit 7becc742cd
4 changed files with 124 additions and 39 deletions

View File

@ -18,14 +18,43 @@
** Overview ** Overview
** Details ** Details
*** New variable =org-export-html-style-extra= *** New setup for HTML style information
In order to create a more CSS-like setup of the HTML style
information, the following changes have been made:
- The default style has moved to a constant,
=org-export-html-style-default= and should not be changed
anymore.
- The default of the variable =org-export-html-style= is now
just the empty string. This variable should receive
settings that are Org-wide. When using org-publish, this
variable is associated with the =:style= property and can
be used to establish project-wide settings.
- There is a new variable =org-export-html-style-extra= that
should be used for file-local setings. Org-publish can, if
necessary, access this variable with the =:style-extra=
property.
- When a file is published, the values of
- org-export-html-style-default
- org-export-html-style
- org-export-html-style-extra
are all inserted into the HTML header, in the given
sequence.
This variable can be used to just /add/ to the default style
in =org-export-html-style=. So if you want only small
modifications to the default style, you no longer need to to
copy the entire default style to your customization.
This follows a proposal by Rustom Mody. This follows a proposal by Rustom Mody.
*** A way to compare times during a property search
If the comparison value in a property search is a string that
is enclosed in angular brackets, a time comparison will be
done. For example
: +DEADLINE>="<2008-12-24 15:20>"
looks for entries with a deadline on or after that time.
Special allowed values are "<now>" (with time) and "<today>"
(date only).
This is based on a request by Manish.
*** Simplified way to specify file links *** Simplified way to specify file links
In a link, you can now leave uout the "file:" prefix if you In a link, you can now leave uout the "file:" prefix if you

View File

@ -3757,22 +3757,40 @@ the same commands are used as for tag searches (@pxref{Tag searches}), and
the same logic applies. For example, here is a search string: the same logic applies. For example, here is a search string:
@example @example
+work-boss+PRIORITY="A"+Coffee="unlimited"+Effort<2+With=@{Sarah\|Denny@} +work-boss+PRIORITY="A"+Coffee="unlimited"+Effort<2 \
+With=@{Sarah\|Denny@}+SCHEDULED>="<2008-10-11>"
@end example @end example
@noindent @noindent
The type of comparison will depend on how the comparison value is written:
@itemize @minus
@item
If the comparison value is a plain number, a numerical comparison is done, If the comparison value is a plain number, a numerical comparison is done,
and the allowed operators are @samp{<}, @samp{=}, @samp{>}, @samp{<=}, and the allowed operators are @samp{<}, @samp{=}, @samp{>}, @samp{<=},
@samp{>=}, and @samp{<>}. If the comparison value is enclosed in double @samp{>=}, and @samp{<>}.
quotes, a string comparison is done, and the same operators are allowed. If @item
the comparison value is enclosed in curly braces, a regexp match is If the comparison value is enclosed in double
performed, with @samp{=} meaning that the regexp matches the property value, quotes, a string comparison is done, and the same operators are allowed.
and @samp{<>} meaning that it does not match. So the search string in the @item
example finds entries tagged @samp{:work:} but not @samp{:boss:}, which also If the comparison value is enclosed in double quotes @emph{and} angular
have a priority value @samp{A}, a @samp{:Coffee:} property with the value brackets (like @samp{DEADLINE<="<2008-12-24 18:30>"}), both values are
@samp{unlimited}, an @samp{Effort} property that is numerically smaller than assumed to be date/time specifications in the standard Org way@footnote{The
2, and a @samp{:With:} property that is matched by the regular expression only special values that will be recognized are @samp{"<now>"} for now, and
@samp{Sarah\|Denny}. @samp{"<today"} today at 0:00 hours, i.e. without a time specification.}, and
the comparison will be done accordingly.
@item
If the comparison value is enclosed
in curly braces, a regexp match is performed, with @samp{=} meaning that the
regexp matches the property value, and @samp{<>} meaning that it does not
match.
@end itemize
So the search string in the example finds entries tagged @samp{:work:} but
not @samp{:boss:}, which also have a priority value @samp{A}, a
@samp{:Coffee:} property with the value @samp{unlimited}, an @samp{Effort}
property that is numerically smaller than 2, a @samp{:With:} property that is
matched by the regular expression @samp{Sarah\|Denny}, and that are scheduled
on or after December 24, 2008.
You can configure Org mode to use property inheritance during a search, but You can configure Org mode to use property inheritance during a search, but
beware that this can slow down searches considerably. See @ref{Property beware that this can slow down searches considerably. See @ref{Property
@ -7344,29 +7362,31 @@ document - your style specifications may change these:
.target @r{target for links} .target @r{target for links}
@end example @end example
The default style specification can be configured through the option Each exported files contains a compact default style that defines these
@code{org-export-html-style}. You can also just @emph{add} to the default classes in a basic way. You may overwrite these settings, or add to them by
(instead of overwriting it) by using the option using the variables @code{org-export-html-style} (for Org-wide settings) and
@code{org-export-html-style-extra}. If you want to use a file-local style, @code{org-export-html-style-extra} (for more granular settings, like
you may use file variables, best wrapped into a COMMENT section at the end of file-local settings). If you want to use a file-local style, you may use
the outline tree. For example@footnote{Under Emacs 21, the continuation file variables, best wrapped into a COMMENT section at the end of the outline
lines for a variable value should have no @samp{#} at the start of the tree. For example@footnote{Under Emacs 21, the continuation lines for a
line.}: variable value should have no @samp{#} at the start of the line.}:
@example @example
* COMMENT html style specifications * COMMENT html style specifications
# Local Variables: # Local Variables:
# org-export-html-style-extra: # org-export-html-style-extra:
# "p @{font-weight: normal; color: gray; @} # "<style>
# h1 @{color: black; @}" # p @{font-weight: normal; color: gray; @}
# h1 @{color: black; @}
# </style>"
# End: # End:
@end example @end example
Remember to execute @kbd{M-x normal-mode} after changing this to make Remember to execute @kbd{M-x normal-mode} after changing this to make the new
the new style visible to Emacs. This command restarts Org mode for the style immediately visible to Emacs. This command restarts Org mode for the
current buffer and forces Emacs to re-evaluate the local variables current buffer and forces Emacs to re-evaluate the local variables section in
section in the buffer. the buffer.
@c FIXME: More about header and footer styles @c FIXME: More about header and footer styles
@c FIXME: Talk about links and targets. @c FIXME: Talk about links and targets.

View File

@ -1,3 +1,13 @@
2008-07-01 Carsten Dominik <dominik@science.uva.nl>
* org.el (org-time=, org-time<, org-time<=, org-time>)
(org-time>=, org-time<>, org-2ft): New functions.
(org-op-to-function): Also provide for the time testing fucntions.
2008-06-30 Carsten Dominik <dominik@science.uva.nl>
* org-exp.el (org-export-html-style-default): New constant.
2008-06-29 Carsten Dominik <dominik@science.uva.nl> 2008-06-29 Carsten Dominik <dominik@science.uva.nl>
* org-exp.el (org-export-html-style-extra): New variable. * org-exp.el (org-export-html-style-extra): New variable.

View File

@ -9441,8 +9441,10 @@ also TODO lines."
cat-p (equal pn "CATEGORY") cat-p (equal pn "CATEGORY")
re-p (equal (string-to-char pv) ?{) re-p (equal (string-to-char pv) ?{)
str-p (equal (string-to-char pv) ?\") str-p (equal (string-to-char pv) ?\")
time-p (save-match-data (string-match "^\"<.*>\"$" pv))
pv (if (or re-p str-p) (substring pv 1 -1) pv)) pv (if (or re-p str-p) (substring pv 1 -1) pv))
(setq po (org-op-to-function po str-p)) (if time-p (setq pv (org-matcher-time pv)))
(setq po (org-op-to-function po (if time-p 'time str-p)))
(if (equal pn "CATEGORY") (if (equal pn "CATEGORY")
(setq gv '(get-text-property (point) 'org-category)) (setq gv '(get-text-property (point) 'org-category))
(setq gv `(org-cached-entry-get nil ,pn))) (setq gv `(org-cached-entry-get nil ,pn)))
@ -9497,21 +9499,46 @@ also TODO lines."
(cons match0 matcher))) (cons match0 matcher)))
(defun org-op-to-function (op &optional stringp) (defun org-op-to-function (op &optional stringp)
"Turn an operator into the appropriate function."
(setq op (setq op
(cond (cond
((equal op "<" ) '(< string< )) ((equal op "<" ) '(< string< org-time<))
((equal op ">" ) '(> org-string> )) ((equal op ">" ) '(> org-string> org-time>))
((member op '("<=" "=<")) '(<= org-string<= )) ((member op '("<=" "=<")) '(<= org-string<= org-time<=))
((member op '(">=" "=>")) '(>= org-string>= )) ((member op '(">=" "=>")) '(>= org-string>= org-time>=))
((member op '("=" "==")) '(= string= )) ((member op '("=" "==")) '(= string= org-time=))
((member op '("<>" "!=")) '(org<> org-string<> )))) ((member op '("<>" "!=")) '(org<> org-string<> org-time<>))))
(nth (if stringp 1 0) op)) (nth (if (eq stringp 'time) 2 (if stringp 1 0)) op))
(defun org<> (a b) (not (= a b))) (defun org<> (a b) (not (= a b)))
(defun org-string<= (a b) (or (string= a b) (string< a b))) (defun org-string<= (a b) (or (string= a b) (string< a b)))
(defun org-string>= (a b) (not (string< a b))) (defun org-string>= (a b) (not (string< a b)))
(defun org-string> (a b) (and (not (string= a b)) (not (string< a b)))) (defun org-string> (a b) (and (not (string= a b)) (not (string< a b))))
(defun org-string<> (a b) (not (string= a b))) (defun org-string<> (a b) (not (string= a b)))
(defun org-time= (a b) (= (org-2ft a) (org-2ft b)))
(defun org-time< (a b) (< (org-2ft a) (org-2ft b)))
(defun org-time<= (a b) (<= (org-2ft a) (org-2ft b)))
(defun org-time> (a b) (> (org-2ft a) (org-2ft b)))
(defun org-time>= (a b) (>= (org-2ft a) (org-2ft b)))
(defun org-time<> (a b) (org<> (org-2ft a) (org-2ft b)))
(defun org-2ft (s)
"Convert S to a floating point time.
If S is already a number, just return it. If it is a string, parse
it as a time string and apply `float-time' to it. f S is nil, just return 0."
(cond
((numberp s) s)
((stringp s)
(condition-case nil
(float-time (apply 'encode-time (org-parse-time-string s)))
(error 0.)))
(t 0.)))
(defun org-matcher-time (s)
(cond
((equal s "<now>") (float-time))
((equal s "<today>")
(float-time (append '(0 0 0) (nthcdr 3 (decode-time)))))
(t (org-2ft s))))
(defun org-match-any-p (re list) (defun org-match-any-p (re list)
"Does re match any element of list?" "Does re match any element of list?"
@ -14539,4 +14566,3 @@ Still experimental, may disappear in the future."
;; arch-tag: e77da1a7-acc7-4336-b19e-efa25af3f9fd ;; arch-tag: e77da1a7-acc7-4336-b19e-efa25af3f9fd
;;; org.el ends here ;;; org.el ends here