Mercurial > addons > slrn-macros > slrn-unread-threads-macro
diff unread-threads.sl @ 0:4ec1eb102837
Initial revision
author | Guido Berhoerster <guido+slrn@berhoerster.name> |
---|---|
date | Sat, 14 Mar 2015 11:46:41 +0100 |
parents | |
children | e50b2ba42af7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/unread-threads.sl Sat Mar 14 11:46:41 2015 +0100 @@ -0,0 +1,110 @@ +% unread-threads.sl - display complete threads if they contain unread articles +% +% Copyright (C) 2009 Guido Berhoerster <guido+slrn@berhoerster.name> +% +% Permission is hereby granted, free of charge, to any person obtaining +% a copy of this software and associated documentation files (the +% "Software"), to deal in the Software without restriction, including +% without limitation the rights to use, copy, modify, merge, publish, +% distribute, sublicense, and/or sell copies of the Software, and to +% permit persons to whom the Software is furnished to do so, subject to +% the following conditions: +% +% The above copyright notice and this permission notice shall be included +% in all copies or substantial portions of the Software. +% +% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +% IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +% CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +% TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +% SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +% + +%open_log_file(make_home_filename("slrn-debug.log")); +%_traceback = 1; + +implements("UnreadThreads"); + +define select_group_unread_threads() +{ + variable msgid = NULL; + variable flags; + variable saved_header_flags = Assoc_Type[]; + variable saved_show_article = get_variable_value("show_article"); + + set_integer_variable("show_article", 0); + set_prefix_argument(4); + if (select_group() == -1) + return; + reset_prefix_arg(); + + uncollapse_threads(); + while (((msgid == NULL) && (not get_header_flags() & HEADER_READ)) || + header_next_unread()) + { + msgid = extract_article_header("Message-ID"); + ifnot (strlen(msgid)) + continue; + + % move on to next unread article if this thread has already been + % processed + if (assoc_key_exists(saved_header_flags, msgid)) + continue; + + % move to first article of the current thread + while (has_parent()) + () = header_up(1); + + % save the flags of each article in this thread in saved_header_flags + % and mark it unread + loop (thread_size()) + { + msgid = extract_article_header("Message-ID"); + saved_header_flags[msgid] = get_header_flags(); + call("undelete"); + } + + % move one article up since "undelete" except for the very last message + % moves one article down + ifnot (msgid == extract_article_header("Message-ID")) + () = header_up(1); + } + + % return if there are no unread articles + ifnot (length(saved_header_flags)) + { + collapse_threads(); + + % clear message area + message(""); + + return; + } + + % remove all read articles and restore flags for the remaining articles + call("expunge"); + foreach msgid, flags(saved_header_flags) using("keys", "values") + { + () = locate_header_by_msgid(msgid, 0); + set_header_flags(flags); + } + + % place cursor on first unread article + collapse_threads(); + call("header_bob"); + if (get_header_flags() & HEADER_READ) + header_next_unread(); + + % obey show_article setting + if (saved_show_article) + call("hide_article"); + set_integer_variable("show_article", saved_show_article); + + % clear message area + message(""); + + return; +} +