From 43df7bd75d887a04b9d1433a534b7fa77188663d Mon Sep 17 00:00:00 2001 From: wmorgan Date: Tue, 28 Nov 2006 22:10:56 +0000 Subject: [PATCH 1/1] moved evertying to devel git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@36 5c8cc53c-5e98-4d25-b20a-d8db53a31250 --- History.txt | 5 + LICENSE | 280 ++++++++++++++ Manifest.txt | 52 +++ README.txt | 119 ++++++ Rakefile | 45 +++ bin/sup | 229 ++++++++++++ bin/sup-import | 162 ++++++++ devel/count-loc.sh | 3 + devel/load-index.rb | 9 + devel/profile.rb | 12 + doc/FAQ.txt | 38 ++ doc/Philosophy.txt | 59 +++ doc/TODO | 31 ++ lib/sup.rb | 141 +++++++ lib/sup/account.rb | 53 +++ lib/sup/buffer.rb | 391 ++++++++++++++++++++ lib/sup/colormap.rb | 118 ++++++ lib/sup/contact.rb | 40 ++ lib/sup/draft.rb | 105 ++++++ lib/sup/index.rb | 353 ++++++++++++++++++ lib/sup/keymap.rb | 89 +++++ lib/sup/label.rb | 41 ++ lib/sup/logger.rb | 42 +++ lib/sup/mbox.rb | 51 +++ lib/sup/mbox/loader.rb | 116 ++++++ lib/sup/message.rb | 302 +++++++++++++++ lib/sup/mode.rb | 79 ++++ lib/sup/modes/buffer-list-mode.rb | 37 ++ lib/sup/modes/compose-mode.rb | 33 ++ lib/sup/modes/contact-list-mode.rb | 121 ++++++ lib/sup/modes/edit-message-mode.rb | 162 ++++++++ lib/sup/modes/forward-mode.rb | 38 ++ lib/sup/modes/help-mode.rb | 19 + lib/sup/modes/inbox-mode.rb | 45 +++ lib/sup/modes/label-list-mode.rb | 89 +++++ lib/sup/modes/label-search-results-mode.rb | 29 ++ lib/sup/modes/line-cursor-mode.rb | 133 +++++++ lib/sup/modes/log-mode.rb | 44 +++ lib/sup/modes/person-search-results-mode.rb | 29 ++ lib/sup/modes/poll-mode.rb | 24 ++ lib/sup/modes/reply-mode.rb | 136 +++++++ lib/sup/modes/resume-mode.rb | 18 + lib/sup/modes/scroll-mode.rb | 106 ++++++ lib/sup/modes/search-results-mode.rb | 31 ++ lib/sup/modes/text-mode.rb | 51 +++ lib/sup/modes/thread-index-mode.rb | 389 +++++++++++++++++++ lib/sup/modes/thread-view-mode.rb | 338 +++++++++++++++++ lib/sup/person.rb | 120 ++++++ lib/sup/poll.rb | 80 ++++ lib/sup/sent.rb | 46 +++ lib/sup/tagger.rb | 40 ++ lib/sup/textfield.rb | 83 +++++ lib/sup/thread.rb | 358 ++++++++++++++++++ lib/sup/update.rb | 21 ++ lib/sup/util.rb | 260 +++++++++++++ www/index.html | 63 ++++ www/ss1.png | Bin 0 -> 93669 bytes www/ss2.png | Bin 0 -> 38059 bytes www/ss3.png | Bin 0 -> 43946 bytes www/ss4.png | Bin 0 -> 65852 bytes www/ss5.png | Bin 0 -> 63085 bytes www/ss6.png | Bin 0 -> 30276 bytes 62 files changed, 5908 insertions(+) create mode 100644 History.txt create mode 100644 LICENSE create mode 100644 Manifest.txt create mode 100644 README.txt create mode 100644 Rakefile create mode 100644 bin/sup create mode 100644 bin/sup-import create mode 100644 devel/count-loc.sh create mode 100644 devel/load-index.rb create mode 100644 devel/profile.rb create mode 100644 doc/FAQ.txt create mode 100644 doc/Philosophy.txt create mode 100644 doc/TODO create mode 100644 lib/sup.rb create mode 100644 lib/sup/account.rb create mode 100644 lib/sup/buffer.rb create mode 100644 lib/sup/colormap.rb create mode 100644 lib/sup/contact.rb create mode 100644 lib/sup/draft.rb create mode 100644 lib/sup/index.rb create mode 100644 lib/sup/keymap.rb create mode 100644 lib/sup/label.rb create mode 100644 lib/sup/logger.rb create mode 100644 lib/sup/mbox.rb create mode 100644 lib/sup/mbox/loader.rb create mode 100644 lib/sup/message.rb create mode 100644 lib/sup/mode.rb create mode 100644 lib/sup/modes/buffer-list-mode.rb create mode 100644 lib/sup/modes/compose-mode.rb create mode 100644 lib/sup/modes/contact-list-mode.rb create mode 100644 lib/sup/modes/edit-message-mode.rb create mode 100644 lib/sup/modes/forward-mode.rb create mode 100644 lib/sup/modes/help-mode.rb create mode 100644 lib/sup/modes/inbox-mode.rb create mode 100644 lib/sup/modes/label-list-mode.rb create mode 100644 lib/sup/modes/label-search-results-mode.rb create mode 100644 lib/sup/modes/line-cursor-mode.rb create mode 100644 lib/sup/modes/log-mode.rb create mode 100644 lib/sup/modes/person-search-results-mode.rb create mode 100644 lib/sup/modes/poll-mode.rb create mode 100644 lib/sup/modes/reply-mode.rb create mode 100644 lib/sup/modes/resume-mode.rb create mode 100644 lib/sup/modes/scroll-mode.rb create mode 100644 lib/sup/modes/search-results-mode.rb create mode 100644 lib/sup/modes/text-mode.rb create mode 100644 lib/sup/modes/thread-index-mode.rb create mode 100644 lib/sup/modes/thread-view-mode.rb create mode 100644 lib/sup/person.rb create mode 100644 lib/sup/poll.rb create mode 100644 lib/sup/sent.rb create mode 100644 lib/sup/tagger.rb create mode 100644 lib/sup/textfield.rb create mode 100644 lib/sup/thread.rb create mode 100644 lib/sup/update.rb create mode 100644 lib/sup/util.rb create mode 100644 www/index.html create mode 100644 www/ss1.png create mode 100644 www/ss2.png create mode 100644 www/ss3.png create mode 100644 www/ss4.png create mode 100644 www/ss5.png create mode 100644 www/ss6.png diff --git a/History.txt b/History.txt new file mode 100644 index 0000000..1f59089 --- /dev/null +++ b/History.txt @@ -0,0 +1,5 @@ +== 0.0.1 / 2006-11-28 + +* Initial release. Unix-centrism, support for mbox only, no i18n. + Untested on anything other than 1.8.5. Other than that, works great! + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e37680c --- /dev/null +++ b/LICENSE @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/Manifest.txt b/Manifest.txt new file mode 100644 index 0000000..233b081 --- /dev/null +++ b/Manifest.txt @@ -0,0 +1,52 @@ +History.txt +Manifest.txt +README.txt +LICENSE +Rakefile +doc/FAQ.txt +doc/Philosophy.txt +doc/TODO +bin/sup +bin/sup-import +lib/sup/mbox/loader.rb +lib/sup/modes/line-cursor-mode.rb +lib/sup/modes/reply-mode.rb +lib/sup/modes/scroll-mode.rb +lib/sup/modes/resume-mode.rb +lib/sup/modes/contact-list-mode.rb +lib/sup/modes/forward-mode.rb +lib/sup/modes/label-search-results-mode.rb +lib/sup/modes/search-results-mode.rb +lib/sup/modes/compose-mode.rb +lib/sup/modes/poll-mode.rb +lib/sup/modes/edit-message-mode.rb +lib/sup/modes/thread-index-mode.rb +lib/sup/modes/person-search-results-mode.rb +lib/sup/modes/inbox-mode.rb +lib/sup/modes/thread-view-mode.rb +lib/sup/modes/log-mode.rb +lib/sup/modes/buffer-list-mode.rb +lib/sup/modes/text-mode.rb +lib/sup/modes/label-list-mode.rb +lib/sup/modes/help-mode.rb +lib/sup/logger.rb +lib/sup/util.rb +lib/sup/update.rb +lib/sup/label.rb +lib/sup/message.rb +lib/sup/mode.rb +lib/sup/keymap.rb +lib/sup/textfield.rb +lib/sup/contact.rb +lib/sup/account.rb +lib/sup/draft.rb +lib/sup/mbox.rb +lib/sup/poll.rb +lib/sup/person.rb +lib/sup/index.rb +lib/sup/thread.rb +lib/sup/buffer.rb +lib/sup/sent.rb +lib/sup/tagger.rb +lib/sup/colormap.rb +lib/sup.rb diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..419e16b --- /dev/null +++ b/README.txt @@ -0,0 +1,119 @@ +sup + by William Morgan + http://sup.rubyforge.org + +== DESCRIPTION: + +Sup is an attempt to take the UI innovations of web-based email +readers (ok, really just GMail) and to combine them with the +traditional wholesome goodness of a console-based email client. + +Sup is designed to work with massive amounts of email, potentially +spread out across different mbox files, IMAP folders, and GMail +accounts, and to pull them all together into a single interface. + +The goal of Sup is to become the email client of choice for nerds +everywhere. + +== FEATURES/PROBLEMS: + +Features: + +- Scalability to massive amounts of email. Immediate startup and + operability, regardless of how much amount of email you have. + (At least, once everything's been indexed.) + +- Immediate full-text search of your entire email archive, using + the full Ferret query langauge. Search over message bodies, labels, + from: and to: fields, or any combination thereof. + +- Thread-centrism. Operations are performed at the thread, not the + message level. Entire threads are manipulated and viewed (with + redundancies removed) at a time. + +- Labels over folders. Drop that tired old metaphor and you'll see how + much easier it is to organize email. + +- GMail-style thread management. Archive a thread, and it will + disappear from your inbox until someone replies. Kill a thread, and + it will never come back to your inbox. (But it will still show up in + searches, of course.) + +- Console based, so instantaneous response to interaction. No mouse + clicking required! + +- Programmability. It's in Ruby. The code is good. It's easy to + extend. + +- Multiple buffer support. Why be limited to viewing one thread at a + time? + +- Automatic context-sensitive help. + +- Message tagging and multi-message tagged operations. + +- Mutt-style MIME attachment viewing. + +Current limitations which will be fixed: + +- Support for mbox ONLY at this point. No support for POP, IMAP, and + GMail accounts. + +- No internationalization support. No wide characters, no subject + demangling. + +- No GMail-style filters. + +- Unix-centrism in MIME attachment handling. + +== SYNOPSYS: + + 1. sup-import + + 2. sup + 3. edit ~/.sup/config.yaml for the (very few) settings sup has + + sup-import has several options which control whether you want + messages from particular mailboxes not to be added to the inbox, + or not to be marked as new, so run it with -h for help. + + Note that Sup *never* changes the contents of any mailboxes. So it + shouldn't ever corrupt your mail. The flip side is that if you + change a mailbox (e.g. delete or read messages) then Sup may crash, + and will tell you to run sup-import --rebuild to recalculate the + offsets within the mailbox have changed. + +== REQUIREMENTS: + +* ferret >= 0.10.13 +* ncurses >= 0.9.1 +* rmail >= 0.17 + +== INSTALL: + +* gem install sup -y +* Then, in rmail, change line 159 of multipart.rb to: + chunk = chunk[0..start] + (Sorry. it's an unsupported package.) You might be able to get away + without doing this but if you get frozen string exceptions when + reading in multipart email messages, this is what you need to + change. + +== LICENSE: + +Copyright (c) 2006 William Morgan. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301, USA. + diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..c9bceea --- /dev/null +++ b/Rakefile @@ -0,0 +1,45 @@ +# -*- ruby -*- + +require 'rubygems' +require 'hoe' +require './lib/sup.rb' + +Hoe.new('sup', Redwood::VERSION) do |p| + p.rubyforge_name = 'sup' + p.author = "William Morgan" + p.summary = 'A console-based email client with the best features of GMail, mutt, and emacs. Features full text search, labels, tagged operations, multiple buffers, recent contacts, and more.' + p.description = p.paragraphs_of('README.txt', 2..4).join("\n\n") + p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[2].gsub(/^\s+/, "") + p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n") + p.email = "wmorgan-sup@masanjin.net" + p.extra_deps = [['ferret', '>= 0.10.13'], ['ncurses', '>= 0.9.1'], ['rmail', '>= 0.17']] +end + +rule 'ss?.png' => 'ss?-small.png' do |t| + +end + + +## is there really no way to make a rule for this? +WWW_FILES = %w(www/index.html README.txt doc/Philosophy.txt doc/FAQ.txt) + +SCREENSHOTS = FileList["www/ss?.png"] +SCREENSHOTS_SMALL = [] +SCREENSHOTS.each do |fn| + fn =~ /ss(\d+)\.png/ + sfn = "www/ss#{$1}-small.png" + file sfn => [fn] do |t| + sh "cat #{fn} | pngtopnm | pnmscale -xysize 320 240 | pnmtopng > #{sfn}" + end + SCREENSHOTS_SMALL << sfn +end + +task :upload_webpage => WWW_FILES do |t| + sh "scp -C #{t.prerequisites * ' '} wmorgan@rubyforge.org:/var/www/gforge-projects/sup/" +end + +task :upload_webpage_images => (SCREENSHOTS + SCREENSHOTS_SMALL) do |t| + sh "scp -C #{t.prerequisites * ' '} wmorgan@rubyforge.org:/var/www/gforge-projects/sup/" +end + +# vim: syntax=Ruby diff --git a/bin/sup b/bin/sup new file mode 100644 index 0000000..65dbaa3 --- /dev/null +++ b/bin/sup @@ -0,0 +1,229 @@ +#!/bin/env ruby + +require 'rubygems' +require 'ncurses' +require "sup" + +module Redwood + +$exception = nil + +global_keymap = Keymap.new do |k| + k.add :quit, "Quit Redwood", 'q' + k.add :help, "Show help", 'H', '?' + k.add :roll_buffers, "Switch to next buffer", 'b' + k.add :roll_buffers_backwards, "Switch to previous buffer", 'B' + k.add :kill_buffer, "Kill the current buffer", 'x' + k.add :list_buffers, "List all buffers", 'A' + k.add :list_contacts, "List contacts", 'C' + k.add :redraw, "Redraw screen", :ctrl_l + k.add :search, "Search messages", '/' + k.add :list_labels, "List labels", 'L' + k.add :poll, "Poll for new messages", 'P' + k.add :compose, "Compose new message", 'm' +end + +def start_cursing + Ncurses.initscr + Ncurses.noecho + Ncurses.cbreak + Ncurses.stdscr.keypad 1 + Ncurses.curs_set 0 + Ncurses.start_color +end + +def stop_cursing + Ncurses.curs_set 1 + Ncurses.echo + Ncurses.endwin +end +module_function :start_cursing, :stop_cursing + +Redwood::SentManager.new Redwood::SENT_FN +Redwood::ContactManager.new Redwood::CONTACT_FN +Redwood::LabelManager.new Redwood::LABEL_FN +Redwood::AccountManager.new $config[:accounts] +Redwood::DraftManager.new Redwood::DRAFT_DIR +Redwood::UpdateManager.new +Redwood::PollManager.new + +Index.new.load +log "loaded #{Index.size} messages from index" + +if(s = Index.source_for DraftManager.source_name) + DraftManager.source = s +else + Index.add_source DraftManager.new_source +end + +if(s = Index.source_for SentManager.source_name) + SentManager.source = s +else + Index.add_source SentManager.new_source +end + +begin + log "starting curses" + start_cursing + + log "initializing colormap" + Colormap.new do |c| + c.add :status_color, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLUE, Ncurses::A_BOLD + c.add :index_old_color, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK + c.add :index_new_color, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK, + Ncurses::A_BOLD + c.add :labellist_old_color, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK + c.add :labellist_new_color, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK, + Ncurses::A_BOLD + c.add :twiddle_color, Ncurses::COLOR_BLUE, Ncurses::COLOR_BLACK + c.add :label_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK + c.add :message_patina_color, Ncurses::COLOR_BLACK, Ncurses::COLOR_GREEN + c.add :mime_color, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK + c.add :quote_patina_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK + c.add :sig_patina_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK + c.add :quote_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK + c.add :sig_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK + c.add :to_me_color, Ncurses::COLOR_GREEN, Ncurses::COLOR_BLACK + c.add :starred_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK, + Ncurses::A_BOLD + c.add :starred_patina_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_GREEN, + Ncurses::A_BOLD + c.add :snippet_color, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK + c.add :option_color, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK + c.add :tagged_color, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK, + Ncurses::A_BOLD + c.add :draft_notification_color, Ncurses::COLOR_RED, Ncurses::COLOR_BLACK, + Ncurses::A_BOLD + end + + log "initializing buffer manager" + bm = BufferManager.new + + if Index.usual_sources.any? { |s| !s.done? } + log "polling for new mail" + pmode = PollMode.new + pbuf = bm.spawn "load new messages", pmode + pmode.poll +# sleep 1 +# bm.kill_buffer pbuf + end + + log "initializing mail index buffer" + imode = InboxMode.new + ibuf = bm.spawn "inbox", imode + + log "ready for (inter)action!" + Logger.make_buf + + bm.draw_screen + imode.load_more_threads ibuf.content_height + + until $exception + bm.draw_screen + c = Ncurses.nonblocking_getch + bm.erase_flash + + if c == Ncurses::KEY_RESIZE + bm.handle_resize + elsif c + unless bm.handle_input(c) + x = global_keymap.action_for c + case x + when :quit + break + when :help + curmode = bm.focus_buf.mode + bm.spawn_unless_exists("") { HelpMode.new curmode, global_keymap } + when :roll_buffers + bm.roll_buffers + when :roll_buffers_backwards + bm.roll_buffers_backwards + when :kill_buffer + bm.kill_buffer bm.focus_buf unless bm.focus_buf.mode.is_a? InboxMode + when :list_buffers + bm.spawn_unless_exists("Buffer List") { BufferListMode.new } + when :list_contacts + mode = ContactListMode.new + bm.spawn "compose to contacts", mode + when :search + text = bm.ask :search, "query: " + next unless text && text !~ /^\s*$/ + mode = SearchResultsMode.new text + short_text = + if text.length < 20 + text + else + text[0 ... 20] + "..." + end + bm.spawn "search: \"#{short_text}\"", mode + bm.draw_screen + mode.load_more_threads mode.buffer.content_height + when :list_labels + b = BufferManager.spawn_unless_exists("all labels") do + LabelListMode.new + end + b.mode.load_in_background + when :compose + mode = ComposeMode.new + bm.spawn "new message", mode + mode.edit + when :poll + b = BufferManager.spawn_unless_exists("load new messages") do + PollMode.new + end + b.mode.poll + when :nothing + when :redraw + bm.completely_redraw_screen + else + BufferManager.flash "Unknown key press '#{c.to_character}' for #{bm.focus_buf.mode.name}." + end + end + end + end + bm.kill_all_buffers + Redwood::LabelManager.save + Redwood::ContactManager.save +rescue Exception => e + $exception ||= e +ensure + stop_cursing +end + +Index.save unless $exception # TODO: think about this + +if $exception + if $exception.is_a? IndexError + $stderr.puts <* +where * is zero or more source descriptions (e.g., mbox +filenames on disk). + +If the sources listed are not already in the Sup source list, +they will be added to it, as parameterized by the following options: + --archive: messages from these sources will not appear in the inbox + --unusual: these sources will not be polled when the flag --the-usual + is called + +Regardless of whether the sources are new or not, they will be polled, +and any new messages will be added to the index, as parameterized by +the following options: + --force-archive: regardless of the source "archive" flag, any new + messages found will not appear in the inbox. + --force-read: any messages found will not be marked as new. + +The following options can also be specified: + --the-usual: import new messages from all usual sources + --rebuild: rebuild the index for the specified sources rather than + just adding new messages. Useful if the sources + have changed in any way *other* than new messages + being added. + --force-rebuild: force a rebuild of all messages in the inbox, not just + ones that have changed. You probably won't need this + unless William changes the index format. + --optimize: optimize the index after adding any new messages. + --help: don't do anything, just show this message. +EOS +#' stupid ruby-mode + exit +end + +educate_user if ARGV.member? '--help' + +archive = ARGV.delete "--archive" +unusual = ARGV.delete "--unusual" +force_archive = ARGV.delete "--force-archive" +force_read = ARGV.delete "--force-read" +the_usual = ARGV.delete "--the-usual" +rebuild = ARGV.delete "--rebuild" +force_rebuild = ARGV.delete "--force-rebuild" +optimize = ARGV.delete "--optimize" + +if(o = ARGV.find { |x| x =~ /^--/ }) + $stderr.puts "error: unknown option #{o}" + educate_user +end + +puts "loading index..." +index = Redwood::Index.new +index.load +pre_nm = index.size +puts "loaded index of #{index.size} messages" + +sources = ARGV.map do |fn| + source = index.source_for fn + unless source + source = Redwood::MBox::Loader.new(fn, 0, !unusual, !!archive) + index.add_source source + end + source +end +sources = (sources + index.usual_sources).uniq if the_usual +sources.each { |s| s.reset! } if rebuild || force_rebuild + +found = {} +start = Time.now +begin + sources.each do |source| + next if source.done? + puts "loading from #{source}... " + num = 0 + start_offset = nil + source.each do |offset, labels| + start_offset ||= offset + labels -= [:inbox] if force_archive + labels -= [:unread] if force_read + begin + m = Redwood::Message.new source, offset, labels + if found[m.id] + puts "skipping duplicate message #{m.id}" + next + else + found[m.id] = true + end + + m.remove_label :unread if m.mbox_status == "RO" unless force_read + if (rebuild || force_rebuild) && + (docid, entry = index.load_entry_for_id(m.id)) && entry + if force_rebuild || entry[:source_info].to_i != offset + puts "replacing message #{m.id} labels #{entry[:label].inspect} (offset #{entry[:source_info]} => #{offset})" + m.labels = entry[:label].split.map { |l| l.intern } + num += 1 if index.update_message m, source, offset + end + else + num += 1 if index.add_message m + end + rescue Redwood::MessageFormatError => e + $stderr.puts "ignoring erroneous message at #{source}##{offset}: #{e.message}" + end + if num % 1000 == 0 && num > 0 + elapsed = Time.now - start + pctdone = (offset.to_f - start_offset) / (source.total.to_f - start_offset) + remaining = (source.total.to_f - offset.to_f) * (elapsed.to_f / (offset.to_f - start_offset)) + puts "## #{num} (#{(pctdone * 100.0)}% done) read; #{elapsed.to_time_s} elapsed; est. #{remaining.to_time_s} remaining" + end + end + puts "loaded #{num} messages" unless num == 0 + end +ensure + index.save +end + +if rebuild || force_rebuild + puts "deleting missing messages from the index..." + numdel = 0 + sources.each do |source| + raise "no source id for #{source}" unless source.id + index.index.search_each("source_id:#{source.id}", :limit => :all) do |docid, score| + mid = index.index[docid][:message_id] + next if found[mid] + puts "deleting #{mid}" + index.index.delete docid + numdel += 1 + end + end + puts "deleted #{numdel} messages" +end + +if optimize + puts "optimizing index..." + optt = time { index.index.optimize } + puts "optimized index of size #{index.size} in #{optt}s." +end diff --git a/devel/count-loc.sh b/devel/count-loc.sh new file mode 100644 index 0000000..5ea1246 --- /dev/null +++ b/devel/count-loc.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +find . -type f -name \*.rb | xargs cat | grep -v "^ *$"|grep -v "^ *#"|grep -v "^ *end *$"|wc -l diff --git a/devel/load-index.rb b/devel/load-index.rb new file mode 100644 index 0000000..858c8b5 --- /dev/null +++ b/devel/load-index.rb @@ -0,0 +1,9 @@ +require 'sup' + +puts "loading index..." +@index = Redwood::Index.new +@index.load +@i = @index.index +puts "loaded index of #{@i.size} messages" + + diff --git a/devel/profile.rb b/devel/profile.rb new file mode 100644 index 0000000..67b6b08 --- /dev/null +++ b/devel/profile.rb @@ -0,0 +1,12 @@ +require 'rubygems' +require 'ruby-prof' +require "redwood" + +result = RubyProf.profile do + Redwood::ThreadSet.new(ARGV.map { |fn| Redwood::MBox::Scanner.new fn }).load_n_threads 100 +end + +printer = RubyProf::GraphHtmlPrinter.new(result) +File.open("profile.html", "w") { |f| printer.print(f, 1) } +puts "report in profile.html" + diff --git a/doc/FAQ.txt b/doc/FAQ.txt new file mode 100644 index 0000000..4e6324f --- /dev/null +++ b/doc/FAQ.txt @@ -0,0 +1,38 @@ +Sup FAQ +------- + +Q: How is Sup even possible? +A: Sup is only possible through the hard work of Dave Balmain, the + author of ferret. + + I started using Ferret when it was still slightly buggy, and it + seemed like every week Dave released a bugfix or a speed + improvement that directly affected sup. Ferret has become a + first-class piece of software, and it's almost entirely due to him. + It amazes me just how much time and effort he has put into it. + +Q: Why the console? +A: As the millions (ok, hundreds) of mutt users will tell you, there are + many advantages to the console: + - You don't need a bulky web browser. + - You can ssh and check your mail on another machine. + - Instantaneous interaction. + - A few keystrokes are worth a hundred mouse clicks. + +Q: If you love GMail so much, why not just use it? +A: I hate using a mouse, and I hate ads, and I hate non-programmability. + +Q: How does Sup deal with spam? +A: You can manually mark messages as spam, which prevents them from + showing up in future searches, but that's all that Sup does. Spam + filtering should be done by a dedicated tool like SpamAssassin. + +Q: What are all these "Redwood" references I see in the code? +A: That was Sup's original name. (Think pine, elm. Although I am a + Mutt user, I couldn't think of a good progression there.) But it was + taken by another project on RubyForge, and wasn't that original, + and was too long to type anyways. + + Maybe one day I'll do a huge search-and-replace on the code, but it + doesn't seem that important at this point. + diff --git a/doc/Philosophy.txt b/doc/Philosophy.txt new file mode 100644 index 0000000..9f35a58 --- /dev/null +++ b/doc/Philosophy.txt @@ -0,0 +1,59 @@ +Must an email client have a philosophy? I think so. For many people, +it is our primary means of communication. Something so important +should warrant a little thought. + +So here's Sup's philosophy. + +Using "traditional" email clients today is increasingly problematic. +Anyone who's on a high-traffic mailing list knows this. My ruby-talk +folder is 350 megs and Mutt sits there for 60 seconds while it opens +it. Keeping up with the all the new traffic is painful, even with +Mutt's excellent threading features, just because there's so much of +it. A single thread can span several pages. And Mutt is probably the +best email client out there in terms of threading and mailing list +support. + +The principle problem with traditional clients is that they place a +high mental cost on the user for each incoming email, by forcing them +to ask: + - Should I keep this email, or delete it? + - If I keep it, where should I file it? + +For example, I've spent the last 10 years of my life laboriously +hand-filing every email message I received and feeling a mild sense of +panic every time an email was both "from Mom" and "about school". The +massive amounts of email that many people receive, and the cheap cost +of storage, have made these questions both more costly and less useful +to answer. + +As a long-time Mutt user, when I watched people use GMail, I saw them +use email differently from how I had ever used it. I saw that making +certain operations quantitatively easier (namely, search) resulted in +a qualitative difference in usage (and for the better!). I saw that +thread-centrism had many advantages over message-centrism. + +So, in many ways, I believe GMail has taken the right approach to +handle both of the factors above, and much of the inspiration for Sup +was based on using GMail. Of course, I don't ultimately like using +GMail, which is why I created Sup in the first place. + +Sup is based on the following principles, which I learned from GMail: + +- An immediately accessible and fast search capability over the + entire email archive eliminates most of the need for folders, + and eliminates the necessity of having to ever delete email. + +- Labels eliminate the remaining need for folders. + +- A thread-centric approach to the UI is much more in line with how + people operate than dealing with individual messages is. A message + and its content deserve the same treatment in the vast majority + of cases. + +Sup is also based on many ideas from mutt (and Emacs and vi!), having +to do with the fantastic productivity of a console- and key-based +application, and the usefulness of multiple buffers, etc., and the +necessity of handling multiple email accounts, but these features form +less of the philosophy and more of the general usefulness of Sup. + + diff --git a/doc/TODO b/doc/TODO new file mode 100644 index 0000000..d24fc86 --- /dev/null +++ b/doc/TODO @@ -0,0 +1,31 @@ +forward attachments +tab completion on labels, contacts +within-buffer search +contact selector in edit-message-mode +undo +maybe: filters +maybe: rangefilter on the initial inbox to only consider the most recent 1000 messages +select all, starred, to me, etc +editing of arbitrary messages +annotations on messages + +x word wrap +x background indexing +x auto-insertion of draft messages +x drafts +x sent messages loader +x search: from +x contacts +x tagging for group operations +x view: starred, to me, etc +x pull in messages by subject as well in load_thread_for_ +x reply+compose+forward +x resize +x buffer respawns +x readline +x "loading" message +x search: body, to/from, tags (requires: readline) +x highlighting/different color stuff +x config: your email, sendmail, etc +x status: to/from_you, cc_you_others +x status: new/not, important diff --git a/lib/sup.rb b/lib/sup.rb new file mode 100644 index 0000000..819fae1 --- /dev/null +++ b/lib/sup.rb @@ -0,0 +1,141 @@ +require 'rubygems' +require 'yaml' +require 'zlib' +require 'thread' +require 'fileutils' +Thread.abort_on_exception = true # make debugging possible + +class Object + ## this is for debugging purposes because i keep calling nil.id and + ## i want it to throw an exception + def id + raise "wrong id called" + end +end + +module Redwood + VERSION = "0.0.1" + + BASE_DIR = File.join(ENV["HOME"], ".sup") + CONFIG_FN = File.join(BASE_DIR, "config.yaml") + SOURCE_FN = File.join(BASE_DIR, "sources.yaml") + LABEL_FN = File.join(BASE_DIR, "labels.txt") + CONTACT_FN = File.join(BASE_DIR, "contacts.txt") + DRAFT_DIR = File.join(BASE_DIR, "drafts") + SENT_FN = File.join(BASE_DIR, "sent.mbox") + + YAML_DOMAIN = "masanjin.net" + YAML_DATE = "2006-10-01" + +## one-stop shop for yamliciousness + + def register_yaml klass, props + vars = props.map { |p| "@#{p}" } + path = klass.name.gsub(/::/, "/") + + klass.instance_eval do + define_method(:to_yaml_properties) { vars } + define_method(:to_yaml_type) { "!#{YAML_DOMAIN},#{YAML_DATE}/#{path}" } + end + + YAML.add_domain_type("#{YAML_DOMAIN},#{YAML_DATE}", path) do |type, val| + klass.new(*props.map { |p| val[p] }) + end + end + + def save_yaml_obj object, fn, compress=false + if compress + Zlib::GzipWriter.open(fn) { |f| f.puts object.to_yaml } + else + File.open(fn, "w") { |f| f.puts object.to_yaml } + end + end + + def load_yaml_obj fn, compress=false + if File.exists? fn + if compress + Zlib::GzipReader.open(fn) { |f| YAML::load f } + else + YAML::load_file fn + end + end + end + + module_function :register_yaml, :save_yaml_obj, :load_yaml_obj +end + +## set up default configuration file + +if File.exists? Redwood::CONFIG_FN + $config = Redwood::load_yaml_obj Redwood::CONFIG_FN +else + $config = { + :accounts => { + :default => { + :name => "Your Name Here", + :email => "your.email.here@domain.tld", + :alternates => [], + :sendmail => "/usr/sbin/sendmail -oem -ti", + :sig_file => File.join(ENV["HOME"], ".signature") + } + }, + :editor => ENV["EDITOR"] || "/usr/bin/vi", + } + begin + FileUtils.mkdir_p Redwood::BASE_DIR + Redwood::save_yaml_obj $config, Redwood::CONFIG_FN + rescue StandardError => e + $stderr.puts "warning: #{e.message}" + end +end + +require "sup/util" +require "sup/update" +require "sup/message" +require "sup/mbox" +require "sup/person" +require "sup/account" +require "sup/thread" +require "sup/index" +require "sup/textfield" +require "sup/buffer" +require "sup/keymap" +require "sup/mode" +require "sup/colormap" +require "sup/label" +require "sup/contact" +require "sup/tagger" +require "sup/draft" +require "sup/poll" +require "sup/modes/scroll-mode" +require "sup/modes/text-mode" +require "sup/modes/line-cursor-mode" +require "sup/modes/help-mode" +require "sup/modes/edit-message-mode" +require "sup/modes/compose-mode" +require "sup/modes/resume-mode" +require "sup/modes/forward-mode" +require "sup/modes/reply-mode" +require "sup/modes/label-list-mode" +require "sup/modes/contact-list-mode" +require "sup/modes/thread-view-mode" +require "sup/modes/thread-index-mode" +require "sup/modes/label-search-results-mode" +require "sup/modes/search-results-mode" +require "sup/modes/person-search-results-mode" +require "sup/modes/inbox-mode" +require "sup/modes/buffer-list-mode" +require "sup/modes/log-mode" +require "sup/modes/poll-mode" +require "sup/logger" +require "sup/sent" + +module Redwood + def log s; Logger.log s; end + module_function :log +end + +$:.each do |base| + d = File.join base, "sup/share/modes/" + Redwood::Mode.load_all_modes d if File.directory? d +end diff --git a/lib/sup/account.rb b/lib/sup/account.rb new file mode 100644 index 0000000..adb7649 --- /dev/null +++ b/lib/sup/account.rb @@ -0,0 +1,53 @@ +module Redwood + +class Account < Person + attr_accessor :sendmail, :sig_file + + def initialize h + super h[:name], h[:email] + @sendmail = h[:sendmail] + @sig_file = h[:signature] + end +end + +class AccountManager + include Singleton + + attr_accessor :default_account + + def initialize accounts + @email_map = {} + @alternate_map = {} + @accounts = {} + @default_account = nil + + accounts.each { |k, v| add_account v, k == :default } + + self.class.i_am_the_instance self + end + + def user_accounts; @accounts.keys; end + def user_emails; (@email_map.keys + @alternate_map.keys).uniq.select { |e| String === e }; end + + def add_account hash, default=false + email = hash[:email] + + next if @email_map.member? email + a = Account.new hash + @accounts[a] = true + @email_map[email] = a + hash[:alternates].each { |aa| @alternate_map[aa] = a } + if default + raise ArgumentError, "multiple default accounts" if @default_account + @default_account = a + end + end + + def is_account? p; @accounts.member? p; end + def account_for email + @email_map[email] || @alternate_map[email] || @alternate_map.argfind { |k, v| k === email && v } + end + def is_account_email? email; !account_for(email).nil?; end +end + +end diff --git a/lib/sup/buffer.rb b/lib/sup/buffer.rb new file mode 100644 index 0000000..60404f7 --- /dev/null +++ b/lib/sup/buffer.rb @@ -0,0 +1,391 @@ +require 'thread' + +module Ncurses + def rows + lame, lamer = [], [] + stdscr.getmaxyx lame, lamer + lame.first + end + + def cols + lame, lamer = [], [] + stdscr.getmaxyx lame, lamer + lamer.first + end + + ## aaahhh, user input. who would have though that such a simple + ## idea would be SO FUCKING COMPLICATED?! because apparently + ## Ncurses.getch (and Curses.getch), even in cbreak mode, BLOCKS + ## ALL THREAD ACTIVITY. as in, no threads anywhere will run while + ## it's waiting for input. ok, fine, so we wrap it in a select. Of + ## course we also rely on Ncurses.getch to tell us when an xterm + ## resize has occurred, which select won't catch, so we won't + ## resize outselves after a sigwinch until the user hits a key. + ## and installing our own sigwinch handler means that the screen + ## size returned by getmaxyx() DOESN'T UPDATE! and Kernel#trap + ## RETURNS NIL as the previous handler! + ## + ## so basically, resizing with multi-threaded ruby Ncurses + ## applications will always be broken. + ## + ## i've coined a new word for this: lametarded. + def nonblocking_getch + if IO.select([$stdin], nil, nil, nil) + Ncurses.getch + else + nil + end + end + + module_function :rows, :cols, :nonblocking_getch + + KEY_CANCEL = "\a"[0] # ctrl-g +end + +module Redwood + +class Buffer + attr_reader :mode, :x, :y, :width, :height, :title + bool_reader :dirty + + def initialize window, mode, width, height, opts={} + @w = window + @mode = mode + @dirty = true + @focus = false + @title = opts[:title] || "" + @x, @y, @width, @height = 0, 0, width, height + end + + def content_height; @height - 1; end + def content_width; @width; end + + def resize rows, cols + @width = cols + @height = rows + mode.resize rows, cols + end + + def redraw + draw if @dirty + draw_status + commit + end + def mark_dirty; @dirty = true; end + + def commit + @dirty = false + @w.noutrefresh + end + + def draw + @mode.draw + draw_status + commit + end + + ## s nil means a blank line! + def write y, x, s, opts={} + return if x >= @width || y >= @height + + @w.attrset Colormap.color_for(opts[:color] || :none, opts[:highlight]) + s ||= "" + maxl = @width - x + @w.mvaddstr y, x, s[0 ... maxl] + unless s.length >= maxl || opts[:no_fill] + @w.mvaddstr(y, x + s.length, " " * (maxl - s.length)) + end + end + + def clear + @w.clear + end + + def draw_status + write @height - 1, 0, " [#{mode.name}] #{title} #{mode.status}", + :color => :status_color + end + + def focus + @focus = true + @dirty = true + @mode.focus + end + + def blur + @focus = false + @dirty = true + @mode.blur + end +end + +class BufferManager + include Singleton + + attr_reader :focus_buf + + def initialize + @name_map = {} + @buffers = [] + @focus_buf = nil + @dirty = true + @minibuf_stack = [] + @textfields = {} + @flash = nil + @shelled_out = false + + self.class.i_am_the_instance self + end + + def buffers; @name_map.to_a; end + + def focus_on buf + raise ArgumentError, "buffer not on stack: #{buf.inspect}" unless + @buffers.member? buf + return if buf == @focus_buf + @focus_buf.blur if @focus_buf + @focus_buf = buf + @focus_buf.focus + end + + def raise_to_front buf + raise ArgumentError, "buffer not on stack: #{buf.inspect}" unless + @buffers.member? buf + @buffers.delete buf + @buffers.push buf + focus_on buf + @dirty = true + end + + def roll_buffers + raise_to_front @buffers.first + end + + def roll_buffers_backwards + return unless @buffers.length > 1 + raise_to_front @buffers[@buffers.length - 2] + end + + def handle_input c + @focus_buf && @focus_buf.mode.handle_input(c) + end + + def exists? n; @name_map.member? n; end + def [] n; @name_map[n]; end + def []= n, b + raise ArgumentError, "duplicate buffer name" if b && @name_map.member?(n) + @name_map[n] = b + end + + def completely_redraw_screen + return if @shelled_out + Ncurses.clear + @dirty = true + draw_screen + end + + def handle_resize + return if @shelled_out + rows, cols = Ncurses.rows, Ncurses.cols + @buffers.each { |b| b.resize rows - 1, cols } + completely_redraw_screen + flash "resized to #{rows}x#{cols}" + end + + def draw_screen skip_minibuf=false + return if @shelled_out + + ## disabling this for the time being, to help with debugging + ## (currently we only have one buffer visible at a time). + ## TODO: reenable this if we allow multiple buffers + false && @buffers.inject(@dirty) do |dirty, buf| + dirty ? buf.draw : buf.redraw + dirty || buf.dirty? + end + ## quick hack + true && (@dirty ? @buffers.last.draw : @buffers.last.redraw) + + draw_minibuf unless skip_minibuf + @dirty = false + Ncurses.doupdate + end + + ## gets the mode from the block, which is only called if the buffer + ## doesn't already exist. this is useful in the case that generating + ## the mode is expensive, as it often is. + def spawn_unless_exists title, opts={} + if @name_map.member? title + Redwood::log "buffer '#{title}' already exists, raising to front" + raise_to_front @name_map[title] + else + mode = yield + spawn title, mode, opts + end + @name_map[title] + end + + def spawn title, mode, opts={} + realtitle = title + num = 2 + while @name_map.member? realtitle + realtitle = "#{title} #{num}" + num += 1 + end + + Redwood::log "spawning buffer \"#{realtitle}\"" + width = opts[:width] || Ncurses.cols + height = opts[:height] || Ncurses.rows - 1 + + ## since we are currently only doing multiple full-screen modes, + ## use stdscr for each window. once we become more sophisticated, + ## we may need to use a new Ncurses::WINDOW + ## + ## w = Ncurses::WINDOW.new(height, width, (opts[:top] || 0), + ## (opts[:left] || 0)) + w = Ncurses.stdscr + raise "nil window" unless w + + b = Buffer.new w, mode, width, height, :title => realtitle + mode.buffer = b + @name_map[realtitle] = b + if opts[:hidden] + @buffers.unshift b + focus_on b unless @focus_buf + else + @buffers.push b + raise_to_front b + end + b + end + + def kill_all_buffers + kill_buffer @buffers.first until @buffers.empty? + end + + def kill_buffer buf + raise ArgumentError, "buffer not on stack: #{buf.inspect}" unless @buffers.member? buf + Redwood::log "killing buffer \"#{buf.title}\"" + + buf.mode.cleanup + @buffers.delete buf + @name_map.delete buf.title + @focus_buf = nil if @focus_buf == buf + if @buffers.empty? + ## TODO: something intelligent here + ## for now I will simply prohibit killing the inbox buffer. + else + raise_to_front @buffers.last + end + end + + def ask domain, question, default=nil + @textfields[domain] ||= TextField.new Ncurses.stdscr, Ncurses.rows - 1, 0, + Ncurses.cols + tf = @textfields[domain] + + ## this goddamn ncurses form shit is a fucking 1970's + ## nightmare. jesus christ. the exact sequence of ncurses events + ## that needs to happen in order to display a form and have the + ## entire screen not disappear and have the cursor in the right + ## place is TOO FUCKING COMPLICATED. + tf.activate question, default + @dirty = true + draw_screen true + tf.position_cursor + Ncurses.refresh + + ret = nil + while tf.handle_input(Ncurses.nonblocking_getch); end + + ret = tf.value + tf.deactivate + @dirty = true + + ret + end + + ## some pretty lame code in here! + def ask_getch question, accept=nil + accept = accept.split(//).map { |x| x[0] } if accept + + flash question + Ncurses.curs_set 1 + Ncurses.move Ncurses.rows - 1, question.length + 1 + Ncurses.refresh + + ret = nil + done = false + until done + key = Ncurses.nonblocking_getch + if key == Ncurses::KEY_CANCEL + done = true + elsif (accept && accept.member?(key)) || !accept + ret = key + done = true + end + end + + Ncurses.curs_set 0 + erase_flash + draw_screen + Ncurses.curs_set 0 + + ret + end + + def ask_yes_or_no question + [?y, ?Y].member? ask_getch(question, "ynYN") + end + + def draw_minibuf + s = @flash || @minibuf_stack.reverse.find { |x| x } || "" + + Ncurses.attrset Colormap.color_for(:none) + Ncurses.mvaddstr Ncurses.rows - 1, 0, s + (" " * [Ncurses.cols - s.length, + 0].max) + end + + def say s, id=nil + id ||= @minibuf_stack.length + @minibuf_stack[id] = s + unless @shelled_out + draw_minibuf + Ncurses.refresh + end + id + end + + def erase_flash; @flash = nil; end + + def flash s + @flash = s + unless @shelled_out + draw_minibuf + Ncurses.refresh + end + end + + def clear id + @minibuf_stack[id] = nil + if id == @minibuf_stack.length - 1 + id.downto(0) do |i| + break unless @minibuf_stack[i].nil? + @minibuf_stack.delete_at i + end + end + unless @shelled_out + draw_minibuf + Ncurses.refresh + end + end + + def shell_out command + @shelled_out = true + Ncurses.endwin + system command + Ncurses.refresh + Ncurses.curs_set 0 + @shelled_out = false + end +end +end diff --git a/lib/sup/colormap.rb b/lib/sup/colormap.rb new file mode 100644 index 0000000..d13e86c --- /dev/null +++ b/lib/sup/colormap.rb @@ -0,0 +1,118 @@ +require "curses" + +module Redwood + +class Colormap + @@instance = nil + + CURSES_COLORS = [Curses::COLOR_BLACK, Curses::COLOR_RED, Curses::COLOR_GREEN, + Curses::COLOR_YELLOW, Curses::COLOR_BLUE, + Curses::COLOR_MAGENTA, Curses::COLOR_CYAN, + Curses::COLOR_WHITE] + NUM_COLORS = 15 + + def initialize + raise "only one instance can be created" if @@instance + @@instance = self + @entries = {} + @color_pairs = {[Curses::COLOR_WHITE, Curses::COLOR_BLACK] => 0} + @users = [] + @next_id = 0 + yield self if block_given? + @entries[highlight_sym(:none)] = highlight_for(Curses::COLOR_WHITE, + Curses::COLOR_BLACK, + []) + [nil] + end + + def add sym, fg, bg, *attrs + raise ArgumentError, "color for #{sym} already defined" if + @entries.member? sym + raise ArgumentError, "color '#{fg}' unknown" unless CURSES_COLORS.include? fg + raise ArgumentError, "color '#{bg}' unknown" unless CURSES_COLORS.include? bg + + @entries[sym] = [fg, bg, attrs, nil] + @entries[highlight_sym(sym)] = highlight_for(fg, bg, attrs) + [nil] + end + + def highlight_sym sym + "#{sym}_highlight".intern + end + + def highlight_for fg, bg, attrs + hfg = + case fg + when Curses::COLOR_BLUE + Curses::COLOR_WHITE + when Curses::COLOR_YELLOW, Curses::COLOR_GREEN + fg + else + Curses::COLOR_BLACK + end + + hbg = + case bg + when Curses::COLOR_CYAN + Curses::COLOR_YELLOW + else + Curses::COLOR_CYAN + end + + attrs = + if fg == Curses::COLOR_WHITE && attrs.include?(Curses::A_BOLD) + [Curses::A_BOLD] + else + case hfg + when Curses::COLOR_BLACK + [] + else + [Curses::A_BOLD] + end + end + [hfg, hbg, attrs] + end + + def color_for sym, highlight=false + sym = highlight_sym(sym) if highlight + return Curses::COLOR_BLACK if sym == :none + raise ArgumentError, "undefined color #{sym}" unless @entries.member? sym + + ## if this color is cached, return it + fg, bg, attrs, color = @entries[sym] + return color if color + + if(cp = @color_pairs[[fg, bg]]) + ## nothing + else ## need to get a new colorpair + @next_id = (@next_id + 1) % NUM_COLORS + @next_id += 1 if @next_id == 0 # 0 is always white on black + id = @next_id + Redwood::log "colormap: for color #{sym}, using id #{id} -> #{fg}, #{bg}" + Curses.init_pair id, fg, bg or raise ArgumentError, + "couldn't initialize curses color pair #{fg}, #{bg} (key #{id})" + + cp = @color_pairs[[fg, bg]] = Curses.color_pair(id) + ## delete the old mapping, if it exists + if @users[cp] + @users[cp].each do |usym| + Redwood::log "dropping color #{usym} (#{id})" + @entries[usym][3] = nil + end + @users[cp] = [] + end + end + + ## by now we have a color pair + color = attrs.inject(cp) { |color, attr| color | attr } + @entries[sym][3] = color # fill the cache + (@users[cp] ||= []) << sym # record entry as a user of that color pair + color + end + + def self.instance; @@instance; end + def self.method_missing meth, *a + Colorcolors.new unless @@instance + @@instance.send meth, *a + end +end + +end diff --git a/lib/sup/contact.rb b/lib/sup/contact.rb new file mode 100644 index 0000000..715497b --- /dev/null +++ b/lib/sup/contact.rb @@ -0,0 +1,40 @@ +module Redwood + +class ContactManager + include Singleton + + def initialize fn + @fn = fn + @people = {} + + if File.exists? fn + IO.foreach(fn) do |l| + l =~ /^(\S+): (.*)$/ or raise "can't parse #{fn} line #{l.inspect}" + aalias, addr = $1, $2 + @people[aalias] = Person.for addr + end + end + + self.class.i_am_the_instance self + end + + def contacts; @people; end + def set_contact person, aalias + oldentry = @people.find { |a, p| p == person } + @people.delete oldentry.first if oldentry + @people[aalias] = person + end + def drop_contact person; @people.delete person; end + def delete t; @people.delete t; end + def resolve aalias; @people[aalias]; end + + def save + File.open(@fn, "w") do |f| + @people.keys.sort.each do |aalias| + f.puts "#{aalias}: #{@people[aalias].full_address}" + end + end + end +end + +end diff --git a/lib/sup/draft.rb b/lib/sup/draft.rb new file mode 100644 index 0000000..12233f3 --- /dev/null +++ b/lib/sup/draft.rb @@ -0,0 +1,105 @@ +module Redwood + +class DraftManager + include Singleton + + attr_accessor :source + def initialize dir + @dir = dir + @source = nil + self.class.i_am_the_instance self + end + + def self.source_name; "drafts"; end + def self.source_id; 9999; end + def new_source; @source = DraftLoader.new @dir; end + + def write_draft + offset = @source.gen_offset + fn = @source.fn_for_offset offset + File.open(fn, "w") { |f| yield f } + + @source.each do |offset, labels| + m = Message.new @source, offset, labels + Index.add_message m + UpdateManager.relay :add, m + end + end + + def discard mid + docid, entry = Index.load_entry_for_id mid + raise ArgumentError, "can't find entry for draft: #{mid.inspect}" unless entry + raise ArgumentError, "not a draft: source id #{entry[:source_id].inspect}, should be #{DraftManager.source_id.inspect} for #{mid.inspect} / docno #{docid}" unless entry[:source_id].to_i == DraftManager.source_id + Index.drop_entry docid + File.delete @source.fn_for_offset(entry[:source_info]) + UpdateManager.relay :delete, mid + end +end + +class DraftLoader + attr_accessor :dir, :end_offset + bool_reader :dirty + + def initialize dir, end_offset=0 + Dir.mkdir dir unless File.exists? dir + @dir = dir + @end_offset = end_offset + @dirty = false + end + + def done?; !File.exists? fn_for_offset(@end_offset); end + def usual?; true; end + def id; DraftManager.source_id; end + def to_s; DraftManager.source_name; end + def is_source_for? x; x == DraftManager.source_name; end + + def gen_offset + i = @end_offset + while File.exists? fn_for_offset(i) + i += 1 + end + i + end + + def fn_for_offset o; File.join(@dir, o.to_s); end + + def load_header offset + File.open fn_for_offset(offset) do |f| + return MBox::read_header(f) + end + end + + def load_message offset + File.open fn_for_offset(offset) do |f| + RMail::Mailbox::MBoxReader.new(f).each_message do |input| + return RMail::Parser.read(input) + end + end + end + + ## load the full header text + def load_header_text offset + ret = "" + File.open fn_for_offset(offset) do |f| + until f.eof? || (l = f.gets) =~ /^$/ + ret += l + end + end + ret + end + + def each + while File.exists?(fn = File.join(@dir, @end_offset.to_s)) + yield @end_offset, [:draft, :inbox] + @end_offset += 1 + @dirty = true + end + end + + def total; Dir[File.join(@dir, "*")].sort.last.to_i; end + def reset!; @end_offset = 0; @dirty = true; end +end + +Redwood::register_yaml(DraftLoader, %w(dir end_offset)) + +end diff --git a/lib/sup/index.rb b/lib/sup/index.rb new file mode 100644 index 0000000..255e2f8 --- /dev/null +++ b/lib/sup/index.rb @@ -0,0 +1,353 @@ +## the index structure for redwood. interacts with ferret. + +require 'thread' +require 'fileutils' +require_gem 'ferret', ">= 0.10.13" + +module Redwood + +class IndexError < StandardError + attr_reader :source + + def initialize source, s + super s + @source = source + end +end + +class Index + include Singleton + + LOAD_THREAD_PETIT_DELAY = 0.1 + LOAD_THREAD_GRAND_DELAY = 5 + + MESSAGES_AT_A_TIME = 10 + + attr_reader :index # debugging only + + def initialize dir=BASE_DIR + @dir = dir + @mutex = Mutex.new + @load_thread = nil # loads new messages + @sources = {} + @sources_dirty = false + + self.class.i_am_the_instance self + end + + def load + load_sources + load_index + end + + def save + FileUtils.mkdir_p @dir unless File.exists? @dir + save_sources + save_index + end + + def add_source source + raise "duplicate source!" if @sources.include? source + @sources_dirty = true + source.id ||= @sources.size + source.id += 1 while @sources.member? source.id + @sources[source.id] = source + end + + def source_for name; @sources.values.find { |s| s.is_source_for? name }; end + def usual_sources; @sources.values.find_all { |s| s.usual? }; end + + def load_index dir=File.join(@dir, "ferret") + wsa = Ferret::Analysis::WhiteSpaceAnalyzer.new false + sa = Ferret::Analysis::StandardAnalyzer.new + analyzer = Ferret::Analysis::PerFieldAnalyzer.new wsa + analyzer[:body] = sa + + if File.exists? dir + Redwood::log "loading index" + @index = Ferret::Index::Index.new(:path => dir, :analyzer => analyzer) + else + Redwood::log "creating index" + field_infos = Ferret::Index::FieldInfos.new :store => :yes + field_infos.add_field :message_id + field_infos.add_field :source_id + field_infos.add_field :source_info, :index => :no, :term_vector => :no + field_infos.add_field :date, :index => :untokenized + field_infos.add_field :body, :store => :no + field_infos.add_field :label + field_infos.add_field :subject + field_infos.add_field :from + field_infos.add_field :to + field_infos.add_field :refs + field_infos.add_field :snippet, :index => :no, :term_vector => :no + field_infos.create_index dir + @index = Ferret::Index::Index.new(:path => dir, :analyzer => analyzer) + end + end + + ## update the message by deleting and re-adding + def update_message m, source=nil, source_info=nil + docid, entry = load_entry_for_id m.id + if entry + source ||= entry[:source_id].to_i + source_info ||= entry[:source_info].to_i + end + raise "no entry and no source info for message #{m.id}" unless source && source_info + + raise "deleting non-corresponding entry #{docid}" unless @index[docid][:message_id] == m.id + @index.delete docid + add_message m + end + + def save_index fn=File.join(@dir, "ferret") + # don't have to do anything apparently + end + + def contains_id? id + @index.search(Ferret::Search::TermQuery.new(:message_id, id)).total_hits > 0 + end + def contains? m; contains_id? m.id; end + def size; @index.size; end + + ## you should probably not call this on a block that doesn't break + ## rather quickly because the results will probably be, as we say + ## in scotland, frikkin' huuuge. + EACH_BY_DATE_NUM = 100 + def each_id_by_date opts={} + return if @index.size == 0 # otherwise ferret barfs + query = build_query opts + offset = 0 + while true + results = @index.search(query, :sort => "date DESC", :limit => EACH_BY_DATE_NUM, :offset => offset) + Redwood::log "got #{results.total_hits} results for query (offset #{offset}) #{query.inspect}" + results.hits.each { |hit| yield @index[hit.doc][:message_id], lambda { build_message hit.doc } } + break if offset >= results.total_hits - EACH_BY_DATE_NUM + offset += EACH_BY_DATE_NUM + end + end + + def num_results_for opts={} + query = build_query opts + x = @index.search(query).total_hits + Redwood::log "num_results_for: have #{x} for query #{query}" + x + end + + SAME_SUBJECT_DATE_LIMIT = 7 + def each_message_in_thread_for m, opts={} + messages = {} + searched = {} + num_queries = 0 + + ## temporarily disabling subject searching because it's a + ## significant slowdown. + ## + ## TODO: make this configurable, i guess + if false + date_min = m.date - (SAME_SUBJECT_DATE_LIMIT * 12 * 3600) + date_max = m.date + (SAME_SUBJECT_DATE_LIMIT * 12 * 3600) + + q = Ferret::Search::BooleanQuery.new true + sq = Ferret::Search::PhraseQuery.new(:subject) + wrap_subj(Message.normalize_subj(m.subj)).split(/\s+/).each do |t| + sq.add_term t + end + q.add_query sq, :must + q.add_query Ferret::Search::RangeQuery.new(:date, :>= => date_min.to_indexable_s, :<= => date_max.to_indexable_s), :must + + pending = @index.search(q).hits.map { |hit| @index[hit.doc][:message_id] } + Redwood::log "found #{pending.size} results for subject query #{q}" + else + pending = [m.id] + end + + until pending.empty? || (opts[:limit] && messages.size >= opts[:limit]) + id = pending.pop + next if searched.member? id + searched[id] = true + q = Ferret::Search::BooleanQuery.new true + q.add_query Ferret::Search::TermQuery.new(:message_id, id), :should + q.add_query Ferret::Search::TermQuery.new(:refs, id), :should + + num_queries += 1 + @index.search_each(q, :limit => :all) do |docid, score| + break if opts[:limit] && messages.size >= opts[:limit] + mid = @index[docid][:message_id] + unless messages.member? mid + messages[mid] ||= lambda { build_message docid } + refs = @index[docid][:refs].split(" ") + pending += refs + end + end + end + Redwood::log "ran #{num_queries} queries to build thread of #{messages.size} messages for #{m.id}" + messages.each { |mid, builder| yield mid, builder } + end + + ## builds a message object from a ferret result + def build_message docid + doc = @index[docid] + source = @sources[doc[:source_id].to_i] + #puts "building message #{doc[:message_id]} (#{source}##{doc[:source_info]})" + raise "invalid source #{doc[:source_id]}" unless source + begin + raise "no snippet" unless doc[:snippet] + Message.new source, doc[:source_info].to_i, + doc[:label].split(" ").map { |s| s.intern }, + doc[:snippet] + rescue MessageFormatError => e + raise IndexError.new(source, "error building message #{doc[:message_id]} at #{source}/#{doc[:source_info]}: #{e.message}") + nil + end + end + + def start_load_thread + return if @load_thread + @load_thread = true + @load_thread = ::Thread.new do + while @load_thread + load_some_entries ENTRIES_AT_A_TIME, LOAD_THREAD_PETIT_DELAY, LOAD_THREAD_GRAND_DELAY + end + end + end + + def end_load_thread; @load_thread = nil; end + def fresh_thread_id; @next_thread_id += 1; end + + def wrap_subj subj; "__START_SUBJECT__ #{subj} __END_SUBJECT__"; end + + def add_message m + return false if contains? m + + source_id = + if m.source.is_a? Integer + m.source + else + m.source.id or raise "unregistered source #{m.source}" + end + + to = (m.to + m.cc + m.bcc).map { |x| x.email }.join(" ") + d = { + :message_id => m.id, + :source_id => source_id, + :source_info => m.source_info, + :date => m.date.to_indexable_s, + :body => m.content, + :snippet => m.snippet, + :label => m.labels.join(" "), + :from => m.from ? m.from.email : "", + :to => (m.to + m.cc + m.bcc).map { |x| x.email }.join(" "), + :subject => wrap_subj(Message.normalize_subj(m.subj)), + :refs => (m.refs + m.replytos).join(" "), + } + + @index.add_document d + + ## TODO: figure out why this is sometimes triggered + #docid, entry = load_entry_for_id m.id + #raise "just added message #{m.id} but couldn't find it in a search" unless docid + true + end + + def drop_entry docno; @index.delete docno; end + + def load_entry_for_id mid + results = @index.search(Ferret::Search::TermQuery.new(:message_id, mid)) + return if results.total_hits == 0 + docid = results.hits[0].doc + [docid, @index[docid]] + end + + def load_contacts emails, h={} + q = Ferret::Search::BooleanQuery.new true + emails.each do |e| + qq = Ferret::Search::BooleanQuery.new true + qq.add_query Ferret::Search::TermQuery.new(:from, e), :should + qq.add_query Ferret::Search::TermQuery.new(:to, e), :should + q.add_query qq + end + q.add_query Ferret::Search::TermQuery.new(:label, "spam"), :must_not + + Redwood::log "contact search: #{q}" + contacts = {} + num = h[:num] || 20 + @index.search_each(q, :sort => "date DESC", :limit => :all) do |docid, score| + break if contacts.size >= num + #Redwood::log "got message with to: #{@index[docid][:to].inspect} and from: #{@index[docid][:from].inspect}" + f = @index[docid][:from] + t = @index[docid][:to] + + if AccountManager.is_account_email? f + t.split(" ").each { |e| #Redwood::log "adding #{e} because there's a message to him from account email #{f}"; + contacts[Person.for(e)] = true } + else + #Redwood::log "adding from #{f} because there's a message from him to #{t}" + contacts[Person.for(f)] = true + end + end + + contacts.keys.compact + end + +protected + + ## TODO: convert this to query objects rather than strings + def build_query opts + query = "" + query += opts[:labels].map { |t| "+label:#{t}" }.join(" ") if opts[:labels] + query += " +label:#{opts[:label]}" if opts[:label] + query += " #{opts[:content]}" if opts[:content] + if opts[:participants] + query += "+(" + + opts[:participants].map { |p| "from:#{p.email} OR to:#{p.email}" }.join(" OR ") + ")" + end + + query += " -label:spam" unless opts[:load_spam] || opts[:labels] == :spam || + (opts[:labels] && opts[:labels].include?(:spam)) + query += " -label:killed" unless opts[:load_killed] || opts[:labels] == :killed || + (opts[:labels] && opts[:labels].include?(:killed)) + query + end + + def load_sources fn=Redwood::SOURCE_FN + @sources = Hash[*(Redwood::load_yaml_obj(fn) || []).map { |s| [s.id, s] }.flatten] + @sources_dirty = false + end + + def save_sources fn=Redwood::SOURCE_FN + if @sources_dirty || @sources.any? { |id, s| s.dirty? } + FileUtils.mv fn, fn + ".bak", :force => true if File.exists? fn + Redwood::save_yaml_obj @sources.values, fn + end + @sources_dirty = false + end + + def load_some_entries max=ENTRIES_AT_A_TIME, delay1=nil, delay2=nil + num = 0 + begin + @sources.each_with_index do |source, source_id| + next if source.done? || num >= max + source.each do |source_info, label| + begin + m = Message.new(source, source_info, label + [:inbox]) + add_message m unless contains_id? m.id + puts m.content.inspect + num += 1 + rescue MessageFormatError => e + $stderr.puts "ignoring erroneous message at #{source}##{source_info}: #{e.message}" + end + break if num >= max + sleep delay1 if delay1 + end + Redwood::log "loaded #{num} entries from #{source}" + sleep delay2 if delay2 + end + ensure + save_sources + save_index + end + num + end +end + +end diff --git a/lib/sup/keymap.rb b/lib/sup/keymap.rb new file mode 100644 index 0000000..64935d9 --- /dev/null +++ b/lib/sup/keymap.rb @@ -0,0 +1,89 @@ +require "curses" + +module Redwood + +class Keymap + def initialize + @map = {} + @order = [] + yield self if block_given? + end + + def keysym_to_keycode k + case k + when :down: Curses::KEY_DOWN + when :up: Curses::KEY_UP + when :left: Curses::KEY_LEFT + when :right: Curses::KEY_RIGHT + when :page_down: Curses::KEY_NPAGE + when :page_up: Curses::KEY_PPAGE + when :backspace: Curses::KEY_BACKSPACE + when :home: Curses::KEY_HOME + when :end: Curses::KEY_END + when :ctrl_l: "\f"[0] + when :ctrl_g: "\a"[0] + when :tab: "\t"[0] + when :enter, :return: 10 #Curses::KEY_ENTER + else + if k.is_a?(String) && k.length == 1 + k[0] + else + raise ArgumentError, "unknown key name '#{k}'" + end + end + end + + def keysym_to_string k + case k + when :down: "" + when :up: "" + when :left: "" + when :right: "" + when :page_down: "" + when :page_up: "" + when :backspace: "" + when :home: "" + when :end: "" + when :enter, :return: "" + when :ctrl_l: "ctrl-l" + when :ctrl_l: "ctrl-g" + when :tab: "tab" + when " ": "" + else + if k.is_a?(String) && k.length == 1 + k + else + raise ArgumentError, "unknown key name \"#{k}\"" + end + end + end + + def add action, help, *keys + entry = [action, help, keys] + @order << entry + keys.each do |k| + raise ArgumentError, "key #{k} already defined (action #{action})" if @map.include? k + kc = keysym_to_keycode k + @map[kc] = entry + end + end + + def action_for kc + action, help, keys = @map[kc] + action + end + + def keysyms; @map.values.map { |action, help, keys| keys }.flatten; end + + def help_text except_for={} + lines = @order.map do |action, help, keys| + valid_keys = keys.select { |k| !except_for[k] } + next if valid_keys.empty? + [valid_keys.map { |k| keysym_to_string k }.join(", "), help] + end.compact + llen = lines.map { |a, b| a.length }.max + lines.map { |a, b| sprintf " %#{llen}s : %s", a, b }.join("\n") + end +end + +end diff --git a/lib/sup/label.rb b/lib/sup/label.rb new file mode 100644 index 0000000..a82313f --- /dev/null +++ b/lib/sup/label.rb @@ -0,0 +1,41 @@ +module Redwood + +class LabelManager + include Singleton + + ## all labels that have special meaning. user will be unable to + ## add/remove these via normal label mechanisms. + RESERVED_LABELS = [ :starred, :spam, :draft, :unread, :killed, :sent ] + + ## labels which it nonetheless makes sense to search for by + LISTABLE_LABELS = [ :starred, :spam, :draft, :sent ] + + ## labels that will never be displayed to the user + HIDDEN_LABELS = [ :starred, :unread ] + + def initialize fn + @fn = fn + labels = + if File.exists? fn + IO.readlines(fn).map { |x| x.chomp.intern } + else + [] + end + @labels = {} + labels.each { |t| @labels[t] = true } + + self.class.i_am_the_instance self + end + + def user_labels; @labels.keys; end + + def << t; @labels[t] = true unless @labels.member?(t) || RESERVED_LABELS.member?(t); end + + def delete t; @labels.delete t; end + + def save + File.open(@fn, "w") { |f| f.puts @labels.keys } + end +end + +end diff --git a/lib/sup/logger.rb b/lib/sup/logger.rb new file mode 100644 index 0000000..7a8026a --- /dev/null +++ b/lib/sup/logger.rb @@ -0,0 +1,42 @@ +module Redwood + +class Logger + @@instance = nil + + attr_reader :buf + + def initialize + raise "only one Log can be defined" if @@instance + @@instance = self + @mode = LogMode.new + @respawn = true + @spawning = false # to prevent infinite loops! + end + + ## must be called if you want to see anything! + ## once called, will respawn if killed... + def make_buf + return if @mode.buffer || !BufferManager.instantiated? || !@respawn || @spawning + @spawning = true + @mode.text = "" + @mode.buffer = BufferManager.instance.spawn "", @mode, :hidden => true + @spawning = false + end + + def log s +# $stderr.puts s + @mode << "#{Time.now}: #{s}\n" + make_buf + end + + def self.method_missing m, *a + @@instance = Logger.new unless @@instance + @@instance.send m, *a + end + + def self.buffer + @@instance.buf + end +end + +end diff --git a/lib/sup/mbox.rb b/lib/sup/mbox.rb new file mode 100644 index 0000000..5c9d612 --- /dev/null +++ b/lib/sup/mbox.rb @@ -0,0 +1,51 @@ +require "sup/mbox/loader" + +module Redwood + +## some utility functions +module MBox + BREAK_RE = /^From \S+@\S+/ + + def read_header f + header = {} + last = nil + + ## i do it in this weird way because i am trying to speed things up + ## at load-message time. + while(line = f.gets) + case line + when /^From:\s+(.*)$/i: header[last = "From"] = $1 + when /^To:\s+(.*)$/i: header[last = "To"] = $1 + when /^Cc:\s+(.*)$/i: header[last = "Cc"] = $1 + when /^Bcc:\s+(.*)$/i: header[last = "Bcc"] = $1 + when /^Subject:\s+(.*)$/i: header[last = "Subject"] = $1 + when /^Date:\s+(.*)$/i: header[last = "Date"] = $1 + when /^Message-Id:\s+<(.*)>$/i: header[last = "Message-Id"] = $1 + when /^References:\s+(.*)$/i: header[last = "References"] = $1 + when /^In-Reply-To:\s+(.*)$/i: header[last = "In-Reply-To"] = $1 + when /^List-Post:\s+(.*)$/i: header[last = "List-Post"] = $1 + when /^Reply-To:\s+(.*)$/i: header[last = "Reply-To"] = $1 + when /^Status:\s+(.*)$/i: header[last = "Status"] = $1 + when /^Delivered-To:\s+(.*)$/i + header[last = "Delivered-To"] = $1 unless header["Delivered-To"] + when /^$/: break + when /:/: last = nil + else + header[last] += line.gsub(/^\s+/, "") if last + end + end + header + end + + def read_body f + body = [] + f.each_line do |l| + break if l =~ BREAK_RE + body << l.chomp + end + body + end + + module_function :read_header, :read_body +end +end diff --git a/lib/sup/mbox/loader.rb b/lib/sup/mbox/loader.rb new file mode 100644 index 0000000..f144683 --- /dev/null +++ b/lib/sup/mbox/loader.rb @@ -0,0 +1,116 @@ +require 'thread' +require 'rmail' + +module Redwood +module MBox + +class Error < StandardError; end + +class Loader + attr_reader :filename + bool_reader :usual, :archived, :read, :dirty + attr_accessor :id, :labels + + ## end_offset is the last offsets within the file which we've read. + ## everything after that is considered new messages that haven't + ## been indexed. + def initialize filename, end_offset=0, usual=true, archived=false, id=nil + @filename = filename.gsub(%r(^mbox://), "") + @end_offset = end_offset + @dirty = false + @usual = usual + @archived = archived + @id = id + @mutex = Mutex.new + @f = File.open @filename + @labels = ([ + :unread, + archived ? nil : :inbox, + ] + + if File.dirname(filename) =~ /\b(var|usr|spool)\b/ + [] + else + [File.basename(filename).intern] + end).compact + end + + def reset!; @end_offset = 0; @dirty = true; end + def == o; o.is_a?(Loader) && o.filename == filename; end + def to_s; "mbox://#{@filename}"; end + + def is_source_for? s + @filename == s || self.to_s == s + end + + def load_header offset=nil + header = nil + @mutex.synchronize do + @f.seek offset if offset + header = MBox::read_header @f + end + header + end + + def load_message offset + ret = nil + @mutex.synchronize do + @f.seek offset + RMail::Mailbox::MBoxReader.new(@f).each_message do |input| + return RMail::Parser.read(input) + end + end + end + + ## load the full header text + def load_header_text offset + ret = "" + @mutex.synchronize do + @f.seek offset + until @f.eof? || (l = @f.gets) =~ /^$/ + ret += l + end + end + ret + end + + def next + return nil if done? + @dirty = true + next_end_offset = @end_offset + + @mutex.synchronize do + @f.seek @end_offset + + @f.gets # skip the From separator + next_end_offset = @f.tell + while(line = @f.gets) + break if line =~ BREAK_RE + next_end_offset = @f.tell + 1 + end + end + + start_offset = @end_offset + @end_offset = next_end_offset + + start_offset + end + + def each + until @end_offset >= File.size(@f) + n = self.next + yield(n, labels) if n + end + end + + def each_header + each { |offset, labels| yield offset, labels, load_header(offset) } + end + + def done?; @end_offset >= File.size(@f); end + def total; File.size @f; end +end + +Redwood::register_yaml(Loader, %w(filename end_offset usual archived id)) + +end +end diff --git a/lib/sup/message.rb b/lib/sup/message.rb new file mode 100644 index 0000000..5ceab55 --- /dev/null +++ b/lib/sup/message.rb @@ -0,0 +1,302 @@ +require 'tempfile' +require 'time' + +module Redwood + +class MessageFormatError < StandardError; end + +## a Message is what's threaded. +## +## it is also where the parsing for quotes and signatures is done, but +## that should be moved out to a separate class at some point (because +## i would like, for example, to be able to add in a ruby-talk +## specific module that would detect and link to /ruby-talk:\d+/ +## sequences in the text of an email. (how sweet would that be?) +## +## TODO: integrate with user's addressbook to render names +## appropriately. +class Message + SNIPPET_LEN = 80 + RE_PATTERN = /^((re|re[\[\(]\d[\]\)]):\s*)+/i + + ## some utility methods + class << self + def normalize_subj s; s.gsub(RE_PATTERN, ""); end + def subj_is_reply? s; s =~ RE_PATTERN; end + def reify_subj s; subj_is_reply?(s) ? s : "Re: " + s; end + end + + class Attachment + attr_reader :content_type, :desc + def initialize content_type, desc, part + @content_type = content_type + @desc = desc + @part = part + @file = nil + end + + def view! + unless @file + @file = Tempfile.new "redwood.attachment" + @file.print @part.decode + @file.close + end + + ## TODO: handle unknown mime-types + system "/usr/bin/run-mailcap --action=view #{@content_type}:#{@file.path}" + end + end + + class Text + attr_reader :lines + def initialize lines + ## do some wrapping + @lines = lines.map { |l| l.wrap 80 }.flatten + end + end + + class Quote + attr_reader :lines + def initialize lines + @lines = lines + end + end + + class Signature + attr_reader :lines + def initialize lines + @lines = lines + end + end + + QUOTE_PATTERN = /^\s{0,4}[>|\}]/ + BLOCK_QUOTE_PATTERN = /^-----\s*Original Message\s*----+$/ + QUOTE_START_PATTERN = /(^\s*Excerpts from)|(^\s*In message )|(^\s*In article )|(^\s*Quoting )|((wrote|writes|said|says)\s*:\s*$)/ + SIG_PATTERN = /(^-- ?$)|(^\s*----------+\s*$)|(^\s*_________+\s*$)/ + SIG_DISTANCE = 15 # lines from the end + DEFAULT_SUBJECT = "(missing subject)" + DEFAULT_SENDER = "(missing sender)" + + attr_reader :id, :date, :from, :subj, :refs, :replytos, :to, :source, + :cc, :bcc, :labels, :list_address, :recipient_email, :replyto, + :source_info, :mbox_status + + bool_reader :dirty + + def initialize source, source_info, labels, snippet=nil + @source = source + @source_info = source_info + @dirty = false + @snippet = snippet + @labels = labels + + header = @source.load_header @source_info + header.each { |k, v| header[k.downcase] = v } + + %w(message-id date).each do |f| + raise MessageFormatError, "no #{f} field in header #{header.inspect} (source #@source offset #@source_info)" unless header.include? f + raise MessageFormatError, "nil #{f} field in header #{header.inspect} (source #@source offset #@source_info)" unless header[f] + end + + begin + @date = Time.parse header["date"] + rescue ArgumentError => e + raise MessageFormatError, "unparsable date #{header['date']}: #{e.message}" + end + + if(@subj = header["subject"]) + @subj = @subj.gsub(/\s+/, " ").gsub(/\s+$/, "") + else + @subj = DEFAULT_SUBJECT + end + @from = Person.for header["from"] + @to = Person.for_several header["to"] + @cc = Person.for_several header["cc"] + @bcc = Person.for_several header["bcc"] + @id = header["message-id"] + @refs = (header["references"] || "").scan(/<(.*?)>/).flatten + @replytos = (header["in-reply-to"] || "").scan(/<(.*?)>/).flatten + @replyto = Person.for header["reply-to"] + @list_address = + if header["list-post"] + @list_address = Person.for header["list-post"].gsub(/^$/, "") + else + nil + end + + @recipient_email = header["delivered-to"] + @mbox_status = header["status"] + end + + def snippet + to_chunks unless @snippet + @snippet + end + + def is_list_message?; !@list_address.nil?; end + def is_draft?; DraftLoader === @source; end + def draft_filename + raise "not a draft" unless is_draft? + @source.fn_for_offset @source_info + end + + def save index + index.update_message self if @dirty + @dirty = false + end + + def has_label? t; @labels.member? t; end + def add_label t + return if @labels.member? t + @labels.push t + @dirty = true + end + def remove_label t + return unless @labels.member? t + @labels.delete t + @dirty = true + end + + def recipients + @to + @cc + @bcc + end + + def labels= l + @labels = l + @dirty = true + end + + def to_chunks + m = @source.load_message @source_info + message_to_chunks m + end + + def header_text + @source.load_header_text @source_info + end + + def content + [ + from && from.longname, + to.map { |p| p.longname }, + cc.map { |p| p.longname }, + bcc.map { |p| p.longname }, + to_chunks.select { |c| c.is_a? Text }.map { |c| c.lines }, + subj, + ].flatten.compact.join " " + end + + def basic_body_lines + to_chunks.find_all { |c| c.is_a?(Text) || c.is_a?(Quote) }.map { |c| c.lines }.flatten + end + + def basic_header_lines + ["From: #{@from.full_address}"] + + (@to.empty? ? [] : ["To: " + @to.map { |p| p.full_address }.join(", ")]) + + (@cc.empty? ? [] : ["Cc: " + @cc.map { |p| p.full_address }.join(", ")]) + + (@bcc.empty? ? [] : ["Bcc: " + @bcc.map { |p| p.full_address }.join(", ")]) + + ["Date: #{@date.rfc822}", + "Subject: #{@subj}"] + end + +private + + ## everything RubyMail-specific goes here. + def message_to_chunks m + ret = [] << + case m.header.content_type + when "text/plain", nil + raise MessageFormatError, "no message body before decode" unless + m.body + body = m.decode or raise MessageFormatError, "no message body" + text_to_chunks body.gsub(/\t/, " ").gsub(/\r/, "").split("\n") + when "multipart/alternative", "multipart/mixed" + nil + else + disp = m.header["Content-Disposition"] || "" + Attachment.new m.header.content_type, disp.gsub(/[\s\n]+/, " "), m + end + + m.each_part { |p| ret << message_to_chunks(p) } if m.multipart? + ret.compact.flatten + end + + ## parse the lines of text into chunk objects. the heuristics here + ## need tweaking in some nice manner. TODO: move these heuristics + ## into the classes themselves. + + def text_to_chunks lines + state = :text # one of :text, :quote, or :sig + chunks = [] + chunk_lines = [] + + lines.each_with_index do |line, i| + nextline = lines[(i + 1) ... lines.length].find { |l| l !~ /^\s*$/ } # skip blank lines + case state + when :text + newstate = nil + if line =~ QUOTE_PATTERN || (line =~ QUOTE_START_PATTERN && (nextline =~ QUOTE_PATTERN || nextline =~ QUOTE_START_PATTERN)) + newstate = :quote + elsif line =~ SIG_PATTERN && (lines.length - i) < SIG_DISTANCE + newstate = :sig + elsif line =~ BLOCK_QUOTE_PATTERN + newstate = :block_quote + end + if newstate + chunks << Text.new(chunk_lines) unless chunk_lines.empty? + chunk_lines = [line] + state = newstate + else + chunk_lines << line + end + when :quote + newstate = nil + if line =~ QUOTE_PATTERN || line =~ QUOTE_START_PATTERN || line =~ /^\s*$/ + chunk_lines << line + elsif line =~ SIG_PATTERN && (lines.length - i) < SIG_DISTANCE + newstate = :sig + else + newstate = :text + end + if newstate + if chunk_lines.empty? + # nothing + elsif chunk_lines.size == 1 + chunks << Text.new(chunk_lines) # forget about one-line quotes + else + chunks << Quote.new(chunk_lines) + end + chunk_lines = [line] + state = newstate + end + when :block_quote + chunk_lines << line + when :sig + chunk_lines << line + end + + if state == :text && (@snippet.nil? || @snippet.length < SNIPPET_LEN) && + line !~ /[=\*#_-]{3,}/ && line !~ /^\s*$/ + @snippet = (@snippet ? @snippet + " " : "") + line.gsub(/^\s+/, "").gsub(/[\r\n]/, "").gsub(/\s+/, " ") + @snippet = @snippet[0 ... SNIPPET_LEN] + end +# if @snippet.nil? && state == :text && (line.length > 40 || +# line =~ /\S+.*[^,!:]\s*$/) +# @snippet = line.gsub(/^\s+/, "").gsub(/[\r\n]/, "")[0 .. 80] +# end + end + + ## final object + case state + when :quote, :block_quote + chunks << Quote.new(chunk_lines) unless chunk_lines.empty? + when :text + chunks << Text.new(chunk_lines) unless chunk_lines.empty? + when :sig + chunks << Signature.new(chunk_lines) unless chunk_lines.empty? + end + chunks + end +end + +end diff --git a/lib/sup/mode.rb b/lib/sup/mode.rb new file mode 100644 index 0000000..b90401f --- /dev/null +++ b/lib/sup/mode.rb @@ -0,0 +1,79 @@ +module Redwood + +class Mode + attr_accessor :buffer + @@keymaps = {} + + def self.register_keymap keymap=nil, &b + keymap = Keymap.new(&b) if keymap.nil? + @@keymaps[self] = keymap + end + + def initialize + @buffer = nil + end + + def self.make_name s; s.gsub(/.*::/, "").camel_to_hyphy; end + def name; Mode.make_name self.class.name; end + + def self.load_all_modes dir + Dir[File.join(dir, "*.rb")].each do |f| + $stderr.puts "## loading mode #{f}" + require f + end + end + + def draw; end + def focus; end + def blur; end + def status; ""; end + def resize rows, cols; end + def cleanup + @buffer = nil + end + + ## turns an input keystroke into an action symbol + def resolve_input c + ## try all keymaps in order of age + action = nil + klass = self.class + + ancestors.each do |klass| + action = @@keymaps.member?(klass) && @@keymaps[klass].action_for(c) + return action if action + end + + nil + end + + def handle_input c + if(action = resolve_input c) + send action + true + else + false + end + end + + def help_text + used_keys = {} + ancestors.map do |klass| + km = @@keymaps[klass] or next + title = "Keybindings from #{Mode.make_name klass.name}" + s = < AccountManager.default_account.full_address, + "Message-Id" => gen_message_id, + } + + @header["To"] = [h[:to]].flatten.compact.map { |p| p.full_address } + @body = sig_lines + regen_text + end + + def lines; @text.length; end + def [] i; @text[i]; end + +protected + + def handle_new_text new_header, new_body + @header = new_header + @body = new_body + end + + def regen_text + @text = header_lines(@header - EditMessageMode::NON_EDITABLE_HEADERS) + [""] + @body + end +end + +end diff --git a/lib/sup/modes/contact-list-mode.rb b/lib/sup/modes/contact-list-mode.rb new file mode 100644 index 0000000..f2f5049 --- /dev/null +++ b/lib/sup/modes/contact-list-mode.rb @@ -0,0 +1,121 @@ +module Redwood + +class ContactListMode < LineCursorMode + LOAD_MORE_CONTACTS_NUM = 10 + + register_keymap do |k| + k.add :load_more, "Load #{LOAD_MORE_CONTACTS_NUM} more contacts", 'M' + k.add :reload, "Reload contacts", 'R' + k.add :alias, "Edit alias for contact", 'a' + k.add :toggle_tagged, "Tag/untag current line", 't' + k.add :apply_to_tagged, "Apply next command to all tagged items", ';' + k.add :search, "Search for messages from particular people", 'S' + end + + def initialize mode = :regular + @mode = mode + @tags = Tagger.new self + reload + super() + end + + def lines; @text.length; end + def [] i; @text[i]; end + + def toggle_tagged + p = @contacts[curpos] or return + @tags.toggle_tag_for p + update_text_for_line curpos + cursor_down + end + + def multi_toggle_tagged threads + @tags.drop_all_tags + regen_text + end + + def apply_to_tagged; @tags.apply_to_tagged; end + + def load; regen_text; end + def load_more + @num += LOAD_MORE_CONTACTS_NUM + regen_text + BufferManager.flash "Loaded #{LOAD_MORE_CONTACTS_NUM} more contacts." + end + + def multi_select people + case @mode + when :regular + mode = ComposeMode.new :to => people + BufferManager.spawn "new message", mode + mode.edit + end + end + + def select + p = @contacts[curpos] or return + multi_select [p] + end + + def multi_search people + mode = PersonSearchResultsMode.new people + BufferManager.spawn "personal search results", mode + mode.load_more_threads mode.buffer.content_height + end + + def search + p = @contacts[curpos] or return + multi_search [p] + end + + def reload + @tags.drop_all_tags + @num = LOAD_MORE_CONTACTS_NUM + load + end + + def alias + p = @contacts[curpos] or return + a = BufferManager.ask(:alias, "alias for #{p.longname}: ", @user_contacts[p]) or return + if a.empty? + ContactManager.drop_contact p + else + ContactManager.set_contact p, a + @user_contacts[p] = a + update_text_for_line curpos + end + end + +protected + + def update_text_for_line line + @text[line] = text_for_contact @contacts[line] + buffer.mark_dirty + end + + def text_for_contact p + aalias = @user_contacts[p] || "" + [[:tagged_color, @tags.tagged?(p) ? ">" : " "], + [:none, sprintf("%-#{@awidth}s %-#{@nwidth}s %s", aalias, p.name, p.email)]] + end + + def regen_text + @user_contacts = ContactManager.contacts.invert + recent = Index.load_contacts AccountManager.user_emails, + :num => @num + + @contacts = (@user_contacts.keys + recent.select { |p| !@user_contacts[p] }).sort_by { |p| p.sort_by_me + (p.name || "") + p.email }.remove_successive_dupes + + @awidth, @nwidth = 0, 0 + @contacts.each do |p| + aalias = @user_contacts[p] + @awidth = aalias.length if aalias && aalias.length > @awidth + @nwidth = p.name.length if p.name && p.name.length > @nwidth + end + + @text = @contacts.map { |p| text_for_contact p } + buffer.mark_dirty if buffer + end +end + +end diff --git a/lib/sup/modes/edit-message-mode.rb b/lib/sup/modes/edit-message-mode.rb new file mode 100644 index 0000000..7db5060 --- /dev/null +++ b/lib/sup/modes/edit-message-mode.rb @@ -0,0 +1,162 @@ +require 'tempfile' +require 'socket' # just for gethostname! + +module Redwood + +class EditMessageMode < LineCursorMode + FORCE_HEADERS = %w(From To Cc Bcc Subject) + MULTI_HEADERS = %w(To Cc Bcc) + NON_EDITABLE_HEADERS = %w(Message-Id Date) + + attr_reader :status + + register_keymap do |k| + k.add :send_message, "Send message", 'y' + k.add :edit, "Edit message", 'e', :enter + k.add :save_as_draft, "Save as draft", 'P' + end + + def initialize *a + super + @attachments = [] + @edited = false + end + + def edit + @file = Tempfile.new "redwood.#{self.class.name.camel_to_hyphy}" + @file.puts header_lines(header - NON_EDITABLE_HEADERS) + @file.puts + @file.puts body + @file.close + + editor = $config[:editor] || ENV['EDITOR'] || "/usr/bin/vi" + + mtime = File.mtime @file.path + BufferManager.shell_out "#{editor} #{@file.path}" + @edited = true if File.mtime(@file.path) > mtime + + new_header, new_body = parse_file(@file.path) + NON_EDITABLE_HEADERS.each { |h| new_header[h] = header[h] if header[h] } + handle_new_text new_header, new_body + update + end + +protected + + def gen_message_id + "<#{Time.now.to_i}-redwood-#{rand 10000}@#{Socket.gethostname}>" + end + + def update + regen_text + buffer.mark_dirty + end + + def parse_file fn + File.open(fn) do |f| + header = MBox::read_header f + body = MBox::read_body f + + header.delete_if { |k, v| NON_EDITABLE_HEADERS.member? k } + header.each do |k, v| + next unless MULTI_HEADERS.include?(k) && !v.empty? + header[k] = v.split_on_commas.map do |name| + (p = ContactManager.resolve(name)) && p.full_address || name + end + end + + [header, body] + end + end + + def header_lines header + force_headers = FORCE_HEADERS.map { |h| make_lines "#{h}:", header[h] } + other_headers = (header.keys - FORCE_HEADERS).map do |h| + make_lines "#{h}:", header[h] + end + + (force_headers + other_headers).flatten.compact + end + + def make_lines header, things + case things + when nil, [] + [header + " "] + when String + [header + " " + things] + else + if things.empty? + [header] + else + things.map_with_index do |name, i| + raise "an array: #{name.inspect} (things #{things.inspect})" if Array === name + if i == 0 + header + " " + name + else + (" " * (header.length + 1)) + name + end + (i == things.length - 1 ? "" : ",") + end + end + end + end + + def send_message + return false unless @edited || BufferManager.ask_yes_or_no("message unedited---really send?") + + raise "no message id!" unless header["Message-Id"] + date = Time.now + from_email = + if header["From"] =~ /?$/ + $1 + else + AccountManager.default_account.email + end + + sendmail = AccountManager.account_for(from_email).sendmail + raise "nil sendmail" unless sendmail + SentManager.write_sent_message(date, from_email) { |f| write_message f, true, date } + BufferManager.flash "sending..." + + IO.popen(sendmail, "w") { |p| write_message p, true, date } + + BufferManager.kill_buffer buffer + BufferManager.flash "Message sent!" + true + end + + def save_as_draft + DraftManager.write_draft { |f| write_message f, false } + BufferManager.kill_buffer buffer + BufferManager.flash "Saved for later editing." + end + + def sig_lines + sigfn = (AccountManager.account_for(header["From"]) || + AccountManager.default_account).sig_file + + if sigfn && File.exists?(sigfn) + ["", "-- "] + File.readlines(sigfn).map { |l| l.chomp } + else + [] + end + end + + def write_message f, full_header=true, date=Time.now + raise ArgumentError, "no pre-defined date: header allowed" if header["Date"] + f.puts header_lines(header) + f.puts "Date: #{date.rfc2822}" + if full_header + f.puts < AccountManager.default_account.full_address, + "Subject" => "Fwd: #{m.subj}", + "Message-Id" => gen_message_id, + } + @body = forward_body_lines(m) + sig_lines + regen_text + end + + def lines; @text.length; end + def [] i; @text[i]; end + +protected + + def forward_body_lines m + ["--- Begin forwarded message from #{m.from.mediumname} ---"] + + m.basic_header_lines + [""] + m.basic_body_lines + + ["--- End forwarded message ---"] + end + + def handle_new_text new_header, new_body + @header = new_header + @body = new_body + end + + def regen_text + @text = header_lines(@header - NON_EDITABLE_HEADERS) + [""] + @body + end +end + +end diff --git a/lib/sup/modes/help-mode.rb b/lib/sup/modes/help-mode.rb new file mode 100644 index 0000000..b98f131 --- /dev/null +++ b/lib/sup/modes/help-mode.rb @@ -0,0 +1,19 @@ +module Redwood + +class HelpMode < TextMode + def initialize mode, global_keymap + title = "Help for #{mode.name}" + super < :inbox, + :load_killed => false, + :load_spam => false, + :when_done => lambda { |num| + BufferManager.flash "Added #{num} threads." + } + end + + def reload + drop_all_threads + BufferManager.draw_screen + load_more_threads buffer.content_height + end +end + +end diff --git a/lib/sup/modes/label-list-mode.rb b/lib/sup/modes/label-list-mode.rb new file mode 100644 index 0000000..80f584c --- /dev/null +++ b/lib/sup/modes/label-list-mode.rb @@ -0,0 +1,89 @@ +module Redwood + +class LabelListMode < LineCursorMode + register_keymap do |k| + k.add :view_results, "View messages with the selected label", :enter + k.add :reload, "Reload", "R" + end + + def initialize + @labels = [] + @text = [] + super() + end + + def lines; @text.length; end + def [] i; @text[i]; end + + def load; regen_text; end + + def load_in_background + ::Thread.new do + regen_text do |i| + if i % 10 == 0 + buffer.mark_dirty + BufferManager.draw_screen + sleep 0.1 # ok, dirty trick. + end + end + buffer.mark_dirty + BufferManager.draw_screen + end + end + +protected + + def reload + buffer.mark_dirty + BufferManager.draw_screen + load_in_background + end + + def regen_text + @text = [] + @labels = LabelManager::LISTABLE_LABELS.sort_by { |t| t.to_s } + + LabelManager.user_labels.sort_by { |t| t.to_s } + + counts = @labels.map do |t| + total = Index.num_results_for :label => t + unread = Index.num_results_for :labels => [t, :unread] + [t, total, unread] + end + + width = @labels.map { |t| t.to_s.length }.max + + counts.map_with_index do |(t, total, unread), i| + if total == 0 && !LabelManager::LISTABLE_LABELS.include?(t) + Redwood::log "no hits for label #{t}, deleting" + LabelManager.delete t + @labels.delete t + next + end + + label = + case t + when *LabelManager::LISTABLE_LABELS + t.to_s.ucfirst + else + t.to_s + end + @text << [[(unread == 0 ? :labellist_old_color : :labellist_new_color), + sprintf("%#{width + 1}s %5d %s, %5d unread", label, total, total == 1 ? " message" : "messages", unread)]] + yield i if block_given? + end.compact + end + + def view_results + label = @labels[curpos] + if label == :inbox + BufferManager.raise_to_front BufferManager["inbox"] + else + b = BufferManager.spawn_unless_exists(label) do + mode = LabelSearchResultsMode.new [label] + end + b.mode.load_more_threads b.content_height + end + end +end + +end diff --git a/lib/sup/modes/label-search-results-mode.rb b/lib/sup/modes/label-search-results-mode.rb new file mode 100644 index 0000000..3f49e27 --- /dev/null +++ b/lib/sup/modes/label-search-results-mode.rb @@ -0,0 +1,29 @@ +module Redwood + +class LabelSearchResultsMode < ThreadIndexMode + register_keymap do |k| + k.add :load_more_threads, "Load #{LOAD_MORE_THREAD_NUM} more threads", 'M' + end + + def initialize labels + @labels = labels + super + end + + def is_relevant? m; @labels.all? { |l| m.has_label? l }; end + + def load_more_threads n=ThreadIndexMode::LOAD_MORE_THREAD_NUM + load_n_threads_background n, :labels => @labels, + :load_killed => true, + :load_spam => false, + :when_done =>(lambda do |num| + if num > 0 + BufferManager.flash "Found #{num} threads" + else + BufferManager.flash "No matches" + end + end) + end +end + +end diff --git a/lib/sup/modes/line-cursor-mode.rb b/lib/sup/modes/line-cursor-mode.rb new file mode 100644 index 0000000..f8a46e9 --- /dev/null +++ b/lib/sup/modes/line-cursor-mode.rb @@ -0,0 +1,133 @@ +module Redwood + +class LineCursorMode < ScrollMode + register_keymap do |k| + ## overwrite scrollmode binding on arrow keys for cursor movement + ## but j and k still scroll! + k.add :cursor_down, "Move cursor down one line", :down, 'j' + k.add :cursor_up, "Move cursor up one line", :up, 'k' + k.add :select, "Select this item", :enter + end + + attr_reader :curpos + + def initialize cursor_top=0, opts={} + @cursor_top = cursor_top + @curpos = cursor_top + super opts + end + + def draw + super + set_status + end + +protected + + def draw_line ln, opts={} + if ln == @curpos + super ln, :highlight => true, :debug => opts[:debug] + else + super + end + end + + def ensure_mode_validity + super + raise @curpos.inspect unless @curpos.is_a?(Integer) + c = @curpos.clamp topline, botline - 1 + c = @cursor_top if c < @cursor_top + buffer.mark_dirty unless c == @curpos + @curpos = c + end + + def set_cursor_pos p + return if @curpos == p + @curpos = p.clamp @cursor_top, lines + buffer.mark_dirty + end + + def line_down # overwrite scrollmode + super + set_cursor_pos topline if @curpos < topline + end + + def line_up # overwrite scrollmode + super + set_cursor_pos botline - 1 if @curpos > botline - 1 + end + + def cursor_down + return false unless @curpos < lines - 1 + if @curpos >= botline - 1 + page_down + set_cursor_pos [topline + 1, botline].min + else + @curpos += 1 + unless buffer.dirty? + draw_line @curpos - 1 + draw_line @curpos + set_status + buffer.commit + end + end + true + end + + def cursor_up + return false unless @curpos > @cursor_top + if @curpos == topline + page_up + set_cursor_pos [botline - 2, topline].max +# raise "cursor position now #@curpos, topline #{topline} botline #{botline}" + else + @curpos -= 1 + unless buffer.dirty? + draw_line @curpos + 1 + draw_line @curpos + set_status + buffer.commit + end + end + true + end + + def page_up # overwrite + if topline <= @cursor_top + set_cursor_pos @cursor_top + else + relpos = @curpos - topline + super + set_cursor_pos topline + relpos + end + end + + def page_down + if topline >= lines - buffer.content_height + set_cursor_pos(lines - 1) + else + relpos = @curpos - topline + super + set_cursor_pos [topline + relpos, lines - 1].min + end + end + + def jump_to_home + super + set_cursor_pos @cursor_top + end + + def jump_to_end + super if topline < (lines - buffer.content_height) + set_cursor_pos(lines - 1) + end + +private + + def set_status + @status = "line #{@curpos + 1} of #{lines}" + end + +end + +end diff --git a/lib/sup/modes/log-mode.rb b/lib/sup/modes/log-mode.rb new file mode 100644 index 0000000..f71c0ed --- /dev/null +++ b/lib/sup/modes/log-mode.rb @@ -0,0 +1,44 @@ +module Redwood + +class LogMode < TextMode + register_keymap do |k| + k.add :toggle_follow, "Toggle follow mode", 'f' + end + + def initialize + @follow = true + super "" + end + + def toggle_follow + @follow = !@follow + if buffer + if @follow + jump_to_line lines - buffer.content_height + 1 # leave an empty line at bottom + end + buffer.mark_dirty + end + end + + def text= t + super + if buffer && @follow + follow_top = lines - buffer.content_height + 1 + jump_to_line follow_top if topline < follow_top + end + end + + def << line + super + if buffer && @follow + follow_top = lines - buffer.content_height + 1 + jump_to_line follow_top if topline < follow_top + end + end + + def status + super + " (follow: #@follow)" + end +end + +end diff --git a/lib/sup/modes/person-search-results-mode.rb b/lib/sup/modes/person-search-results-mode.rb new file mode 100644 index 0000000..8fe3c30 --- /dev/null +++ b/lib/sup/modes/person-search-results-mode.rb @@ -0,0 +1,29 @@ +module Redwood + +class PersonSearchResultsMode < ThreadIndexMode + register_keymap do |k| + k.add :load_more_threads, "Load #{LOAD_MORE_THREAD_NUM} more threads", 'M' + end + + def initialize people + @people = people + super + end + + def is_relevant? m; @people.any? { |p| m.from == p }; end + + def load_more_threads n=ThreadIndexMode::LOAD_MORE_THREAD_NUM + load_n_threads_background n, :participants => @people, + :load_killed => true, + :load_spam => false, + :when_done =>(lambda do |num| + if num > 0 + BufferManager.flash "Found #{num} threads" + else + BufferManager.flash "No matches" + end + end) + end +end + +end diff --git a/lib/sup/modes/poll-mode.rb b/lib/sup/modes/poll-mode.rb new file mode 100644 index 0000000..8aaad03 --- /dev/null +++ b/lib/sup/modes/poll-mode.rb @@ -0,0 +1,24 @@ +module Redwood + +class PollMode < LogMode + def initialize + @new = true + super + end + + def puts s="" + self << s + "\n" +# if lines % 5 == 0 + BufferManager.draw_screen +# end + end + + def poll + puts unless @new + @new = false + puts "poll started at #{Time.now}" + PollManager.poll { |s| puts s } + end +end + +end diff --git a/lib/sup/modes/reply-mode.rb b/lib/sup/modes/reply-mode.rb new file mode 100644 index 0000000..d2dae22 --- /dev/null +++ b/lib/sup/modes/reply-mode.rb @@ -0,0 +1,136 @@ +module Redwood + +class ReplyMode < EditMessageMode + REPLY_TYPES = [:sender, :list, :all, :user] + TYPE_DESCRIPTIONS = { + :sender => "Reply to sender", + :all => "Reply to all", + :list => "Reply to mailing list", + :user => "Customized reply" + } + + register_keymap do |k| + k.add :move_cursor_right, "Move cursor to the right", :right + k.add :move_cursor_left, "Move cursor to the left", :left + end + + def initialize message + super 2, :twiddles => false + @m = message + + from = + if @m.recipient_email + AccountManager.account_for(@m.recipient_email) + else + (@m.to + @m.cc).argfind { |p| AccountManager.is_account? p } + end || AccountManager.default_account + + from_email = @m.recipient_email || from.email + + ## ignore reply-to for list messages because it's typically set to + ## the list address anyways + to = @m.is_list_message? ? @m.from : (@m.replyto || @m.from) + cc = (@m.to + @m.cc - [from, to]).uniq + + @headers = {} + @headers[:sender] = { + "From" => "#{from.name} <#{from_email}>", + "To" => [to.full_address], + } + + @headers[:user] = { + "From" => "#{from.name} <#{from_email}>", + "To" => "", + } + + @headers[:all] = { + "From" => "#{from.name} <#{from_email}>", + "To" => [to.full_address], + "Cc" => cc.map { |p| p.full_address }, + } unless cc.empty? + + @headers[:list] = { + "From" => "#{from.name} <#{from_email}>", + "To" => [@m.list_address.full_address], + } if @m.is_list_message? + + refs = gen_references + mid = gen_message_id + @headers.each do |k, v| + @headers[k] = v.merge({ + "In-Reply-To" => "<#{@m.id}>", + "Subject" => Message.reify_subj(@m.subj), + "Message-Id" => mid, + "References" => refs, + }) + end + + @type_labels = REPLY_TYPES.select { |t| @headers.member?(t) } + @selected_type = @m.is_list_message? ? :list : :sender + + @body = reply_body_lines(message) + sig_lines + regen_text + end + + def lines; @text.length + 2; end + def [] i + case i + when 0 + lame = [] + @type_labels.each do |t| + lame << [(t == @selected_type ? :none_highlight : :none), + "#{TYPE_DESCRIPTIONS[t]}"] + lame << [:none, " "] + end + lame + [[:none, ""]] + when 1 + "" + else + @text[i - 2] + end + end + +protected + + def body; @body; end + def header; @headers[@selected_type]; end + + def reply_body_lines m + lines = ["Excerpts from #{@m.from.name}'s message of #{@m.date}:"] + + m.basic_body_lines.map { |l| "> #{l}" } + lines.pop while lines.last !~ /[:alpha:]/ + lines + end + + def handle_new_text new_header, new_body + @body = new_body + + if new_header.size != header.size || + header.any? { |k, v| new_header[k] != v } + @selected_type = :user + @headers[:user] = new_header + end + end + + def regen_text + @text = header_lines(@headers[@selected_type] - NON_EDITABLE_HEADERS) + [""] + @body + end + + def gen_references + (@m.refs + [@m.id]).map { |x| "<#{x}>" }.join(" ") + end + + def move_cursor_left + i = @type_labels.index @selected_type + @selected_type = @type_labels[(i - 1) % @type_labels.length] + update + end + + def move_cursor_right + i = @type_labels.index @selected_type + @selected_type = @type_labels[(i + 1) % @type_labels.length] + update + end +end + +end diff --git a/lib/sup/modes/resume-mode.rb b/lib/sup/modes/resume-mode.rb new file mode 100644 index 0000000..b8b06b2 --- /dev/null +++ b/lib/sup/modes/resume-mode.rb @@ -0,0 +1,18 @@ +module Redwood + +class ResumeMode < ComposeMode + def initialize m + super() + @id = m.id + @header, @body = parse_file m.draft_filename + @header.delete "Date" + @header["Message-Id"] = gen_message_id # generate a new'n + regen_text + end + + def send_message + DraftManager.discard @id if super + end +end + +end diff --git a/lib/sup/modes/scroll-mode.rb b/lib/sup/modes/scroll-mode.rb new file mode 100644 index 0000000..32693a0 --- /dev/null +++ b/lib/sup/modes/scroll-mode.rb @@ -0,0 +1,106 @@ +module Redwood + +class ScrollMode < Mode + attr_reader :status, :topline, :botline + + COL_JUMP = 2 + + register_keymap do |k| + k.add :line_down, "Down one line", :down, 'j', 'J' + k.add :line_up, "Up one line", :up, 'k', 'K' + k.add :col_left, "Left one column", :left, 'h' + k.add :col_right, "Right one column", :right, 'l' + k.add :page_down, "Down one page", :page_down, 'n', ' ' + k.add :page_up, "Up one page", :page_up, 'p', :backspace + k.add :jump_to_home, "Jump to top", :home, '^', '1' + k.add :jump_to_end, "Jump to bottom", :end, '$', '0' + end + + def initialize opts={} + @topline, @botline, @leftcol = 0, 0, 0 + @slip_rows = opts[:slip_rows] || 0 # when we pgup/pgdown, + # how many lines do we keep? + @twiddles = opts.member?(:twiddles) ? opts[:twiddles] : true + super() + end + + def draw + ensure_mode_validity + (@topline ... @botline).each { |ln| draw_line ln } + ((@botline - @topline) ... buffer.content_height).each do |ln| + if @twiddles + buffer.write ln, 0, "~", :color => :twiddle_color + else + buffer.write ln, 0, "" + end + end + @status = "lines #{@topline + 1}:#{@botline}/#{lines}" + end + + def col_left + return unless @leftcol > 0 + @leftcol -= COL_JUMP + buffer.mark_dirty + end + + def col_right + @leftcol += COL_JUMP + buffer.mark_dirty + end + + ## set top line to l + def jump_to_line l + l = l.clamp 0, lines - 1 + return if @topline == l + @topline = l + @botline = [l + buffer.content_height, lines].min + buffer.mark_dirty + end + + def line_down; jump_to_line @topline + 1; end + def line_up; jump_to_line @topline - 1; end + def page_down; jump_to_line @topline + buffer.content_height - @slip_rows; end + def page_up; jump_to_line @topline - buffer.content_height + @slip_rows; end + def jump_to_home; jump_to_line 0; end + def jump_to_end; jump_to_line lines - buffer.content_height; end + + def ensure_mode_validity + @topline = @topline.clamp 0, lines - 1 + @topline = 0 if @topline < 0 # empty + @botline = [@topline + buffer.content_height, lines].min + end + +protected + + def draw_line ln, opts={} + case(s = self[ln]) + when String + buffer.write ln - @topline, 0, s[@leftcol .. -1], + :highlight => opts[:highlight] + when Array + xpos = 0 + s.each do |color, text| + raise "nil text for color '#{color}'" if text.nil? + if xpos + text.length < @leftcol + buffer.write ln - @topline, 0, "", :color => color, + :highlight => opts[:highlight] + xpos += text.length + ## nothing + elsif xpos < @leftcol + ## partial + buffer.write ln - @topline, 0, text[(@leftcol - xpos) .. -1], + :color => color, + :highlight => opts[:highlight] + xpos += text.length + else + buffer.write ln - @topline, xpos - @leftcol, text, + :color => color, :highlight => opts[:highlight] + xpos += text.length + end + + end + end + end +end + +end diff --git a/lib/sup/modes/search-results-mode.rb b/lib/sup/modes/search-results-mode.rb new file mode 100644 index 0000000..0a353a9 --- /dev/null +++ b/lib/sup/modes/search-results-mode.rb @@ -0,0 +1,31 @@ +module Redwood + +class SearchResultsMode < ThreadIndexMode + register_keymap do |k| + k.add :load_more_threads, "Load #{LOAD_MORE_THREAD_NUM} more threads", 'M' + end + + def initialize content + raise ArgumentError, "no content" if content =~ /^\s*$/ + @content = content.gsub(/[\(\)]/) { |x| "\\" + x } + super + end + + ## TODO: think about this + def is_relevant? m; super; end + + def load_more_threads n=ThreadIndexMode::LOAD_MORE_THREAD_NUM + load_n_threads_background n, :content => @content, + :load_killed => true, + :load_spam => false, + :when_done =>(lambda do |num| + if num > 0 + BufferManager.flash "Found #{num} threads" + else + BufferManager.flash "No matches" + end + end) + end +end + +end diff --git a/lib/sup/modes/text-mode.rb b/lib/sup/modes/text-mode.rb new file mode 100644 index 0000000..f495219 --- /dev/null +++ b/lib/sup/modes/text-mode.rb @@ -0,0 +1,51 @@ +module Redwood + +class TextMode < ScrollMode + attr_reader :text + + def initialize text="" + @text = text + update_lines + buffer.mark_dirty if buffer + super() + end + + def text= t + @text = t + update_lines + if buffer + ensure_mode_validity + buffer.mark_dirty + end + end + + def << line + @lines = [0] if @text.empty? + @text << line + @lines << @text.length + if buffer + ensure_mode_validity + buffer.mark_dirty + end + end + + def lines + @lines.length - 1 + end + + def [] i + return nil unless i < @lines.length + @text[@lines[i] ... (i + 1 < @lines.length ? @lines[i + 1] - 1 : @text.length)] +# (@lines[i] ... (i + 1 < @lines.length ? @lines[i + 1] - 1 : @text.length)).inspect + end + +private + + def update_lines + pos = @text.find_all_positions("\n") + pos.push @text.length unless pos.last == @text.length - 1 + @lines = [0] + pos.map { |x| x + 1 } + end +end + +end diff --git a/lib/sup/modes/thread-index-mode.rb b/lib/sup/modes/thread-index-mode.rb new file mode 100644 index 0000000..6bce14c --- /dev/null +++ b/lib/sup/modes/thread-index-mode.rb @@ -0,0 +1,389 @@ +module Redwood + +class ThreadIndexMode < LineCursorMode + DATE_WIDTH = Time::TO_NICE_S_MAX_LEN + FROM_WIDTH = 15 + LOAD_MORE_THREAD_NUM = 20 + + register_keymap do |k| + k.add :toggle_archived, "Toggle archived status", 'a' + k.add :toggle_starred, "Star or unstar all messages in thread", '*' + k.add :toggle_new, "Toggle new/read status of all messages in thread", 'N' + k.add :edit_labels, "Edit or add labels for a thread", 'l' + k.add :edit_message, "Edit message (drafts only)", 'e' + k.add :mark_as_spam, "Mark thread as spam", 'S' + k.add :kill, "Kill thread (never to be seen in inbox again)", 'K' + k.add :save, "Save changes now", '$' + k.add :jump_to_next_new, "Jump to next new thread", :tab + k.add :reply, "Reply to a thread", 'r' + k.add :forward, "Forward a thread", 'f' + k.add :toggle_tagged, "Tag/untag current line", 't' + k.add :apply_to_tagged, "Apply next command to all tagged threads", ';' + end + + def initialize required_labels=[], hidden_labels=[] + super() + @load_thread = nil + @required_labels = required_labels + @hidden_labels = hidden_labels + LabelManager::HIDDEN_LABELS + @date_width = DATE_WIDTH + @from_width = FROM_WIDTH + @size_width = nil + + @tags = Tagger.new self + + initialize_threads + update + + UpdateManager.register self + end + + def lines; @text.length; end + def [] i; @text[i]; end + + ## open up a thread view window + def select + this_curpos = curpos + t = @threads[this_curpos] + + ## TODO: don't regen text completely + mode = ThreadViewMode.new t, @hidden_labels + BufferManager.spawn t.subj, mode + end + + def handle_starred_update m + return unless(t = @ts.thread_for m) + @starred_cache[t] = t.has_label? :starred + update_text_for_line @lines[t] + end + + def handle_read_update m + return unless(t = @ts.thread_for m) + @new_cache[t] = false + update_text_for_line @lines[t] + end + + ## overwrite me! + def is_relevant? m; false; end + + def handle_add_update m + if is_relevant?(m) || @ts.is_relevant?(m) + @ts.load_thread_for_message m + update + end + end + + def handle_delete_update mid + if @ts.contains_id? mid + @ts.remove mid + update + end + end + + def update + ## let's see you do THIS in python + @threads = @ts.threads.select { |t| !@hidden_threads[t] }.sort_by { |t| t.date }.reverse + @size_width = (@threads.map { |t| t.size }.max || 0).num_digits + regen_text + end + + def edit_message + t = @threads[curpos] or return + message, *crap = t.find { |m, *o| m.has_label? :draft } + if message + mode = ResumeMode.new message + BufferManager.spawn "Edit message", mode + else + BufferManager.flash "Not a draft message!" + end + end + + def toggle_starred + t = @threads[curpos] or return + @starred_cache[t] = t.toggle_label :starred + update_text_for_line curpos + cursor_down + end + + def multi_toggle_starred threads + threads.each { |t| @starred_cache[t] = t.toggle_label :starred } + regen_text + end + + def toggle_archived + return unless(t = @threads[curpos]) + t.toggle_label :inbox + update_text_for_line curpos + cursor_down + end + + def multi_toggle_archived threads + threads.each { |t| t.toggle_label :inbox } + regen_text + end + + def toggle_new + t = @threads[curpos] or return + @new_cache[t] = t.toggle_label :unread + update_text_for_line curpos + cursor_down + end + + def multi_toggle_new threads + threads.each { |t| @new_cache[t] = t.toggle_label :unread } + regen_text + end + + def multi_toggle_tagged threads + @tags.drop_all_tags + regen_text + end + + def jump_to_next_new + t = @threads[curpos] or return + n = ((curpos + 1) .. lines).find { |i| @new_cache[@threads[i]] } + n = (0 ... curpos).find { |i| @new_cache[@threads[i]] } unless n + if n + set_cursor_pos n + else + BufferManager.flash "No new messages" + end + end + + def mark_as_spam + t = @threads[curpos] or return + multi_mark_as_spam [t] + end + + def multi_mark_as_spam threads + threads.each do |t| + t.apply_label :spam + hide_thread t + end + regen_text + end + + def kill + t = @threads[curpos] or return + multi_kill [t] + end + + def multi_kill threads + threads.each do |t| + t.apply_label :killed + hide_thread t + end + regen_text + end + + def save + threads = @threads + @hidden_threads.keys + mbid = BufferManager.say "Saving threads..." + threads.each_with_index do |t, i| + BufferManager.say "Saving thread #{i + 1} of #{threads.length}...", + mbid + t.save Index + end + BufferManager.clear mbid + end + + def cleanup + UpdateManager.unregister self + + if @load_thread + @load_thread.kill + BufferManager.clear @mbid if @mbid + sleep 0.1 # TODO: necessary? + BufferManager.erase_flash + end + save + super + end + + def toggle_tagged + t = @threads[curpos] or return + @tags.toggle_tag_for t + update_text_for_line curpos + cursor_down + end + + def apply_to_tagged; @tags.apply_to_tagged; end + + def edit_labels + thread = @threads[curpos] + speciall = (@hidden_labels + LabelManager::RESERVED_LABELS).uniq + keepl, modifyl = thread.labels.partition { |t| speciall.member? t } + label_string = modifyl.join(" ") + + answer = BufferManager.ask :edit_labels, "edit labels: ", label_string + return unless answer + user_labels = answer.split(/\s+/).map { |l| l.intern } + + hl = user_labels.select { |l| speciall.member? l } + if hl.empty? + thread.labels = keepl + user_labels + user_labels.each { |l| LabelManager << l } + else + BufferManager.flash "'#{hl}' is a reserved label!" + end + update_text_for_line curpos + end + + def multi_edit_labels threads + answer = BufferManager.ask :add_labels, "add labels: " + return unless answer + user_labels = answer.split(/\s+/).map { |l| l.intern } + + hl = user_labels.select { |l| @hidden_labels.member? l } + if hl.empty? + threads.each { |t| user_labels.each { |l| t.apply_label l } } + user_labels.each { |l| LabelManager << l } + else + BufferManager.flash "'#{hl}' is a reserved label!" + end + regen_text + end + + def reply + t = @threads[curpos] or return + m = t.latest_message + return if m.nil? # probably won't happen + mode = ReplyMode.new m + BufferManager.spawn "Reply to #{m.subj}", mode + end + + def forward + t = @threads[curpos] or return + m = t.latest_message + return if m.nil? # probably won't happen + mode = ForwardMode.new m + BufferManager.spawn "Forward of #{m.subj}", mode + mode.edit + end + + def load_n_threads_background n=LOAD_MORE_THREAD_NUM, opts={} + return if @load_thread + @load_thread = ::Thread.new do + begin + num = load_n_threads n, opts + opts[:when_done].call(num) if opts[:when_done] + rescue Exception => e + $exception ||= e + raise + end + @load_thread = nil + end + end + + def load_n_threads n=LOAD_MORE_THREAD_NUM, opts={} + @mbid = BufferManager.say "Searching for threads..." + orig_size = @ts.size + @ts.load_n_threads(@ts.size + n, opts) do |i| + BufferManager.say "Loaded #{i} threads...", @mbid + if i % 5 == 0 + update + BufferManager.draw_screen + end + end + @ts.threads.each { |th| th.labels.each { |l| LabelManager << l } } + + update + BufferManager.clear @mbid + @mbid = nil + + BufferManager.draw_screen + + @ts.size - orig_size + end + + def status + "line #{curpos + 1} of #{lines} #{dirty? ? '*modified*' : ''}" + end + +protected + + def cursor_thread; @threads[curpos]; end + + def drop_all_threads + @tags.drop_all_tags + initialize_threads + update + end + + def remove_label_and_hide_thread t, label + t.remove_label label + hide_thread t + end + + def hide_thread t + raise "already hidden" if @hidden_threads[t] + @hidden_threads[t] = true + @threads.delete t + @tags.drop_tag_for t + end + + def update_text_for_line l + @text[l] = text_for_thread @threads[l] + buffer.mark_dirty if buffer + end + + def regen_text + @text = @threads.map_with_index { |t, i| text_for_thread t } + @lines = @threads.map_with_index { |t, i| [t, i] }.to_h + buffer.mark_dirty if buffer + end + + def author_text_for_thread t + if t.authors.size == 1 + t.authors.first.mediumname + else + t.authors.map { |p| AccountManager.is_account?(p) ? "me" : p.shortname }.join ", " + end + end + + def text_for_thread t + date = (@date_cache[t] ||= t.date.to_nice_s(Time.now)) + from = (@who_cache[t] ||= author_text_for_thread(t)) + if from.length > @from_width + from = from[0 ... (@from_width - 1)] + from += "." unless from[-1] == ?\s + end + + new = @new_cache.member?(t) ? @new_cache[t] : @new_cache[t] = t.has_label?(:unread) + starred = @starred_cache.member?(t) ? @starred_cache[t] : @starred_cache[t] = t.has_label?(:starred) + + dp = (@dp_cache[t] ||= t.direct_participants.any? { |p| AccountManager.is_account? p }) + p = (@p_cache[t] ||= (dp || t.participants.any? { |p| AccountManager.is_account? p })) + + base_color = (new ? :index_new_color : :index_old_color) + [ + [:tagged_color, @tags.tagged?(t) ? ">" : " "], + [:none, sprintf("%#{@date_width}s ", date)], + [base_color, sprintf("%-#{@from_width}s ", from)], + [:starred_color, starred ? "*" : " "], + [:none, t.size == 1 ? " " * (@size_width + 2) : sprintf("(%#{@size_width}d)", t.size)], + [:to_me_color, dp ? " >" : (p ? ' -' : " ")], + [base_color, t.subj] + ] + + (t.labels - @hidden_labels).map { |label| [:label_color, " +#{label}"] } + + [[:snippet_color, " " + t.snippet] + ] + end + + def dirty?; (@hidden_threads.keys + @threads).any? { |t| t.dirty? }; end + +private + + def initialize_threads + @ts = ThreadSet.new Index.instance + @date_cache = {} + @who_cache = {} + @dp_cache = {} + @p_cache = {} + @new_cache = {} + @starred_cache = {} + @hidden_threads = {} + end +end + +end diff --git a/lib/sup/modes/thread-view-mode.rb b/lib/sup/modes/thread-view-mode.rb new file mode 100644 index 0000000..3eaa481 --- /dev/null +++ b/lib/sup/modes/thread-view-mode.rb @@ -0,0 +1,338 @@ +module Redwood + +class ThreadViewMode < LineCursorMode + DATE_FORMAT = "%B %e %Y %l:%M%P" + + register_keymap do |k| + k.add :toggle_detailed_header, "Toggle detailed header", 'd' + k.add :show_header, "Show full message header", 'H' + k.add :toggle_expanded, "Expand/collapse item", :enter + k.add :expand_all_messages, "Expand/collapse all messages", 'E' + k.add :edit_message, "Edit message (drafts only)", 'e' + k.add :expand_all_quotes, "Expand/collapse all quotes in a message", 'o' + k.add :jump_to_next_open, "Jump to next open message", 'n' + k.add :jump_to_prev_open, "Jump to previous open message", 'p' + k.add :toggle_starred, "Star or unstar message", '*' + k.add :collapse_non_new_messages, "Collapse all but new messages", 'N' + k.add :reply, "Reply to a message", 'r' + k.add :forward, "Forward a message", 'f' + end + + def initialize thread, hidden_labels=[] + super() + @thread = thread + @state = {} + @hidden_labels = hidden_labels + + earliest = nil + latest = nil + latest_date = nil + @thread.each do |m, d, p| + next unless m + earliest ||= m + @state[m] = + if m.has_label?(:unread) && m == earliest + :detailed + elsif m.has_label?(:starred) || m.has_label?(:unread) + :open + else + :closed + end + if latest_date.nil? || m.date > latest_date + latest_date = m.date + latest = m + end + end + @state[latest] = :open if @state[latest] == :closed + + regen_chunks + regen_text + end + + def draw_line ln, opts={} + if ln == curpos + super ln, :highlight => true + else + super + end + end + def lines; @text.length; end + def [] i; @text[i]; end + + def show_header + return unless(m = @message_lines[curpos]) + BufferManager.spawn_unless_exists("Full header") do + TextMode.new m.content #m.header_text + end + end + + def toggle_detailed_header + return unless(m = @message_lines[curpos]) + @state[m] = (@state[m] == :detailed ? :open : :detailed) + update + end + + def reply + return unless(m = @message_lines[curpos]) + mode = ReplyMode.new m + BufferManager.spawn "Reply to #{m.subj}", mode + end + + def forward + return unless(m = @message_lines[curpos]) + mode = ForwardMode.new m + BufferManager.spawn "Forward of #{m.subj}", mode + mode.edit + end + + def toggle_starred + return unless(m = @message_lines[curpos]) + if m.has_label? :starred + m.remove_label :starred + else + m.add_label :starred + end + ## TODO: don't recalculate EVERYTHING just to add a stupid little + ## star to the display + update + UpdateManager.relay :starred, m + end + + def toggle_expanded + return unless(chunk = @chunk_lines[curpos]) + case chunk + when Message, Message::Quote, Message::Signature + @state[chunk] = (@state[chunk] != :closed ? :closed : :open) + when Message::Attachment + view_attachment chunk + end + update + end + + def edit_message + return unless(m = @message_lines[curpos]) + if m.is_draft? + mode = ResumeMode.new m + BufferManager.spawn "Edit message", mode + else + BufferManager.flash "Not a draft message!" + end + end + + def jump_to_next_open + return unless(m = @message_lines[curpos]) + while nextm = @messages[m][3] + break if @state[nextm] == :open + m = nextm + end + jump_to_message nextm if nextm + end + + def jump_to_prev_open + return unless(m = @message_lines[curpos]) + ## jump to the top of the current message if we're in the body; + ## otherwise, to the previous message + top = @messages[m][0] + if curpos == top + while prevm = @messages[m][2] + break if @state[prevm] == :open + m = prevm + end + jump_to_message prevm if prevm + else + jump_to_message m + end + end + + def jump_to_message m + top, bot, prevm, nextm = @messages[m] + jump_to_line top unless top >= topline && + top <= botline && bot >= topline && bot <= botline + set_cursor_pos top + end + + def expand_all_messages + @global_message_state ||= :closed + @global_message_state = (@global_message_state == :closed ? :open : :closed) + @state.each { |m, v| @state[m] = @global_message_state if m.is_a? Message } + update + end + + + def collapse_non_new_messages + @messages.each { |m, v| @state[m] = m.has_label?(:unread) ? :open : :closed } + update + end + + def expand_all_quotes + if(m = @message_lines[curpos]) + quotes = @chunks[m].select { |c| c.is_a?(Message::Quote) || c.is_a?(Message::Signature) } + open, closed = quotes.partition { |c| @state[c] == :open } + newstate = open.length > closed.length ? :closed : :open + Redwood::log "#{open.length} opened, #{closed.length} closed, new state is thus #{newstate}" + quotes.each { |c| @state[c] = newstate } + update + end + end + + ## not sure if this is really necessary but we might as well... + def cleanup + @thread.each do |m, d, p| + if m.has_label? :unread + m.remove_label :unread + UpdateManager.relay :read, m + end + end + + Redwood::log "releasing chunks and text from \"#{buffer.title}\"" + @messages = @chunks = @text = nil + end + +private + + def update + regen_text + buffer.mark_dirty if buffer + end + + def regen_chunks + @chunks = {} + @thread.each { |m, d, p| @chunks[m] = m.to_chunks if m.is_a?(Message) } + end + + def regen_text + @text = [] + @chunk_lines = [] + @message_lines = [] + @messages = {} + + prev_m = nil + @thread.each do |m, depth, parent| + text = chunk_to_lines m, @state[m], @text.length, depth, parent + (0 ... text.length).each do |i| + @chunk_lines[@text.length + i] = m + @message_lines[@text.length + i] = m + end + + @messages[m] = [@text.length, @text.length + text.length, prev_m, nil] + @messages[prev_m][3] = m if prev_m + prev_m = m + + @text += text + if @state[m] != :closed && @chunks.member?(m) + @chunks[m].each do |c| + @state[c] ||= :closed + text = chunk_to_lines c, @state[c], @text.length, depth + (0 ... text.length).each do |i| + @chunk_lines[@text.length + i] = c + @message_lines[@text.length + i] = m + end + @text += text + end + @messages[m][1] = @text.length + end + end + end + + def message_patina_lines m, state, parent, prefix + prefix_widget = [:message_patina_color, prefix] + widget = + case state + when :closed + [:message_patina_color, "+ "] + when :open, :detailed + [:message_patina_color, "- "] + end + imp_widget = + if m.has_label?(:starred) + [:starred_patina_color, "* "] + else + [:message_patina_color, " "] + end + + case state + when :open + [[prefix_widget, widget, imp_widget, + [:message_patina_color, + "#{m.from ? m.from.mediumname : '?'} to #{m.to.map { |l| l.shortname }.join(', ')} #{m.date.to_nice_s} (#{m.date.to_nice_distance_s})"]]] +# (m.to.empty? ? [] : [[[:message_patina_color, prefix + " To: " + m.recipients.map { |x| x.mediumname }.join(", ")]]]) + + when :closed + [[prefix_widget, widget, imp_widget, + [:message_patina_color, + "#{m.from ? m.from.mediumname : '?'}, #{m.date.to_nice_s} (#{m.date.to_nice_distance_s}) #{m.snippet}"]]] + when :detailed + labels = m.labels# - @hidden_labels + x = [[prefix_widget, widget, imp_widget, [:message_patina_color, "From: #{m.from ? m.from.longname : '?'}"]]] + + ((m.to.empty? ? [] : break_into_lines(" To: ", m.to.map { |x| x.longname })) + + (m.cc.empty? ? [] : break_into_lines(" Cc: ", m.cc.map { |x| x.longname })) + + (m.bcc.empty? ? [] : break_into_lines(" Bcc: ", m.bcc.map { |x| x.longname })) + + [" Date: #{m.date.strftime DATE_FORMAT} (#{m.date.to_nice_distance_s})"] + + [" Subject: #{m.subj}"] + + [(parent ? " In reply to: #{parent.from.mediumname}'s message of #{parent.date.strftime DATE_FORMAT}" : nil)] + + [labels.empty? ? nil : " Labels: #{labels.join(', ')}"] + ).flatten.compact.map { |l| [[:message_patina_color, prefix + " " + l]] } + #raise x.inspect + x + end + end + + def break_into_lines prefix, list + pad = " " * prefix.length + [prefix + list.first + (list.length > 1 ? "," : "")] + + list[1 .. -1].map_with_index do |e, i| + pad + e + (i == list.length - 1 ? "" : ",") + end + end + + + def chunk_to_lines chunk, state, start, depth, parent=nil + prefix = " " * depth + case chunk + when :fake_root + [[[:message_patina_color, "#{prefix}"]]] + when nil + [[[:message_patina_color, "#{prefix}"]]] + when Message + message_patina_lines(chunk, state, parent, prefix) + + (chunk.is_draft? ? [[[:draft_notification_color, prefix + " >>> This message is a draft. To edit, hit 'e'. <<<"]]] : []) + + when Message::Attachment + [[[:mime_color, "#{prefix}+ MIME attachment #{chunk.content_type}#{chunk.desc ? ' (' + chunk.desc + ')': ''}"]]] + when Message::Text + t = chunk.lines + if t.last =~ /^\s*$/ + t.pop while t[t.length - 2] =~ /^\s*$/ + end + t.map { |line| [[:none, "#{prefix}#{line}"]] } + when Message::Quote + case state + when :closed + [[[:quote_patina_color, "#{prefix}+ #{chunk.lines.length} quoted lines"]]] + when :open + t = chunk.lines + [[[:quote_patina_color, "#{prefix}- #{chunk.lines.length} quoted lines"]]] + + t.map { |line| [[:quote_color, "#{prefix}#{line}"]] } + end + when Message::Signature + case state + when :closed + [[[:sig_patina_color, "#{prefix}+ #{chunk.lines.length}-line signature"]]] + when :open + t = chunk.lines + [[[:sig_patina_color, "#{prefix}- #{chunk.lines.length}-line signature"]]] + + t.map { |line| [[:sig_color, "#{prefix}#{line}"]] } + end + else + raise "unknown chunk type #{chunk.class.name}" + end + end + + def view_attachment a + BufferManager.flash "viewing #{a.content_type} attachment..." + a.view! + BufferManager.erase_flash + end + +end + +end diff --git a/lib/sup/person.rb b/lib/sup/person.rb new file mode 100644 index 0000000..38fba31 --- /dev/null +++ b/lib/sup/person.rb @@ -0,0 +1,120 @@ +module Redwood + +class Person + @@email_map = {} + + attr_accessor :name, :email + + def initialize name, email + raise ArgumentError, "email can't be nil" unless email + @name = + if name + name.gsub(/^\s+|\s+$/, "").gsub(/\s+/, " ") + else + nil + end + @email = email.gsub(/^\s+|\s+$/, "").gsub(/\s+/, " ").downcase + @@email_map[@email] = self + end + + def == o; o && o.email == email; end + alias :eql? :== + + def hash + [name, email].hash + end + + def shortname + case @name + when /\S+, (\S+)/ + $1 + when /(\S+) \S+/ + $1 + when nil + @email #[0 ... 10] + else + @name #[0 ... 10] + end + end + + def longname + if @name && @email + "#@name <#@email>" + else + @email + end + end + + def mediumname + if @name + name + else + @email + end + end + + def full_address + if @name && @email + if @name =~ /"/ + "#{@name.inspect} <#@email>" + else + "#@name <#@email>" + end + else + @email + end + end + + def sort_by_me + case @name + when /^(\S+), \S+/ + $1 + when /^\S+ \S+ (\S+)/ + $1 + when /^\S+ (\S+)/ + $1 + when nil + @email + else + @name + end.downcase + end + + def self.for_several s + return [] if s.nil? + + begin + s.split_on_commas.map { |ss| self.for ss } + rescue StandardError => e + raise "#{e.message}: for #{s.inspect}" + end + end + + def self.for s + return nil if s.nil? + name, email = + case s + when /["'](.*?)["'] <(.*?)>/, /([^,]+) <(.*?)>/ + a, b = $1, $2 + [a.gsub('\"', '"'), b] + when /<((\S+?)@\S+?)>/ + [$2, $1] + when /((\S+?)@\S+)/ + [$2, $1] + else + [nil, s] + end + + if name && (p = @@email_map[email]) + ## all else being equal, prefer longer names, unless the prior name + ## doesn't contain any capitalization + p.name = name if (p.name.nil? || p.name.length < name.length) unless + p.name =~ /[A-Z]/ || (AccountManager.instantiated? && AccountManager.is_account?(p)) + p + else + Person.new name, email + end + end +end + +end diff --git a/lib/sup/poll.rb b/lib/sup/poll.rb new file mode 100644 index 0000000..b6dfabc --- /dev/null +++ b/lib/sup/poll.rb @@ -0,0 +1,80 @@ +require 'thread' + +module Redwood + +class PollManager + include Singleton + + DELAY = 300 + + def initialize + @polling = false + @last_poll = nil + + self.class.i_am_the_instance self + + ::Thread.new do + while true + sleep DELAY / 2 + if @last_poll.nil? || (Time.now - @last_poll) >= DELAY + mbid = BufferManager.say "Polling for new messages..." + num, numi = poll { |s| BufferManager.say s, mbid } + BufferManager.clear mbid + BufferManager.flash "Loaded #{num} new messages, #{numi} to inbox." if num > 0 + end + end + end + end + + def poll + return [0, 0] if @polling + @polling = true + found = {} + total_num = 0 + total_numi = 0 + Index.usual_sources.each do |source| + next if source.done? + yield "Loading from #{source}... " + + start_offset = nil + num = 0 + num_inbox = 0 + source.each do |offset, labels| + start_offset ||= offset + + begin + m = Redwood::Message.new source, offset, labels + if found[m.id] + yield "Skipping duplicate message #{m.id}" + next + else + found[m.id] = true + end + + if Index.add_message m + UpdateManager.relay :add, m + num += 1 + total_num += 1 + total_numi += 1 if m.labels.include? :inbox + end + rescue Redwood::MessageFormatError => e + yield "Ignoring erroneous message at #{source}##{offset}: #{e.message}" + end + + if num % 1000 == 0 && num > 0 + elapsed = Time.now - start + pctdone = (offset.to_f - start_offset) / (source.total.to_f - start_offset) + remaining = (source.total.to_f - offset.to_f) * (elapsed.to_f / (offset.to_f - start_offset)) + yield "## #{num} (#{(pctdone * 100.0)}% done) read; #{elapsed.to_time_s} elapsed; est. #{remaining.to_time_s} remaining" + end + end + yield "Found #{num} messages" unless num == 0 + end + yield "Done polling; loaded #{total_num} new messages total" + @last_poll = Time.now + @polling = false + [total_num, total_numi] + end +end + +end diff --git a/lib/sup/sent.rb b/lib/sup/sent.rb new file mode 100644 index 0000000..6ef9050 --- /dev/null +++ b/lib/sup/sent.rb @@ -0,0 +1,46 @@ +module Redwood + +class SentManager + include Singleton + + attr_accessor :source + def initialize fn + @fn = fn + @source = nil + self.class.i_am_the_instance self + end + + def self.source_name; "sent"; end + def self.source_id; 9998; end + def new_source; @source = SentLoader.new @fn; end + + def write_sent_message date, from_email + need_blank = File.exists?(@fn) && !File.zero?(@fn) + File.open(@fn, "a") do |f| + f.puts if need_blank + f.puts "From #{from_email} #{date}" + yield f + end + @source.each do |offset, labels| + m = Message.new @source, offset, labels + Index.add_message m + UpdateManager.relay :add, m + end + end +end + +class SentLoader < MBox::Loader + def initialize filename, end_offset=0 + File.open(filename, "w") { } unless File.exists? filename + super filename, end_offset, true, true + end + + def id; SentManager.source_id; end + def to_s; SentManager.source_name; end + + def labels; [:sent, :inbox]; end +end + +Redwood::register_yaml(SentLoader, %w(filename end_offset)) + +end diff --git a/lib/sup/tagger.rb b/lib/sup/tagger.rb new file mode 100644 index 0000000..424dac2 --- /dev/null +++ b/lib/sup/tagger.rb @@ -0,0 +1,40 @@ +module Redwood + +class Tagger + def initialize mode + @mode = mode + @tagged = {} + end + + def tagged? o; @tagged[o]; end + def toggle_tag_for o; @tagged[o] = !@tagged[o]; end + def drop_all_tags; @tagged.clear; end + def drop_tag_for o; @tagged.delete o; end + + def apply_to_tagged + num_tagged = @tagged.map { |t| t ? 1 : 0 }.sum + if num_tagged == 0 + BufferManager.flash "No tagged messages!" + return + end + + noun = num_tagged == 1 ? "message" : "messages" + c = BufferManager.ask_getch "apply to #{num_tagged} tagged #{noun}:" + return if c.nil? # user cancelled + + if(action = @mode.resolve_input c) + tagged_sym = "multi_#{action}".intern + if @mode.respond_to? tagged_sym + targets = @tagged.select_by_value + @mode.send tagged_sym, targets + else + BufferManager.flash "That command cannot be applied to multiple messages." + end + else + BufferManager.flash "Unknown command #{c.to_character}." + end + end + +end + +end diff --git a/lib/sup/textfield.rb b/lib/sup/textfield.rb new file mode 100644 index 0000000..337a4fb --- /dev/null +++ b/lib/sup/textfield.rb @@ -0,0 +1,83 @@ +require 'curses' + +module Redwood + +class TextField + attr_reader :value + + def initialize window, y, x, width + @w, @x, @y = window, x, y + @width = width + @i = nil + @history = [] + end + + def activate question, default=nil + @question = question + @value = nil + @field = Ncurses::Form.new_field 1, @width - question.length, + @y, @x + question.length, 0, 0 + @form = Ncurses::Form.new_form [@field] + + @history[@i = @history.size] = default || "" + Ncurses::Form.post_form @form + @field.set_field_buffer 0, @history[@i] + end + + def position_cursor + @w.attrset Colormap.color_for(:none) + @w.mvaddstr @y, 0, @question + Ncurses.curs_set 1 + Ncurses::Form.form_driver @form, Ncurses::Form::REQ_END_FIELD + end + + def deactivate + @form.unpost_form + @form.free_form + @field.free_field + Ncurses.curs_set 0 + end + + def handle_input c + if c == 10 # Ncurses::KEY_ENTER + Ncurses::Form.form_driver @form, Ncurses::Form::REQ_VALIDATION + @value = @history[@i] = @field.field_buffer(0).gsub(/^\s+|\s+$/, "").gsub(/\s+/, " ") + return false + elsif c == Ncurses::KEY_CANCEL + @history.delete_at @i + @i = @history.empty? ? nil : (@i - 1) % @history.size + @value = nil + return false + end + + d = + case c + when Ncurses::KEY_LEFT + Ncurses::Form::REQ_PREV_CHAR + when Ncurses::KEY_RIGHT + Ncurses::Form::REQ_NEXT_CHAR + when Ncurses::KEY_BACKSPACE + Ncurses::Form::REQ_DEL_PREV + when ?\001 + Ncurses::Form::REQ_BEG_FIELD + when ?\005 + Ncurses::Form::REQ_END_FIELD + when Ncurses::KEY_UP + @history[@i] = @field.field_buffer(0) + @i = (@i - 1) % @history.size + @field.set_field_buffer 0, @history[@i] + when Ncurses::KEY_DOWN + @history[@i] = @field.field_buffer(0) + @i = (@i + 1) % @history.size + @field.set_field_buffer 0, @history[@i] + else + c + end + + Ncurses::Form.form_driver @form, d + Ncurses.refresh + + true + end +end +end diff --git a/lib/sup/thread.rb b/lib/sup/thread.rb new file mode 100644 index 0000000..688a033 --- /dev/null +++ b/lib/sup/thread.rb @@ -0,0 +1,358 @@ +require 'date' + +module Redwood + +class Thread + include Enumerable + + attr_reader :containers + def initialize + @containers = [] + end + + def << c + @containers << c + end + + def empty?; @containers.empty?; end + + def drop c + raise "bad drop" unless @containers.member? c + @containers.delete c + end + + def dump + puts "=== start thread #{self} with #{@containers.length} trees ===" + @containers.each { |c| c.dump_recursive } + puts "=== end thread ===" + end + + ## yields each message and some stuff + def each fake_root=false + adj = 0 + root = @containers.find_all { |c| !Message.subj_is_reply?(c) }.argmin { |c| c.date } + + if root + adj = 1 + root.first_useful_descendant.each_with_stuff do |c, d, par| + yield c.message, d, (par ? par.message : nil) + end + elsif @containers.length > 1 && fake_root + adj = 1 + yield :fake_root, 0, nil + end + + @containers.each do |cont| + next if cont == root + fud = cont.first_useful_descendant + fud.each_with_stuff do |c, d, par| + ## special case here: if we're an empty root that's already + ## been joined by a fake root, don't emit + yield c.message, d + adj, (par ? par.message : nil) unless + fake_root && c.message.nil? && root.nil? && c == fud + end + end + end + + def dirty?; any? { |m, *o| m && m.dirty? }; end + def date; map { |m, *o| m.date if m }.compact.max; end + def snippet; argfind { |m, *o| m && m.snippet }; end + def authors; map { |m, *o| m.from if m }.compact.uniq; end + + def apply_label t; each { |m, *o| m && m.add_label(t) }; end + def remove_label t + each { |m, *o| m && m.remove_label(t) } + end + + def toggle_label label + if has_label? label + remove_label label + return false + else + apply_label label + return true + end + end + + def set_labels l; each { |m, *o| m && m.labels = l }; end + + def has_label? t; any? { |m, *o| m && m.has_label?(t) }; end + def save index; each { |m, *o| m && m.save(index) }; end + + def direct_participants + map { |m, *o| [m.from] + m.to if m }.flatten.compact.uniq + end + + def participants + map { |m, *o| [m.from] + m.to + m.cc + m.bcc if m }.flatten.compact.uniq + end + + def size; map { |m, *o| m ? 1 : 0 }.sum; end + def subj; argfind { |m, *o| m && m.subj }; end + def labels + map { |m, *o| m && m.labels }.flatten.compact.uniq.sort_by { |t| t.to_s } + end + def labels= l + each { |m, *o| m && m.labels = l.clone } + end + + def latest_message + inject(nil) do |a, b| + b = b.first + if a.nil? + b + elsif b.nil? + a + else + b.date > a.date ? b : a + end + end + end + + def to_s + "" + end +end + +## recursive structure used internally to represent message trees as +## described by reply-to: and references: headers. +## +## the 'id' field is the same as the message id. but the message might +## be empty, in the case that we represent a message that was referenced +## by another message (as an ancestor) but never received. +class Container + attr_accessor :message, :parent, :children, :id, :thread + + def initialize id + raise "non-String #{id.inspect}" unless id.is_a? String + @id = id + @message, @parent, @thread = nil, nil, nil + @children = [] + end + + def each_with_stuff parent=nil + yield self, 0, parent + @children.each do |c| + c.each_with_stuff(self) { |cc, d, par| yield cc, d + 1, par } + end + end + + def descendant_of? o + if o == self + true + else + @parent && @parent.descendant_of?(o) + end + end + + def == o; Container === o && id == o.id; end + + def empty?; @message.nil?; end + def root?; @parent.nil?; end + def root; root? ? self : @parent.root; end + + def first_useful_descendant + if empty? && @children.size == 1 + @children.first.first_useful_descendant + else + self + end + end + + def find_attr attr + if empty? + @children.argfind { |c| c.find_attr attr } + else + @message.send attr + end + end + def subj; find_attr :subj; end + def date; find_attr :date; end + + def is_reply?; subj && Message.subject_is_reply?(subj); end + + def to_s + [ "<#{id}", + (@parent.nil? ? nil : "parent=#{@parent.id}"), + (@children.empty? ? nil : "children=#{@children.map { |c| c.id }.inspect}"), + ].compact.join(" ") + ">" + end + + def dump_recursive indent=0, root=true, parent=nil + raise "inconsistency" unless parent.nil? || parent.children.include?(self) + unless root + print " " * indent + print "+->" + end + line = #"[#{useful? ? 'U' : ' '}] " + + if @message + "[#{thread}] #{@message.subj} " ##{@message.refs.inspect} / #{@message.replytos.inspect}" + else + "" + end + + puts "#{id} #{line}"#[0 .. (105 - indent)] + indent += 3 + @children.each { |c| c.dump_recursive indent, false, self } + end +end + +## a set of threads (so a forest). builds the thread structures by +## reading messages from an index. +class ThreadSet + attr_reader :num_messages + + def initialize index + @index = index + @num_messages = 0 + @messages = {} ## map from message ids to container objects + @subj_thread = {} ## map from subject strings to thread objects + end + + def contains_id? id; @messages.member?(id) && !@messages[id].empty?; end + def thread_for m + (c = @messages[m.id]) && c.root.thread + end + + def delete_empties + @subj_thread.each { |k, v| @subj_thread.delete(k) if v.empty? } + end + private :delete_empties + + def threads; delete_empties; @subj_thread.values; end + def size; delete_empties; @subj_thread.size; end + + def dump + @subj_thread.each do |s, t| + puts "**********************" + puts "** for subject #{s} **" + puts "**********************" + t.dump + end + end + + def link p, c, overwrite=false + if p == c || p.descendant_of?(c) || c.descendant_of?(p) # would create a loop +# puts "*** linking parent #{p} and child #{c} would create a loop" + return + end + + if c.parent.nil? || overwrite + c.parent.children.delete c if overwrite && c.parent + if c.thread + c.thread.drop c + c.thread = nil + end + p.children << c + c.parent = p + end + end + private :link + + def remove mid + return unless(c = @messages[mid]) + + c.parent.children.delete c if c.parent + if c.thread + c.thread.drop c + c.thread = nil + end + end + + ## load in (at most) num number of threads from the index + def load_n_threads num, opts={} + @index.each_id_by_date opts do |mid, builder| + break if size >= num + next if contains_id? mid + + m = builder.call + add_message m + load_thread_for_message m + yield @subj_thread.size if block_given? + end + end + + ## loads in all messages needed to thread m + def load_thread_for_message m + @index.each_message_in_thread_for m, :limit => 100 do |mid, builder| + next if contains_id? mid + add_message builder.call + end + end + + def is_relevant? m + m.refs.any? { |ref_id| @messages[ref_id] } + end + + ## an "online" version of the jwz threading algorithm. + def add_message message + id = message.id + el = (@messages[id] ||= Container.new id) + return if @messages[id].message # we've seen it before + + el.message = message + oldroot = el.root + + ## link via references: + prev = nil + message.refs.each do |ref_id| + raise "non-String ref id #{ref_id.inspect} (full: #{message.refs.inspect})" unless ref_id.is_a?(String) + ref = (@messages[ref_id] ||= Container.new ref_id) + link prev, ref if prev + prev = ref + end + link prev, el, true if prev + + ## link via in-reply-to: + message.replytos.each do |ref_id| + ref = (@messages[ref_id] ||= Container.new ref_id) + link ref, el, true + break # only do the first one + end + + ## update subject grouping + root = el.root + # puts "> have #{el}, root #{root}, oldroot #{oldroot}" + # el.dump_recursive + + if root == oldroot + if oldroot.thread + # puts "*** root (#{root.subj}) == oldroot (#{oldroot.subj}); ignoring" + else + ## to disable subject grouping, use the next line instead + ## (and the same for below) + thread = (@subj_thread[Message.normalize_subj(root.subj)] ||= Thread.new) + #thread = (@subj_thread[root.id] ||= Thread.new) + + thread << root + root.thread = thread + # puts "# (1) added #{root} to #{thread}" + end + else + if oldroot.thread + ## new root. need to drop old one and put this one in its place + # puts "*** DROPPING #{oldroot} from #{oldroot.thread}" + oldroot.thread.drop oldroot + oldroot.thread = nil + end + + if root.thread + # puts "*** IGNORING cuz root already has a thread" + else + ## to disable subject grouping, use the next line instead + ## (and the same above) + thread = (@subj_thread[Message.normalize_subj(root.subj)] ||= Thread.new) + #thread = (@subj_thread[root.id] ||= Thread.new) + + thread << root + root.thread = thread + # puts "# (2) added #{root} to #{thread}" + end + end + + ## last bit + @num_messages += 1 + end +end + +end diff --git a/lib/sup/update.rb b/lib/sup/update.rb new file mode 100644 index 0000000..75c82ac --- /dev/null +++ b/lib/sup/update.rb @@ -0,0 +1,21 @@ +module Redwood + +class UpdateManager + include Singleton + + def initialize + @targets = {} + self.class.i_am_the_instance self + end + + def register o; @targets[o] = true; end + def unregister o; @targets.delete o; end + + def relay type, *args + meth = "handle_#{type}_update".intern + @targets.keys.each { |o| o.send meth, *args if o.respond_to? meth } + BufferManager.draw_screen ## TODO: think about this + end +end + +end diff --git a/lib/sup/util.rb b/lib/sup/util.rb new file mode 100644 index 0000000..60be36f --- /dev/null +++ b/lib/sup/util.rb @@ -0,0 +1,260 @@ +class Module + def bool_reader *args + args.each { |sym| class_eval %{ def #{sym}?; @#{sym}; end } } + end + def bool_writer *args; attr_writer(*args); end + def bool_accessor *args + bool_reader(*args) + bool_writer(*args) + end +end + +class Object + def ancestors + ret = [] + klass = self.class + + until klass == Object + ret << klass + klass = klass.superclass + end + ret + end +end + +class String + def camel_to_hyphy + self.gsub(/([a-z])([A-Z0-9])/, '\1-\2').downcase + end + + def find_all_positions x + ret = [] + start = 0 + while start < length + pos = index x, start + break if pos.nil? + ret << pos + start = pos + 1 + end + ret + end + + def ucfirst + self[0 .. 0].upcase + self[1 .. -1] + end + + ## found on teh internets + def split_on_commas + split(/,\s*(?=(?:[^"]*"[^"]*")*(?![^"]*"))/) + end + + def wrap len + ret = [] + s = self + while s.length > len + cut = s[0 ... len].rindex(/\s/) + if cut + ret << s[0 ... cut] + "\n" + s = s[(cut + 1) .. -1] + else + ret << s[0 ... len] + "\n" + s = s[len .. -1] + end + end + ret << s + end +end + +class Numeric + def clamp min, max + if self < min + min + elsif self > max + max + else + self + end + end + + def in? range; range.member? self; end +end + +class Fixnum + def num_digits base=10 + return 1 if self == 0 + 1 + (Math.log(self) / Math.log(10)).floor + end + + def to_character + if self < 128 && self >= 0 + chr + else + "<#{self}>" + end + end +end + +class Hash + def - o + Hash[*self.map { |k, v| [k, v] unless o.include? k }.compact.flatten_one_level] + end + + def select_by_value v=true + select { |k, vv| vv == v }.map { |x| x.first } + end +end + +module Enumerable + def map_with_index + ret = [] + each_with_index { |x, i| ret << yield(x, i) } + ret + end + + def sum; inject(0) { |x, y| x + y }; end + + def map_to_hash + ret = {} + each { |x| ret[x] = yield(x) } + ret + end + + # like find, except returns the value of the block rather than the + # element itself. + def argfind + ret = nil + find { |e| ret ||= yield(e) } + ret || nil # force + end + + def argmin + best, bestval = nil, nil + each do |e| + val = yield e + if bestval.nil? || val < bestval + best, bestval = e, val + end + end + best + end +end + +class Array + def flatten_one_level + inject([]) { |a, e| a + e } + end + + def to_h; Hash[*flatten]; end + def rest; self[1..-1]; end + + def to_boolean_h; Hash[*map { |x| [x, true] }.flatten]; end + + ## apparently uniq doesn't use ==. wtf. + def remove_successive_dupes + ret = [] + last = nil + each do |e| + unless e == last + ret << e + last = e + end + end + ret + end +end + +class Time + def to_indexable_s + sprintf "%012d", self + end + + def nearest_hour + if min < 30 + self + else + self + (60 - min) * 60 + end + end + + def midnight # within a second + self - (hour * 60 * 60) - (min * 60) - sec + end + + def is_the_same_day? other + (midnight - other.midnight).abs < 1 + end + + def is_the_day_before? other + other.midnight - midnight <= 24 * 60 * 60 + 1 + end + + def to_nice_distance_s from=Time.now + later_than = (self < from) + diff = (self.to_i - from.to_i).abs.to_f + text = + [ ["second", 60], + ["minute", 60], + ["hour", 24], + ["day", 7], + ["week", 4], # heh heh + ["month", 12], + ["year", nil], + ].argfind do |unit, size| + if diff <= 1 + "one #{unit}" + elsif size.nil? || diff < size + "#{diff} #{unit}s" + else + diff = (diff / size.to_f).round + false + end + end + if later_than + text + " ago" + else + "in " + text + end + end + + TO_NICE_S_MAX_LEN = 11 # e.g. "Jul 31 2005" + def to_nice_s from=Time.now + if year != from.year + strftime "%b %e %Y" + elsif month != from.month + strftime "%b %e" + else + if is_the_same_day? from + strftime("%l:%M%P") + elsif is_the_day_before? from + "Yest." + nearest_hour.strftime("%l%P") + else + strftime "%b %e" + end + end + end +end + +## simple singleton module. far less complete and insane than the ruby +## standard library one, but automatically forwards methods calls and +## allows for constructors that take arguments. +## +## You must have #initialize call "self.class.i_am_the_instance self" +## at some point or everything will fail horribly +module Singleton + module ClassMethods + def instance; @instance; end + def instantiated?; defined?(@instance) && !@instance.nil?; end + def method_missing meth, *a, &b + raise "no instance defined!" unless defined? @instance + @instance.send meth, *a, &b + end + def i_am_the_instance o + raise "there can be only one! (instance)" if defined? @instance + @instance = o + end + end + + def self.included klass + klass.extend ClassMethods + end +end diff --git a/www/index.html b/www/index.html new file mode 100644 index 0000000..ca15980 --- /dev/null +++ b/www/index.html @@ -0,0 +1,63 @@ + + +Sup + + + + +

Sup

+ +

+Sup is an attempt to take the UI innovations of web-based email +readers (ok, really just GMail) and to combine them with the +traditional wholesome goodness of a console-based email client. +

+

+Sup is designed to work with massive amounts of email, potentially +spread out across different mbox files, IMAP folders, and GMail +accounts, and to pull them all together into a single interface. +

+

+The goal of Sup is to become the email client of choice for nerds +everywhere. +

+ +

Screenshots

+ + + + + + + +

Documentation

+ +Please read the README, the FAQ, and the philosophical statement. + +

Status

+ +

The current version of Sup is 0.0.1, released November 28th, 2006. +This is an alpha release. It is unix-centric, mbox-specific, and has +no i18n support. I plan to fix all of these problems.

+ +

Other than those limitations, it works great. I use it for my +everyday email.

+ +

More info

+ +

You can download Sup releases from the Sup RubyForge page. +Feel free to post comments, bug reports and patches to the forums there. +

+ +

Credits

+ +Sup is brought to you by William Morgan. + +Sup is made possible only by the hard work of Dave Balmain and his fantastic +IR engine Ferret. + + + diff --git a/www/ss1.png b/www/ss1.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c43d4b95ad3236e437682d4427b95ddac52764 GIT binary patch literal 93669 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

INT(DC5F5zq-N$H$rmWiR`QfM0(L_|!> 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 literal 0 HcmV?d00001 diff --git a/www/ss2.png b/www/ss2.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b6df775dbef97bca1f57f8cb0f42126dbfe567 GIT binary patch literal 38059 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 literal 0 HcmV?d00001 diff --git a/www/ss3.png b/www/ss3.png new file mode 100644 index 0000000000000000000000000000000000000000..4038cb56916904a98e2c77996b432d545de9c438 GIT binary patch literal 43946 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 literal 0 HcmV?d00001 diff --git a/www/ss5.png b/www/ss5.png new file mode 100644 index 0000000000000000000000000000000000000000..aa367ae2d1885d12bcccbd9e1a017be958635b60 GIT binary patch literal 63085 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 Lv{dtz&7S=i6o%&P literal 0 HcmV?d00001 -- 2.45.2