From 7becc742cd8050aeea2e797caee042a0af7d4aa4 Mon Sep 17 00:00:00 2001 From: Carsten Dominik Date: Tue, 1 Jul 2008 16:23:17 -0700 Subject: [PATCH] Time comparisons for property searches. --- ORGWEBPAGE/Changes.org | 39 ++++++++++++++++++++--- doc/org.texi | 70 +++++++++++++++++++++++++++--------------- lisp/ChangeLog | 10 ++++++ lisp/org.el | 44 ++++++++++++++++++++------ 4 files changed, 124 insertions(+), 39 deletions(-) diff --git a/ORGWEBPAGE/Changes.org b/ORGWEBPAGE/Changes.org index d337412aa..d5333db3d 100644 --- a/ORGWEBPAGE/Changes.org +++ b/ORGWEBPAGE/Changes.org @@ -18,14 +18,43 @@ ** Overview ** 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. +*** 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 "" (with time) and "" + (date only). + + This is based on a request by Manish. + *** Simplified way to specify file links In a link, you can now leave uout the "file:" prefix if you diff --git a/doc/org.texi b/doc/org.texi index aafc1a71e..c380534bf 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -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: @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 @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, and the allowed operators are @samp{<}, @samp{=}, @samp{>}, @samp{<=}, -@samp{>=}, and @samp{<>}. If the comparison value is enclosed in double -quotes, a string comparison is done, and the same operators are allowed. 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. 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, and a @samp{:With:} property that is matched by the regular expression -@samp{Sarah\|Denny}. +@samp{>=}, and @samp{<>}. +@item +If the comparison value is enclosed in double +quotes, a string comparison is done, and the same operators are allowed. +@item +If the comparison value is enclosed in double quotes @emph{and} angular +brackets (like @samp{DEADLINE<="<2008-12-24 18:30>"}), both values are +assumed to be date/time specifications in the standard Org way@footnote{The +only special values that will be recognized are @samp{""} for now, 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 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} @end example -The default style specification can be configured through the option -@code{org-export-html-style}. You can also just @emph{add} to the default -(instead of overwriting it) by using the option -@code{org-export-html-style-extra}. If you want to use a file-local style, -you may use file variables, best wrapped into a COMMENT section at the end of -the outline tree. For example@footnote{Under Emacs 21, the continuation -lines for a variable value should have no @samp{#} at the start of the -line.}: +Each exported files contains a compact default style that defines these +classes in a basic way. You may overwrite these settings, or add to them by +using the variables @code{org-export-html-style} (for Org-wide settings) and +@code{org-export-html-style-extra} (for more granular settings, like +file-local settings). If you want to use a file-local style, you may use +file variables, best wrapped into a COMMENT section at the end of the outline +tree. For example@footnote{Under Emacs 21, the continuation lines for a +variable value should have no @samp{#} at the start of the line.}: @example * COMMENT html style specifications # Local Variables: # org-export-html-style-extra: -# "p @{font-weight: normal; color: gray; @} -# h1 @{color: black; @}" +# "" # End: @end example -Remember to execute @kbd{M-x normal-mode} after changing this to make -the new style visible to Emacs. This command restarts Org mode for the -current buffer and forces Emacs to re-evaluate the local variables -section in the buffer. +Remember to execute @kbd{M-x normal-mode} after changing this to make the new +style immediately visible to Emacs. This command restarts Org mode for the +current buffer and forces Emacs to re-evaluate the local variables section in +the buffer. @c FIXME: More about header and footer styles @c FIXME: Talk about links and targets. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 35e69bb19..df6a0c0b2 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,13 @@ +2008-07-01 Carsten Dominik + + * 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 + + * org-exp.el (org-export-html-style-default): New constant. + 2008-06-29 Carsten Dominik * org-exp.el (org-export-html-style-extra): New variable. diff --git a/lisp/org.el b/lisp/org.el index daea7e7f0..cf05fde56 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -9441,8 +9441,10 @@ also TODO lines." cat-p (equal pn "CATEGORY") re-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)) - (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") (setq gv '(get-text-property (point) 'org-category)) (setq gv `(org-cached-entry-get nil ,pn))) @@ -9497,21 +9499,46 @@ also TODO lines." (cons match0 matcher))) (defun org-op-to-function (op &optional stringp) + "Turn an operator into the appropriate function." (setq op (cond - ((equal op "<" ) '(< string< )) - ((equal op ">" ) '(> org-string> )) - ((member op '("<=" "=<")) '(<= org-string<= )) - ((member op '(">=" "=>")) '(>= org-string>= )) - ((member op '("=" "==")) '(= string= )) - ((member op '("<>" "!=")) '(org<> org-string<> )))) - (nth (if stringp 1 0) op)) + ((equal op "<" ) '(< string< org-time<)) + ((equal op ">" ) '(> org-string> org-time>)) + ((member op '("<=" "=<")) '(<= org-string<= org-time<=)) + ((member op '(">=" "=>")) '(>= org-string>= org-time>=)) + ((member op '("=" "==")) '(= string= org-time=)) + ((member op '("<>" "!=")) '(org<> org-string<> org-time<>)))) + (nth (if (eq stringp 'time) 2 (if stringp 1 0)) op)) (defun org<> (a b) (not (= 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) (and (not (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 "") (float-time)) + ((equal s "") + (float-time (append '(0 0 0) (nthcdr 3 (decode-time))))) + (t (org-2ft s)))) (defun org-match-any-p (re 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 ;;; org.el ends here -